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\
+};
+