Sophie

Sophie

distrib > * > 2008.0 > x86_64 > by-pkgid > ecbfffd53099d296aa3be64531b34419 > files > 7

mplayer-1.0-1.rc1.20.6mdv2008.0.src.rpm

diff -ruN MPlayer-1.0rc1/configure MPlayer-1.0rc1-dirac/configure
--- MPlayer-1.0rc1/configure	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/configure	2007-03-30 16:23:01.369849250 +0100
@@ -318,7 +318,7 @@
   --enable-demuxer=DEMUXER  enable specified FFmpeg demuxer
   --disable-muxer=MUXER     disable specified FFmpeg muxer
   --enable-muxer=MUXER      enable specified FFmpeg muxer
-  
+  --enable-dirac         build with Dirac support [autodetect] 
 Video output:
   --disable-vidix-internal disable internal VIDIX [for x86 *nix]
   --disable-vidix-external disable external VIDIX [for x86 *nix]
@@ -1533,7 +1533,7 @@
 # Checking for CFLAGS
 _stripbinaries=yes
 if test "$_profile" != "" || test "$_debug" != "" ; then
-  CFLAGS="-W -Wall -O2 $_march $_mcpu $_debug $_profile"
+  CFLAGS="-W -Wall -O0 $_march $_mcpu $_debug $_profile"
   if test "$_cc_major" -ge "3" ; then
     CFLAGS=`echo "$CFLAGS" | sed -e 's/\(-Wall\)/\1 -Wno-unused-parameter/'`
   fi
@@ -1724,6 +1724,7 @@
 _ass=auto
 _rpath=no
 _asmalign_pot=auto
+_dirac=auto
 for ac_option do
   case "$ac_option" in
   # Skip 1st pass
@@ -2073,6 +2074,9 @@
   --enable-sortsub) _sortsub=yes ;;
   --disable-sortsub) _sortsub=no ;;
 
+  --enable-dirac) _dirac=yes ;;
+  --disable-dirac) _dirac=no ;;
+
   --charset=*)
     _charset=`echo $ac_option | cut -d '=' -f 2`
     ;;
@@ -7427,6 +7431,53 @@
 echores "$_maemo"
 fi
 
+echocheck "Dirac support (version 6.x!)"
+if test "$_dirac" = auto ; then
+  _dirac=no
+  cat > $TMPC << EOF
+#include <libdirac_decoder/dirac_parser.h>
+#include <string.h>
+int main(void) 
+{ 
+  /* dirac is in flux, make sure that all interface routines and 
+   * datatypes exist and work the way we expect it, so we don't break
+   * mplayer */
+  dirac_decoder_t *decoder;
+  unsigned char *yuv[3];
+  char buffer[1024];
+  dirac_chroma_t chroma;
+  dirac_frame_type_t frame;
+  dirac_seqparams_t seq_params;
+  dirac_frameparams_t frame_params;
+  dirac_framebuf_t frame_buf;
+  DecoderState state;
+
+  decoder = dirac_decoder_init(0);
+
+  /* we don't want to execute this kind of nonsense; just for making sure
+   * that compilation works... */
+  memset(&buffer, 0, sizeof(buffer));
+  dirac_buffer (decoder, buffer, buffer + sizeof(buffer));
+  state = dirac_parse (decoder);
+  dirac_set_buf (decoder, yuv, NULL);
+  dirac_skip(decoder, 1);
+  dirac_decoder_close(decoder);
+  return 0;
+}
+EOF
+  cc_check `pkg-config --cflags dirac` `pkg-config --libs dirac` -lstdc++ && _dirac=yes
+fi
+if test "$_dirac" = yes ; then
+  _def_dirac='#define HAVE_DIRAC 1'
+  _codecmodules="libdirac $_codecmodules"
+  _inc_dirac=`pkg-config --cflags dirac`
+  _ld_dirac="`pkg-config --libs dirac` -lstdc++"
+else
+  _def_dirac='#undef HAVE_DIRAC'
+  _nocodecmodules="libdirac $_nocodecmodules"
+fi
+echores "$_dirac"
+
 #############################################################################
 echo "Creating config.mak"
 cat > config.mak << EOF
@@ -7644,6 +7695,9 @@
 CONFIG_MUXERS=$_mencoder
 RADIO=$_radio
 RADIO_CAPTURE=$_radio_capture
