[vlc-devel] [PATCH v2 1/7] clock: handle the normal play time (npt) from the input

Thomas Guillem thomas at gllm.fr
Thu Apr 1 15:30:06 UTC 2021


vlc_clock_t will send corrected update points directly.

The player won't have to fetch the normal_time from the demux and fix
its timer accordingly.
---
 src/clock/clock.c | 22 ++++++++++++++++++++--
 src/clock/clock.h | 11 +++++++++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/clock/clock.c b/src/clock/clock.c
index cfbb5eb6f6d..3a24e49927f 100644
--- a/src/clock/clock.c
+++ b/src/clock/clock.c
@@ -45,6 +45,9 @@ struct vlc_clock_main_t
     average_t coeff_avg; /* Moving average to smooth out the instant coeff */
     double rate;
     double coeff;
+    /* Time reference of the input, if VLC_TICK_0 (default), PTS and PCR use
+     * the same time base */
+    vlc_tick_t npt;
     vlc_tick_t offset;
     vlc_tick_t delay;
 
@@ -157,6 +160,8 @@ static vlc_tick_t vlc_clock_master_update(vlc_clock_t *clock,
         vlc_cond_broadcast(&main_clock->cond);
     }
 
+    original_ts -= main_clock->npt - VLC_TICK_0;
+
     vlc_mutex_unlock(&main_clock->lock);
 
     vlc_clock_on_update(clock, system_now, original_ts, rate, frame_rate,
@@ -293,18 +298,23 @@ static vlc_tick_t vlc_clock_slave_update(vlc_clock_t *clock,
 {
     vlc_clock_main_t *main_clock = clock->owner;
 
+    vlc_mutex_lock(&main_clock->lock);
+
     if (system_now == INT64_MAX)
     {
+        ts -= main_clock->npt - VLC_TICK_0;
+
+        vlc_mutex_unlock(&main_clock->lock);
         /* If system_now is INT64_MAX, the update is forced, don't modify anything
         * but only notify the new clock point. */
         vlc_clock_on_update(clock, INT64_MAX, ts, rate, frame_rate, frame_rate_base);
         return INT64_MAX;
     }
 
-    vlc_mutex_lock(&main_clock->lock);
-
     vlc_tick_t computed = clock->to_system_locked(clock, system_now, ts, rate);
 
+    ts -= main_clock->npt - VLC_TICK_0;
+
     vlc_mutex_unlock(&main_clock->lock);
 
     vlc_clock_on_update(clock, computed, ts, rate, frame_rate, frame_rate_base);
@@ -373,6 +383,7 @@ vlc_clock_main_t *vlc_clock_main_New(void)
     main_clock->coeff = 1.0f;
     main_clock->rate = 1.0f;
     main_clock->offset = VLC_TICK_INVALID;
+    main_clock->npt = VLC_TICK_0;
     main_clock->delay = 0;
 
     main_clock->first_pcr =
@@ -439,6 +450,13 @@ void vlc_clock_main_SetDejitter(vlc_clock_main_t *main_clock,
     vlc_mutex_unlock(&main_clock->lock);
 }
 
+void vlc_clock_main_SetInputNPT(vlc_clock_main_t *main_clock, vlc_tick_t npt)
+{
+    vlc_mutex_lock(&main_clock->lock);
+    main_clock->npt = npt;
+    vlc_mutex_unlock(&main_clock->lock);
+}
+
 void vlc_clock_main_ChangePause(vlc_clock_main_t *main_clock, vlc_tick_t now,
                                 bool paused)
 {
diff --git a/src/clock/clock.h b/src/clock/clock.h
index 772577616d6..2dbc61a54ba 100644
--- a/src/clock/clock.h
+++ b/src/clock/clock.h
@@ -80,6 +80,17 @@ void vlc_clock_main_SetFirstPcr(vlc_clock_main_t *main_clock,
 void vlc_clock_main_SetInputDejitter(vlc_clock_main_t *main_clock,
                                      vlc_tick_t delay);
 
+/**
+ * Set the normal play time of the input
+ *
+ * It corresponds to the real starting time of the input. Substracing PTS to
+ * this normal_time will give the playback time.
+ *
+ * Not reset via vlc_clock_*_Reset(), call
+ * vlc_clock_main_SetInputNPT(VLC_TICK_0) to restore the default NPT.
+ */
+void vlc_clock_main_SetInputNPT(vlc_clock_main_t *main_clock, vlc_tick_t npt);
+
 /**
  * This function sets the dejitter delay to absorb the clock jitter
  *
-- 
2.30.0



More information about the vlc-devel mailing list