Mercurial > mplayer.hg
changeset 4878:eff8a76e515f
libmpcodecs core - initial version
author | arpi |
---|---|
date | Thu, 28 Feb 2002 00:57:30 +0000 |
parents | 9d97874d8691 |
children | 2c8ed6b32373 |
files | libmpcodecs/Makefile libmpcodecs/vd.c libmpcodecs/vd.h libmpcodecs/vd_internal.h |
diffstat | 4 files changed, 191 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/Makefile Thu Feb 28 00:57:30 2002 +0000 @@ -0,0 +1,41 @@ + +include ../config.mak + +LIBNAME = libmpcodecs.a + +SRCS=vd.c vd_null.c + +OBJS=$(SRCS:.c=.o) + +CFLAGS = -Wall $(OPTFLAGS) -I. -I.. -I../libmpdemux -I../loader $(EXTRA_INC) + +.SUFFIXES: .c .o + +# .PHONY: all clean + +.c.o: + $(CC) -c $(CFLAGS) -o $@ $< + +$(LIBNAME): $(OBJS) + $(AR) r $(LIBNAME) $(OBJS) + +all: $(LIBNAME) + +clean: + rm -f *.o *.a *~ + +distclean: + rm -f Makefile.bak *.o *.a *~ .depend + +dep: depend + +depend: + $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend + +# +# include dependency files if they exist +# +ifneq ($(wildcard .depend),) +include .depend +endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/vd.c Thu Feb 28 00:57:30 2002 +0000 @@ -0,0 +1,96 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "config.h" +#include "mp_msg.h" + +#ifdef HAVE_MALLOC_H +#include <malloc.h> +#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; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/vd.h Thu Feb 28 00:57:30 2002 +0000 @@ -0,0 +1,38 @@ +typedef struct vd_info_s +{ + /* driver name ("Matrox Millennium G200/G400" */ + const char *name; + /* short name (for config strings) ("mga") */ + const char *short_name; + /* -vfm id */ + const int id; + /* interface author/maintainer */ + const char *maintainer; + /* codec author ("Aaron Holtzman <aholtzma@ess.engr.uvic.ca>") */ + const char *author; + /* any additional comments */ + const char *comment; +} vd_info_t; + +/* interface towards mplayer and */ +typedef struct vd_functions_s +{ + vd_info_t *info; + int (*init)(sh_video_t *sh); + void (*uninit)(sh_video_t *sh); + int (*control)(sh_video_t *sh,int cmd,void* arg, ...); + mp_image_t* (*decode)(sh_video_t *sh,void* data,int len,int flags); +} vd_functions_t; + +// NULL terminated array of all drivers +extern vd_functions_t* mpcodecs_vd_drivers[]; + +#define CONTROL_OK 1 +#define CONTROL_TRUE 1 +#define CONTROL_FALSE 0 +#define CONTROL_UNKNOWN -1 +#define CONTROL_ERROR -2 +#define CONTROL_NA -3 + +#define VDCTRL_QUERY_FORMAT 3 /* test for availabilty of a format */ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpcodecs/vd_internal.h Thu Feb 28 00:57:30 2002 +0000 @@ -0,0 +1,16 @@ + +// prototypes: +static vd_info_t info; +static int control(sh_video_t *sh,int cmd,void* arg,...); +static int init(sh_video_t *sh); +static void uninit(sh_video_t *sh); +static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags); + +#define LIBVD_EXTERN(x) vd_functions_t mpcodecs_vd_##x = {\ + &info,\ + init,\ + uninit,\ + control,\ + decode\ +}; +