vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Jan 26 20:25:57 2016 +0200| [c5939bffc48bcd712d6e28f5d1db426dabbc213f] | committer: Rémi Denis-Courmont
aout: fix lost block stats Do not count dropped blocks as played. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c5939bffc48bcd712d6e28f5d1db426dabbc213f --- src/audio_output/aout_internal.h | 5 +++-- src/audio_output/dec.c | 13 ++++++++---- src/input/decoder.c | 42 +++++++++++++++++++++----------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index 8cfcf33..4990597 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -81,6 +81,7 @@ typedef struct aout_request_vout_t request_vout; atomic_uint buffers_lost; + atomic_uint buffers_played; atomic_uchar restart; } aout_owner_t; @@ -136,8 +137,8 @@ bool aout_ChangeFilterString( vlc_object_t *manager, vlc_object_t *aout, int aout_DecNew(audio_output_t *, const audio_sample_format_t *, const audio_replay_gain_t *, const aout_request_vout_t *); void aout_DecDelete(audio_output_t *); -int aout_DecPlay(audio_output_t *, block_t *, int i_input_rate); -unsigned aout_DecGetResetLost(audio_output_t *); +void aout_DecPlay(audio_output_t *, block_t *, int i_input_rate); +void aout_DecGetResetStats(audio_output_t *, unsigned *, unsigned *); void aout_DecChangePause(audio_output_t *, bool b_paused, mtime_t i_date); void aout_DecFlush(audio_output_t *, bool wait); void aout_RequestRestart (audio_output_t *, unsigned); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 50ad86d..84c2f60 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -108,6 +108,7 @@ error: aout_OutputUnlock (p_aout); atomic_init (&owner->buffers_lost, 0); + atomic_init (&owner->buffers_played, 0); return 0; } @@ -338,7 +339,7 @@ static void aout_DecSynchronize (audio_output_t *aout, mtime_t dec_pts, /***************************************************************************** * aout_DecPlay : filter & mix the decoded buffer *****************************************************************************/ -int aout_DecPlay (audio_output_t *aout, block_t *block, int input_rate) +void aout_DecPlay (audio_output_t *aout, block_t *block, int input_rate) { aout_owner_t *owner = aout_owner (aout); @@ -384,9 +385,10 @@ int aout_DecPlay (audio_output_t *aout, block_t *block, int input_rate) owner->sync.end = block->i_pts + block->i_length + 1; owner->sync.discontinuity = false; aout_OutputPlay (aout, block); + atomic_fetch_add(&owner->buffers_played, 1); out: aout_OutputUnlock (aout); - return 0; + return; drop: owner->sync.discontinuity = true; block_Release (block); @@ -395,10 +397,13 @@ lost: goto out; } -unsigned aout_DecGetResetLost (audio_output_t *aout) +void aout_DecGetResetStats(audio_output_t *aout, unsigned *restrict lost, + unsigned *restrict played) { aout_owner_t *owner = aout_owner (aout); - return atomic_exchange(&owner->buffers_lost, 0); + + *lost = atomic_exchange(&owner->buffers_lost, 0); + *played = atomic_exchange(&owner->buffers_played, 0); } void aout_DecChangePause (audio_output_t *aout, bool paused, mtime_t date) diff --git a/src/input/decoder.c b/src/input/decoder.c index 8ef1fd5..77b3fb1 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1038,7 +1038,6 @@ static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block ) } static int DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, - unsigned *restrict pi_played_sum, unsigned *restrict pi_lost_sum ) { decoder_owner_sys_t *p_owner = p_dec->p_owner; @@ -1093,35 +1092,40 @@ static int DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, audio_output_t *p_aout = p_owner->p_aout; - if( p_aout == NULL || 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 - || DecoderTimedWait( p_dec, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ) ) + if( p_aout != NULL && 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 + && !DecoderTimedWait( p_dec, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ) ) + { + aout_DecPlay( p_aout, p_audio, i_rate ); + } + else { msg_Dbg( p_dec, "discarded audio buffer" ); *pi_lost_sum += 1; block_Release( p_audio ); - return 0; } - - if( aout_DecPlay( p_aout, p_audio, i_rate ) == 0 ) - *pi_played_sum += 1; - return 0; } static void DecoderUpdateStatAudio( decoder_t *p_dec, unsigned decoded, - unsigned lost, unsigned played ) + unsigned lost ) { decoder_owner_sys_t *p_owner = p_dec->p_owner; input_thread_t *p_input = p_owner->p_input; + unsigned played = 0; /* Update ugly stat */ if( p_input == NULL ) return; if( p_owner->p_aout != NULL ) - lost += aout_DecGetResetLost( p_owner->p_aout ); + { + unsigned aout_lost; + + aout_DecGetResetStats( p_owner->p_aout, &aout_lost, &played ); + lost += aout_lost; + } vlc_mutex_lock( &p_input->p->counters.counters_lock); stats_Update( p_input->p->counters.p_lost_abuffers, lost, NULL ); @@ -1132,11 +1136,11 @@ static void DecoderUpdateStatAudio( decoder_t *p_dec, unsigned decoded, static int DecoderQueueAudio( decoder_t *p_dec, block_t *p_aout_buf ) { - unsigned i_lost = 0, i_played = 0; + unsigned lost = 0; - int ret = DecoderPlayAudio( p_dec, p_aout_buf, &i_played, &i_lost ); + int ret = DecoderPlayAudio( p_dec, p_aout_buf, &lost ); - DecoderUpdateStatAudio( p_dec, 1, i_lost, i_played ); + DecoderUpdateStatAudio( p_dec, 1, lost ); return ret; } @@ -1145,16 +1149,16 @@ static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block ) { block_t *p_aout_buf; block_t **pp_block = p_block ? &p_block : NULL; - unsigned i_decoded = 0, i_lost = 0, i_played = 0; + unsigned decoded = 0, lost = 0; while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, pp_block ) ) ) { - i_decoded++; + decoded++; - DecoderPlayAudio( p_dec, p_aout_buf, &i_played, &i_lost ); + DecoderPlayAudio( p_dec, p_aout_buf, &lost ); } - DecoderUpdateStatAudio( p_dec, i_decoded, i_lost, i_played ); + DecoderUpdateStatAudio( p_dec, decoded, lost ); } /* This function process a audio block _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
