summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpcodecs/Makefile41
-rw-r--r--libmpcodecs/vd.c96
-rw-r--r--libmpcodecs/vd.h38
-rw-r--r--libmpcodecs/vd_internal.h16
4 files changed, 191 insertions, 0 deletions
diff --git a/libmpcodecs/Makefile b/libmpcodecs/Makefile
new file mode 100644
index 0000000000..b4e738ea06
--- /dev/null
+++ b/libmpcodecs/Makefile
@@ -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
+
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 <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;
+}
+
diff --git a/libmpcodecs/vd.h b/libmpcodecs/vd.h
new file mode 100644
index 0000000000..3436281100
--- /dev/null
+++ b/libmpcodecs/vd.h
@@ -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 */
+
diff --git a/libmpcodecs/vd_internal.h b/libmpcodecs/vd_internal.h
new file mode 100644
index 0000000000..16e8679803
--- /dev/null
+++ b/libmpcodecs/vd_internal.h
@@ -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\
+};
+