diff -ruN MPlayer-1.0rc2/configure MPlayer-1.0rc2-dirac/configure --- MPlayer-1.0rc2/configure 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/configure 2008-01-26 14:34:40.000000000 +1100 @@ -313,6 +313,7 @@ --disable-libvorbis disable libvorbis support [autodetect] --disable-speex disable Speex support [autodetect] --enable-theora enable OggTheora libraries [autodetect] + --enable-dirac enable Dirac libraries [autodetect] --enable-faad-external enable external FAAD2 (AAC) [autodetect] --disable-faad-internal disable internal FAAD2 (AAC) [autodetect] --enable-faad-fixed enable fixed-point mode in internal FAAD2 [disabled] @@ -570,6 +571,7 @@ _libvorbis=auto _speex=auto _theora=auto +_dirac=auto _mp3lib=yes _liba52=yes _libdca=auto @@ -911,6 +913,8 @@ --disable-tremor-external) _tremor_external=no ;; --enable-theora) _theora=yes ;; --disable-theora) _theora=no ;; + --enable-dirac) _dirac=yes ;; + --disable-dirac) _dirac=no ;; --enable-mp3lib) _mp3lib=yes ;; --disable-mp3lib) _mp3lib=no ;; --enable-liba52) _liba52=yes ;; @@ -2323,7 +2327,7 @@ # Checking for CFLAGS _install_strip="-s" if test "$_profile" != "" || test "$_debug" != "" ; then - CFLAGS="-W -Wall -O2 $_march $_mcpu $_pipe $_debug $_profile" + CFLAGS="-W -Wall -O0 $_march $_mcpu $_pipe $_debug $_profile" _install_strip= elif test -z "$CFLAGS" ; then if test "$cc_vendor" = "intel" ; then @@ -5958,6 +5962,55 @@ fi echores "$_theora" +echocheck "Dirac support (version 0.9.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_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 `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++" + _ld_extra="$_ld_extra $_ld_dirac" + _inc_extra="$_inc_extra $_inc_dirac" +else + _def_dirac='#undef HAVE_DIRAC' + _nocodecmodules="libdirac $_nocodecmodules" +fi +echores "$_dirac" + echocheck "internal mp3lib support" if test "$_mp3lib" = yes ; then _def_mp3lib='#define USE_MP3LIB 1' @@ -7429,6 +7482,7 @@ _libs_mplayer=$_ld_tmp + ############################################################################# if darwin ; then CFLAGS="$CFLAGS -mdynamic-no-pic -falign-loops=16 -DSYS_DARWIN -shared-libgcc" @@ -7667,6 +7721,7 @@ LIBMAD = $_mad LIBVORBIS = $_vorbis LIBTHEORA = $_theora +LIBDIRAC = $_dirac FAAD_INTERNAL = $_faad_internal FAAD_FIXED = $_faad_fixed LIBSMBCLIENT = $_smbsupport @@ -8346,6 +8401,9 @@ /* enable FAAC (AAC encoder) support */ $_def_faac +/* enable Dirac support */ +$_def_dirac + /* enable LADSPA plugin support */ $_def_ladspa diff -ruN MPlayer-1.0rc2/etc/codecs.conf MPlayer-1.0rc2-dirac/etc/codecs.conf --- MPlayer-1.0rc2/etc/codecs.conf 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/etc/codecs.conf 2008-01-26 14:34:40.000000000 +1100 @@ -326,6 +326,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.0rc2/libmpcodecs/Makefile MPlayer-1.0rc2-dirac/libmpcodecs/Makefile --- MPlayer-1.0rc2/libmpcodecs/Makefile 2007-10-08 05:49:25.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpcodecs/Makefile 2008-01-26 14:34:40.000000000 +1100 @@ -110,6 +110,7 @@ SRCS_COMMON-$(LIBA52) += ad_liba52.c SRCS_COMMON-$(LIBAVCODEC) += ad_ffmpeg.c vd_ffmpeg.c vf_lavc.c vf_lavcdeint.c SRCS_COMMON-$(LIBDCA) += ad_libdca.c +SRCS_COMMON-$(LIBDIRAC) += vd_dirac.c SRCS_COMMON-$(LIBDV) += ad_libdv.c vd_libdv.c SRCS_COMMON-$(LIBMAD) += ad_libmad.c SRCS_COMMON-$(LIBMPEG2) += vd_libmpeg2.c diff -ruN MPlayer-1.0rc2/libmpcodecs/vd.c MPlayer-1.0rc2-dirac/libmpcodecs/vd.c --- MPlayer-1.0rc2/libmpcodecs/vd.c 2007-10-08 05:49:25.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpcodecs/vd.c 2008-01-26 14:34:40.000000000 +1100 @@ -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.0rc2/libmpcodecs/vd_dirac.c MPlayer-1.0rc2-dirac/libmpcodecs/vd_dirac.c --- MPlayer-1.0rc2/libmpcodecs/vd_dirac.c 1970-01-01 10:00:00.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpcodecs/vd_dirac.c 2008-01-26 14:34:40.000000000 +1100 @@ -0,0 +1,176 @@ +#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.9.0", + "dirac", + "Dirac <dirac at rd dot bbc dot co dot 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->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 -ruN MPlayer-1.0rc2/libmpdemux/demux_dirac.c MPlayer-1.0rc2-dirac/libmpdemux/demux_dirac.c --- MPlayer-1.0rc2/libmpdemux/demux_dirac.c 1970-01-01 10:00:00.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/demux_dirac.c 2008-01-26 14:35:37.000000000 +1100 @@ -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/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->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 -ruN MPlayer-1.0rc2/libmpdemux/demuxer.c MPlayer-1.0rc2-dirac/libmpdemux/demuxer.c --- MPlayer-1.0rc2/libmpdemux/demuxer.c 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/demuxer.c 2008-01-26 14:34:40.000000000 +1100 @@ -67,6 +67,8 @@ extern demuxer_desc_t demuxer_desc_lavf_preferred; 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, @@ -132,6 +134,9 @@ #ifdef HAVE_XMMS &demuxer_desc_xmms, #endif +#ifdef HAVE_DIRAC + &demuxer_desc_dirac, +#endif NULL }; diff -ruN MPlayer-1.0rc2/libmpdemux/demuxer.h MPlayer-1.0rc2-dirac/libmpdemux/demuxer.h --- MPlayer-1.0rc2/libmpdemux/demuxer.h 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/demuxer.h 2008-01-26 14:34:40.000000000 +1100 @@ -56,11 +56,12 @@ #define DEMUXER_TYPE_MPEG_GXF 42 #define DEMUXER_TYPE_NUT 43 #define DEMUXER_TYPE_LAVF_PREFERRED 44 +#define DEMUXER_TYPE_DIRAC 45 // 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 44 +#define DEMUXER_TYPE_MAX 45 #define DEMUXER_TYPE_DEMUXERS (1<<16) // A virtual demuxer type for the network code diff -ruN MPlayer-1.0rc2/libmpdemux/extension.c MPlayer-1.0rc2-dirac/libmpdemux/extension.c --- MPlayer-1.0rc2/libmpdemux/extension.c 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/extension.c 2008-01-26 14:35:12.000000000 +1100 @@ -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 -ruN MPlayer-1.0rc2/libmpdemux/Makefile MPlayer-1.0rc2-dirac/libmpdemux/Makefile --- MPlayer-1.0rc2/libmpdemux/Makefile 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/Makefile 2008-01-26 14:34:40.000000000 +1100 @@ -51,6 +51,7 @@ SRCS_COMMON-$(LIBNEMESI) += demux_nemesi.c SRCS_COMMON-$(LIBNUT) += demux_nut.c SRCS_COMMON-$(LIBVORBIS) += demux_ogg.c +SRCS_COMMON-$(LIBDIRAC) += demux_dirac.c parse_dirac.c SRCS_COMMON-$(MUSEPACK) += demux_mpc.c SRCS_COMMON-$(STREAMING_LIVE555) += demux_rtp.cpp demux_rtp_codec.cpp SRCS_COMMON-$(WIN32DLL) += demux_avs.c diff -ruN MPlayer-1.0rc2/libmpdemux/parse_dirac.c MPlayer-1.0rc2-dirac/libmpdemux/parse_dirac.c --- MPlayer-1.0rc2/libmpdemux/parse_dirac.c 1970-01-01 10:00:00.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/parse_dirac.c 2008-01-26 16:04:02.000000000 +1100 @@ -0,0 +1,162 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#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 -ruN MPlayer-1.0rc2/libmpdemux/parse_dirac.h MPlayer-1.0rc2-dirac/libmpdemux/parse_dirac.h --- MPlayer-1.0rc2/libmpdemux/parse_dirac.h 1970-01-01 10:00:00.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/parse_dirac.h 2008-01-26 14:34:40.000000000 +1100 @@ -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.0rc2/libmpdemux/video.c MPlayer-1.0rc2-dirac/libmpdemux/video.c --- MPlayer-1.0rc2/libmpdemux/video.c 2007-10-08 05:49:33.000000000 +1000 +++ MPlayer-1.0rc2-dirac/libmpdemux/video.c 2008-01-26 14:34:40.000000000 +1100 @@ -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)*/ @@ -556,6 +557,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 /*HAVE_DIRAC*/ } else { // frame-based file formats: (AVI,ASF,MOV) in_size=ds_get_packet(d_video,start); @@ -640,6 +645,8 @@ } } } + } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC){ + sh_video->pts+=frame_time; } else sh_video->pts=d_video->pts;