From 0ed51b294c45f484bae2b888c12776fa363414fb Mon Sep 17 00:00:00 2001 From: arpi Date: Thu, 28 Feb 2002 00:57:30 +0000 Subject: libmpcodecs core - initial version git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4879 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpcodecs/vd.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 libmpcodecs/vd.c (limited to 'libmpcodecs/vd.c') diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c new file mode 100644 index 0000000000..5ee42d3af6 --- /dev/null +++ b/libmpcodecs/vd.c @@ -0,0 +1,96 @@ +#include +#include +#include + +#include "config.h" +#include "mp_msg.h" + +#ifdef HAVE_MALLOC_H +#include +#endif + +#include "codec-cfg.h" +//#include "mp_image.h" + +#include "../libvo/img_format.h" + +#include "stream.h" +#include "demuxer.h" +#include "stheader.h" + +#include "vd.h" +//#include "vd_internal.h" + +extern vd_functions_t mpcodecs_vd_null; + +vd_functions_t* mpcodecs_vd_drivers[] = { + &mpcodecs_vd_null, + NULL +}; + +int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int preferred_outfmt){ + + return 1; +} + +static mp_image_t* static_images[2]; +static mp_image_t* temp_images[1]; +static int static_idx=0; + +// mp_imgtype: buffering type, see mp_image.h +// mp_imgflag: buffer requirements (read/write, preserve, stride limits), see mp_image.h +// returns NULL or allocated mp_image_t* +// Note: buffer allocation may be moved to mpcodecs_config_vo() later... +mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h){ + mp_image_t* mpi=NULL; + // Note: we should call libvo first to check if it supports direct rendering + // and if not, then fallback to software buffers: + switch(mp_imgtype){ + case MP_IMGTYPE_EXPORT: + mpi=new_mp_image(w,h); + break; + case MP_IMGTYPE_STATIC: + if(!static_images[0]) static_images[0]=new_mp_image(w,h); + mpi=static_images[0]; + break; + case MP_IMGTYPE_TEMP: + if(!temp_images[0]) temp_images[0]=new_mp_image(w,h); + mpi=temp_images[0]; + break; + case MP_IMGTYPE_IPB: + if(!(mp_imgflag&MP_IMGFLAG_READABLE)){ // B frame: + if(!temp_images[0]) temp_images[0]=new_mp_image(w,h); + mpi=temp_images[0]; + break; + } + case MP_IMGTYPE_IP: + if(!static_images[static_idx]) static_images[static_idx]=new_mp_image(w,h); + mpi=static_images[static_idx]; + static_idx^=1; + break; + } + if(mpi){ + mpi->type=mp_imgtype; + mpi->flags&=~(MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE); + mpi->flags|=mp_imgflag&(MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE); + if(!mpi->bpp){ + mp_image_setfmt(mpi,sh->codec->outfmt[sh->outfmtidx]); + if(!(mpi->flags&(MP_IMGFLAG_ALLOCATED|MP_IMGFLAG_DIRECT)) + && mpi->type>MP_IMGTYPE_EXPORT){ + // non-direct and not yet allocaed image. allocate it! + printf("*** Allocating mp_image_t, %d bytes\n",mpi->bpp*mpi->width*mpi->height/8); + mpi->planes[0]=memalign(64, mpi->bpp*mpi->width*mpi->height/8); + if(!mpi->stride[0]) mpi->stride[0]=mpi->width; + if(mpi->flags&MP_IMGFLAG_PLANAR){ + // YV12/I420. feel free to add other planar formats here... + if(!mpi->stride[1]) mpi->stride[1]=mpi->stride[2]=mpi->width/2; + mpi->planes[1]=mpi->planes[0]+mpi->width*mpi->height; + mpi->planes[2]=mpi->planes[1]+mpi->width*mpi->height/4; + } + mpi->flags|=MP_IMGFLAG_ALLOCATED; + } + } + } + return mpi; +} + -- cgit v1.2.3