X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fcodec%2Fmpeg_audio.c;h=151f88f07cd82ba01c46b2256fe040770cb26029;hb=dd5f0b9f0c35ec204432e1fe650053355f511e02;hp=c80960d120557bceb95994e9cab96295953ba030;hpb=2cb472dba008f7d877ffe6bae9c5575253365282;p=vlc diff --git a/modules/codec/mpeg_audio.c b/modules/codec/mpeg_audio.c index c80960d120..151f88f07c 100644 --- a/modules/codec/mpeg_audio.c +++ b/modules/codec/mpeg_audio.c @@ -28,10 +28,11 @@ * Preamble *****************************************************************************/ #include -#include -#include +#include +#include +#include -#include "vlc_block_helper.h" +#include /***************************************************************************** * decoder_sys_t : decoder descriptor @@ -60,6 +61,10 @@ struct decoder_sys_t unsigned int i_channels_conf, i_channels; unsigned int i_rate, i_max_frame_size, i_frame_length; unsigned int i_layer, i_bit_rate; + + vlc_bool_t b_discontinuity; + + int i_input_rate; }; enum { @@ -103,10 +108,10 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels, * Module descriptor *****************************************************************************/ vlc_module_begin(); - set_description( _("MPEG audio layer I/II/III parser") ); + set_description( _("MPEG audio layer I/II/III decoder") ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_ACODEC ); -#if defined(SYS_DARWIN) || defined(UNDER_CE) +#if defined(UNDER_CE) set_capability( "decoder", 5 ); #else set_capability( "decoder", 100 ); @@ -152,6 +157,8 @@ static int OpenDecoder( vlc_object_t *p_this ) p_sys->i_state = STATE_NOSYNC; aout_DateSet( &p_sys->end_date, 0 ); p_sys->bytestream = block_BytestreamInit( p_dec ); + p_sys->b_discontinuity = VLC_FALSE; + p_sys->i_input_rate = INPUT_RATE_DEFAULT; /* Set output properties */ p_dec->fmt_out.i_cat = AUDIO_ES; @@ -196,18 +203,30 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) if( !pp_block || !*pp_block ) return NULL; - if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts ) + if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) { - /* We've just started the stream, wait for the first PTS. */ + if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED ) + { + p_sys->i_state = STATE_NOSYNC; + block_BytestreamFlush( &p_sys->bytestream ); + } +// aout_DateSet( &p_sys->end_date, 0 ); block_Release( *pp_block ); + p_sys->b_discontinuity = VLC_TRUE; return NULL; } - if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) + if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts ) { - p_sys->i_state = STATE_NOSYNC; + /* We've just started the stream, wait for the first PTS. */ + msg_Dbg( p_dec, "waiting for PTS" ); + block_Release( *pp_block ); + return NULL; } + if( (*pp_block)->i_rate > 0 ) + p_sys->i_input_rate = (*pp_block)->i_rate; + block_BytestreamPush( &p_sys->bytestream, *pp_block ); while( 1 ) @@ -273,6 +292,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) msg_Dbg( p_dec, "emulated startcode" ); block_SkipByte( &p_sys->bytestream ); p_sys->i_state = STATE_NOSYNC; + p_sys->b_discontinuity = VLC_TRUE; break; } @@ -347,6 +367,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) msg_Dbg( p_dec, "emulated startcode on next frame" ); block_SkipByte( &p_sys->bytestream ); p_sys->i_state = STATE_NOSYNC; + p_sys->b_discontinuity = VLC_TRUE; break; } @@ -521,7 +542,10 @@ static aout_buffer_t *GetAoutBuffer( decoder_t *p_dec ) p_buf->start_date = aout_DateGet( &p_sys->end_date ); p_buf->end_date = - aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length ); + aout_DateIncrement( &p_sys->end_date, + p_sys->i_frame_length * p_sys->i_input_rate / INPUT_RATE_DEFAULT ); + p_buf->b_discontinuity = p_sys->b_discontinuity; + p_sys->b_discontinuity = VLC_FALSE; /* Hack for libmad filter */ p_buf->i_nb_bytes = p_sys->i_frame_size + MAD_BUFFER_GUARD; @@ -543,8 +567,9 @@ static block_t *GetSoutBuffer( decoder_t *p_dec ) p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date ); p_block->i_length = - aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length ) - - p_block->i_pts; + aout_DateIncrement( &p_sys->end_date, + p_sys->i_frame_length * p_sys->i_input_rate / INPUT_RATE_DEFAULT ) - + p_block->i_pts; return p_block; }