+LIBDIRAC = $_dirac
+DIRAC_LIB = $_ld_dirac
+DIRAC_INC = $_inc_dirac
 
 # --- Some stuff for autoconfigure ----
 $_target_arch
@@ -8265,6 +8319,9 @@
 /* enable FAAC (AAC encoder) support */
 $_def_faac
 
+/* enable Dirac support */
+$_def_dirac
+
 /* enable LADSPA plugin support */
 $_def_ladspa
 
diff -ruN MPlayer-1.0rc1/etc/codecs.conf MPlayer-1.0rc1-dirac/etc/codecs.conf
--- MPlayer-1.0rc1/etc/codecs.conf	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/etc/codecs.conf	2007-03-30 17:15:08.637291250 +0100
@@ -288,6 +288,16 @@
   dll libtheora
   out YV12
 
+videocodec dirac
+  info "Dirac (libdirac_decoder)"
+  comment "work in progress"
+  status working
+  fourcc drac
+  format 0x20000001
+  driver dirac
+;  dll "libmpeg2"
+  out I420,422P
+
 ; prefer native codecs over win32?
 ; the win32 codecs probably are (better) optimized and support direct
 ; rendering, so this may be not the best idea...
diff -ruN MPlayer-1.0rc1/libmpcodecs/Makefile MPlayer-1.0rc1-dirac/libmpcodecs/Makefile
--- MPlayer-1.0rc1/libmpcodecs/Makefile	2006-10-22 23:32:24.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpcodecs/Makefile	2007-03-30 16:06:47.817006000 +0100
@@ -114,6 +114,9 @@
 ifeq ($(ZORAN),yes)
 VIDEO_SRCS+=vd_zrmjpeg.c
 endif
+ifeq ($(LIBDIRAC),yes)
+VIDEO_SRCS+=vd_dirac.c
+endif
 
 
 VFILTER_SRCS=vf.c \
@@ -324,6 +327,7 @@
           -I../stream \
           -I../loader \
           $(LIBAV_INC) \
+          $(DIRAC_INC) \
           $(OPTFLAGS) \
           -D_GNU_SOURCE \
 
diff -ruN MPlayer-1.0rc1/libmpcodecs/vd.c MPlayer-1.0rc1-dirac/libmpcodecs/vd.c
--- MPlayer-1.0rc1/libmpcodecs/vd.c	2006-10-22 23:32:24.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpcodecs/vd.c	2007-03-30 14:25:29.601141250 +0100
@@ -50,6 +50,7 @@
 extern vd_functions_t mpcodecs_vd_libdv;
 extern vd_functions_t mpcodecs_vd_lzo;
 extern vd_functions_t mpcodecs_vd_qtvideo;
+extern vd_functions_t mpcodecs_vd_dirac;
 
 vd_functions_t* mpcodecs_vd_drivers[] = {
         &mpcodecs_vd_null,
@@ -99,6 +100,9 @@
 #if defined(USE_QTX_CODECS) || defined(MACOSX)
 	&mpcodecs_vd_qtvideo,
 #endif
+#ifdef HAVE_DIRAC 
+	&mpcodecs_vd_dirac,
+#endif
 	NULL
 };
 
