diff -ruN MPlayer-1.0pre6a/configure MPlayer-1.0pre6a-dirac/configure
--- MPlayer-1.0pre6a/configure	2004-12-23 15:36:00.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/configure	2005-02-15 13:07:57.000000000 +0000
@@ -220,6 +220,7 @@
   --disable-liba52       disable builtin liba52 [enabled]
   --enable-libdts        enable libdts support [autodetect]
   --disable-libmpeg2     disable builtin libmpeg2 [enabled]
+  --enable-dirac         build with Dirac support [autodetect]
   
 Video output:
   --disable-vidix        disable VIDIX [enable on x86 *nix]
@@ -1393,6 +1394,7 @@
 _inet6=auto
 _gethostbyname2=auto
 _ftp=yes
+_dirac=auto
 for ac_option do
   case "$ac_option" in
   # Skip 1st pass
@@ -1660,6 +1662,9 @@
   --enable-sortsub) _sortsub=yes ;;
   --disable-sortsub) _sortsub=no ;;
 
+  --enable-dirac) _dirac=yes ;;
+  --disable-dirac) _dirac=no ;;
+
   --language=*)
     _language=`echo $ac_option | cut -d '=' -f 2`
     ;;
@@ -6510,6 +6515,53 @@
 fi
 echores "$_lircc"
 
+echocheck "Dirac support (only the CVS version!)"
+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
@@ -6676,6 +6728,8 @@
 TOOLAME=$_toolame
 TOOLAME_EXTRAFLAGS=$_toolame_extraflags
 TOOLAME_LIB=$_toolame_lib
+DIRAC_LIB = $_ld_dirac
+DIRAC_INC = $_inc_dirac
 
 # --- Some stuff for autoconfigure ----
 $_target_arch
@@ -7206,6 +7260,9 @@
 /* enable Matroska support */
 $_def_matroska
 
+/* enable Dirac support */
+$_def_dirac
+
 /* enable FAAD (AAC) support */
 $_def_faad
 $_def_faad_internal
diff -ruN MPlayer-1.0pre6a/etc/codecs.conf MPlayer-1.0pre6a-dirac/etc/codecs.conf
--- MPlayer-1.0pre6a/etc/codecs.conf	2004-12-17 13:30:29.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/etc/codecs.conf	2005-02-15 14:01:21.000000000 +0000
@@ -205,6 +205,15 @@
   dll libtheora
   out YV12
 
+videocodec dirac
+  info "Dirac (libdirac_decoder)"
+  comment "work in progress"
+  status working
+  format 0x20000001
+  driver dirac
+;  dll "libmpeg2"
+  out IYUV,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.0pre6a/libmpcodecs/Makefile MPlayer-1.0pre6a-dirac/libmpcodecs/Makefile
--- MPlayer-1.0pre6a/libmpcodecs/Makefile	2004-12-09 13:11:21.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/libmpcodecs/Makefile	2005-02-15 13:17:41.000000000 +0000
@@ -11,7 +11,7 @@
 
 VIDEO_SRCS_LIB=vd_libmpeg2.c vd_nuv.c vd_lzo.c
 VIDEO_SRCS_NAT=vd_null.c vd_raw.c vd_hmblck.c vd_mpegpes.c vd_mtga.c vd_sgi.c
-VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_zrmjpeg.c vd_xanim.c vd_xvid.c vd_xvid4.c vd_libdv.c vd_qtvideo.c vd_theora.c
+VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_zrmjpeg.c vd_xanim.c vd_xvid.c vd_xvid4.c vd_libdv.c vd_qtvideo.c vd_theora.c vd_dirac.c
 VIDEO_SRCS=dec_video.c vd.c $(VIDEO_SRCS_NAT) $(VIDEO_SRCS_LIB) $(VIDEO_SRCS_OPT)
 
 VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_scale.c vf_format.c vf_noformat.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c vf_perspective.c vf_down3dright.c vf_field.c vf_denoise3d.c vf_hqdn3d.c vf_detc.c vf_telecine.c vf_tfields.c vf_ivtc.c vf_ilpack.c vf_dsize.c vf_decimate.c vf_softpulldown.c vf_tinterlace.c vf_pullup.c pullup.c vf_framestep.c vf_tile.c vf_delogo.c vf_fil.c vf_hue.c vf_spp.c vf_yuvcsp.c vf_filmdint.c vf_kerndeint.c vf_rgbtest.c vf_qp.c vf_phase.c vf_divtc.c vf_harddup.c vf_softskip.c
