Mercurial > mplayer.hg
view libmpcodecs/vd_vfw.c @ 7194:6df5abe8d967
fix flip handling bug
author | alex |
---|---|
date | Sat, 31 Aug 2002 13:29:26 +0000 |
parents | 28677d779205 |
children | b4d025d64eb3 |
line wrap: on
line source
#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 = { "Win32/VfW video codecs", "vfw", "A'rpi", "based on http://avifile.sf.net", "win32 codecs" }; LIBVD_EXTERN(vfw) // 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,0)) 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, 0); } // 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,0))){ 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