diff -ruN MPlayer-1.0rc1/libmpcodecs/vd_dirac.c MPlayer-1.0rc1-dirac/libmpcodecs/vd_dirac.c
--- MPlayer-1.0rc1/libmpcodecs/vd_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpcodecs/vd_dirac.c	2007-03-30 17:12:05.481844750 +0100
@@ -0,0 +1,171 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+#ifdef HAVE_DIRAC
+#include "mp_msg.h"
+
+#include "vd_internal.h"
+
+static vd_info_t info = 
+{
+	"Dirac Video decoder v0.6.x",
+	"dirac",
+	"Dirac <dirac@rd.bbc.co.uk",
+	"Dirac",
+	"native"
+};
+
+LIBVD_EXTERN(dirac)
+#include <libdirac_decoder/dirac_parser.h>
+
+// to set/get/query special features/parameters
+static int control(sh_video_t *sh,int cmd,void* arg,...)
+{
+	return CONTROL_UNKNOWN;
+}
+
+// init driver
+static int init(sh_video_t *sh)
+{
+	dirac_decoder_t *diracdec ;
+
+	/*
+	* initialise cpu acceleration stuff when we have it in Dirac
+	*/
+
+	/*
+	* initialise decoder
+	*/
+	diracdec = dirac_decoder_init(verbose > 4);
+
+	if (!diracdec)
+		return 0;
+
+	sh->context = diracdec;
+
+	return 1;
+}
+
+// uninit driver
+static void uninit(sh_video_t *sh)
+{
+	dirac_decoder_t *diracdec = sh->context;
+	if (diracdec)
+		dirac_decoder_close (diracdec);
+}
+
+// decode a frame
+static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags)
+{
+	dirac_decoder_t *diracdec = sh->context;
+	mp_image_t* mpi=NULL;
+	int drop_frame, framedrop=flags&3;
+	unsigned char *buf[3];
+
+
+	if(len<=0) return 0; // skipped null frame
+
+	dirac_buffer (diracdec, data, data+len);
+
+	while (1)
+	{
+		DecoderState state = dirac_parse (diracdec);
+
+		switch (state)
+		{
+		case STATE_BUFFER:
+			return 0;
+
+		case STATE_SEQUENCE:
+			mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_SEQUENCE width=%d height=%d\n", diracdec->seq_params.width, diracdec->seq_params.height);
+			if (diracdec->seq_params.chroma == format422)
+			{
+				if(!mpcodecs_config_vo(sh, 
+					diracdec->seq_params.width, 
+					diracdec->seq_params.height, 
+					IMGFMT_422P))
+					return 0;
+			}
+			else
+			{
+				if(!mpcodecs_config_vo(sh, 
+					diracdec->seq_params.width, 
+					diracdec->seq_params.height, 
+					IMGFMT_I420))
+					return 0;
+			}
+			buf[0] = (unsigned char *)malloc (diracdec->seq_params.width * diracdec->seq_params.height);
+			buf[1] = (unsigned char *)malloc (diracdec->seq_params.chroma_width * diracdec->seq_params.chroma_height);
+			buf[2] = (unsigned char *)malloc (diracdec->seq_params.chroma_width * diracdec->seq_params.chroma_height);
+
+			if (!buf[0] || !buf[1] || !buf[2])
+			{
+				free(buf[0]);
+				free(buf[1]);
+				free(buf[2]);
+				return 0;
+			}
+			dirac_set_buf(diracdec, buf, mpi);
+			break;
+	
+		case STATE_SEQUENCE_END:
+			mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_SEQUENCE_END\n");
+			free (diracdec->fbuf->buf[0]);
+			free (diracdec->fbuf->buf[1]);
+			free (diracdec->fbuf->buf[2]);
+			break;
+	
+		case STATE_PICTURE_AVAIL:
+			mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_PICTURE_AVAIL fnum=%d ftype=%s reftype=%s\n", 
+			diracdec->frame_params.fnum, 
+			diracdec->frame_params.ftype == INTER_FRAME ? "INTER" : 
+					"INTRA_FRAME",
+			diracdec->frame_params.rtype == REFERENCE_FRAME ? "REF" : 
+					"NON_REF");
+			mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, sh->disp_w, sh->disp_h);
+			if (mpi)
+			{
+				mpi->planes[0] = diracdec->fbuf->buf[0];
+				mpi->stride[0] = diracdec->seq_params.width;
+				mpi->planes[1] = diracdec->fbuf->buf[1];
+				mpi->stride[1] = diracdec->seq_params.chroma_width;
+				mpi->planes[2] = diracdec->fbuf->buf[2];
+				mpi->stride[2] = diracdec->seq_params.chroma_width;
+				return mpi;
+			}
+		case STATE_PICTURE_START:
+			mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_PICTURE_START fnum=%d ftype=%s\n", 
+			diracdec->frame_params.fnum, 
+			diracdec->frame_params.ftype == INTER_FRAME ? "INTER" : 
+					"INTRA_FRAME",
+			diracdec->frame_params.rtype == REFERENCE_FRAME ? "REF" : 
+					"NON_REF");
+			sh->pts =  (diracdec->frame_params.fnum+1)*sh->frametime;
+			drop_frame = framedrop && (diracdec->frame_params.ftype == INTER_FRAME && diracdec->frame_params.rtype == NON_REFERENCE_FRAME);
+			drop_frame |= framedrop>=2;
+			if (drop_frame)
+			{
+				mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"      Skipping frame\n");
+				dirac_skip(diracdec, 1);
+			}
+			else
+				dirac_skip(diracdec, 0);
+			break;
+		
+		case STATE_INVALID:
+			mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_INVALID");
+			free (diracdec->fbuf->buf[0]);
+			free (diracdec->fbuf->buf[1]);
+			free (diracdec->fbuf->buf[2]);
+			return 0;
+			break;
+
+		default:
+			break;
+		}
+	}
+	return 0;
+}
+
+#endif
diff -ruN MPlayer-1.0rc1/libmpdemux/demux_dirac.c MPlayer-1.0rc1-dirac/libmpdemux/demux_dirac.c
--- MPlayer-1.0rc1/libmpdemux/demux_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/demux_dirac.c	2007-03-30 17:00:37.098823500 +0100
@@ -0,0 +1,170 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+#include "config.h"
+
+#ifdef HAVE_DIRAC
+#include "mp_msg.h"
+#include "help_mp.h"
+
+#include "stream.h"
+#include "demuxer.h"
+#include "stheader.h"
+
+#include <libdirac_decoder/dirac_parser.h>
+
+
+
+static int dirac_check_file(struct demuxer_st *demuxer)
+{
+	unsigned char tmp_buffer[4096];
+	int bytes_read;
+	dirac_decoder_t *diracdec;
+	DecoderState state;
+	int ret_stat = 0;
+
+	mp_msg(MSGT_DEMUX,MSGL_V,"Checking for Dirac\n");
+	diracdec = dirac_decoder_init(verbose);
+
+	if (diracdec ==NULL)
+		return 0;
+
+	while(1)
+	{
+		bytes_read = stream_read(demuxer->stream,tmp_buffer, 4096);
+		if (bytes_read == 0)
+			break;
+		dirac_buffer (diracdec, tmp_buffer, tmp_buffer + bytes_read);
+
+		state = dirac_parse (diracdec);
+		switch (state)
+		{
+		case STATE_BUFFER:
+			break;
+
+		case STATE_SEQUENCE:
+			ret_stat = DEMUXER_TYPE_DIRAC;
+			break;
+
+		default:
+			break;
+
+		}
+		if (ret_stat)
+			break;
+	}
+
+	dirac_decoder_close(diracdec);
+	stream_reset(demuxer->stream);
+	stream_seek(demuxer->stream, 0);
+
+	return ret_stat;
+}
+
+static struct demuxer_st* demux_open_dirac(struct demuxer_st *demuxer)
+{
+	unsigned char tmp_buffer[4096];
+	int bytes_read;
+	dirac_decoder_t *diracdec;
+	DecoderState state;
+	int ret_stat = 0;
+
+	mp_msg(MSGT_DEMUX,MSGL_V,"Opening Dirac stream\n");
+	diracdec = dirac_decoder_init(verbose);
+	if (diracdec ==NULL)
+		return NULL;
+
+	stream_reset(demuxer->stream);
+	stream_seek(demuxer->stream, 0);
+	
+
+	while(1)
+	{
+		bytes_read = stream_read(demuxer->stream,tmp_buffer, 4096);
+		if (bytes_read == 0)
+			break;
+		dirac_buffer (diracdec, tmp_buffer, tmp_buffer + bytes_read);
+
+		state = dirac_parse (diracdec);
+		switch (state)
+		{
+		case STATE_BUFFER:
+			break;
+
+		case STATE_SEQUENCE:
+			ret_stat = 1;
+			break;
+
+		default:
+			break;
+
+		}
+		if (ret_stat)
+			break;
+	}
+	if (ret_stat)
+	{
+		sh_video_t *sh_video = new_sh_video(demuxer, 0);
+		/* FIXME: set seekable to 1 after including code for seek */
+		demuxer->seekable = 0;
+		demuxer->video->sh = sh_video;
+		sh_video->ds = demuxer->video;
+		/* FIXME: defined in codecs.conf. Do we need to get a unique
+		 * number from somebody!!!
+		 */
+		sh_video->format = 0x20000001;
+		sh_video->disp_w = diracdec->seq_params.width;
+		sh_video->disp_h = diracdec->seq_params.height;
+		sh_video->fps = diracdec->src_params.frame_rate.numerator / 
+		                diracdec->src_params.frame_rate.denominator;
+		sh_video->frametime = 1.0/sh_video->fps;
+	}
+
+	dirac_decoder_close(diracdec);
+	stream_reset(demuxer->stream);
+	stream_seek(demuxer->stream, 0);
+
+	return demuxer;
+}
+
+static int demux_dirac_fill_buffer(struct demuxer_st *demuxer, demux_stream_t *dsds)
+{
+	demux_packet_t* dp_video=NULL;
+	unsigned char tmp_buffer[4096];
+
+	int bytes_read;
+	bytes_read = stream_read(demuxer->stream,tmp_buffer, 4096);
+	if (bytes_read)
+	{
+		dp_video=new_demux_packet(bytes_read);
+		memmove(dp_video->buffer, tmp_buffer, bytes_read);
+		dp_video->flags=0;
+		dp_video->pos=stream_tell(demuxer->stream);
+		ds_add_packet(demuxer->video,dp_video);
+		return 1;
+	}
+	return 0;
+}
+
+static void demux_close_dirac(struct demuxer_st* demuxer)
+{
+	return;
+}
+
+demuxer_desc_t demuxer_desc_dirac = {
+    "Dirac Demuxer",
+	"dirac",
+	"Dirac",
+	"Anuradha Suraparaju",
+	"",
+	DEMUXER_TYPE_DIRAC,
+	1,
+	dirac_check_file,
+	demux_dirac_fill_buffer,
+	demux_open_dirac,
+	demux_close_dirac,
+	NULL,
+	NULL
+};
+#endif
diff -ruN MPlayer-1.0rc1/libmpdemux/demuxer.c MPlayer-1.0rc1-dirac/libmpdemux/demuxer.c
--- MPlayer-1.0rc1/libmpdemux/demuxer.c	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/demuxer.c	2007-03-30 14:45:08.142795500 +0100
@@ -65,6 +65,8 @@
 extern demuxer_desc_t demuxer_desc_lavf;
 extern demuxer_desc_t demuxer_desc_aac;
 extern demuxer_desc_t demuxer_desc_nut;
