Mercurial > mplayer.hg
diff libmpcodecs/vd_vfwex.c @ 7175:f8b147aab1a5
vfwex separated from vfw, to work with new vfm system and dlopen
author | arpi |
---|---|
date | Fri, 30 Aug 2002 20:47:18 +0000 |
parents | |
children | 42222161de9b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/vd_vfwex.c Fri Aug 30 20:47:18 2002 +0000 @@ -0,0 +1,91 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "config.h" +#ifdef USE_WIN32DLL + +#include "mp_msg.h" +#include "help_mp.h" + +#include "vd_internal.h" + +#include "dll_init.h" + +static vd_info_t info_vfwex = { + "Win32/VfWex video codecs", + "vfwex", + VFM_VFWEX, + "A'rpi", + "based on http://avifile.sf.net", + "win32 codecs" +}; + +LIBVD_EXTERN(vfwex) + +// to set/get/query special features/parameters +static int control(sh_video_t *sh,int cmd,void* arg,...){ + switch(cmd){ + case VDCTRL_QUERY_MAX_PP_LEVEL: + return 9; + case VDCTRL_SET_PP_LEVEL: + vfw_set_postproc(sh,10*(*((int*)arg))); + return CONTROL_OK; + } + return CONTROL_UNKNOWN; +} + +// init driver +static int init(sh_video_t *sh){ + if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YUY2)) return 0; + if(!init_vfw_video_codec(sh,1)) return 0; + mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Win32 video codec init OK!\n"); + return 1; +} + +// uninit driver +static void uninit(sh_video_t *sh){ + vfw_close_video_codec(sh, 1); +} + +//mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); + +// decode a frame +static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ + mp_image_t* mpi; + int ret; + if(len<=0) return NULL; // skipped frame + + mpi=mpcodecs_get_image(sh, + (sh->codec->outflags[sh->outfmtidx] & CODECS_FLAG_STATIC) ? + MP_IMGTYPE_STATIC : MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_WIDTH, + sh->disp_w, sh->disp_h); + if(!mpi){ // temporary! + printf("couldn't allocate image for cinepak codec\n"); + return NULL; + } + + // set buffer: + sh->our_out_buffer=mpi->planes[0]; + + // set stride: (trick discovered by Andreas Ackermann - thanx!) + sh->bih->biWidth=mpi->width; //mpi->stride[0]/(mpi->bpp/8); + sh->o_bih.biWidth=mpi->width; //mpi->stride[0]/(mpi->bpp/8); + + if((ret=vfw_decode_video(sh,data,len,flags&3,1))){ + mp_msg(MSGT_DECVIDEO,MSGL_WARN,"Error decompressing frame, err=%d\n",ret); + return NULL; + } + + if(mpi->imgfmt==IMGFMT_RGB8 || mpi->imgfmt==IMGFMT_BGR8){ + // export palette: +// FIXME: sh->o_bih is cutted down to 40 bytes!!! +// if(sh->o_bih->biSize>40) +// mpi->planes[1]=((unsigned char*)&sh->o_bih)+40; +// else + mpi->planes[1]=NULL; + } + + return mpi; +} + +#endif