vd_dshow.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 116 行
C
116 行
#include <uclib.h>#include <uclib.h>#include <stdarg.h>#include "config.h"#include "mp_msg.h"#include "help_mp.h"#include "vd_internal.h"#include "loader/dshow/DS_VideoDecoder.h"static vd_info_t info = { "DirectShow video codecs", "dshow", "A'rpi", "based on http://avifile.sf.net", "win32 codecs"};LIBVD_EXTERN(dshow)// to set/get/query special features/parametersstatic int control(sh_video_t *sh,int cmd,void* arg,...){ switch(cmd){ case VDCTRL_QUERY_MAX_PP_LEVEL: return 4; case VDCTRL_SET_PP_LEVEL: if(!sh->context) return CONTROL_ERROR; DS_VideoDecoder_SetValue(sh->context,"Quality",*((int*)arg)); return CONTROL_OK; case VDCTRL_SET_EQUALIZER: { va_list ap; int value; va_start(ap, arg); value=va_arg(ap, int); va_end(ap); if(DS_VideoDecoder_SetValue(sh->context,arg,50+value/2)==0) return CONTROL_OK; return CONTROL_FALSE; } } return CONTROL_UNKNOWN;}// init driverstatic int init(sh_video_t *sh){ unsigned int out_fmt; /* Hack for VSSH codec: new dll can't decode old files * In my samples old files have no extradata, so use that info * to decide what dll should be used (here and in vd_vfw). */ if (!strcmp(sh->codec->dll, "vsshdsd.dll") && (sh->bih->biSize == 40)) return 0; if(!(sh->context=DS_VideoDecoder_Open(sh->codec->dll,&sh->codec->guid, sh->bih, 0, 0))){ mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingDLLcodec,sh->codec->dll); mp_msg(MSGT_DECVIDEO,MSGL_HINT,MSGTR_DownloadCodecPackage); return 0; } if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YUY2)) return 0; out_fmt=sh->codec->outfmt[sh->outfmtidx]; switch(out_fmt){ case IMGFMT_YUY2: case IMGFMT_UYVY: DS_VideoDecoder_SetDestFmt(sh->context,16,out_fmt);break; // packed YUV case IMGFMT_YV12: case IMGFMT_I420: case IMGFMT_IYUV: DS_VideoDecoder_SetDestFmt(sh->context,12,out_fmt);break; // planar YUV case IMGFMT_YVU9: DS_VideoDecoder_SetDestFmt(sh->context,9,out_fmt);break; default: DS_VideoDecoder_SetDestFmt(sh->context,out_fmt&255,0); // RGB/BGR } DS_SetAttr_DivX("Quality",divx_quality); DS_VideoDecoder_StartInternal(sh->context); mp_msg(MSGT_DECVIDEO,MSGL_V,MSGTR_DShowInitOK); return 1;}// uninit driverstatic void uninit(sh_video_t *sh){ DS_VideoDecoder_Destroy(sh->context);}//mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);// decode a framestatic mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ mp_image_t* mpi; if(len<=0) return NULL; // skipped frame if(flags&3){ // framedrop: DS_VideoDecoder_DecodeInternal(sh->context, data, len, 0, 0); return NULL; } mpi=mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, 0 /*MP_IMGFLAG_ACCEPT_STRIDE*/, sh->disp_w, sh->disp_h); if(!mpi){ // temporary! mp_msg(MSGT_DECVIDEO,MSGL_WARN,MSGTR_MPCODECS_CouldntAllocateImageForCinepakCodec); return NULL; } DS_VideoDecoder_DecodeInternal(sh->context, data, len, 0, mpi->planes[0]); return mpi;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?