diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/configure MPlayer-1.0pre7-snow-dirac/configure --- MPlayer-1.0pre7/configure 2005-04-13 12:46:35.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/configure 2005-05-12 12:41:00.000000000 +0100 @@ -229,6 +229,7 @@ --disable-amr_nb disable amr narrowband, floating point [autodetect] --disable-amr_nb-fixed disable amr narrowband, fixed point [autodetect] --disable-amr_wb disable amr wideband, floating point [autodetect] + --enable-dirac build with Dirac support [autodetect] Video output: --disable-vidix disable VIDIX [enable on x86 *nix] @@ -1411,6 +1412,7 @@ _gethostbyname2=auto _ftp=yes _vstream=auto +_dirac=auto for ac_option do case "$ac_option" in # Skip 1st pass @@ -1692,6 +1694,9 @@ --enable-sortsub) _sortsub=yes ;; --disable-sortsub) _sortsub=no ;; + --enable-dirac) _dirac=yes ;; + --disable-dirac) _dirac=no ;; + --charset=*) _charset=`echo $ac_option | cut -d '=' -f 2` ;; @@ -6673,6 +6678,53 @@ fi echores "$_lircc" +echocheck "Dirac support (version 5.2!)" +if test "$_dirac" = auto ; then + _dirac=no + cat > $TMPC << EOF +#include +#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 @@ -6848,6 +6900,8 @@ AMR_NB=$_amr_nb AMR_NB_FIXED=$_amr_nb_fixed AMR_WB=$_amr_wb +DIRAC_LIB = $_ld_dirac +DIRAC_INC = $_inc_dirac # --- Some stuff for autoconfigure ---- $_target_arch @@ -7377,6 +7431,9 @@ /* enable Matroska support */ $_def_matroska +/* enable Dirac support */ +$_def_dirac + /* enable FAAD (AAC) support */ $_def_faad $_def_faad_internal diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/etc/codecs.conf MPlayer-1.0pre7-snow-dirac/etc/codecs.conf --- MPlayer-1.0pre7/etc/codecs.conf 2005-04-10 17:44:29.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/etc/codecs.conf 2005-05-12 12:49:04.000000000 +0100 @@ -220,6 +220,16 @@ dll libtheora out YV12 +videocodec dirac + info "Dirac (libdirac_decoder)" + comment "work in progress" + status working + fourcc drac + format 0x20000001 + driver dirac +; dll "libmpeg2" + out IYUV,422P + ; prefer native codecs over win32? ; the win32 codecs probably are (better) optimized and support direct ; rendering, so this may be not the best idea... diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libavcodec/snow.c MPlayer-1.0pre7-snow-dirac/libavcodec/snow.c --- MPlayer-1.0pre7/libavcodec/snow.c 2005-04-16 21:41:13.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libavcodec/snow.c 2005-05-18 11:47:53.000000000 +0100 @@ -2359,8 +2359,13 @@ // if(b_w==16) am= 8*(a1+a2); - if(dx<8) tmp[x]= (32*a2*( 8-dx) + am* dx + 128)>>8; - else tmp[x]= ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8; + if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8; + else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8; + + /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/ + if(am&(~255)) am= ~(am>>31); + + tmp[x] = am; /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6; else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6; @@ -2387,9 +2392,12 @@ // if(b_w==16) am= 8*(a1+a2); - if(dy<8) dst[x]= (32*a2*( 8-dy) + am* dy + 128)>>8; - else dst[x]= ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8; + if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8; + else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8; + if(am&(~255)) am= ~(am>>31); + + dst[x] = am; /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6; else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6; else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6; @@ -2942,7 +2950,7 @@ } } -static void dequantize_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride){ +static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){ const int w= b->width; const int h= b->height; const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16); @@ -2953,7 +2961,7 @@ if(s->qlog == LOSSLESS_QLOG) return; - for(y=0; ystride_line) + b->buf_y_offset) + b->buf_x_offset; for(x=0; xwidth; const int h= b->height; int x,y; @@ -3030,7 +3038,10 @@ DWTELEM * line; DWTELEM * prev; - for(y=0; ystride_line) + b->buf_y_offset) + b->buf_x_offset; + + for(y=start_y; ystride_line) + b->buf_y_offset) + b->buf_x_offset; @@ -3329,9 +3340,9 @@ SnowContext *s = avctx->priv_data; int plane_index; - if(avctx->strict_std_compliance >= 0){ - av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n" - "use vstrict=-1 / -strict -1 to use it anyway\n"); + if(avctx->strict_std_compliance >= 0 ){ + av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n" + "use vstrict=-2 / -strict -2 to use it anyway\n"); return -1; } @@ -3641,15 +3652,13 @@ { SnowContext *s = avctx->priv_data; int block_size; + + avctx->pix_fmt= PIX_FMT_YUV420P; common_init(avctx); block_size = MB_SIZE >> s->block_max_depth; - /* FIXME block_size * 2 is determined empirically. block_size * 1.5 is definitely needed, but I (Robert) cannot figure out why more than that is needed. Perhaps there is a bug, or perhaps I overlooked some demands that are placed on the buffer. */ - /* FIXME The formula is WRONG. For height > 480, the buffer will overflow. */ - /* FIXME For now, I will use a full frame of lines. Fortunately, this should not materially effect cache performance because lines are allocated using a stack, so if in fact only 50 out of 496 lines are needed at a time, the other 446 will sit allocated but never accessed. */ -// slice_buffer_init(s->plane[0].sb, s->plane[0].height, (block_size * 2) + (s->spatial_decomposition_count * s->spatial_decomposition_count), s->plane[0].width, s->spatial_dwt_buffer); - slice_buffer_init(&s->sb, s->plane[0].height, s->plane[0].height, s->plane[0].width, s->spatial_dwt_buffer); + slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 2)) + 1, s->plane[0].width, s->spatial_dwt_buffer); return 0; } @@ -3681,7 +3690,6 @@ int h= p->height; int x, y; int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */ - SubBand * correlate_band; if(s->avctx->debug&2048){ memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h); @@ -3704,12 +3712,6 @@ } STOP_TIMER("unpack coeffs"); } - - /* Handle level 0, orientation 0 specially. It is particularly resistant to slicing but fortunately quite small, so process it in one pass. */ - correlate_band = &p->band[0][0]; - decode_subband_slice_buffered(s, correlate_band, &s->sb, 0, correlate_band->height, decode_state[0][0]); - correlate_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0); - dequantize_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride); {START_TIMER const int mb_h= s->b_height << s->block_max_depth; @@ -3724,23 +3726,43 @@ ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count); for(mb_y=0; mb_y<=mb_h; mb_y++){ - const int slice_starty = block_w*mb_y; - const int slice_h = block_w*(mb_y+1); + int slice_starty = block_w*mb_y; + int slice_h = block_w*(mb_y+1); + if (!(s->keyframe || s->avctx->debug&512)){ + slice_starty = FFMAX(0, slice_starty - (block_w >> 1)); + slice_h -= (block_w >> 1); + } { START_TIMER for(level=0; levelspatial_decomposition_count; level++){ - for(orientation=level ? 1 : 1; orientation<4; orientation++){ + for(orientation=level ? 1 : 0; orientation<4; orientation++){ SubBand *b= &p->band[level][orientation]; int start_y; int end_y; int our_mb_start = mb_y; int our_mb_end = (mb_y + 1); - start_y = FFMIN(b->height, (mb_y ? ((block_w * our_mb_start - 4) >> (s->spatial_decomposition_count - level)) + 5 : 0)); - end_y = FFMIN(b->height, (((block_w * our_mb_end - 4) >> (s->spatial_decomposition_count - level)) + 5)); - - if (start_y != end_y) - decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]); + start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2: 0); + end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + 2); + if (!(s->keyframe || s->avctx->debug&512)){ + start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level))); + end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level))); + } + start_y = FFMIN(b->height, start_y); + end_y = FFMIN(b->height, end_y); + + if (start_y != end_y){ + if (orientation == 0){ + SubBand * correlate_band = &p->band[0][0]; + int correlate_end_y = FFMIN(b->height, end_y + 1); + int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0)); + decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]); + correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y); + dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y); + } + else + decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]); + } } } STOP_TIMER("decode_subband_slice"); @@ -3764,16 +3786,8 @@ predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y); - /* Nasty hack based empirically on how predict_slice_buffered() hits the buffer. */ - /* FIXME If possible, make predict_slice fit into the slice. As of now, it works on some previous lines (up to slice_height / 2) if the condition on the next line is false. */ - if (s->keyframe || (s->avctx->debug&512)){ - y = FFMIN(p->height, slice_starty); - end_y = FFMIN(p->height, slice_h); - } - else{ - y = FFMAX(0, FFMIN(p->height, slice_starty - (block_w >> 1))); - end_y = FFMAX(0, FFMIN(p->height, slice_h - (block_w >> 1))); - } + y = FFMIN(p->height, slice_starty); + end_y = FFMIN(p->height, slice_h); while(y < end_y) slice_buffer_release(&s->sb, y++); } diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpcodecs/Makefile MPlayer-1.0pre7-snow-dirac/libmpcodecs/Makefile --- MPlayer-1.0pre7/libmpcodecs/Makefile 2004-12-29 19:51:56.000000000 +0000 +++ MPlayer-1.0pre7-snow-dirac/libmpcodecs/Makefile 2005-05-12 12:55:36.000000000 +0100 @@ -11,7 +11,7 @@ VIDEO_SRCS_LIB=vd_libmpeg2.c vd_nuv.c vd_lzo.c VIDEO_SRCS_NAT=vd_null.c vd_raw.c vd_hmblck.c vd_mpegpes.c vd_mtga.c vd_sgi.c -VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_zrmjpeg.c vd_xanim.c vd_xvid.c vd_xvid4.c vd_libdv.c vd_qtvideo.c vd_theora.c +VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_zrmjpeg.c vd_xanim.c vd_xvid.c vd_xvid4.c vd_libdv.c vd_qtvideo.c vd_theora.c vd_dirac.c VIDEO_SRCS=dec_video.c vd.c $(VIDEO_SRCS_NAT) $(VIDEO_SRCS_LIB) $(VIDEO_SRCS_OPT) VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_scale.c vf_format.c vf_noformat.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c vf_perspective.c vf_down3dright.c vf_field.c vf_denoise3d.c vf_hqdn3d.c vf_detc.c vf_telecine.c vf_tfields.c vf_ivtc.c vf_ilpack.c vf_dsize.c vf_decimate.c vf_softpulldown.c vf_tinterlace.c vf_pullup.c pullup.c vf_framestep.c vf_tile.c vf_delogo.c vf_fil.c vf_hue.c vf_spp.c vf_yuvcsp.c vf_filmdint.c vf_kerndeint.c vf_rgbtest.c vf_qp.c vf_phase.c vf_divtc.c vf_harddup.c vf_softskip.c @@ -50,7 +50,7 @@ SRCS2=$(ENCODER_SRCS) OBJS2=$(SRCS2:.c=.o) -CFLAGS = $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) $(X264_INC) -D_GNU_SOURCE +CFLAGS = $(OPTFLAGS) -I. -Inative -I.. -I../libmpdemux -I../loader $(EXTRA_INC) $(X264_INC) $(DIRAC_INC) -D_GNU_SOURCE .SUFFIXES: .c .o diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpcodecs/vd.c MPlayer-1.0pre7-snow-dirac/libmpcodecs/vd.c --- MPlayer-1.0pre7/libmpcodecs/vd.c 2005-03-01 20:21:58.000000000 +0000 +++ MPlayer-1.0pre7-snow-dirac/libmpcodecs/vd.c 2005-05-12 12:51:56.000000000 +0100 @@ -52,6 +52,7 @@ extern vd_functions_t mpcodecs_vd_libdv; extern vd_functions_t mpcodecs_vd_lzo; extern vd_functions_t mpcodecs_vd_qtvideo; +extern vd_functions_t mpcodecs_vd_dirac; vd_functions_t* mpcodecs_vd_drivers[] = { &mpcodecs_vd_null, @@ -109,6 +110,9 @@ #if defined(USE_QTX_CODECS) || defined(MACOSX) &mpcodecs_vd_qtvideo, #endif +#ifdef HAVE_DIRAC + &mpcodecs_vd_dirac, +#endif NULL }; diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpcodecs/vd_dirac.c MPlayer-1.0pre7-snow-dirac/libmpcodecs/vd_dirac.c --- MPlayer-1.0pre7/libmpcodecs/vd_dirac.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libmpcodecs/vd_dirac.c 2005-05-12 13:49:13.000000000 +0100 @@ -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.5.2", + "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 -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/demux_dirac.c MPlayer-1.0pre7-snow-dirac/libmpdemux/demux_dirac.c --- MPlayer-1.0pre7/libmpdemux/demux_dirac.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/demux_dirac.c 2005-05-12 12:58:10.000000000 +0100 @@ -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 -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/demuxer.c MPlayer-1.0pre7-snow-dirac/libmpdemux/demuxer.c --- MPlayer-1.0pre7/libmpdemux/demuxer.c 2005-04-03 15:08:26.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/demuxer.c 2005-05-12 13:10:29.000000000 +0100 @@ -160,6 +160,9 @@ #ifdef USE_WIN32DLL extern void demux_close_avs(demuxer_t* demuxer); #endif +#ifdef HAVE_DIRAC +extern void demux_close_dirac(demuxer_t* demuxer); +#endif #ifdef USE_TV @@ -255,6 +258,10 @@ case DEMUXER_TYPE_AVS: demux_close_avs(demuxer); break; #endif +#ifdef HAVE_DIRAC + case DEMUXER_TYPE_DIRAC: + demux_close_dirac(demuxer); break; +#endif } // free streams: for(i = 0; i < MAX_A_STREAMS; i++) @@ -349,6 +356,9 @@ #ifdef USE_WIN32DLL extern int demux_avs_fill_buffer(demuxer_t *d); #endif +#ifdef HAVE_DIRAC +int demux_dirac_fill_buffer(demuxer_t *demuxer); +#endif int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ // Note: parameter 'ds' can be NULL! @@ -411,6 +421,9 @@ #ifdef USE_WIN32DLL case DEMUXER_TYPE_AVS: return demux_avs_fill_buffer(demux); #endif +#ifdef HAVE_DIRAC + case DEMUXER_TYPE_DIRAC: return demux_dirac_fill_buffer(demux); +#endif } return 0; } @@ -626,6 +639,12 @@ int avs_check_file(demuxer_t *demuxer, const char *filename); #endif +#ifdef HAVE_DIRAC +int demux_open_dirac(demuxer_t* demuxer); +extern int dirac_check_file(demuxer_t *demuxer); +#endif + + extern int vivo_check_file(demuxer_t *demuxer); extern void demux_open_vivo(demuxer_t *demuxer); extern int y4m_check_file(demuxer_t *demuxer); @@ -1127,6 +1146,22 @@ } } #endif +#ifdef HAVE_DIRAC +//=============== Try to open raw Dirac file ================= +if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_DIRAC) +{ + demuxer=new_demuxer(stream,DEMUXER_TYPE_DIRAC,audio_id,video_id,dvdsub_id); + if(dirac_check_file(demuxer)) + { + mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"DIRAC"); + file_format=DEMUXER_TYPE_DIRAC; + } + else { + free_demuxer(demuxer); + demuxer=NULL; + } +} +#endif //=============== Try to open as audio file: ================= if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_AUDIO){ demuxer=new_demuxer(stream,DEMUXER_TYPE_AUDIO,audio_id,video_id,dvdsub_id); @@ -1399,6 +1434,13 @@ break; } #endif +#ifdef HAVE_DIRAC + case DEMUXER_TYPE_DIRAC: { + if (!demux_open_dirac(demuxer)) return NULL; + break; + } +#endif + } // switch(file_format) pts_from_bps=0; // !!! if ((sh_video=demuxer->video->sh) && sh_video->bih) diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/demuxer.h MPlayer-1.0pre7-snow-dirac/libmpdemux/demuxer.h --- MPlayer-1.0pre7/libmpdemux/demuxer.h 2005-04-03 15:08:26.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/demuxer.h 2005-05-12 13:04:34.000000000 +0100 @@ -46,11 +46,12 @@ #define DEMUXER_TYPE_NSV 36 #define DEMUXER_TYPE_VQF 37 #define DEMUXER_TYPE_AVS 38 +#define DEMUXER_TYPE_DIRAC 39 // This should always match the higest demuxer type number. // Unless you want to disallow users to force the demuxer to some types #define DEMUXER_TYPE_MIN 0 -#define DEMUXER_TYPE_MAX 38 +#define DEMUXER_TYPE_MAX 39 #define DEMUXER_TYPE_DEMUXERS (1<<16) // A virtual demuxer type for the network code diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/Makefile MPlayer-1.0pre7-snow-dirac/libmpdemux/Makefile --- MPlayer-1.0pre7/libmpdemux/Makefile 2005-02-27 04:25:12.000000000 +0000 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/Makefile 2005-05-12 12:57:27.000000000 +0100 @@ -3,7 +3,7 @@ include ../config.mak -SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c stream_vstream.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c demux_vqf.c +SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c stream_vstream.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c demux_vqf.c demux_dirac.c parse_dirac.c ifeq ($(XMMS_PLUGINS),yes) SRCS += demux_xmms.c endif @@ -37,7 +37,7 @@ OBJS = $(SRCS:.c=.o) OBJS += $(CPLUSPLUSSRCS:.cpp=.o) INCLUDE = -I.. -I../loader $(CSS_INC) $(EXTRA_INC) $(LIBAV_INC) -CFLAGS = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC) +CFLAGS = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC) $(DIRAC_INC) CPLUSPLUSFLAGS = $(CFLAGS) $(CPLUSPLUSINCLUDE) CPLUSPLUS = $(CC) diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/parse_dirac.c MPlayer-1.0pre7-snow-dirac/libmpdemux/parse_dirac.c --- MPlayer-1.0pre7/libmpdemux/parse_dirac.c 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/parse_dirac.c 2005-05-12 12:58:15.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 -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/parse_dirac.h MPlayer-1.0pre7-snow-dirac/libmpdemux/parse_dirac.h --- MPlayer-1.0pre7/libmpdemux/parse_dirac.h 1970-01-01 01:00:00.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/parse_dirac.h 2005-05-12 12:58:19.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 -x config.h -x config.mak -x version.h MPlayer-1.0pre7/libmpdemux/video.c MPlayer-1.0pre7-snow-dirac/libmpdemux/video.c --- MPlayer-1.0pre7/libmpdemux/video.c 2005-03-06 21:10:01.000000000 +0000 +++ MPlayer-1.0pre7-snow-dirac/libmpdemux/video.c 2005-05-12 13:02:36.000000000 +0100 @@ -17,6 +17,7 @@ #include "demuxer.h" #include "stheader.h" #include "parse_es.h" +#include "parse_dirac.h" #include "mpeg_hdr.h" /* sub_cc (closed captions)*/ @@ -533,6 +534,9 @@ *start=videobuffer; in_size=videobuf_len; videobuf_len=0; + } else if(demuxer->file_format==DEMUXER_TYPE_DIRAC){ + in_size = dirac_read_video_frame(d_video, start); + } else { // frame-based file formats: (AVI,ASF,MOV) in_size=ds_get_packet(d_video,start); @@ -615,7 +619,9 @@ } } // printf("\rIII pts: %5.3f [%d] (%5.3f) \n",d_video->pts2,picture_coding_type,i_pts); - } else + } else if (demuxer->file_format==DEMUXER_TYPE_DIRAC){ + sh_video->pts+=frame_time; + } else sh_video->pts=d_video->pts; if(frame_time_ptr) *frame_time_ptr=frame_time; diff -ruN -x config.h -x config.mak -x version.h MPlayer-1.0pre7/Makefile MPlayer-1.0pre7-snow-dirac/Makefile --- MPlayer-1.0pre7/Makefile 2005-04-16 21:18:12.000000000 +0100 +++ MPlayer-1.0pre7-snow-dirac/Makefile 2005-05-12 12:45:25.000000000 +0100 @@ -32,10 +32,10 @@ VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB) AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(JACK_LIB) $(NAS_LIB) $(SGIAUDIO_LIB) $(POLYP_LIB) -CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB) +CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(X264_LIB) $(DIRAC_LIB) COMMON_LIBS = libmpcodecs/libmpcodecs.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB) -CFLAGS = $(OPTFLAGS) -I. $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) # -Wall +CFLAGS = $(OPTFLAGS) -I. $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) $(DIRAC_INC) # -Wall ifeq ($(TOOLAME),yes) CFLAGS += $(TOOLAME_EXTRAFLAGS) CODEC_LIBS += $(TOOLAME_LIB)