From: Anuradha S. <asu...@us...> - 2008-05-30 03:33:24
|
Update of /cvsroot/dirac/compress/extras/patches In directory sc8-pr-cvs12.sourceforge.net:/tmp/cvs-serv15746 Added Files: MPlayer-1.0rc2_dirac-0.10.x.patch README_MPlayer-1.0rc2_dirac-0.10.x_patch README_mplayersvn_trunk_revision_26925_dirac-0.10.x_patch mplayersvn_trunk_revision_26925-dirac-0.10.x.patch Log Message: New patches to enable Dirac 0.10.0 playback using MPlayer. --- NEW FILE: mplayersvn_trunk_revision_26925-dirac-0.10.x.patch --- diff --exclude=.svn -ruN mplayersvn_trunk/configure mplayersvn_trunk_dirac/configure --- mplayersvn_trunk/configure 2008-05-29 11:42:42.000000000 +1000 +++ mplayersvn_trunk_dirac/configure 2008-05-29 14:24:09.000000000 +1000 @@ -290,6 +290,10 @@ --disable-xvid-lavc disable XviD in libavcodec [autodetect] --disable-x264 disable x264 [autodetect] --disable-x264-lavc disable x264 in libavcodec [autodetect] + --disable-libdirac disable dirac in libavcodec [autodetect] + --disable-libdirac-lavc disable dirac in libavcodec [autodetect] + --disable-libschroedinger disable libschroedinger in libavcodec (Schroedinger decoder) [autodetect] + --disable-libschroedinger-lavc disable dirac in libavcodec (Schroedinger decoder) [autodetect] --disable-libnut disable libnut [autodetect] --disable-libavutil_a disable static libavutil [autodetect] --disable-libavcodec_a disable static libavcodec [autodetect] @@ -627,6 +631,10 @@ _xvid_lavc=auto _x264=auto _x264_lavc=auto +_libdirac=auto +_libdirac_lavc=auto +_libschroedinger=auto +_libschroedinger_lavc=auto _libnut=auto _lirc=auto _lircc=auto @@ -1034,6 +1042,14 @@ --disable-x264) _x264=no ;; --enable-x264-lavc) _x264_lavc=yes ;; --disable-x264-lavc) _x264_lavc=no ;; + --enable-libdirac) _libdirac=yes ;; + --disable-libdirac) _libdirac=no ;; + --enable-libdirac-lavc) _libdirac_lavc=yes ;; + --disable-libdirac-lavc) _libdirac_lavc=no ;; + --enable-libschroedinger) _libschroedinger=yes ;; + --disable-libschroedinger) _libschroedinger=no ;; + --enable-libschroedinger-lavc) _libschroedinger_lavc=yes ;; + --disable-libschroedinger-lavc) _libschroedinger_lavc=no ;; --enable-libnut) _libnut=yes ;; --disable-libnut) _libnut=no ;; --enable-libavutil_a) _libavutil_a=yes ;; @@ -6607,6 +6623,79 @@ echores "$_x264" +echocheck "libdirac" +if test "$_libdirac" = auto ; then + _def_libdirac='#define HAVE_LIBDIRAC 1' + _codecmodules="libdirac $_codecmodules" + cat > $TMPC << EOF +#include <libdirac_encoder/dirac_encoder.h> +#include <libdirac_decoder/dirac_parser.h> +int main(void) +{ + dirac_encoder_context_t enc_ctx; + dirac_decoder_t *dec_handle; + dirac_encoder_context_init(&enc_ctx, VIDEO_FORMAT_SD_576I50); + dec_handle = dirac_decoder_init(0); + if (dec_handle) + dirac_decoder_close(dec_handle); + return 0; +} +EOF + _libdirac=no + cc_check `$_pkg_config --silence-errors --cflags dirac` `$_pkg_config --libs dirac` && _libdirac=yes +fi + +if test "$_libdirac" = yes ; then + test "$_libdirac_lavc" = auto && _libdirac_lavc=yes + if test "$_libdirac_lavc" = yes ; then + _def_libdirac_lavc='#define CONFIG_LIBDIRAC 1' + _inc_extra="$_inc_extra `$_pkg_config --silence-errors --cflags dirac`" + _ld_extra="$_ld_extra `$_pkg_config --silence-errors --libs dirac`" + _libavencoders="$_libavencoders LIBDIRAC_ENCODER" + _libavdecoders="$_libavdecoders LIBDIRAC_DECODER" + fi +else + _def_libdirac='#undef HAVE_LIBDIRAC' + _libdirac_lavc=no + _def_libdirac_lavc='#undef CONFIG_LIBDIRAC' + _nocodecmodules="libdirac $_nocodecmodules" +fi +_res_comment="in libavcodec: $_libdirac_lavc" +echores "$_libdirac" + + +echocheck "libschroedinger" +if test "$_libschroedinger" = auto ; then + _def_libschroedinger='#define HAVE_LIBSCHROEDINGER 1' + _codecmodules="libschroedinger $_codecmodules" + cat > $TMPC << EOF +#include <schroedinger/schro.h> +int main(void) { schro_init(); return 0; } +EOF + _libschroedinger=no + cc_check `$_pkg_config --silence-errors --libs --cflags schroedinger-1.0` && _libschroedinger=yes +fi + +if test "$_libschroedinger" = yes ; then + test "$_libschroedinger_lavc" = auto && _libschroedinger_lavc=yes + if test "$_libschroedinger_lavc" = yes ; then + _def_libschroedinger_lavc='#define CONFIG_LIBSCHROEDINGER 1' + _inc_extra="$_inc_extra `$_pkg_config --silence-errors --cflags schroedinger-1.0`" + _ld_extra="$_ld_extra `$_pkg_config --silence-errors --libs schroedinger-1.0`" + _libavencoders="$_libavencoders LIBSCHROEDINGER_ENCODER" + _libavdecoders="$_libavdecoders LIBSCHROEDINGER_DECODER" + # disable libdirac decoder if Schroedinger is available. + _libavdecoders=`echo $_libavdecoders | sed -e s/LIBDIRAC_DECODER// ` + fi +else + _def_libdirac='#undef HAVE_LIBSCHROEDINGER' + _libschroedinger_lavc=no + _def_libschroedinger_lavc='#undef CONFIG_LIBSCHROEDINGER' + _nocodecmodules="libschroedinger $_nocodecmodules" +fi +_res_comment="in libavcodec: $_libschroedinger_lavc" +echores "$_libschroedinger" + echocheck "libnut" if test "$_libnut" = auto ; then cat > $TMPC << EOF @@ -7691,6 +7780,8 @@ LIBDV = $_libdv XVID4 = $_xvid X264 = $_x264 +DIRAC = $_libdirac +SCHROEDINGER = $_libschroedinger LIBNUT = $_libnut LIBDCA = $_libdca MPLAYER = $_mplayer @@ -7778,6 +7869,8 @@ CONFIG_LIBMP3LAME=$_mp3lame_lavc CONFIG_LIBVORBIS=$_libvorbis CONFIG_LIBX264=$_x264_lavc +CONFIG_LIBDIRAC=$_libdirac_lavc +CONFIG_LIBSCHROEDINGER=$_libschroedinger_lavc CONFIG_LIBXVID=$_xvid_lavc CONFIG_MLIB = $_mlib # Prevent building libavcodec/imgresample.c with conflicting symbols @@ -7942,6 +8035,12 @@ /* Define if you are using the X.264 library */ $_def_x264 +/* Define if you are using the Dirac library */ +$_def_libdirac + +/* Define if you are using the Schroedinger-1.0 library */ +$_def_libschroedinger + /* Define if you are using libnut */ $_def_libnut @@ -8173,6 +8272,8 @@ $_def_faac_lavc $_def_mp3lame_lavc $_def_x264_lavc +$_def_libdirac_lavc +$_def_libschroedinger_lavc $_def_xvid_lavc /* Use codec libs included in mplayer CVS / source dist: */ diff --exclude=.svn -ruN mplayersvn_trunk/etc/codecs.conf mplayersvn_trunk_dirac/etc/codecs.conf --- mplayersvn_trunk/etc/codecs.conf 2008-05-29 11:42:42.000000000 +1000 +++ mplayersvn_trunk_dirac/etc/codecs.conf 2008-05-29 14:24:09.000000000 +1000 @@ -699,6 +699,22 @@ dll mpeg4 out YV12,I420,IYUV flip +videocodec fflibdirac + info "DIRAC (through ffmpeg)" + status working + fourcc drac + driver ffmpeg + dll libdirac + out I420,IYUV,422P,444P + +videocodec fflibschroedinger + info "DIRAC (through ffmpeg)" + status working + fourcc drac + driver ffmpeg + dll libschroedinger + out I420,IYUV,422P,444P + videocodec xvid info "XviD (MPEG-4)" status working diff --exclude=.svn -ruN mplayersvn_trunk/libmpdemux/mp_taglists.c mplayersvn_trunk_dirac/libmpdemux/mp_taglists.c --- mplayersvn_trunk/libmpdemux/mp_taglists.c 2008-05-27 11:03:33.000000000 +1000 +++ mplayersvn_trunk_dirac/libmpdemux/mp_taglists.c 2008-05-29 14:26:38.000000000 +1000 @@ -78,6 +78,7 @@ { CODEC_ID_WS_VQA, MKTAG('V', 'Q', 'A', 'V')}, { CODEC_ID_XAN_WC3, MKTAG('W', 'C', '3', 'V')}, { CODEC_ID_NUV, MKTAG('N', 'U', 'V', '1')}, + { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c')}, { 0, 0 }, }; --- NEW FILE: README_MPlayer-1.0rc2_dirac-0.10.x_patch --- These are the instructions for enabling Dirac support in Mplayer-1.0rc2 source code. 1. Download Dirac 0.10.0 from http://sourceforge.net/projects/dirac/ 2. Unpack the Dirac source tar xvzf dirac-0.10.0.tar.gz 3. Build and Install cd dirac-0.10.0 ./configure make make install The last step installs the Dirac share encoder and decoder libraries in /usr/local/lib (which is the default install point). 3. Download the MPlayer-1.0rc2 http://www.mplayerhq.hu/design7/dload.html 4. Unpack the source tar xvjf MPlayer-1.0rc2.tar.bz2 5. Apply the patch cd MPlayer-1.0rc2 patch -p1 < MPlayer-1.0rc2_dirac-0.10.x.patch 6. Build and Install ./configure make make install (If Dirac support is enabled, HAVE_DIRAC is defined in config.h) --- NEW FILE: MPlayer-1.0rc2_dirac-0.10.x.patch --- 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-05-29 20:29:00.000000000 +1000 @@ -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,53 @@ 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_picture_type_t picture; + dirac_sourceparams_t src_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_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 +7480,7 @@ _libs_mplayer=$_ld_tmp + ############################################################################# if darwin ; then CFLAGS="$CFLAGS -mdynamic-no-pic -falign-loops=16 -DSYS_DARWIN -shared-libgcc" @@ -7667,6 +7719,7 @@ LIBMAD = $_mad LIBVORBIS = $_vorbis LIBTHEORA = $_theora +LIBDIRAC = $_dirac FAAD_INTERNAL = $_faad_internal FAAD_FIXED = $_faad_fixed LIBSMBCLIENT = $_smbsupport @@ -8346,6 +8399,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-05-29 20:36:18.000000000 +1000 @@ -0,0 +1,152 @@ +#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.10.x", + "dirac", + "Dirac <diracinfo 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\n", diracdec->frame_num); + 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_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; --- NEW FILE: README_mplayersvn_trunk_revision_26925_dirac-0.10.x_patch --- This is a Dirac patch for Mplayer svn revision 26925. Encoding and decoding of Dirac raw bytestreams are now supported in FFmpeg via the Dirac libraries and Schroedinger libraries. This patch adds support for Dirac raw bytestream playback in Mplayer. I. Installing Dirac 1. Download Dirac 0.10.0 from http://sourceforge.net/projects/dirac/ 2. Unpack the Dirac source tar xvzf dirac-0.10.0.tar.gz 3. Build and Install cd dirac-0.10.0 ./configure make make install The last step installs the Dirac share encoder and decoder libraries in /usr/local/lib (which is the default install point). II. Installing Schroedinger 1. Download and install the latest release of Schroedinger from http://diracvideo.schleef.org/download/schroedinger/schroedinger-1.0.3.tar.gz For more details on the Schroedinger project please refer to http://diracvideo.schleef.org/ III. Building MPlayer 1. Check out trunk revision 26925 svn checkout -r 26925 svn://svn.mplayerhq.hu/mplayer/trunk mplayersvn_trunk_rev_26925 2. Apply the patch cd mplayersvn_trunk_rev_26925 patch -p1 < mplayersvn_trunk_revision_26925-dirac-0.10.x.patch 3. Build and Install ./configure make make install Dirac and Schroedinger support is auto-detected. Since Schroedinger is a more optimised and efficient decoder than Dirac, it is the the default decoder to decode Dirac bytestreams if enabled. If both Dirac and Schroedinger are enabled, the following variables will be defined in config.h #define HAVE_LIBDIRAC 1 #define HAVE_LIBSCHROEDINGER 1 #define ENABLE_LIBDIRAC_DECODER 0 #define CONFIG_LIBSCHROEDINGER_DECODER 1 #define ENABLE_LIBSCHROEDINGER_DECODER 1 #define CONFIG_LIBDIRAC_ENCODER 1 #define ENABLE_LIBDIRAC_ENCODER 1 #define CONFIG_LIBSCHROEDINGER_ENCODER 1 #define ENABLE_LIBSCHROEDINGER_ENCODER 1 #define CONFIG_DIRAC_PARSER 1 #define ENABLE_DIRAC_PARSER 1 #define CONFIG_DIRAC_DEMUXER 1 #define ENABLE_DIRAC_DEMUXER 1 #define CONFIG_DIRAC_MUXER 1 #define ENABLE_DIRAC_MUXER 1 #define CONFIG_LIBDIRAC 1 #define CONFIG_LIBSCHROEDINGER 1 |