diff -ruN MPlayer-1.0pre6a/configure MPlayer-1.0pre6a-dirac/configure --- MPlayer-1.0pre6a/configure 2004-12-23 15:36:00.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/configure 2005-02-15 13:07:57.000000000 +0000 @@ -220,6 +220,7 @@ --disable-liba52 disable builtin liba52 [enabled] --enable-libdts enable libdts support [autodetect] --disable-libmpeg2 disable builtin libmpeg2 [enabled] + --enable-dirac build with Dirac support [autodetect] Video output: --disable-vidix disable VIDIX [enable on x86 *nix] @@ -1393,6 +1394,7 @@ _inet6=auto _gethostbyname2=auto _ftp=yes +_dirac=auto for ac_option do case "$ac_option" in # Skip 1st pass @@ -1660,6 +1662,9 @@ --enable-sortsub) _sortsub=yes ;; --disable-sortsub) _sortsub=no ;; + --enable-dirac) _dirac=yes ;; + --disable-dirac) _dirac=no ;; + --language=*) _language=`echo $ac_option | cut -d '=' -f 2` ;; @@ -6510,6 +6515,53 @@ fi echores "$_lircc" +echocheck "Dirac support (only the CVS version!)" +if test "$_dirac" = auto ; then + _dirac=no + cat > $TMPC << EOF +#include +#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_seqparams_t seq_params; + dirac_frameparams_t frame_params; + dirac_framebuf_t frame_buf; + DecoderState state; + + decoder = dirac_decoder_init(0); + + /* we don't want to execute this kind of nonsense; just for making sure + * that compilation works... */ + memset(&buffer, 0, sizeof(buffer)); + dirac_buffer (decoder, buffer, buffer + sizeof(buffer)); + state = dirac_parse (decoder); + dirac_set_buf (decoder, yuv, NULL); + dirac_skip(decoder, 1); + dirac_decoder_close(decoder); + return 0; +} +EOF + cc_check `pkg-config --cflags dirac` `pkg-config --libs dirac` -lstdc++ && _dirac=yes +fi +if test "$_dirac" = yes ; then + _def_dirac='#define HAVE_DIRAC 1' + _codecmodules="libdirac $_codecmodules" + _inc_dirac=`pkg-config --cflags dirac` + _ld_dirac="`pkg-config --libs dirac` -lstdc++" +else + _def_dirac='#undef HAVE_DIRAC' + _nocodecmodules="libdirac $_nocodecmodules" +fi +echores "$_dirac" + ############################################################################# echo "Creating config.mak" cat > config.mak << EOF @@ -6676,6 +6728,8 @@ TOOLAME=$_toolame TOOLAME_EXTRAFLAGS=$_toolame_extraflags TOOLAME_LIB=$_toolame_lib +DIRAC_LIB = $_ld_dirac +DIRAC_INC = $_inc_dirac # --- Some stuff for autoconfigure ---- $_target_arch @@ -7206,6 +7260,9 @@ /* enable Matroska support */ $_def_matroska +/* enable Dirac support */ +$_def_dirac + /* enable FAAD (AAC) support */ $_def_faad $_def_faad_internal diff -ruN MPlayer-1.0pre6a/etc/codecs.conf MPlayer-1.0pre6a-dirac/etc/codecs.conf --- MPlayer-1.0pre6a/etc/codecs.conf 2004-12-17 13:30:29.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/etc/codecs.conf 2005-02-15 14:01:21.000000000 +0000 @@ -205,6 +205,15 @@ dll libtheora out YV12 +videocodec dirac + info "Dirac (libdirac_decoder)" + comment "work in progress" + status working + format 0x20000001 + driver dirac +; dll "libmpeg2" + out IYUV,422P + ; prefer native codecs over win32? ; the win32 codecs probably are (better) optimized and support direct ; rendering, so this may be not the best idea... diff -ruN MPlayer-1.0pre6a/libmpcodecs/Makefile MPlayer-1.0pre6a-dirac/libmpcodecs/Makefile --- MPlayer-1.0pre6a/libmpcodecs/Makefile 2004-12-09 13:11:21.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/libmpcodecs/Makefile 2005-02-15 13:17:41.000000000 +0000 @@ -11,7 +11,7 @@ VIDEO_SRCS_LIB=vd_libmpeg2.c vd_nuv.c vd_lzo.c VIDEO_SRCS_NAT=vd_null.c vd_raw.c vd_hmblck.c vd_mpegpes.c vd_mtga.c vd_sgi.c -VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_zrmjpeg.c vd_xanim.c vd_xvid.c vd_xvid4.c vd_libdv.c vd_qtvideo.c vd_theora.c +VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_zrmjpeg.c vd_xanim.c vd_xvid.c vd_xvid4.c vd_libdv.c vd_qtvideo.c vd_theora.c vd_dirac.c VIDEO_SRCS=dec_video.c vd.c $(VIDEO_SRCS_NAT) $(VIDEO_SRCS_LIB) $(VIDEO_SRCS_OPT) VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_scale.c vf_format.c vf_noformat.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c vf_perspective.c vf_down3dright.c vf_field.c vf_denoise3d.c vf_hqdn3d.c vf_detc.c vf_telecine.c vf_tfields.c vf_ivtc.c vf_ilpack.c vf_dsize.c vf_decimate.c vf_softpulldown.c vf_tinterlace.c vf_pullup.c pullup.c vf_framestep.c vf_tile.c vf_delogo.c vf_fil.c vf_hue.c vf_spp.c vf_yuvcsp.c vf_filmdint.c vf_kerndeint.c vf_rgbtest.c vf_qp.c vf_phase.c vf_divtc.c vf_harddup.c vf_softskip.c @@ -50,7 +50,7 @@ SRCS2=$(ENCODER_SRCS) OBJS2=$(SRCS2:.c=.o) -CFLAGS = $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) $(X264_INC) -D_GNU_SOURCE +CFLAGS = $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) $(X264_INC) $(DIRAC_INC) -D_GNU_SOURCE .SUFFIXES: .c .o diff -ruN MPlayer-1.0pre6a/libmpcodecs/vd.c MPlayer-1.0pre6a-dirac/libmpcodecs/vd.c --- MPlayer-1.0pre6a/libmpcodecs/vd.c 2004-12-18 14:06:35.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/libmpcodecs/vd.c 2005-02-15 13:14:50.000000000 +0000 @@ -52,6 +52,7 @@ extern vd_functions_t mpcodecs_vd_libdv; extern vd_functions_t mpcodecs_vd_lzo; extern vd_functions_t mpcodecs_vd_qtvideo; +extern vd_functions_t mpcodecs_vd_dirac; vd_functions_t* mpcodecs_vd_drivers[] = { &mpcodecs_vd_null, @@ -109,6 +110,9 @@ #if defined(USE_QTX_CODECS) || defined(MACOSX) &mpcodecs_vd_qtvideo, #endif +#ifdef HAVE_DIRAC + &mpcodecs_vd_dirac, +#endif NULL }; diff -ruN MPlayer-1.0pre6a/libmpcodecs/vd_dirac.c MPlayer-1.0pre6a-dirac/libmpcodecs/vd_dirac.c --- MPlayer-1.0pre6a/libmpcodecs/vd_dirac.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre6a-dirac/libmpcodecs/vd_dirac.c 2005-01-24 12:13:50.000000000 +0000 @@ -0,0 +1,169 @@ +#include +#include + +#include "config.h" +#ifdef HAVE_DIRAC +#include "mp_msg.h" + +#include "vd_internal.h" + +static vd_info_t info = +{ + "Dirac Video decoder v0.4.0", + "dirac", + "Dirac + +// to set/get/query special features/parameters +static int control(sh_video_t *sh,int cmd,void* arg,...) +{ + return CONTROL_UNKNOWN; +} + +// init driver +static int init(sh_video_t *sh) +{ + dirac_decoder_t *diracdec ; + + /* + * initialise cpu acceleration stuff when we have it in Dirac + */ + + /* + * initialise decoder + */ + diracdec = dirac_decoder_init(verbose > 4); + + if (!diracdec) + return 0; + + sh->context = diracdec; + + return 1; +} + +// uninit driver +static void uninit(sh_video_t *sh) +{ + dirac_decoder_t *diracdec = sh->context; + if (diracdec) + dirac_decoder_close (diracdec); +} + +// decode a frame +static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags) +{ + dirac_decoder_t *diracdec = sh->context; + mp_image_t* mpi=NULL; + int drop_frame, framedrop=flags&3; + unsigned char *buf[3]; + + + if(len<=0) return 0; // skipped null frame + + dirac_buffer (diracdec, data, data+len); + + while (1) + { + DecoderState state = dirac_parse (diracdec); + + switch (state) + { + case STATE_BUFFER: + return 0; + + case STATE_SEQUENCE: + mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_SEQUENCE width=%d height=%d\n", diracdec->seq_params.width, diracdec->seq_params.height); + if (diracdec->seq_params.chroma == format422) + { + if(!mpcodecs_config_vo(sh, + diracdec->seq_params.width, + diracdec->seq_params.height, + IMGFMT_422P)) + return 0; + } + else + { + if(!mpcodecs_config_vo(sh, + diracdec->seq_params.width, + diracdec->seq_params.height, + IMGFMT_IYUV)) + return 0; + } + buf[0] = (unsigned char *)malloc (diracdec->seq_params.width * diracdec->seq_params.height); + buf[1] = (unsigned char *)malloc (diracdec->seq_params.chroma_width * diracdec->seq_params.chroma_height); + buf[2] = (unsigned char *)malloc (diracdec->seq_params.chroma_width * diracdec->seq_params.chroma_height); + + if (!buf[0] || !buf[1] || !buf[2]) + { + free(buf[0]); + free(buf[1]); + free(buf[2]); + return 0; + } + dirac_set_buf(diracdec, buf, mpi); + break; + + case STATE_SEQUENCE_END: + mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_SEQUENCE_END\n"); + free (diracdec->fbuf->buf[0]); + free (diracdec->fbuf->buf[1]); + free (diracdec->fbuf->buf[2]); + break; + + case STATE_PICTURE_AVAIL: + mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_PICTURE_AVAIL fnum=%d ftype=%s\n", + diracdec->frame_params.fnum, + diracdec->frame_params.ftype == I_frame ? "I_frame" : + (diracdec->frame_params.ftype == L1_frame ? + "L1_frame" : "L2_frame")); + mpi=mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, sh->disp_w, sh->disp_h); + if (mpi) + { + mpi->planes[0] = diracdec->fbuf->buf[0]; + mpi->stride[0] = diracdec->seq_params.width; + mpi->planes[1] = diracdec->fbuf->buf[1]; + mpi->stride[1] = diracdec->seq_params.chroma_width; + mpi->planes[2] = diracdec->fbuf->buf[2]; + mpi->stride[2] = diracdec->seq_params.chroma_width; + return mpi; + } + case STATE_PICTURE_START: + mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_PICTURE_START fnum=%d ftype=%s\n", + diracdec->frame_params.fnum, + diracdec->frame_params.ftype == I_frame ? "I_frame" : + (diracdec->frame_params.ftype == L1_frame ? + "L1_frame" : "L2_frame")); + sh->pts = (diracdec->frame_params.fnum+1)*sh->frametime; + drop_frame = framedrop && (diracdec->frame_params.ftype == L2_frame); + drop_frame |= framedrop>=2; + if (drop_frame) + { + mp_msg(MSGT_DECVIDEO,MSGL_DBG2," Skipping frame\n"); + dirac_skip(diracdec, 1); + } + else + dirac_skip(diracdec, 0); + break; + + case STATE_INVALID: + mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Dirac: STATE_INVALID"); + free (diracdec->fbuf->buf[0]); + free (diracdec->fbuf->buf[1]); + free (diracdec->fbuf->buf[2]); + return 0; + break; + + default: + break; + } + } + return 0; +} + +#endif diff -ruN MPlayer-1.0pre6a/libmpdemux/demux_dirac.c MPlayer-1.0pre6a-dirac/libmpdemux/demux_dirac.c --- MPlayer-1.0pre6a/libmpdemux/demux_dirac.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre6a-dirac/libmpdemux/demux_dirac.c 2005-02-16 16:57:11.985881437 +0000 @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include "config.h" + +#ifdef HAVE_DIRAC +#include "mp_msg.h" +#include "help_mp.h" + +#include "stream.h" +#include "demuxer.h" +#include "stheader.h" + +#include + +int dirac_check_file(demuxer_t *demuxer) +{ + unsigned char tmp_buffer[4096]; + int bytes_read; + dirac_decoder_t *diracdec; + DecoderState state; + int ret_stat = 0; + + mp_msg(MSGT_DEMUX,MSGL_V,"Checking for Dirac\n"); + diracdec = dirac_decoder_init(verbose); + + if (diracdec ==NULL) + return 0; + + while(1) + { + bytes_read = stream_read(demuxer->stream,tmp_buffer, 4096); + if (bytes_read == 0) + break; + dirac_buffer (diracdec, tmp_buffer, tmp_buffer + bytes_read); + + state = dirac_parse (diracdec); + switch (state) + { + case STATE_BUFFER: + break; + + case STATE_SEQUENCE: + ret_stat = 1; + break; + + default: + break; + + } + if (ret_stat) + break; + } + + dirac_decoder_close(diracdec); + stream_reset(demuxer->stream); + stream_seek(demuxer->stream, 0); + + return ret_stat; +} + +int demux_open_dirac(demuxer_t *demuxer) +{ + unsigned char tmp_buffer[4096]; + int bytes_read; + dirac_decoder_t *diracdec; + DecoderState state; + int ret_stat = 0; + + mp_msg(MSGT_DEMUX,MSGL_V,"Opening Dirac stream\n"); + diracdec = dirac_decoder_init(verbose); + if (diracdec ==NULL) + return 0; + + stream_reset(demuxer->stream); + stream_seek(demuxer->stream, 0); + + + while(1) + { + bytes_read = stream_read(demuxer->stream,tmp_buffer, 4096); + if (bytes_read == 0) + break; + dirac_buffer (diracdec, tmp_buffer, tmp_buffer + bytes_read); + + state = dirac_parse (diracdec); + switch (state) + { + case STATE_BUFFER: + break; + + case STATE_SEQUENCE: + ret_stat = 1; + break; + + default: + break; + + } + if (ret_stat) + break; + } + if (ret_stat) + { + sh_video_t *sh_video = new_sh_video(demuxer, 0); + /* FIXME: set seekable to 1 after including code for seek */ + demuxer->seekable = 0; + demuxer->video->sh = sh_video; + sh_video->ds = demuxer->video; + /* FIXME: defined in codecs.conf. Do we need to get a unique + * number from somebody!!! + */ + sh_video->format = 0x20000001; + sh_video->disp_w = diracdec->seq_params.width; + sh_video->disp_h = diracdec->seq_params.height; + sh_video->fps = diracdec->seq_params.frame_rate.numerator / + diracdec->seq_params.frame_rate.denominator; + sh_video->frametime = 1.0/sh_video->fps; + } + + dirac_decoder_close(diracdec); + stream_reset(demuxer->stream); + stream_seek(demuxer->stream, 0); + + return ret_stat; +} + +int demux_dirac_fill_buffer(demuxer_t *demuxer) +{ + demux_packet_t* dp_video=NULL; + unsigned char tmp_buffer[4096]; + + int bytes_read; + bytes_read = stream_read(demuxer->stream,tmp_buffer, 4096); + if (bytes_read) + { + dp_video=new_demux_packet(bytes_read); + memmove(dp_video->buffer, tmp_buffer, bytes_read); + dp_video->flags=0; + dp_video->pos=stream_tell(demuxer->stream); + ds_add_packet(demuxer->video,dp_video); + return 1; + } + return 0; +} + +extern void demux_close_dirac(demuxer_t* demuxer) +{ + return; +} + +#endif diff -ruN MPlayer-1.0pre6a/libmpdemux/demuxer.c MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.c --- MPlayer-1.0pre6a/libmpdemux/demuxer.c 2004-12-21 12:25:59.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.c 2005-02-15 13:29:28.000000000 +0000 @@ -156,6 +156,9 @@ extern void demux_close_ra(demuxer_t* demuxer); extern void demux_close_ty(demuxer_t* demuxer); extern void demux_close_lavf(demuxer_t* demuxer); +#ifdef HAVE_DIRAC +extern void demux_close_dirac(demuxer_t* demuxer); +#endif #ifdef USE_TV @@ -245,6 +248,10 @@ case DEMUXER_TYPE_LAVF: demux_close_lavf(demuxer); break; #endif +#ifdef HAVE_DIRAC + case DEMUXER_TYPE_DIRAC: + demux_close_dirac(demuxer); break; +#endif } // free streams: for(i=0;i<256;i++){ @@ -336,6 +343,10 @@ extern int demux_mkv_fill_buffer(demuxer_t *d); extern int demux_lavf_fill_buffer(demuxer_t *d); +#ifdef HAVE_DIRAC +int demux_dirac_fill_buffer(demuxer_t *demuxer); +#endif + int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ // Note: parameter 'ds' can be NULL! // printf("demux->type=%d\n",demux->type); @@ -393,6 +404,9 @@ #ifdef USE_LIBAVFORMAT case DEMUXER_TYPE_LAVF: return demux_lavf_fill_buffer(demux); #endif +#ifdef HAVE_DIRAC + case DEMUXER_TYPE_DIRAC: return demux_dirac_fill_buffer(demux); +#endif } return 0; } @@ -603,6 +617,10 @@ int demux_open_rawdv(demuxer_t* demuxer); extern int rawdv_check_file(demuxer_t *demuxer); #endif +#ifdef HAVE_DIRAC +int demux_open_dirac(demuxer_t* demuxer); +extern int dirac_check_file(demuxer_t *demuxer); +#endif extern int vivo_check_file(demuxer_t *demuxer); extern void demux_open_vivo(demuxer_t *demuxer); @@ -1073,6 +1091,22 @@ } } #endif +#ifdef HAVE_DIRAC +//=============== Try to open raw Dirac file ================= +if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_DIRAC) +{ + demuxer=new_demuxer(stream,DEMUXER_TYPE_DIRAC,audio_id,video_id,dvdsub_id); + if(dirac_check_file(demuxer)) + { + mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"DIRAC"); + file_format=DEMUXER_TYPE_DIRAC; + } + else { + free_demuxer(demuxer); + demuxer=NULL; + } +} +#endif //=============== Try to open as audio file: ================= if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AUDIO){ demuxer=new_demuxer(stream,DEMUXER_TYPE_AUDIO,audio_id,video_id,dvdsub_id); @@ -1361,6 +1395,12 @@ break; } #endif +#ifdef HAVE_DIRAC + case DEMUXER_TYPE_DIRAC: { + if (!demux_open_dirac(demuxer)) return NULL; + break; + } +#endif } // switch(file_format) pts_from_bps=0; // !!! if ((sh_video=demuxer->video->sh) && sh_video->bih) diff -ruN MPlayer-1.0pre6a/libmpdemux/demuxer.h MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.h --- MPlayer-1.0pre6a/libmpdemux/demuxer.h 2004-12-15 18:39:51.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/libmpdemux/demuxer.h 2005-02-15 13:30:18.000000000 +0000 @@ -44,11 +44,12 @@ #define DEMUXER_TYPE_LMLM4 34 #define DEMUXER_TYPE_LAVF 35 #define DEMUXER_TYPE_NSV 36 +#define DEMUXER_TYPE_DIRAC 37 // This should always match the higest demuxer type number. // Unless you want to disallow users to force the demuxer to some types #define DEMUXER_TYPE_MIN 0 -#define DEMUXER_TYPE_MAX 36 +#define DEMUXER_TYPE_MAX 37 #define DEMUXER_TYPE_DEMUXERS (1<<16) // A virtual demuxer type for the network code diff -ruN MPlayer-1.0pre6a/libmpdemux/Makefile MPlayer-1.0pre6a-dirac/libmpdemux/Makefile --- MPlayer-1.0pre6a/libmpdemux/Makefile 2004-12-15 18:39:51.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/libmpdemux/Makefile 2005-02-15 13:31:53.000000000 +0000 @@ -3,7 +3,7 @@ include ../config.mak -SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c +SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c demux_dirac.c parse_dirac.c ifeq ($(XMMS_PLUGINS),yes) SRCS += demux_xmms.c endif @@ -32,7 +32,7 @@ OBJS = $(SRCS:.c=.o) OBJS += $(CPLUSPLUSSRCS:.cpp=.o) INCLUDE = -I.. -I../loader $(CSS_INC) $(EXTRA_INC) $(LIBAV_INC) -CFLAGS = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC) +CFLAGS = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC) $(DIRAC_INC) CPLUSPLUSFLAGS = $(CFLAGS) $(CPLUSPLUSINCLUDE) CPLUSPLUS = $(CC) diff -ruN MPlayer-1.0pre6a/libmpdemux/parse_dirac.c MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.c --- MPlayer-1.0pre6a/libmpdemux/parse_dirac.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.c 2004-09-14 12:40:29.000000000 +0100 @@ -0,0 +1,154 @@ +#include +#include +#include + +#include "config.h" +#include "mp_msg.h" +#include "help_mp.h" + +#include "stream.h" +#include "demuxer.h" +#include "parse_dirac.h" + +#define DIRAC_VIDEOBUFFER_SIZE 0x100000 + +static unsigned char* dirac_videobuffer = 0; +static int dirac_videobuf_len =0; +static unsigned char dirac_videobuf_code[5]; +static int dirac_videobuf_code_len = 0; + +int dirac_sync_video_packet (demux_stream_t *ds) +{ + int skipped = 0; + dirac_videobuf_len = 0; + while(dirac_videobuf_code_len<5) + { + dirac_videobuf_code[dirac_videobuf_code_len++]=demux_getc(ds); + } + while (1) + { + int c; + if(dirac_videobuf_code[0]==0x42 && dirac_videobuf_code[1]==0x42 && dirac_videobuf_code[2]==0x43 && dirac_videobuf_code[3]==0x44) + { + break; + } + ++skipped; + dirac_videobuffer[0] = dirac_videobuf_code[0]=dirac_videobuf_code[1]; + dirac_videobuffer[1] = dirac_videobuf_code[1]=dirac_videobuf_code[2]; + dirac_videobuffer[2] = dirac_videobuf_code[2]=dirac_videobuf_code[3]; + dirac_videobuffer[3] = dirac_videobuf_code[3]=dirac_videobuf_code[4]; + c = demux_getc(ds); + if (c < 0 ) + return 0; + dirac_videobuffer[4] = dirac_videobuf_code[4]=c; + dirac_videobuf_len = 5; + } + return dirac_videobuf_code[4]; +} + +// RAP Frame start = 0xD7 +// Non-RAP I Frame start = 0xD6 +// L1 Frame start = 0xD4 +// L2 Frame start = 0xD7 +#define FRAME_START(c) ((c) == 0xD4 || (c) == 0xD5 || (c) == 0xD6 || (c) == 0xD7) + +int dirac_read_video_frame (demux_stream_t *ds, unsigned char** start) +{ + int in_frame = 0; + unsigned int shift = 0xffffffff; + int msg_type = 0xFF; + + + if (!dirac_videobuffer) + { + dirac_videobuffer = (unsigned char *)malloc(DIRAC_VIDEOBUFFER_SIZE); + if(!dirac_videobuffer) + { + mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_ShMemAllocFail); + return 0; + } + } + + *start = dirac_videobuffer; + + while (msg_type != 0 && msg_type == 0xFF) + msg_type = dirac_sync_video_packet(ds); + + if (msg_type == 0) + return -1; + + + //dirac_videobuf_len = 0; + //for (i = 0; i < dirac_videobuf_code_len; i++) + //{ + // dirac_videobuffer[dirac_videobuf_len++] = dirac_videobuf_code[i]; + //} + + /* find start of frame */ + while (!in_frame) + { + int byte; + if (FRAME_START(msg_type)) + { + in_frame = 1; + break; + } + + byte = demux_getc(ds); + if (byte < 0) + { + dirac_videobuf_code_len = 0; + if (dirac_videobuf_len) + return dirac_videobuf_len; + else + return -1; + } + + dirac_videobuffer[dirac_videobuf_len++] = byte; + if (shift == 0x42424344) + { + if (FRAME_START(byte)) + { + in_frame = 1; + break; + } + } + shift = (shift << 8 ) | byte; + } + + /* find end of frame */ + shift = 0xffffffff; + dirac_videobuf_code_len = 0; + while (in_frame) + { + int byte; + byte = demux_getc(ds); + if (byte < 0) + return dirac_videobuf_len; + + dirac_videobuffer[dirac_videobuf_len++] = byte; + if (shift == 0x42424344) + { + if (byte != 0xFF) + { + in_frame = 0; + dirac_videobuf_code_len = 5; + dirac_videobuf_code[0] = 0x42; + dirac_videobuf_code[1] = 0x42; + dirac_videobuf_code[2] = 0x43; + dirac_videobuf_code[3] = 0x44; + dirac_videobuf_code[4] = byte; + break; + } + } + shift = (shift << 8 ) | byte; + } + //return dirac_videobuf_len - dirac_videobuf_code_len; + return dirac_videobuf_len; +} + +/* TODO: */ +int dirac_skip_video_frame(demux_stream_t *ds) +{ + return 0; +} diff -ruN MPlayer-1.0pre6a/libmpdemux/parse_dirac.h MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.h --- MPlayer-1.0pre6a/libmpdemux/parse_dirac.h 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre6a-dirac/libmpdemux/parse_dirac.h 2004-09-14 12:40:32.000000000 +0100 @@ -0,0 +1,10 @@ + +#define MAX_VIDEO_PACKET_SIZE (224*1024+4) +#define VIDEOBUFFER_SIZE 0x100000 + +// return: packet length. set *start to start of packet +int dirac_read_video_frame(demux_stream_t *ds, unsigned char **start); + +// return: next packet code +int dirac_skip_video_frame(demux_stream_t *ds); + diff -ruN MPlayer-1.0pre6a/libmpdemux/video.c MPlayer-1.0pre6a-dirac/libmpdemux/video.c --- MPlayer-1.0pre6a/libmpdemux/video.c 2004-11-24 18:55:03.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/libmpdemux/video.c 2005-02-15 13:24:15.000000000 +0000 @@ -17,6 +17,7 @@ #include "demuxer.h" #include "stheader.h" #include "parse_es.h" +#include "parse_dirac.h" #include "mpeg_hdr.h" /* sub_cc (closed captions)*/ @@ -451,6 +452,9 @@ *start=videobuffer; in_size=videobuf_len; videobuf_len=0; + } else if(demuxer->file_format==DEMUXER_TYPE_DIRAC){ + in_size = dirac_read_video_frame(d_video, start); + } else { // frame-based file formats: (AVI,ASF,MOV) in_size=ds_get_packet(d_video,start); @@ -533,7 +537,9 @@ } } // printf("\rIII pts: %5.3f [%d] (%5.3f) \n",d_video->pts2,picture_coding_type,i_pts); - } else + } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC){ + sh_video->pts+=frame_time; + } else sh_video->pts=d_video->pts; if(frame_time_ptr) *frame_time_ptr=frame_time; diff -ruN MPlayer-1.0pre6a/Makefile MPlayer-1.0pre6a-dirac/Makefile --- MPlayer-1.0pre6a/Makefile 2004-11-05 14:02:40.000000000 +0000 +++ MPlayer-1.0pre6a-dirac/Makefile 2005-02-15 13:10:53.000000000 +0000 @@ -32,10 +32,10 @@ VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB) AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(JACK_LIB) $(NAS_LIB) $(SGIAUDIO_LIB) $(POLYP_LIB) -CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB) +CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB) $(DIRAC_LIB) COMMON_LIBS = libmpcodecs/libmpcodecs.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB) -CFLAGS = $(OPTFLAGS) -I. $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) # -Wall +CFLAGS = $(OPTFLAGS) -I. $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) $(DIRAC_INC) # -Wall ifeq ($(TOOLAME),yes) CFLAGS += $(TOOLAME_EXTRAFLAGS) CODEC_LIBS += $(TOOLAME_LIB)