[vlc-devel] [PATCH 2/9] RFC: audio_output: fix buffers_lost count
Rémi Denis-Courmont
remi at remlab.net
Thu Sep 1 11:32:13 CEST 2016
Le torstaina 1. syyskuuta 2016, 10.54.09 EEST Thomas Guillem a écrit :
> aout_FiltersPlay can return NULL without loosing a buffer (the block can
> still be in filters internals)
>
> This is hackish and I'm not sure this will work in all cases .
>
> Should we change pf_*_filter to differentiate an error from an absence of
> block ?
> ---
> src/audio_output/aout_internal.h | 2 ++
> src/audio_output/dec.c | 20 ++++++++++++++++----
> 2 files changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/src/audio_output/aout_internal.h
> b/src/audio_output/aout_internal.h index c6edf8e..5592e22 100644
> --- a/src/audio_output/aout_internal.h
> +++ b/src/audio_output/aout_internal.h
> @@ -80,6 +80,8 @@ typedef struct
>
> aout_request_vout_t request_vout;
>
> + mtime_t last_dts;
> + unsigned buffers_filtered_count;
> atomic_uint buffers_lost;
> atomic_uint buffers_played;
> atomic_uchar restart;
> diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
> index c1cc1db..ca2105f 100644
> --- a/src/audio_output/dec.c
> +++ b/src/audio_output/dec.c
> @@ -107,6 +107,8 @@ error:
> owner->sync.discontinuity = true;
> aout_OutputUnlock (p_aout);
>
> + owner->last_dts = VLC_TS_INVALID;
> + owner->buffers_filtered_count = 0;
> atomic_init (&owner->buffers_lost, 0);
> atomic_init (&owner->buffers_played, 0);
> return 0;
> @@ -374,9 +376,22 @@ int aout_DecPlay (audio_output_t *aout, block_t *block,
> int input_rate) if (block->i_flags & BLOCK_FLAG_DISCONTINUITY)
> owner->sync.discontinuity = true;
>
> + mtime_t last_dts = block->i_dts;
> block = aout_FiltersPlay (owner->filters, block, input_rate);
> if (block == NULL)
> - goto lost;
> + {
> + if (owner->last_dts != VLC_TS_INVALID)
> + owner->last_dts = last_dts;
> + owner->buffers_filtered_count++;
> + goto out;
> + }
> + else if (owner->last_dts != VLC_TS_INVALID && block->i_dts >
> owner->last_dts) + {
AFAICT, that´s broken (too). For instance, speech codecs can have
discontinuities during silence, i.e. not caused by packet loss.
> + assert( owner->buffers_filtered_count > 0 );
> + atomic_fetch_add(&owner->buffers_lost,
> owner->buffers_filtered_count); + }
> + owner->last_dts = VLC_TS_INVALID;
> + owner->buffers_filtered_count = 0;
>
> /* Software volume */
> aout_volume_Amplify (owner->volume, block);
> @@ -395,9 +410,6 @@ out:
> drop:
> owner->sync.discontinuity = true;
> block_Release (block);
> -lost:
> - atomic_fetch_add(&owner->buffers_lost, 1);
> - goto out;
> }
>
> void aout_DecGetResetStats(audio_output_t *aout, unsigned *restrict lost,
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list