+extern demuxer_desc_t demuxer_desc_avs;
+extern demuxer_desc_t demuxer_desc_dirac;
 
 demuxer_desc_t* demuxer_list[] = {
   &demuxer_desc_rawaudio,
@@ -125,6 +127,9 @@
 #ifdef HAVE_XMMS
   &demuxer_desc_xmms,
 #endif
+#ifdef HAVE_DIRAC
+  &demuxer_desc_dirac,
+#endif
   NULL
 };
 
diff -ruN MPlayer-1.0rc1/libmpdemux/demuxer.h MPlayer-1.0rc1-dirac/libmpdemux/demuxer.h
--- MPlayer-1.0rc1/libmpdemux/demuxer.h	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/demuxer.h	2007-03-30 14:31:57.837404500 +0100
@@ -55,11 +55,12 @@
 #define DEMUXER_TYPE_MPEG_PES 41
 #define DEMUXER_TYPE_MPEG_GXF 42
 #define DEMUXER_TYPE_NUT 43
+#define DEMUXER_TYPE_DIRAC 44
 
 // This should always match the higest demuxer type number.
 // Unless you want to disallow users to force the demuxer to some types
 #define DEMUXER_TYPE_MIN 0
-#define DEMUXER_TYPE_MAX 43
+#define DEMUXER_TYPE_MAX 44
 
 #define DEMUXER_TYPE_DEMUXERS (1<<16)
 // A virtual demuxer type for the network code
