diff -urN mplayer-svn-r26470.orig/configure mplayer-svn-r26470/configure --- mplayer-svn-r26470.orig/configure 2008-04-14 00:02:39 +0300 +++ mplayer-svn-r26470/configure 2008-04-19 22:37:42 +0300 @@ -308,6 +308,7 @@ --disable-faad-internal disable internal FAAD2 (AAC) [autodetect] --enable-faad-fixed enable fixed-point mode in internal FAAD2 [disabled] --disable-faac disable support for FAAC (AAC encoder) [autodetect] + --disable-dirac disable libdirac support [autodetect] --disable-ladspa disable LADSPA plugin support [autodetect] --disable-libdv disable libdv 0.9.5 en/decoding support [autodetect] --disable-mad disable libmad (MPEG audio) support [autodetect] @@ -572,6 +573,7 @@ _faad_external=auto _faad_fixed=no _faac=auto +_dirac=auto _ladspa=auto _xmms=no _dvdnav=auto @@ -929,6 +931,8 @@ --disable-faad-fixed) _faad_fixed=no ;; --enable-faac) _faac=yes ;; --disable-faac) _faac=no ;; + --enable-dirac) _dirac=yes ;; + --disable-dirac) _dirac=no ;; --enable-ladspa) _ladspa=yes ;; --disable-ladspa) _ladspa=no ;; --enable-xmms) _xmms=yes ;; @@ -6131,6 +6135,58 @@ echores "$_faac (in libavcodec: $_lavc_faac)" +echocheck "Dirac support (version 0.8.x!)" +_inc_dirac=`pkg-config --cflags dirac` +_ld_dirac=`pkg-config --libs dirac` +if test "$_dirac" != no ; then + _dirac=no + cat > $TMPC << EOF +#include +#include +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_sourceparams_t src_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 $_inc_dirac $_ld_dirac -lstdc++ && _dirac=yes +fi +if test "$_dirac" = yes ; then + _def_dirac='#define HAVE_DIRAC 1' + _codecmodules="libdirac $_codecmodules" + _inc_extra="$_inc_extra $_inc_dirac" + _ld_extra="$_ld_extra $_ld_dirac -lstdc++" + _libs_mplayer="$_libs_mplayer $_ld_dirac -lstdc++" + _libs_mencoder="$_libs_mencoder $_ld_dirac -lstdc++" +else + _def_dirac='#undef HAVE_DIRAC' + _nocodecmodules="libdirac $_nocodecmodules" +fi +echores "$_dirac" + + echocheck "FAAD2 (AAC) support" if test "$_faad_internal" = auto ; then if x86_32 && test cc_vendor=gnu; then @@ -7813,6 +7869,7 @@ VIDIX_S3=$_vidix_drv_s3 VIDIX_SIS=$_vidix_drv_sis VIDIX_UNICHROME=$_vidix_drv_unichrome +LIBDIRAC=$_dirac # --- Some stuff for autoconfigure ---- $_target_arch @@ -7868,6 +7925,7 @@ CONFIG_LIBAMR_NB=$_libamr_nb CONFIG_LIBAMR_WB=$_libamr_wb CONFIG_LIBFAAC=$_lavc_faac +CONFIG_LIBDIRAC=$_dirac CONFIG_LIBMP3LAME=$_lavc_mp3lame CONFIG_LIBVORBIS=$_libvorbis CONFIG_LIBX264=$_lavc_x264 @@ -8512,6 +8570,9 @@ /* enable libdca support */ $_def_libdca +/* enable Dirac support */ +$_def_dirac + /* enable LADSPA plugin support */ $_def_ladspa diff -urN mplayer-svn-r26470.orig/etc/codecs.conf mplayer-svn-r26470/etc/codecs.conf --- mplayer-svn-r26470.orig/etc/codecs.conf 2008-04-14 00:02:39 +0300 +++ mplayer-svn-r26470/etc/codecs.conf 2008-04-19 22:37:43 +0300 @@ -354,6 +354,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... @@ -466,6 +476,14 @@ dll snow out YV12 +videocodec ffdirac + info "FFDIRAC (Dirac wavelet codec)" + status working + fourcc drac + driver ffmpeg + dll dirac + out YV12 + videocodec ffasv1 info "FFmpeg ASUS V1" status working diff -urN mplayer-svn-r26470.orig/libmpcodecs/Makefile mplayer-svn-r26470/libmpcodecs/Makefile --- mplayer-svn-r26470.orig/libmpcodecs/Makefile 2008-04-14 00:02:35 +0300 +++ mplayer-svn-r26470/libmpcodecs/Makefile 2008-04-19 22:37:43 +0300 @@ -127,6 +127,7 @@ SRCS_COMMON-$(XANIM_CODECS) += vd_xanim.c SRCS_COMMON-$(XVID4) += vd_xvid4.c SRCS_COMMON-$(ZORAN) += vd_zrmjpeg.c vf_zrmjpeg.c +SRCS_COMMON-$(LIBDIRAC) += vd_dirac.c SRCS_MENCODER = ae.c \ diff -urN mplayer-svn-r26470.orig/libmpcodecs/vd.c mplayer-svn-r26470/libmpcodecs/vd.c --- mplayer-svn-r26470.orig/libmpcodecs/vd.c 2008-03-17 00:11:15 +0200 +++ mplayer-svn-r26470/libmpcodecs/vd.c 2008-04-19 22:37:43 +0300 @@ -48,6 +48,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; /* Please do not add any new decoders here. If you want to implement a new * decoder, add it to libavcodec, except for wrappers around external @@ -101,6 +102,9 @@ #ifdef USE_QTX_CODECS &mpcodecs_vd_qtvideo, #endif +#ifdef HAVE_DIRAC + &mpcodecs_vd_dirac, +#endif /* Please do not add any new decoders here. If you want to implement a new * decoder, add it to libavcodec, except for wrappers around external * libraries and decoders requiring binary support. */ diff -urN mplayer-svn-r26470.orig/libmpcodecs/vd_dirac.c mplayer-svn-r26470/libmpcodecs/vd_dirac.c --- mplayer-svn-r26470.orig/libmpcodecs/vd_dirac.c 1970-01-01 03:00:00 +0300 +++ mplayer-svn-r26470/libmpcodecs/vd_dirac.c 2008-04-19 22:37:43 +0300 @@ -0,0 +1,176 @@ +#include +#include + +#include "config.h" +#ifdef HAVE_DIRAC +#include "mp_msg.h" + +#include "vd_internal.h" + +static vd_info_t info = +{ + "Dirac Video decoder v0.9.0", + "dirac", + "Dirac ", + "Dirac", + "native" +}; + +LIBVD_EXTERN(dirac) +#include + +// 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->src_params.width, diracdec->src_params.height); + if (diracdec->src_params.chroma == format422) + { + if(!mpcodecs_config_vo(sh, + diracdec->src_params.width, + diracdec->src_params.height, + IMGFMT_422P)) + return 0; + } + else + { + if(!mpcodecs_config_vo(sh, + diracdec->src_params.width, + diracdec->src_params.height, + IMGFMT_I420)) + return 0; + } + sh->disp_w = diracdec->src_params.width; + sh->disp_h = diracdec->src_params.height; + sh->format = 0x20000001; + sh->fps = diracdec->src_params.frame_rate.numerator / + diracdec->src_params.frame_rate.denominator; + buf[0] = (unsigned char *)malloc (diracdec->src_params.width * diracdec->src_params.height); + buf[1] = (unsigned char *)malloc (diracdec->src_params.chroma_width * diracdec->src_params.chroma_height); + buf[2] = (unsigned char *)malloc (diracdec->src_params.chroma_width * diracdec->src_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->src_params.width; + mpi->planes[1] = diracdec->fbuf->buf[1]; + mpi->stride[1] = diracdec->src_params.chroma_width; + mpi->planes[2] = diracdec->fbuf->buf[2]; + mpi->stride[2] = diracdec->src_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 -urN mplayer-svn-r26470.orig/libmpdemux/demux_dirac.c mplayer-svn-r26470/libmpdemux/demux_dirac.c --- mplayer-svn-r26470.orig/libmpdemux/demux_dirac.c 1970-01-01 03:00:00 +0300 +++ mplayer-svn-r26470/libmpdemux/demux_dirac.c 2008-04-19 22:37:43 +0300 @@ -0,0 +1,170 @@ +#include +#include +#include +#include +#include "config.h" + +#ifdef HAVE_DIRAC +#include "mp_msg.h" +#include "help_mp.h" + +#include "stream/stream.h" +#include "demuxer.h" +#include "stheader.h" + +#include + + + +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->src_params.width; + sh_video->disp_h = diracdec->src_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, + 0, + NULL, + demux_dirac_fill_buffer, + demux_open_dirac, + demux_close_dirac, + NULL, + NULL +}; +#endif diff -urN mplayer-svn-r26470.orig/libmpdemux/demuxer.c mplayer-svn-r26470/libmpdemux/demuxer.c --- mplayer-svn-r26470.orig/libmpdemux/demuxer.c 2008-04-19 22:33:09 +0300 +++ mplayer-svn-r26470/libmpdemux/demuxer.c 2008-04-19 22:38:18 +0300 @@ -73,6 +73,7 @@ extern const demuxer_desc_t demuxer_desc_lavf_preferred; extern const demuxer_desc_t demuxer_desc_aac; extern const demuxer_desc_t demuxer_desc_nut; +extern demuxer_desc_t demuxer_desc_dirac; /* Please do not add any new demuxers here. If you want to implement a new * demuxer, add it to libavformat, except for wrappers around external @@ -145,6 +146,9 @@ #ifdef HAVE_XMMS &demuxer_desc_xmms, #endif +#ifdef HAVE_DIRAC + &demuxer_desc_dirac, +#endif /* Please do not add any new demuxers here. If you want to implement a new * demuxer, add it to libavformat, except for wrappers around external * libraries and demuxers requiring binary support. */ diff -urN mplayer-svn-r26470.orig/libmpdemux/demuxer.h mplayer-svn-r26470/libmpdemux/demuxer.h --- mplayer-svn-r26470.orig/libmpdemux/demuxer.h 2008-04-14 00:02:38 +0300 +++ mplayer-svn-r26470/libmpdemux/demuxer.h 2008-04-19 22:37:43 +0300 @@ -62,11 +62,12 @@ #define DEMUXER_TYPE_NUT 43 #define DEMUXER_TYPE_LAVF_PREFERRED 44 #define DEMUXER_TYPE_RTP_NEMESI 45 +#define DEMUXER_TYPE_DIRAC 46 // 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 45 +#define DEMUXER_TYPE_MAX 46 #define DEMUXER_TYPE_DEMUXERS (1<<16) // A virtual demuxer type for the network code diff -urN mplayer-svn-r26470.orig/libmpdemux/extension.c mplayer-svn-r26470/libmpdemux/extension.c --- mplayer-svn-r26470.orig/libmpdemux/extension.c 2007-09-15 00:53:49 +0300 +++ mplayer-svn-r26470/libmpdemux/extension.c 2008-04-19 22:37:43 +0300 @@ -62,6 +62,7 @@ { "ape", DEMUXER_TYPE_LAVF }, { "apl", DEMUXER_TYPE_LAVF }, { "mac", DEMUXER_TYPE_LAVF }, + { "drc", DEMUXER_TYPE_DIRAC }, // At least the following are hacks against broken autodetection // that should not be there diff -urN mplayer-svn-r26470.orig/libmpdemux/Makefile mplayer-svn-r26470/libmpdemux/Makefile --- mplayer-svn-r26470.orig/libmpdemux/Makefile 2008-04-14 00:02:38 +0300 +++ mplayer-svn-r26470/libmpdemux/Makefile 2008-04-19 22:37:43 +0300 @@ -57,6 +57,7 @@ SRCS_COMMON-$(STREAMING_LIVE555) += demux_rtp.cpp demux_rtp_codec.cpp SRCS_COMMON-$(WIN32DLL) += demux_avs.c SRCS_COMMON-$(XMMS_PLUGINS) += demux_xmms.c +SRCS_COMMON-$(LIBDIRAC) += demux_dirac.c parse_dirac.c SRCS_MENCODER = muxer.c \ muxer_avi.c \ diff -urN mplayer-svn-r26470.orig/libmpdemux/parse_dirac.c mplayer-svn-r26470/libmpdemux/parse_dirac.c --- mplayer-svn-r26470.orig/libmpdemux/parse_dirac.c 1970-01-01 03:00:00 +0300 +++ mplayer-svn-r26470/libmpdemux/parse_dirac.c 2008-04-19 22:37:43 +0300 @@ -0,0 +1,162 @@ +#include +#include +#include + +#include "config.h" +#include "mp_msg.h" +#include "help_mp.h" + +#include "stream/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 +* End of sequence = 0x10 +* Auxiliary data = 0x20 +* Padding data = 0x30 +* Intra_Ref start = 0x0C (using ac) +* Intra_NonRef start = 0x08 (using ac) +* Intra_Ref start = 0x4C (not using ac) +* Intra_NonRef start = 0x48 (not using ac) +* Intra_Ref start = 0xCC (low delay syntax) +* Intra_NonRef start = 0xC8 (low delay syntax) +* Inter_Ref_1Ref start = 0x0D +* Inter_Ref_2Ref start = 0x0E +* Inter_NonRef_1Ref start = 0x09 +* Inter_NonRef_2Ref start = 0x0A +*/ +#define FRAME_START(c) (((c) == 0x00) || ((c) == 0x10) || (((c)&0xF8) == 0x20) || ((c) == 0x30) || (((c)&0x08) == 0x08)) + +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 -urN mplayer-svn-r26470.orig/libmpdemux/parse_dirac.h mplayer-svn-r26470/libmpdemux/parse_dirac.h --- mplayer-svn-r26470.orig/libmpdemux/parse_dirac.h 1970-01-01 03:00:00 +0300 +++ mplayer-svn-r26470/libmpdemux/parse_dirac.h 2008-04-19 22:37:44 +0300 @@ -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 -urN mplayer-svn-r26470.orig/libmpdemux/video.c mplayer-svn-r26470/libmpdemux/video.c --- mplayer-svn-r26470.orig/libmpdemux/video.c 2008-04-14 00:02:38 +0300 +++ mplayer-svn-r26470/libmpdemux/video.c 2008-04-19 22:37:44 +0300 @@ -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,10 @@ *start=videobuffer; in_size=videobuf_len; videobuf_len=0; +#if defined HAVE_DIRAC + } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC) { + in_size = dirac_read_video_frame(d_video, start); +#endif } else { // frame-based file formats: (AVI,ASF,MOV) in_size=ds_get_packet(d_video,start); @@ -624,6 +629,10 @@ else sh_video->pts=pts; } } +#if defined HAVE_DIRAC + } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC) { + sh_video->pts+=frame_time; +#endif } else sh_video->pts=d_video->pts;