@@ -50,7 +50,7 @@
 SRCS2=$(ENCODER_SRCS)
 OBJS2=$(SRCS2:.c=.o)
 
-CFLAGS  = $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) $(X264_INC) -D_GNU_SOURCE
+CFLAGS  = $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) $(X264_INC) $(DIRAC_INC) -D_GNU_SOURCE
 
 .SUFFIXES: .c .o
 
diff -ruN MPlayer-1.0pre6a/libmpcodecs/vd.c MPlayer-1.0pre6a-dirac/libmpcodecs/vd.c
--- MPlayer-1.0pre6a/libmpcodecs/vd.c	2004-12-18 14:06:35.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/libmpcodecs/vd.c	2005-02-15 13:14:50.000000000 +0000
@@ -52,6 +52,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,
@@ -109,6 +110,9 @@
 #if defined(USE_QTX_CODECS) || defined(MACOSX)
 	&mpcodecs_vd_qtvideo,
 #endif
+#ifdef HAVE_DIRAC
+	&mpcodecs_vd_dirac,
+#endif
 	NULL
 };
 
diff -ruN MPlayer-1.0pre6a/libmpcodecs/vd_dirac.c MPlayer-1.0pre6a-dirac/libmpcodecs/vd_dirac.c
--- MPlayer-1.0pre6a/libmpcodecs/vd_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0pre6a-dirac/libmpcodecs/vd_dirac.c	2005-01-24 12:13:50.000000000 +0000
@@ -0,0 +1,169 @@
+#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.4.0",
+	"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_IYUV))
+					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\n", 
+			diracdec->frame_params.fnum, 
+			diracdec->frame_params.ftype == I_frame ? "I_frame" : 
+				(diracdec->frame_params.ftype == L1_frame ? 
+					"L1_frame" : "L2_frame"));
+			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 == I_frame ? "I_frame" : 
+				(diracdec->frame_params.ftype == L1_frame ? 
+					"L1_frame" : "L2_frame"));
+			sh->pts =  (diracdec->frame_params.fnum+1)*sh->frametime;
+			drop_frame = framedrop && (diracdec->frame_params.ftype == L2_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.0pre6a/libmpdemux/demux_dirac.c MPlayer-1.0pre6a-dirac/libmpdemux/demux_dirac.c
--- MPlayer-1.0pre6a/libmpdemux/demux_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0pre6a-dirac/libmpdemux/demux_dirac.c	2005-02-16 16:57:11.985881437 +0000
@@ -0,0 +1,153 @@
+#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>
+
+int dirac_check_file(demuxer_t *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 = 1;
+			break;
+
+		default:
+			break;
+
+		}
+		if (ret_stat)
+			break;
+	}
+
+	dirac_decoder_close(diracdec);
+	stream_reset(demuxer->stream);
+	stream_seek(demuxer->stream, 0);
+
+	return ret_stat;
+}
+
+int demux_open_dirac(demuxer_t *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 0;
+
+	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->seq_params.frame_rate.numerator / 
+		                diracdec->seq_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 ret_stat;
+}
+
+int demux_dirac_fill_buffer(demuxer_t *demuxer)
+{
+	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;
+}
+
+extern void demux_close_dirac(demuxer_t* demuxer)
+{
+	return;
+}
+
+#endif
diff -ruN MPlayer-1.0pre6a/libmpdemux/demuxer.c MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.c
--- MPlayer-1.0pre6a/libmpdemux/demuxer.c	2004-12-21 12:25:59.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.c	2005-02-15 13:29:28.000000000 +0000
@@ -156,6 +156,9 @@
 extern void demux_close_ra(demuxer_t* demuxer);
 extern void demux_close_ty(demuxer_t* demuxer);
 extern void demux_close_lavf(demuxer_t* demuxer);