diff -ruN MPlayer-1.0rc1/libmpdemux/Makefile MPlayer-1.0rc1-dirac/libmpdemux/Makefile
--- MPlayer-1.0rc1/libmpdemux/Makefile	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/Makefile	2007-03-30 16:06:25.407605500 +0100
@@ -71,6 +71,10 @@
 ifeq ($(WIN32DLL),yes)
 SRCS += demux_avs.c
 endif
+ifeq ($(LIBDIRAC),yes)
+SRCS += demux_dirac.c
+SRCS += parse_dirac.c
+endif
 
 # Muxers
 MUXERS = muxer.c \
@@ -107,7 +111,7 @@
 OBJS	= $(SRCS:.c=.o)
 OBJS   += $(CPLUSPLUSSRCS:.cpp=.o)
 INCLUDE = -I.. -I../stream -I../loader $(LIBAV_INC)
-CFLAGS  = $(INCLUDE) $(OPTFLAGS)
+CFLAGS  = $(INCLUDE) $(OPTFLAGS) $(DIRAC_INC)
 CPLUSPLUSFLAGS  = $(CFLAGS) -D__STDC_LIMIT_MACROS
 CPLUSPLUS = $(CC)
 
diff -ruN MPlayer-1.0rc1/libmpdemux/parse_dirac.c MPlayer-1.0rc1-dirac/libmpdemux/parse_dirac.c
--- MPlayer-1.0rc1/libmpdemux/parse_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/parse_dirac.c	2007-03-30 15:01:56.413808500 +0100
@@ -0,0 +1,154 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "config.h"
+#include "mp_msg.h"
+#include "help_mp.h"
+
+#include "stream.h"
+#include "demuxer.h"
+#include "parse_dirac.h"
+
+#define DIRAC_VIDEOBUFFER_SIZE 0x100000
+
+static unsigned char* dirac_videobuffer = 0;
+static int dirac_videobuf_len =0;
+static unsigned char dirac_videobuf_code[5];
+static int dirac_videobuf_code_len = 0;
+
+int dirac_sync_video_packet (demux_stream_t *ds)
+{
+	int skipped = 0;
+	dirac_videobuf_len = 0;
+	while(dirac_videobuf_code_len<5)
+	{
+		dirac_videobuf_code[dirac_videobuf_code_len++]=demux_getc(ds);
+		memmove (dirac_videobuffer, dirac_videobuf_code, 5);
+		dirac_videobuf_len = 5;
+	}
+	while (1)
+	{
+		int c;
+		if(dirac_videobuf_code[0]==0x42 && dirac_videobuf_code[1]==0x42 && dirac_videobuf_code[2]==0x43 && dirac_videobuf_code[3]==0x44)
+		{
+			break;
+		}
+		++skipped;
+		dirac_videobuffer[0] = dirac_videobuf_code[0]=dirac_videobuf_code[1];
+		dirac_videobuffer[1] = dirac_videobuf_code[1]=dirac_videobuf_code[2];
+		dirac_videobuffer[2] = dirac_videobuf_code[2]=dirac_videobuf_code[3];
+		dirac_videobuffer[3] = dirac_videobuf_code[3]=dirac_videobuf_code[4];
+		c = demux_getc(ds);
+		if (c < 0 )
+			return c;
+		dirac_videobuffer[4] = dirac_videobuf_code[4]=c;
+		dirac_videobuf_len = 5;
+	}
+	return dirac_videobuf_code[4];
+}
+
+// Access unit header = 0x00
+// Intra_Ref start = 0x0C
+// Intra_NonRef start = 0x08
+// Inter_Ref_1Ref start = 0x0D
+// Inter_Ref_2Ref start = 0x0E
+// Inter_NonRef_1Ref start = 0x09
+// Inter_NonRef_2Ref start = 0x0A
+// End of sequence = 0x10
+#define FRAME_START(c) ((c) == 0x00 || (c) == 0x0C || (c) == 0x08 || (c) == 0x0D || (c) == 0x0E || (c) == 0x09 || (c) == 0x0A || (c) == 0x10)
+
+int dirac_read_video_frame (demux_stream_t *ds, unsigned char** start)
+{
+	int in_frame = 0;
+	unsigned int shift = 0xffffffff;
+	int msg_type = 0xFF;
+
+
+	if (!dirac_videobuffer)
+	{
+		dirac_videobuffer = (unsigned char *)malloc(DIRAC_VIDEOBUFFER_SIZE);
+		if(!dirac_videobuffer)
+		{
+			mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail);
+			return 0;
+		}
+	}
+
+	*start = dirac_videobuffer;
+
+	/*while (msg_type != 0 && msg_type == 0xFF)*/
+	msg_type = dirac_sync_video_packet(ds);
+
+	if (msg_type == -1)
+		return -1;
+
+
+	/* find start of frame */
+	while (!in_frame)
+	{
+		int byte;
+		if (FRAME_START(msg_type))
+		{
+			in_frame = 1;
+			break;
+		}
+	
+		byte = demux_getc(ds);
+		if (byte < 0)
+		{
+			dirac_videobuf_code_len = 0;
+			if (dirac_videobuf_len)
+				return dirac_videobuf_len;
+			else
+				return -1;
+		}
+
+		dirac_videobuffer[dirac_videobuf_len++] = byte;
+		if (shift == 0x42424344)
+		{
+			if (FRAME_START(byte))
+			{
+				in_frame = 1;
+				break;
+			}
+		}
+		shift = (shift << 8 ) | byte;
+	}
+
+	/* find end of frame */
+	shift = 0xffffffff;
+	dirac_videobuf_code_len = 0;
+	while (in_frame)
+	{
+		int byte;
+		byte = demux_getc(ds);
+		if (byte < 0)
+			return dirac_videobuf_len;
+
+		dirac_videobuffer[dirac_videobuf_len++] = byte;
+		if (shift == 0x42424344)
+		{
+			if (byte != 0xFF)
+			{
+				in_frame = 0;
+				dirac_videobuf_code_len = 5;
+				dirac_videobuf_code[0] = 0x42;
+				dirac_videobuf_code[1] = 0x42;
+				dirac_videobuf_code[2] = 0x43;
+				dirac_videobuf_code[3] = 0x44;
+				dirac_videobuf_code[4] = byte;
+				break;
+			}
+		}
+		shift = (shift << 8 ) | byte;
+	}
+	//return dirac_videobuf_len - dirac_videobuf_code_len;
+	return dirac_videobuf_len;
+}
+
+/* TODO: */
+int dirac_skip_video_frame(demux_stream_t *ds)
+{
+	return 0;
+}
diff -ruN MPlayer-1.0rc1/libmpdemux/parse_dirac.h MPlayer-1.0rc1-dirac/libmpdemux/parse_dirac.h
--- MPlayer-1.0rc1/libmpdemux/parse_dirac.h	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/parse_dirac.h	2007-03-30 15:01:56.413808500 +0100
@@ -0,0 +1,10 @@
+
+#define MAX_VIDEO_PACKET_SIZE (224*1024+4)
+#define VIDEOBUFFER_SIZE 0x100000
+
+// return: packet length. set *start to start of packet
+int dirac_read_video_frame(demux_stream_t *ds, unsigned char **start);
+
+// return: next packet code
+int dirac_skip_video_frame(demux_stream_t *ds);
+
diff -ruN MPlayer-1.0rc1/libmpdemux/video.c MPlayer-1.0rc1-dirac/libmpdemux/video.c
--- MPlayer-1.0rc1/libmpdemux/video.c	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/libmpdemux/video.c	2007-03-30 15:09:14.273173000 +0100
@@ -17,6 +17,7 @@
 #include "demuxer.h"
 #include "stheader.h"
 #include "parse_es.h"
