X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Flibmpeg2.c;h=13ec4c512a79b7a56c3e5c6e9c826636b7f715bd;hb=6903d514d3ea8113f91b1bedde862607f7efc92a;hp=77230a116e508987a6e416f8a30721dbb3ecc1b9;hpb=b6f3013b3b9d89bf9d4f4f77eaa337552e784404;p=vlc diff --git a/modules/codec/libmpeg2.c b/modules/codec/libmpeg2.c index 77230a116e..13ec4c512a 100644 --- a/modules/codec/libmpeg2.c +++ b/modules/codec/libmpeg2.c @@ -25,13 +25,18 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#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 */ @@ -49,7 +54,7 @@ struct decoder_sys_t */ mpeg2dec_t *p_mpeg2dec; const mpeg2_info_t *p_info; - vlc_bool_t b_skip; + bool b_skip; /* * Input properties @@ -60,17 +65,18 @@ struct decoder_sys_t mtime_t i_current_dts; int i_current_rate; picture_t * p_picture_to_destroy; - vlc_bool_t b_garbage_pic; - vlc_bool_t b_after_sequence_header; /* is it the next frame after + bool b_garbage_pic; + bool b_after_sequence_header; /* is it the next frame after * the sequence header ? */ - vlc_bool_t b_slice_i; /* intra-slice refresh stream */ + bool b_slice_i; /* intra-slice refresh stream */ + bool b_second_field; - vlc_bool_t b_preroll; + bool b_preroll; /* * Output properties */ - vout_synchro_t *p_synchro; + decoder_synchro_t *p_synchro; int i_aspect; int i_sar_num; int i_sar_den; @@ -93,7 +99,7 @@ static void GetAR( decoder_t *p_dec ); * Module descriptor *****************************************************************************/ vlc_module_begin(); - set_description( _("MPEG I/II video decoder (using libmpeg2)") ); + set_description( N_("MPEG I/II video decoder (using libmpeg2)") ); set_capability( "decoder", 150 ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_VCODEC ); @@ -114,8 +120,7 @@ static int OpenDecoder( vlc_object_t *p_this ) p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','g','1') && /* 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') ) { @@ -125,10 +130,7 @@ static int OpenDecoder( vlc_object_t *p_this ) /* Allocate the memory needed to store the decoder's structure */ if( ( p_dec->p_sys = p_sys = (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL ) - { - msg_Err( p_dec, "out of memory" ); - return VLC_EGENERIC; - } + return VLC_ENOMEM; /* Initialize the thread properties */ memset( p_sys, 0, sizeof(decoder_sys_t) ); @@ -142,27 +144,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; + p_sys->b_preroll = 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; } @@ -226,7 +229,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_sys->p_info->sequence && p_sys->p_info->sequence->width != (unsigned)-1 ) { - vout_SynchroReset( p_sys->p_synchro ); + decoder_SynchroReset( p_sys->p_synchro ); if( p_sys->p_info->current_fbuf != NULL && p_sys->p_info->current_fbuf->id != NULL ) { @@ -240,28 +243,29 @@ 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; if ( p_sys->b_slice_i ) { - vout_SynchroNewPicture( p_sys->p_synchro, + decoder_SynchroNewPicture( p_sys->p_synchro, I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate, p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ); - vout_SynchroDecode( p_sys->p_synchro ); - vout_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 ); + decoder_SynchroDecode( p_sys->p_synchro ); + decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 ); } } if( p_block->i_flags & BLOCK_FLAG_PREROLL ) { - p_sys->b_preroll = VLC_TRUE; + p_sys->b_preroll = true; } else if( p_sys->b_preroll ) { - p_sys->b_preroll = VLC_FALSE; + p_sys->b_preroll = false; /* Reset synchro */ - vout_SynchroReset( p_sys->p_synchro ); + decoder_SynchroReset( p_sys->p_synchro ); } #ifdef PIC_FLAG_PTS @@ -290,7 +294,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_block->i_buffer = 0; break; -#ifdef STATE_SEQUENCE_MODIFIED +#if MPEG2_RELEASE >= MPEG2_VERSION (0, 5, 0) + case STATE_SEQUENCE_MODIFIED: GetAR( p_dec ); break; @@ -316,6 +321,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; @@ -326,9 +332,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( p_sys->p_synchro ) { - vout_SynchroRelease( p_sys->p_synchro ); + decoder_SynchroRelease( p_sys->p_synchro ); } - p_sys->p_synchro = vout_SynchroInit( p_dec, + p_sys->p_synchro = decoder_SynchroInit( p_dec, (uint32_t)((uint64_t)1001000000 * 27 / p_sys->p_info->sequence->frame_period) ); p_sys->b_after_sequence_header = 1; @@ -336,20 +342,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: @@ -364,11 +357,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) { /* Intra-slice refresh. Simulate a blank I picture. */ msg_Dbg( p_dec, "intra-slice refresh stream" ); - vout_SynchroNewPicture( p_sys->p_synchro, + decoder_SynchroNewPicture( p_sys->p_synchro, I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate, p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ); - vout_SynchroDecode( p_sys->p_synchro ); - vout_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 ); + decoder_SynchroDecode( p_sys->p_synchro ); + decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 ); p_sys->b_slice_i = 1; } p_sys->b_after_sequence_header = 0; @@ -405,8 +398,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 - vout_SynchroNewPicture( p_sys->p_synchro, + /* If nb_fields == 1, it is a field picture, and it will be + * followed by another field picture for which we won't call + * decoder_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 + */ + decoder_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 ); @@ -415,7 +415,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) !(p_sys->b_slice_i && ((p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE) == P_CODING_TYPE)) - && !vout_SynchroChoose( p_sys->p_synchro, + && !decoder_SynchroChoose( p_sys->p_synchro, p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE, /*p_sys->p_vout->render_time*/ 0 /*FIXME*/, @@ -423,14 +423,14 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) { mpeg2_skip( p_sys->p_mpeg2dec, 1 ); p_sys->b_skip = 1; - vout_SynchroTrash( p_sys->p_synchro ); + decoder_SynchroTrash( p_sys->p_synchro ); mpeg2_set_buf( p_sys->p_mpeg2dec, buf, NULL ); } else { mpeg2_skip( p_sys->p_mpeg2dec, 0 ); p_sys->b_skip = 0; - vout_SynchroDecode( p_sys->p_synchro ); + decoder_SynchroDecode( p_sys->p_synchro ); if( (p_pic = GetNewPicture( p_dec, buf )) == NULL ) { @@ -439,6 +439,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; @@ -451,7 +452,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) { p_pic = (picture_t *)p_sys->p_info->display_fbuf->id; - vout_SynchroEnd( p_sys->p_synchro, + decoder_SynchroEnd( p_sys->p_synchro, p_sys->p_info->display_picture->flags & PIC_MASK_CODING_TYPE, p_sys->b_garbage_pic ); @@ -459,7 +460,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if ( p_sys->p_picture_to_destroy != p_pic ) { - p_pic->date = vout_SynchroDate( p_sys->p_synchro ); + p_pic->date = decoder_SynchroDate( p_sys->p_synchro ); } else { @@ -476,7 +477,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) } /* For still frames */ - if( state == STATE_END && p_pic ) p_pic->b_force = VLC_TRUE; + if( state == STATE_END && p_pic ) p_pic->b_force = true; if( p_pic ) { @@ -500,7 +501,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ( ( p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE) != B_CODING_TYPE ) ) { - if( p_sys->p_synchro ) vout_SynchroReset( p_sys->p_synchro ); + if( p_sys->p_synchro ) decoder_SynchroReset( p_sys->p_synchro ); } mpeg2_skip( p_sys->p_mpeg2dec, 1 ); p_sys->b_skip = 1; @@ -520,6 +521,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; @@ -535,11 +537,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( p_sys->b_slice_i ) { - vout_SynchroNewPicture( p_sys->p_synchro, + decoder_SynchroNewPicture( p_sys->p_synchro, I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate, p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ); - vout_SynchroDecode( p_sys->p_synchro ); - vout_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 ); + decoder_SynchroDecode( p_sys->p_synchro ); + decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 ); } break; } @@ -561,7 +563,7 @@ static void CloseDecoder( vlc_object_t *p_this ) decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys = p_dec->p_sys; - if( p_sys->p_synchro ) vout_SynchroRelease( p_sys->p_synchro ); + if( p_sys->p_synchro ) decoder_SynchroRelease( p_sys->p_synchro ); if( p_sys->p_mpeg2dec ) mpeg2_close( p_sys->p_mpeg2dec );