From 498f442c35ff4ab95b4ddecd42874f2892fc371c Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 21 Mar 2015 19:29:55 +0200 Subject: [PATCH] decoder: simplify audio path DecoderPlayAudio() has no effects with a NULL block. --- src/input/decoder.c | 82 +++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/src/input/decoder.c b/src/input/decoder.c index 65dc51154a..ce072a3389 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1073,7 +1073,7 @@ static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, audio_output_t *p_aout = p_owner->p_aout; /* */ - if( p_audio && p_audio->i_pts <= VLC_TS_INVALID ) // FIXME --VLC_TS_INVALID verify audio_output/* + if( p_audio->i_pts <= VLC_TS_INVALID ) // FIXME --VLC_TS_INVALID verify audio_output/* { msg_Warn( p_dec, "non-dated audio buffer received" ); *pi_lost_sum += 1; @@ -1083,58 +1083,47 @@ static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, /* */ vlc_mutex_lock( &p_owner->lock ); - - if( p_audio && p_owner->b_waiting ) +race: + if( p_owner->b_waiting ) { p_owner->b_has_data = true; vlc_cond_signal( &p_owner->wait_acknowledge ); } - for( ;; ) - { - bool b_paused; - - bool b_reject = DecoderWaitUnblock( p_dec ); - - b_paused = p_owner->b_paused; - - if (!p_audio) - break; - - /* */ - int i_rate = INPUT_RATE_DEFAULT; + bool b_reject = DecoderWaitUnblock( p_dec ); + bool b_paused = p_owner->b_paused; - DecoderFixTs( p_dec, &p_audio->i_pts, NULL, &p_audio->i_length, - &i_rate, AOUT_MAX_ADVANCE_TIME ); + /* */ + int i_rate = INPUT_RATE_DEFAULT; - if( p_audio->i_pts <= VLC_TS_INVALID - || i_rate < INPUT_RATE_DEFAULT/AOUT_MAX_INPUT_RATE - || i_rate > INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE ) - b_reject = true; + DecoderFixTs( p_dec, &p_audio->i_pts, NULL, &p_audio->i_length, + &i_rate, AOUT_MAX_ADVANCE_TIME ); - DecoderWaitDate( p_dec, &b_reject, - p_audio->i_pts - AOUT_MAX_PREPARE_TIME ); + if( p_audio->i_pts <= VLC_TS_INVALID + || i_rate < INPUT_RATE_DEFAULT/AOUT_MAX_INPUT_RATE + || i_rate > INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE ) + b_reject = true; - if( unlikely(p_owner->b_paused != b_paused) ) - continue; /* race with input thread? retry... */ - if( p_aout == NULL ) - b_reject = true; + DecoderWaitDate( p_dec, &b_reject, + p_audio->i_pts - AOUT_MAX_PREPARE_TIME ); - if( !b_reject ) - { - assert( !p_owner->b_paused ); - if( !aout_DecPlay( p_aout, p_audio, i_rate ) ) - *pi_played_sum += 1; - *pi_lost_sum += aout_DecGetResetLost( p_aout ); - } - else - { - msg_Dbg( p_dec, "discarded audio buffer" ); - *pi_lost_sum += 1; - block_Release( p_audio ); - } + if( unlikely(p_owner->b_paused != b_paused) ) + goto race; /* race with input thread? retry... */ + if( p_aout == NULL ) + b_reject = true; - break; + if( !b_reject ) + { + assert( !p_owner->b_paused ); + if( !aout_DecPlay( p_aout, p_audio, i_rate ) ) + *pi_played_sum += 1; + *pi_lost_sum += aout_DecGetResetLost( p_aout ); + } + else + { + msg_Dbg( p_dec, "discarded audio buffer" ); + *pi_lost_sum += 1; + block_Release( p_audio ); } vlc_mutex_unlock( &p_owner->lock ); } @@ -1147,11 +1136,10 @@ static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block ) int i_lost = 0; int i_played = 0; - if (!p_block) { - /* Play a NULL block to output buffered frames */ - DecoderPlayAudio( p_dec, NULL, &i_played, &i_lost ); - } - else while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) + if( p_block == NULL ) + return; /* TODO: remove this check, drain audio decoders properly */ + + while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) { if( DecoderIsFlushing( p_dec ) ) { -- 2.39.2