+#include "parse_dirac.h"
 #include "mpeg_hdr.h"
 
 /* sub_cc (closed captions)*/
@@ -548,6 +549,8 @@
 	*start=videobuffer; in_size=videobuf_len;
 	videobuf_len=0;
 
+  } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC){
+        in_size = dirac_read_video_frame(d_video, start);
   } else {
       // frame-based file formats: (AVI,ASF,MOV)
     in_size=ds_get_packet(d_video,start);
@@ -639,6 +642,8 @@
 	    }
 	}
 //	printf("\rIII pts: %5.3f [%d] (%5.3f)   \n",d_video->pts2,picture_coding_type,i_pts);
+    } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC){
+	     sh_video->pts+=frame_time;
     } else
 	sh_video->pts=d_video->pts;
     
diff -ruN MPlayer-1.0rc1/Makefile MPlayer-1.0rc1-dirac/Makefile
--- MPlayer-1.0rc1/Makefile	2006-10-22 23:32:31.000000000 +0100
+++ MPlayer-1.0rc1-dirac/Makefile	2007-03-30 14:18:53.104361750 +0100
@@ -14,7 +14,7 @@
 LIBAV_INC += -I./libavcodec
 endif
 
-CFLAGS = $(OPTFLAGS) -I. $(LIBAV_INC)
+CFLAGS = $(OPTFLAGS) -I. $(LIBAV_INC) $(DIRAC_INC)
 
 #CFLAGS += -Wall
 
@@ -110,6 +110,7 @@
              $(MUSEPACK_LIB) \
              $(SPEEX_LIB) \
              $(NUT_LIB) \
+             $(DIRAC_LIB) \
 
 ifeq ($(LAVC_MP3LAME),yes)
 CODEC_LIBS += $(MP3LAME_LIB)