[vlc-devel] [PATCH 2/2] soxr: fix pts
Thomas Guillem
thomas at gllm.fr
Thu Feb 28 15:46:47 CET 2019
If you agree, I need to do that for every filters that modify the output timebase.
On Thu, Feb 28, 2019, at 15:46, Thomas Guillem wrote:
> The output block PTS/length was wrongly set to the PTS/length of the last input
> block. This could cause a PTS delay when the filter needed more than one input
> block to return an output one. Example: with a rate of 4, the filter
> (approximately) returned 3 time a NULL buffer, and used the PTS/length of the
> 4th one. This caused a PTS delay of 4 * block->i_length.
>
> The returned PTS/length correspond now exactly to what the filer module wrote.
> ---
> modules/audio_filter/resampler/soxr.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/modules/audio_filter/resampler/soxr.c
> b/modules/audio_filter/resampler/soxr.c
> index 7d7e31fd91..196f935faa 100644
> --- a/modules/audio_filter/resampler/soxr.c
> +++ b/modules/audio_filter/resampler/soxr.c
> @@ -87,7 +87,7 @@ typedef struct
> soxr_t last_soxr;
> double f_fixed_ratio;
> size_t i_last_olen;
> - vlc_tick_t i_last_pts;
> + date_t pts;
> } filter_sys_t;
>
> static block_t *Resample( filter_t *, block_t * );
> @@ -192,6 +192,9 @@ Open( vlc_object_t *p_obj, bool b_change_ratio )
> p_filter->pf_audio_filter = Resample;
> p_filter->pf_flush = Flush;
> p_filter->pf_audio_drain = Drain;
> +
> + date_Init(&p_sys->pts, p_filter->fmt_in.audio.i_rate, 1);
> +
> return VLC_SUCCESS;
> }
>
> @@ -290,7 +293,6 @@ static block_t *
> Resample( filter_t *p_filter, block_t *p_in )
> {
> filter_sys_t *p_sys = p_filter->p_sys;
> - const vlc_tick_t i_pts = p_in->i_pts;
>
> if( p_sys->vr_soxr )
> {
> @@ -321,6 +323,8 @@ Resample( filter_t *p_filter, block_t *p_in )
> /* using fixed resampler */
> soxr = p_sys->soxr;
> }
> + if( date_Get( &p_sys->pts) == VLC_TICK_INVALID )
> + date_Set( &p_sys->pts, p_in->i_pts );
>
> /* If the new soxr is different than the last one, flush it */
> if( p_sys->last_soxr && soxr != p_sys->last_soxr &&
> p_sys->i_last_olen )
> @@ -351,7 +355,8 @@ Resample( filter_t *p_filter, block_t *p_in )
> goto error;
> p_out->i_nb_samples = i_nb_samples;
> }
> - p_out->i_pts = i_pts;
> + p_out->i_dts = p_out->i_pts = date_Get( &p_sys->pts );
> + date_Increment( &p_sys->pts, p_out->i_nb_samples );
> return p_out;
> }
> else
> @@ -362,7 +367,7 @@ Resample( filter_t *p_filter, block_t *p_in )
> p_sys->f_fixed_ratio );
> block_t *p_out = SoXR_Resample( p_filter, p_sys->soxr, p_in,
> i_olen );
> if( p_out )
> - p_out->i_pts = i_pts;
> + p_out->i_pts = p_in->i_pts;
> return p_out;
> }
> error:
> @@ -393,4 +398,5 @@ Flush( filter_t *p_filter )
> p_sys->i_last_olen = 0;
> p_sys->last_soxr = NULL;
> }
> + date_Set( &p_sys->pts, VLC_TICK_INVALID );
> }
> --
> 2.20.1
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list