[vlc-devel] [RFC PATCH 11/13] FIXUP: slightly improve rate change

Rémi Denis-Courmont remi at remlab.net
Wed Jun 27 21:08:13 CEST 2018


Le keskiviikkona 27. kesäkuuta 2018, 15.41.33 EEST Thomas Guillem a écrit :
> From: Denis Charmet <typx at videolan.org>
> 
> ---
>  src/audio_output/filters.c |  2 +-
>  src/clock/clock.c          | 14 ++++++++++----
>  src/input/decoder.c        |  2 +-
>  3 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
> index 99b3a7648d..a8c3df0296 100644
> --- a/src/audio_output/filters.c
> +++ b/src/audio_output/filters.c
> @@ -712,7 +712,7 @@ block_t *aout_FiltersPlay(aout_filters_t *filters,
> block_t *block, float rate)
> 
>          /* Override input rate */
>          nominal_rate = rate_filter->fmt_in.audio.i_rate;
> -        rate_filter->fmt_in.audio.i_rate = lroundf(nominal_rate / rate);
> +        rate_filter->fmt_in.audio.i_rate = lroundf(nominal_rate * rate);
>      }
> 
>      block = aout_FiltersPipelinePlay (filters->tab, filters->count, block);
> diff --git a/src/clock/clock.c b/src/clock/clock.c
> index c977375a8c..0a94cc9ce5 100644
> --- a/src/clock/clock.c
> +++ b/src/clock/clock.c
> @@ -117,7 +117,6 @@ static vlc_tick_t vlc_clock_master_update(vlc_clock_t *
> clock, vlc_tick_t system main_clock->reset_date = VLC_TS_INVALID;
>          vlc_clock_main_reset(main_clock);
>      }
> -    main_clock->rate = rate;
> 
>      if (unlikely(pts == VLC_TS_INVALID || system_now == VLC_TS_INVALID))
>      {
> @@ -130,9 +129,12 @@ static vlc_tick_t vlc_clock_master_update(vlc_clock_t *
> clock, vlc_tick_t system /* We have a reference so we can update coeff */
>          float instant_coeff =
>              ((float) (system_now - main_clock->last.system))/(pts -
> main_clock->last.stream); -        AvgUpdate(&main_clock->coeff_avg,
> instant_coeff);
> -        main_clock->coeff = AvgGet(&main_clock->coeff_avg);
> -        /* TODO handle rate change?*/
> +        if (rate == main_clock->rate)
> +        {
> +          instant_coeff *= rate;
> +          AvgUpdate(&main_clock->coeff_avg, instant_coeff);
> +          main_clock->coeff = AvgGet(&main_clock->coeff_avg);
> +        }
>      }
>      else
>          main_clock->wait_sync_ref =
> @@ -143,6 +145,7 @@ static vlc_tick_t vlc_clock_master_update(vlc_clock_t *
> clock, vlc_tick_t system if (pts != VLC_TS_INVALID && system_now !=
> VLC_TS_INVALID)
>          main_clock->last = clock_point_Create(pts, system_now);
> 
> +    main_clock->rate = rate;
>      vlc_cond_broadcast(&main_clock->cond);
>      vlc_mutex_unlock(&main_clock->lock);
>      return 0;
> @@ -299,6 +302,9 @@ static vlc_tick_t vlc_clock_slave_update(vlc_clock_t *
> clock, vlc_tick_t system_ VLC_UNUSED(rate);
>      vlc_clock_main_t * main_clock = clock->owner;
>      vlc_mutex_lock(&main_clock->lock);
> +    if (!main_clock->master && main_clock->rate != rate)
> +        main_clock->rate = rate;

Useless (half) predicate.

> +
>      vlc_tick_t computed = clock->to_system_locked(clock, system_now, pts);
>      vlc_mutex_unlock(&main_clock->lock);
>      return (computed != INT64_MAX)?(computed - system_now):VLC_TS_INVALID;
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index 142b3a3e33..1601201fbb 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -1519,7 +1519,7 @@ static void *DecoderThread( void *p_data )
>              rate = p_owner->rate;
>              vlc_fifo_Unlock( p_owner->p_fifo );
> 
> -            OutputChangeRate( p_dec, rate );
> +            OutputChangeRate( p_dec, 1.f /rate );
> 
>              vlc_restorecancel( canc );
>              vlc_fifo_Lock( p_owner->p_fifo );


-- 
Реми Дёни-Курмон
http://www.remlab.net/





More information about the vlc-devel mailing list