X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Flibmpeg2.c;h=d335571f8285330be2d1e0610422496c0c96efdc;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=77230a116e508987a6e416f8a30721dbb3ecc1b9;hpb=b6f3013b3b9d89bf9d4f4f77eaa337552e784404;p=vlc diff --git a/modules/codec/libmpeg2.c b/modules/codec/libmpeg2.c index 77230a116e..d335571f82 100644 --- a/modules/codec/libmpeg2.c +++ b/modules/codec/libmpeg2.c @@ -26,12 +26,12 @@ * Preamble *****************************************************************************/ #include -#include -#include +#include +#include #include -#include "vout_synchro.h" +#include /* Aspect ratio (ISO/IEC 13818-2 section 6.3.3, table 6-3) */ #define AR_SQUARE_PICTURE 1 /* square pixels */ @@ -64,8 +64,9 @@ struct decoder_sys_t vlc_bool_t b_after_sequence_header; /* is it the next frame after * the sequence header ? */ vlc_bool_t b_slice_i; /* intra-slice refresh stream */ + vlc_bool_t b_second_field; - vlc_bool_t b_preroll; + vlc_bool_t b_preroll; /* * Output properties @@ -115,7 +116,7 @@ static int OpenDecoder( vlc_object_t *p_this ) /* Pinnacle hardware-mpeg1 */ p_dec->fmt_in.i_codec != VLC_FOURCC('P','I','M','1') && /* ATI Video */ - p_dec->fmt_in.i_codec != VLC_FOURCC('V','C','R','2') && + p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','2','v') && p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','g','2') && p_dec->fmt_in.i_codec != VLC_FOURCC('h','d','v','2') ) { @@ -142,27 +143,28 @@ static int OpenDecoder( vlc_object_t *p_this ) p_sys->p_picture_to_destroy = NULL; p_sys->b_garbage_pic = 0; p_sys->b_slice_i = 0; + p_sys->b_second_field = 0; p_sys->b_skip = 0; p_sys->b_preroll = VLC_FALSE; #if defined( __i386__ ) || defined( __x86_64__ ) - if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_MMX ) + if( vlc_CPU() & CPU_CAPABILITY_MMX ) { i_accel |= MPEG2_ACCEL_X86_MMX; } - if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_3DNOW ) + if( vlc_CPU() & CPU_CAPABILITY_3DNOW ) { i_accel |= MPEG2_ACCEL_X86_3DNOW; } - if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_MMXEXT ) + if( vlc_CPU() & CPU_CAPABILITY_MMXEXT ) { i_accel |= MPEG2_ACCEL_X86_MMXEXT; } #elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ ) - if( p_dec->p_libvlc->i_cpu & CPU_CAPABILITY_ALTIVEC ) + if( vlc_CPU() & CPU_CAPABILITY_ALTIVEC ) { i_accel |= MPEG2_ACCEL_PPC_ALTIVEC; } @@ -240,6 +242,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( (p_pic = GetNewPicture( p_dec, buf )) == NULL ) break; mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic ); + mpeg2_stride( p_sys->p_mpeg2dec, p_pic->p[Y_PLANE].i_pitch ); } p_sys->p_picture_to_destroy = p_pic; @@ -291,6 +294,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) break; #ifdef STATE_SEQUENCE_MODIFIED +/* FIXME - the above ifdef is always FALSE, even with libmpeg2-0.5.0 + * Need to improve the implementation to avoid invalid/unref pictures */ + case STATE_SEQUENCE_MODIFIED: GetAR( p_dec ); break; @@ -316,6 +322,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) } mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic ); + mpeg2_stride( p_sys->p_mpeg2dec, p_pic->p[Y_PLANE].i_pitch ); /* This picture will never go through display_picture. */ p_pic->date = 0; @@ -336,20 +343,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) break; case STATE_PICTURE_2ND: - vout_SynchroNewPicture( p_sys->p_synchro, - p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE, - p_sys->p_info->current_picture->nb_fields, - 0, 0, p_sys->i_current_rate, - p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ); - - if( p_sys->b_skip ) - { - vout_SynchroTrash( p_sys->p_synchro ); - } - else - { - vout_SynchroDecode( p_sys->p_synchro ); - } + p_sys->b_second_field = 1; break; case STATE_PICTURE: @@ -405,8 +399,15 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_sys->i_current_dts : p_sys->i_previous_dts ) : 0; #endif + /* If nb_fields == 1, it is a field picture, and it will be + * followed by another field picture for which we won't call + * vout_SynchroNewPicture() because this would have other + * problems, so we take it into account here. + * This kind of sucks, but I didn't think better. --Meuuh + */ vout_SynchroNewPicture( p_sys->p_synchro, p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE, + p_sys->p_info->current_picture->nb_fields == 1 ? 2 : p_sys->p_info->current_picture->nb_fields, i_pts, i_dts, p_sys->i_current_rate, p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ); @@ -439,6 +440,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) } mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic ); + mpeg2_stride( p_sys->p_mpeg2dec, p_pic->p[Y_PLANE].i_pitch ); } } break; @@ -520,6 +522,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( (p_pic = GetNewPicture( p_dec, buf )) == NULL ) break; mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic ); + mpeg2_stride( p_sys->p_mpeg2dec, p_pic->p[Y_PLANE].i_pitch ); } p_sys->p_picture_to_destroy = p_pic;