[vlc-devel] [PATCH 02/17] clock: allow to return VLC_TICK_INVALID from convert calls
Rémi Denis-Courmont
remi at remlab.net
Tue Feb 16 16:54:08 UTC 2021
Le maanantaina 15. helmikuuta 2021, 12.14.57 EET Thomas Guillem a écrit :
> For now, when the main clock is reset, vlc_clock_ConvertToSystem() won't
> return VLC_TICK_INVALID since it will fallback to
> vlc_clock_monotonic_to_system_locked() but this behavior will change in
> next commits.
As I recall, we had agreed that timestamping must never fail?
> ---
> src/clock/clock.c | 17 ++++++++++++++++-
> src/clock/clock.h | 12 ++++++++----
> 2 files changed, 24 insertions(+), 5 deletions(-)
>
> diff --git a/src/clock/clock.c b/src/clock/clock.c
> index cfbb5eb6f6d..32f6b573632 100644
> --- a/src/clock/clock.c
> +++ b/src/clock/clock.c
> @@ -306,6 +306,8 @@ static vlc_tick_t vlc_clock_slave_update(vlc_clock_t
> *clock, vlc_tick_t computed = clock->to_system_locked(clock, system_now,
> ts, rate);
>
> vlc_mutex_unlock(&main_clock->lock);
> + if (computed == VLC_TICK_INVALID)
> + return computed;
>
> vlc_clock_on_update(clock, computed, ts, rate, frame_rate,
> frame_rate_base); return computed - system_now;
> @@ -349,7 +351,11 @@ void vlc_clock_Wait(vlc_clock_t *clock, vlc_tick_t
> system_now, vlc_tick_t ts, if (main_clock->pause_date != VLC_TICK_INVALID)
> deadline = INT64_MAX;
> else
> + {
> deadline = clock->to_system_locked(clock, system_now, ts,
> rate); + if (deadline == VLC_TICK_INVALID)
> + break;
> + }
> deadline = __MIN(deadline, max_deadline);
>
> if (vlc_cond_timedwait(&main_clock->cond, &main_clock->lock,
> deadline)) @@ -508,16 +514,25 @@ vlc_tick_t
> vlc_clock_ConvertToSystem(vlc_clock_t *clock, vlc_tick_t system_now, return
> system;
> }
>
> -void vlc_clock_ConvertArrayToSystem(vlc_clock_t *clock, vlc_tick_t
> system_now, +int vlc_clock_ConvertArrayToSystem(vlc_clock_t *clock,
> vlc_tick_t system_now, vlc_tick_t *ts_array, size_t ts_count, double rate)
> {
> vlc_clock_main_t *main_clock = clock->owner;
> vlc_mutex_lock(&main_clock->lock);
> for (size_t i = 0; i < ts_count; ++i)
> + {
> ts_array[i] = clock->to_system_locked(clock, system_now,
> ts_array[i], rate);
> + if (ts_array[i] == VLC_TICK_INVALID)
> + {
> + vlc_mutex_unlock(&main_clock->lock);
> + return VLC_EGENERIC;
> + }
> + }
> vlc_mutex_unlock(&main_clock->lock);
> +
> + return VLC_SUCCESS;
> }
>
> static void vlc_clock_set_master_callbacks(vlc_clock_t *clock)
> diff --git a/src/clock/clock.h b/src/clock/clock.h
> index e7373391697..b852af0eb23 100644
> --- a/src/clock/clock.h
> +++ b/src/clock/clock.h
> @@ -168,16 +168,20 @@ void vlc_clock_Wait(vlc_clock_t *clock, vlc_tick_t
> system_now, vlc_tick_t ts,
>
> /**
> * This function converts a timestamp from stream to system
> - * @return the valid system time or INT64_MAX when the clock is paused
> + * @return the valid system time, INT64_MAX when the clock is paused or
> + * VLC_TICK_INVALID when the main clock is reset (the master source is
> flushed). */
> vlc_tick_t vlc_clock_ConvertToSystem(vlc_clock_t *clock, vlc_tick_t
> system_now, vlc_tick_t ts, double rate);
>
> /**
> * This functon converts an array of timestamp from stream to system
> + *
> + * @return VLC_SUCCESS or VLC_EGENERIC if the clock is reset (the master
> source + * is flushed).
> */
> -void vlc_clock_ConvertArrayToSystem(vlc_clock_t *clock, vlc_tick_t
> system_now, - vlc_tick_t *ts_array,
> size_t ts_count, - double rate);
> +int vlc_clock_ConvertArrayToSystem(vlc_clock_t *clock, vlc_tick_t
> system_now, + vlc_tick_t *ts_array,
> size_t ts_count, + double rate);
>
> #endif /*VLC_CLOCK_H*/
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list