diff -ruN MPlayer-1.0pre7try2/configure /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/configure
--- MPlayer-1.0pre7try2/configure	2005-04-13 12:46:35.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/configure	2006-04-03 17:22:37.000000000 +0100
@@ -229,6 +229,7 @@
   --disable-amr_nb       disable amr narrowband, floating point [autodetect]
   --disable-amr_nb-fixed disable amr narrowband, fixed point [autodetect]
   --disable-amr_wb       disable amr wideband, floating point [autodetect]
+  --enable-dirac         build with Dirac support [autodetect]
   
 Video output:
   --disable-vidix        disable VIDIX [enable on x86 *nix]
@@ -1411,6 +1412,7 @@
 _gethostbyname2=auto
 _ftp=yes
 _vstream=auto
+_dirac=auto
 for ac_option do
   case "$ac_option" in
   # Skip 1st pass
@@ -1692,6 +1694,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`
     ;;
@@ -6673,6 +6678,53 @@
 fi
 echores "$_lircc"
 
+echocheck "Dirac support (version 5.2!)"
+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
@@ -6848,6 +6900,8 @@
 AMR_NB=$_amr_nb
 AMR_NB_FIXED=$_amr_nb_fixed
 AMR_WB=$_amr_wb
+DIRAC_LIB = $_ld_dirac
+DIRAC_INC = $_inc_dirac
 
 # --- Some stuff for autoconfigure ----
 $_target_arch
@@ -7377,6 +7431,9 @@
 /* enable Matroska support */
 $_def_matroska
 
+/* enable Dirac support */
+$_def_dirac
+
 /* enable FAAD (AAC) support */
 $_def_faad
 $_def_faad_internal
diff -ruN MPlayer-1.0pre7try2/etc/codecs.conf /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/etc/codecs.conf
--- MPlayer-1.0pre7try2/etc/codecs.conf	2005-04-10 17:44:29.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/etc/codecs.conf	2006-04-03 12:15:51.000000000 +0100
@@ -220,6 +220,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 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.0pre7try2/libavcodec/snow.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libavcodec/snow.c
--- MPlayer-1.0pre7try2/libavcodec/snow.c	2005-04-16 21:41:13.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libavcodec/snow.c	2006-04-03 12:15:51.000000000 +0100
@@ -2359,8 +2359,13 @@
 
 //            if(b_w==16) am= 8*(a1+a2);
 
-            if(dx<8) tmp[x]= (32*a2*( 8-dx) +    am* dx    + 128)>>8;
-            else     tmp[x]= (   am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
+            if(dx<8) am = (32*a2*( 8-dx) +    am* dx    + 128)>>8;
+            else     am = (   am*(16-dx) + 32*a3*(dx-8) + 128)>>8;
+            
+            /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/
+            if(am&(~255)) am= ~(am>>31);
+            
+            tmp[x] = am;
 
 /*            if     (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) +    aL* dx     + 32)>>6;
             else if(dx< 8) tmp[x + y*stride]= (   aL*( 8-dx) +    am*(dx- 4) + 32)>>6;
@@ -2387,9 +2392,12 @@
             
 //            if(b_w==16) am= 8*(a1+a2);
 
-            if(dy<8) dst[x]= (32*a2*( 8-dy) +    am* dy    + 128)>>8;
-            else     dst[x]= (   am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
+            if(dy<8) am =  (32*a2*( 8-dy) +    am* dy    + 128)>>8;
+            else     am = (   am*(16-dy) + 32*a3*(dy-8) + 128)>>8;
 
+            if(am&(~255)) am= ~(am>>31);
+            
+            dst[x] = am;
 /*            if     (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) +    aL* dy     + 32)>>6;
             else if(dy< 8) tmp[x + y*stride]= (   aL*( 8-dy) +    am*(dy- 4) + 32)>>6;
             else if(dy<12) tmp[x + y*stride]= (   am*(12-dy) +    aR*(dy- 8) + 32)>>6;
@@ -2942,7 +2950,7 @@
     }
 }
 
-static void dequantize_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride){
+static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){
     const int w= b->width;
     const int h= b->height;
     const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16);
@@ -2953,7 +2961,7 @@
     
     if(s->qlog == LOSSLESS_QLOG) return;
     
-    for(y=0; y<h; y++){
+    for(y=start_y; y<end_y; y++){
 //        DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride));
         DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
         for(x=0; x<w; x++){
@@ -3020,7 +3028,7 @@
     }
 }
 
-static void correlate_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){
+static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){
     const int w= b->width;
     const int h= b->height;
     int x,y;
@@ -3030,7 +3038,10 @@
     DWTELEM * line;
     DWTELEM * prev;
     
-    for(y=0; y<h; y++){
+    if (start_y != 0)
+        line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
+    
+    for(y=start_y; y<end_y; y++){
         prev = line;
 //        line = slice_buffer_get_line_from_address(sb, src + (y * stride));
         line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset;
@@ -3329,9 +3340,9 @@
     SnowContext *s = avctx->priv_data;
     int plane_index;
 
-    if(avctx->strict_std_compliance >= 0){
-        av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
-               "use vstrict=-1 / -strict -1 to use it anyway\n");
+    if(avctx->strict_std_compliance >= 0 ){
+        av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n"
+               "use vstrict=-2 / -strict -2 to use it anyway\n");
         return -1;
     }
  
@@ -3641,15 +3652,13 @@
 {
     SnowContext *s = avctx->priv_data;
     int block_size;
+    
+    avctx->pix_fmt= PIX_FMT_YUV420P;
 
     common_init(avctx);
     
     block_size = MB_SIZE >> s->block_max_depth;
-    /* FIXME block_size * 2 is determined empirically. block_size * 1.5 is definitely needed, but I (Robert) cannot figure out why more than that is needed. Perhaps there is a bug, or perhaps I overlooked some demands that are placed on the buffer. */
-    /* FIXME The formula is WRONG. For height > 480, the buffer will overflow. */
-    /* FIXME For now, I will use a full frame of lines. Fortunately, this should not materially effect cache performance because lines are allocated using a stack, so if in fact only 50 out of 496 lines are needed at a time, the other 446 will sit allocated but never accessed. */
-//    slice_buffer_init(s->plane[0].sb, s->plane[0].height, (block_size * 2) + (s->spatial_decomposition_count * s->spatial_decomposition_count), s->plane[0].width, s->spatial_dwt_buffer);
-    slice_buffer_init(&s->sb, s->plane[0].height, s->plane[0].height, s->plane[0].width, s->spatial_dwt_buffer);
+    slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 2)) + 1, s->plane[0].width, s->spatial_dwt_buffer);
     
     return 0;
 }
@@ -3681,7 +3690,6 @@
         int h= p->height;
         int x, y;
         int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */
-        SubBand * correlate_band;
         
 if(s->avctx->debug&2048){
         memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
@@ -3704,12 +3712,6 @@
     }
     STOP_TIMER("unpack coeffs");
 }
-        
-        /* Handle level 0, orientation 0 specially. It is particularly resistant to slicing but fortunately quite small, so process it in one pass. */
-        correlate_band = &p->band[0][0];
-        decode_subband_slice_buffered(s, correlate_band, &s->sb, 0, correlate_band->height, decode_state[0][0]);
-        correlate_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0);
-        dequantize_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride);
 
 {START_TIMER
     const int mb_h= s->b_height << s->block_max_depth;
@@ -3724,23 +3726,43 @@
     ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count);
     for(mb_y=0; mb_y<=mb_h; mb_y++){
         
-        const int slice_starty = block_w*mb_y;
-        const int slice_h = block_w*(mb_y+1);
+        int slice_starty = block_w*mb_y;
+        int slice_h = block_w*(mb_y+1);
+        if (!(s->keyframe || s->avctx->debug&512)){
+            slice_starty = FFMAX(0, slice_starty - (block_w >> 1));
+            slice_h -= (block_w >> 1);
+        }
 
         {        
         START_TIMER
         for(level=0; level<s->spatial_decomposition_count; level++){
-            for(orientation=level ? 1 : 1; orientation<4; orientation++){
+            for(orientation=level ? 1 : 0; orientation<4; orientation++){
                 SubBand *b= &p->band[level][orientation];
                 int start_y;
                 int end_y;
                 int our_mb_start = mb_y;
                 int our_mb_end = (mb_y + 1);
-                start_y = FFMIN(b->height, (mb_y ? ((block_w * our_mb_start - 4) >> (s->spatial_decomposition_count - level)) + 5 : 0));
-                end_y = FFMIN(b->height, (((block_w * our_mb_end - 4) >> (s->spatial_decomposition_count - level)) + 5));
-                    
-                if (start_y != end_y)
-                    decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
+                start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2: 0);
+                end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2);
+                if (!(s->keyframe || s->avctx->debug&512)){
+                    start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level)));
+                    end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level)));
+                }
+                start_y = FFMIN(b->height, start_y);
+                end_y = FFMIN(b->height, end_y);
+                
+                if (start_y != end_y){
+                    if (orientation == 0){
+                        SubBand * correlate_band = &p->band[0][0];
+                        int correlate_end_y = FFMIN(b->height, end_y + 1);
+                        int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0));
+                        decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]);
+                        correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y);
+                        dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y);
+                    }
+                    else
+                        decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]);
+                }
             }
         }
         STOP_TIMER("decode_subband_slice");
@@ -3764,16 +3786,8 @@
 
         predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y);
         
-        /* Nasty hack based empirically on how predict_slice_buffered() hits the buffer. */
-        /* FIXME If possible, make predict_slice fit into the slice. As of now, it works on some previous lines (up to slice_height / 2) if the condition on the next line is false. */
-        if (s->keyframe || (s->avctx->debug&512)){
-            y = FFMIN(p->height, slice_starty);
-            end_y = FFMIN(p->height, slice_h);
-        }
-        else{
-            y = FFMAX(0, FFMIN(p->height, slice_starty - (block_w >> 1)));
-            end_y = FFMAX(0, FFMIN(p->height, slice_h - (block_w >> 1)));
-        }
+        y = FFMIN(p->height, slice_starty);
+        end_y = FFMIN(p->height, slice_h);
         while(y < end_y)
             slice_buffer_release(&s->sb, y++);
     }
diff -ruN MPlayer-1.0pre7try2/libmpcodecs/Makefile /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpcodecs/Makefile
--- MPlayer-1.0pre7try2/libmpcodecs/Makefile	2004-12-29 19:51:56.000000000 +0000
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpcodecs/Makefile	2006-04-03 12:15:51.000000000 +0100
@@ -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.0pre7try2/libmpcodecs/vd.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpcodecs/vd.c
--- MPlayer-1.0pre7try2/libmpcodecs/vd.c	2005-03-01 20:21:58.000000000 +0000
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpcodecs/vd.c	2006-04-03 12:15:51.000000000 +0100
@@ -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.0pre7try2/libmpcodecs/vd_dirac.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpcodecs/vd_dirac.c
--- MPlayer-1.0pre7try2/libmpcodecs/vd_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpcodecs/vd_dirac.c	2006-04-03 15:49:03.000000000 +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.5.2",
+	"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 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.0pre7try2/libmpdemux/demux_dirac.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/demux_dirac.c
--- MPlayer-1.0pre7try2/libmpdemux/demux_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/demux_dirac.c	2006-04-03 17:10:20.000000000 +0100
@@ -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->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 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.0pre7try2/libmpdemux/demuxer.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/demuxer.c
--- MPlayer-1.0pre7try2/libmpdemux/demuxer.c	2005-04-03 15:08:26.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/demuxer.c	2006-04-03 12:15:51.000000000 +0100
@@ -160,6 +160,9 @@
 #ifdef USE_WIN32DLL
 extern void demux_close_avs(demuxer_t* demuxer);
 #endif
+#ifdef HAVE_DIRAC
+extern void demux_close_dirac(demuxer_t* demuxer);
+#endif
 
 
 #ifdef USE_TV
@@ -255,6 +258,10 @@
     case DEMUXER_TYPE_AVS:
       demux_close_avs(demuxer); break;
 #endif
+#ifdef HAVE_DIRAC
+    case DEMUXER_TYPE_DIRAC:
+      demux_close_dirac(demuxer); break;
+#endif
     }
     // free streams:
     for(i = 0; i < MAX_A_STREAMS; i++)
@@ -349,6 +356,9 @@
 #ifdef USE_WIN32DLL
 extern int demux_avs_fill_buffer(demuxer_t *d);
 #endif
+#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!
@@ -411,6 +421,9 @@
 #ifdef USE_WIN32DLL
     case DEMUXER_TYPE_AVS: return demux_avs_fill_buffer(demux);
 #endif
+#ifdef HAVE_DIRAC
+     case DEMUXER_TYPE_DIRAC: return demux_dirac_fill_buffer(demux);
+#endif
   }
   return 0;
 }
@@ -626,6 +639,12 @@
 int avs_check_file(demuxer_t *demuxer, const char *filename);
 #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);
 extern int y4m_check_file(demuxer_t *demuxer);
@@ -1127,6 +1146,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);
@@ -1399,6 +1434,13 @@
   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.0pre7try2/libmpdemux/demuxer.h /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/demuxer.h
--- MPlayer-1.0pre7try2/libmpdemux/demuxer.h	2005-04-03 15:08:26.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/demuxer.h	2006-04-03 12:15:51.000000000 +0100
@@ -46,11 +46,12 @@
 #define DEMUXER_TYPE_NSV 36
 #define DEMUXER_TYPE_VQF 37
 #define DEMUXER_TYPE_AVS 38
+#define DEMUXER_TYPE_DIRAC 39
 
 // 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 38
+#define DEMUXER_TYPE_MAX 39
 
 #define DEMUXER_TYPE_DEMUXERS (1<<16)
 // A virtual demuxer type for the network code
diff -ruN MPlayer-1.0pre7try2/libmpdemux/Makefile /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/Makefile
--- MPlayer-1.0pre7try2/libmpdemux/Makefile	2005-02-27 04:25:12.000000000 +0000
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/Makefile	2006-04-03 12:15:51.000000000 +0100
@@ -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 stream_vstream.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_vqf.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 stream_vstream.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_vqf.c demux_dirac.c parse_dirac.c
 ifeq ($(XMMS_PLUGINS),yes)
 SRCS += demux_xmms.c
 endif 
@@ -37,7 +37,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.0pre7try2/libmpdemux/parse_dirac.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/parse_dirac.c
--- MPlayer-1.0pre7try2/libmpdemux/parse_dirac.c	1970-01-01 01:00:00.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/parse_dirac.c	2006-04-03 17:03:12.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);
+		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.0pre7try2/libmpdemux/parse_dirac.h /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/parse_dirac.h
--- MPlayer-1.0pre7try2/libmpdemux/parse_dirac.h	1970-01-01 01:00:00.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/parse_dirac.h	2006-04-03 12:15:51.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.0pre7try2/libmpdemux/video.c /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/video.c
--- MPlayer-1.0pre7try2/libmpdemux/video.c	2005-03-06 21:10:01.000000000 +0000
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/libmpdemux/video.c	2006-04-03 12:15:51.000000000 +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)*/
@@ -533,6 +534,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);
@@ -615,7 +619,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.0pre7try2/Makefile /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/Makefile
--- MPlayer-1.0pre7try2/Makefile	2005-04-16 21:18:12.000000000 +0100
+++ /home/anuradha/work/MPlayer-1.0pre7try2-snow-dirac-spec/Makefile	2006-04-03 12:15:51.000000000 +0100
@@ -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)