+#ifdef HAVE_DIRAC
+extern void demux_close_dirac(demuxer_t* demuxer);
+#endif
 
 
 #ifdef USE_TV
@@ -245,6 +248,10 @@
     case DEMUXER_TYPE_LAVF:
       demux_close_lavf(demuxer); break;
 #endif
+#ifdef HAVE_DIRAC
+    case DEMUXER_TYPE_DIRAC:
+      demux_close_dirac(demuxer); break;
+#endif
     }
     // free streams:
     for(i=0;i<256;i++){
@@ -336,6 +343,10 @@
 extern int demux_mkv_fill_buffer(demuxer_t *d);
 extern int demux_lavf_fill_buffer(demuxer_t *d);
 
+#ifdef HAVE_DIRAC
+int demux_dirac_fill_buffer(demuxer_t *demuxer);
+#endif
+
 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
   // Note: parameter 'ds' can be NULL!
 //  printf("demux->type=%d\n",demux->type);
@@ -393,6 +404,9 @@
 #ifdef USE_LIBAVFORMAT
      case DEMUXER_TYPE_LAVF: return demux_lavf_fill_buffer(demux);
 #endif
+#ifdef HAVE_DIRAC
+     case DEMUXER_TYPE_DIRAC: return demux_dirac_fill_buffer(demux);
+#endif
   }
   return 0;
 }
@@ -603,6 +617,10 @@
 int demux_open_rawdv(demuxer_t* demuxer);
 extern int rawdv_check_file(demuxer_t *demuxer);
 #endif
+#ifdef HAVE_DIRAC
+int demux_open_dirac(demuxer_t* demuxer);
+extern int dirac_check_file(demuxer_t *demuxer);
+#endif
 
 extern int vivo_check_file(demuxer_t *demuxer);
 extern void demux_open_vivo(demuxer_t *demuxer);
@@ -1073,6 +1091,22 @@
    }
 }
 #endif
+#ifdef HAVE_DIRAC
+//=============== Try to open raw Dirac file =================
+if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_DIRAC)
+{
+   demuxer=new_demuxer(stream,DEMUXER_TYPE_DIRAC,audio_id,video_id,dvdsub_id);
+   if(dirac_check_file(demuxer))
+   {
+      mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"DIRAC");
+      file_format=DEMUXER_TYPE_DIRAC;
+   }
+   else {
+      free_demuxer(demuxer);
+      demuxer=NULL;
+   }
+}
+#endif
 //=============== Try to open as audio file: =================
 if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AUDIO){
   demuxer=new_demuxer(stream,DEMUXER_TYPE_AUDIO,audio_id,video_id,dvdsub_id);
@@ -1361,6 +1395,12 @@
   break;
  }
 #endif
+#ifdef HAVE_DIRAC
+  case DEMUXER_TYPE_DIRAC: {
+  if (!demux_open_dirac(demuxer)) return NULL;
+  break;
+ }
+#endif
 } // switch(file_format)
 pts_from_bps=0; // !!!
 if ((sh_video=demuxer->video->sh) && sh_video->bih)
diff -ruN MPlayer-1.0pre6a/libmpdemux/demuxer.h MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.h
--- MPlayer-1.0pre6a/libmpdemux/demuxer.h	2004-12-15 18:39:51.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.h	2005-02-15 13:30:18.000000000 +0000
@@ -44,11 +44,12 @@
 #define DEMUXER_TYPE_LMLM4 34
 #define DEMUXER_TYPE_LAVF 35
 #define DEMUXER_TYPE_NSV 36
+#define DEMUXER_TYPE_DIRAC 37
 
 // 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 36
+#define DEMUXER_TYPE_MAX 37
 
 #define DEMUXER_TYPE_DEMUXERS (1<<16)
 // A virtual demuxer type for the network code
diff -ruN MPlayer-1.0pre6a/libmpdemux/Makefile MPlayer-1.0pre6a-dirac/libmpdemux/Makefile
--- MPlayer-1.0pre6a/libmpdemux/Makefile	2004-12-15 18:39:51.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/libmpdemux/Makefile	2005-02-15 13:31:53.000000000 +0000
@@ -3,7 +3,7 @@
 
 include ../config.mak
 
-SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c
+SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c demux_dirac.c parse_dirac.c
 ifeq ($(XMMS_PLUGINS),yes)
 SRCS += demux_xmms.c
 endif 
@@ -32,7 +32,7 @@
 OBJS	= $(SRCS:.c=.o)
 OBJS   += $(CPLUSPLUSSRCS:.cpp=.o)
 INCLUDE = -I.. -I../loader $(CSS_INC) $(EXTRA_INC) $(LIBAV_INC)
-CFLAGS  = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC)
+CFLAGS  = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC) $(DIRAC_INC)
 CPLUSPLUSFLAGS  = $(CFLAGS) $(CPLUSPLUSINCLUDE)
 CPLUSPLUS = $(CC)
 
diff -ruN MPlayer-1.0pre6a/libmpdemux/parse_dirac.c MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.c
--- MPlayer-1.0pre6a/libmpdemux/parse_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.c	2004-09-14 12:40:29.000000000 +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);
+	}
+	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 0;
+		dirac_videobuffer[4] = dirac_videobuf_code[4]=c;
+		dirac_videobuf_len = 5;
+	}
+	return dirac_videobuf_code[4];
+}
+
+// RAP Frame start = 0xD7
+// Non-RAP I Frame start = 0xD6
+// L1 Frame start = 0xD4
+// L2 Frame start = 0xD7
+#define FRAME_START(c) ((c) == 0xD4 || (c) == 0xD5 || (c) == 0xD6 || (c) == 0xD7)
+
+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 == 0)
+		return -1;
+
+
+	//dirac_videobuf_len = 0;
+	//for (i = 0; i < dirac_videobuf_code_len; i++)
+	//{
+	//	dirac_videobuffer[dirac_videobuf_len++] = dirac_videobuf_code[i];
+	//}
+
+	/* 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.0pre6a/libmpdemux/parse_dirac.h MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.h
--- MPlayer-1.0pre6a/libmpdemux/parse_dirac.h	1970-01-01 01:00:00.000000000 +0100
+++ MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.h	2004-09-14 12:40:32.000000000 +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.0pre6a/libmpdemux/video.c MPlayer-1.0pre6a-dirac/libmpdemux/video.c
--- MPlayer-1.0pre6a/libmpdemux/video.c	2004-11-24 18:55:03.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/libmpdemux/video.c	2005-02-15 13:24:15.000000000 +0000
@@ -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)*/
@@ -451,6 +452,9 @@
 	*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);
@@ -533,7 +537,9 @@
 	    }
 	}
 //	printf("\rIII pts: %5.3f [%d] (%5.3f)   \n",d_video->pts2,picture_coding_type,i_pts);
-    } else
+    } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC){
+ 	   sh_video->pts+=frame_time;
+	} else
 	sh_video->pts=d_video->pts;
     
     if(frame_time_ptr) *frame_time_ptr=frame_time;
diff -ruN MPlayer-1.0pre6a/Makefile MPlayer-1.0pre6a-dirac/Makefile
--- MPlayer-1.0pre6a/Makefile	2004-11-05 14:02:40.000000000 +0000
+++ MPlayer-1.0pre6a-dirac/Makefile	2005-02-15 13:10:53.000000000 +0000
@@ -32,10 +32,10 @@
 
 VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB)
 AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(JACK_LIB) $(NAS_LIB) $(SGIAUDIO_LIB) $(POLYP_LIB)
-CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB)
+CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB) $(DIRAC_LIB)
 COMMON_LIBS = libmpcodecs/libmpcodecs.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB)
 
-CFLAGS = $(OPTFLAGS) -I. $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) # -Wall
+CFLAGS = $(OPTFLAGS) -I. $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) $(DIRAC_INC) # -Wall
 ifeq ($(TOOLAME),yes)
 CFLAGS += $(TOOLAME_EXTRAFLAGS) 
 CODEC_LIBS += $(TOOLAME_LIB)

