[vlc-devel] [PATCH 2/2] RFC: clock: pause from the main_clock (FIXUP)

Thomas Guillem thomas at gllm.fr
Thu Feb 14 17:49:08 CET 2019


This fixes pausing when the clock master is the monotonic clock.

The only potential change was in the vlc_clock_slave_to_system_locked()
function when main_clock->pause_date was checked. This commit won't change
anything since the pause could be triggered before or after the ES slave
reaches this points since we can't control if the master decoder thread will
pause before or after the slave decoder thread.
---
 src/audio_output/dec.c          |  2 -
 src/clock/clock.c               | 78 +++++++++++++--------------------
 src/clock/clock.h               | 10 ++---
 src/input/es_out.c              |  3 ++
 src/video_output/video_output.c |  2 -
 5 files changed, 38 insertions(+), 57 deletions(-)

diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index 4e7079b8c1..fe573bfee1 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -470,8 +470,6 @@ void aout_DecChangePause (audio_output_t *aout, bool paused, vlc_tick_t date)
         else if (paused)
             aout->flush(aout, false);
     }
-
-    vlc_clock_ChangePause(owner->sync.clock, date, paused);
 }
 
 void aout_DecChangeRate(audio_output_t *aout, float rate)
diff --git a/src/clock/clock.c b/src/clock/clock.c
index 8aaaa458eb..22b7f23840 100644
--- a/src/clock/clock.c
+++ b/src/clock/clock.c
@@ -61,7 +61,6 @@ struct vlc_clock_t
     vlc_tick_t (*update)(vlc_clock_t * clock, vlc_tick_t system_now,
                          vlc_tick_t pts, double rate);
     void (*reset)(vlc_clock_t * clock);
-    void (*pause)(vlc_clock_t * clock, vlc_tick_t system_now, bool paused);
     vlc_tick_t (*set_delay)(vlc_clock_t * clock, vlc_tick_t delay);
     void (*set_dejitter)(vlc_clock_t * clock, vlc_tick_t delay);
     vlc_tick_t (*to_system_locked)(vlc_clock_t * clock, vlc_tick_t system_now,
@@ -111,7 +110,6 @@ static vlc_tick_t vlc_clock_master_update(vlc_clock_t * clock,
     pts += clock->delay;
 
     vlc_mutex_lock(&main_clock->lock);
-    assert(main_clock->pause_date == VLC_TICK_INVALID);
 
     if (main_clock->offset != VLC_TICK_INVALID && pts != main_clock->last.stream)
     {
@@ -167,36 +165,6 @@ static void vlc_clock_master_reset(vlc_clock_t * clock)
     vlc_mutex_unlock(&main_clock->lock);
 }
 
-static void vlc_clock_master_pause(vlc_clock_t * clock, vlc_tick_t now, bool paused)
-{
-    vlc_clock_main_t * main_clock = clock->owner;
-    vlc_mutex_lock(&main_clock->lock);
-    assert(paused == (main_clock->pause_date == VLC_TICK_INVALID));
-
-    if (paused)
-        main_clock->pause_date = now;
-    else
-    {
-        /**
-         * Only apply a delay if the clock has a reference point to avoid
-         * messing up the timings if the stream was paused then seeked
-         */
-        const vlc_tick_t delay = now - main_clock->pause_date;
-        if (main_clock->offset != VLC_TICK_INVALID)
-        {
-            main_clock->last.system += delay;
-            main_clock->offset += delay;
-        }
-        if (main_clock->first_pcr.system != VLC_TICK_INVALID)
-            main_clock->first_pcr.system += delay;
-        if (main_clock->wait_sync_ref.system != VLC_TICK_INVALID)
-            main_clock->wait_sync_ref.system += delay;
-        main_clock->pause_date = VLC_TICK_INVALID;
-        vlc_cond_broadcast(&main_clock->cond);
-    }
-    vlc_mutex_unlock(&main_clock->lock);
-}
-
 static vlc_tick_t vlc_clock_master_set_delay(vlc_clock_t * clock, vlc_tick_t delay)
 {
     vlc_clock_main_t * main_clock = clock->owner;
@@ -303,7 +271,6 @@ static vlc_tick_t vlc_clock_master_to_system_locked(vlc_clock_t * clock,
                                                     vlc_tick_t pts)
 {
     vlc_clock_main_t * main_clock = clock->owner;
-    assert(main_clock->pause_date == VLC_TICK_INVALID);
     return vlc_clock_main_to_system_locked(main_clock, now, pts) + clock->delay;
 }
 
@@ -319,7 +286,7 @@ static vlc_tick_t vlc_clock_slave_update(vlc_clock_t * clock,
 
     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_TICK_INVALID;
+    return computed != INT64_MAX ? computed - system_now : VLC_TICK_INVALID;
 }
 
 static void vlc_clock_slave_reset(vlc_clock_t * clock)
@@ -330,13 +297,6 @@ static void vlc_clock_slave_reset(vlc_clock_t * clock)
     vlc_mutex_unlock(&main_clock->lock);
 }
 
-static void vlc_clock_slave_pause(vlc_clock_t * clock, vlc_tick_t now, bool paused)
-{
-    VLC_UNUSED(clock);
-    VLC_UNUSED(paused);
-    VLC_UNUSED(now);
-}
-
 static vlc_tick_t vlc_clock_slave_set_delay(vlc_clock_t * clock, vlc_tick_t delay)
 {
     vlc_clock_main_t * main_clock = clock->owner;
@@ -449,6 +409,35 @@ void vlc_clock_main_SetInputDejitter(vlc_clock_main_t * main_clock, vlc_tick_t d
     vlc_mutex_unlock(&main_clock->lock);
 }
 
+void vlc_clock_main_ChangePause(vlc_clock_main_t * main_clock, vlc_tick_t now, bool paused)
+{
+    vlc_mutex_lock(&main_clock->lock);
+    assert(paused == (main_clock->pause_date == VLC_TICK_INVALID));
+
+    if (paused)
+        main_clock->pause_date = now;
+    else
+    {
+        /**
+         * Only apply a delay if the clock has a reference point to avoid
+         * messing up the timings if the stream was paused then seeked
+         */
+        const vlc_tick_t delay = now - main_clock->pause_date;
+        if (main_clock->offset != VLC_TICK_INVALID)
+        {
+            main_clock->last.system += delay;
+            main_clock->offset += delay;
+        }
+        if (main_clock->first_pcr.system != VLC_TICK_INVALID)
+            main_clock->first_pcr.system += delay;
+        if (main_clock->wait_sync_ref.system != VLC_TICK_INVALID)
+            main_clock->wait_sync_ref.system += delay;
+        main_clock->pause_date = VLC_TICK_INVALID;
+        vlc_cond_broadcast(&main_clock->cond);
+    }
+    vlc_mutex_unlock(&main_clock->lock);
+}
+
 void vlc_clock_main_Delete(vlc_clock_main_t * main_clock)
 {
     vlc_mutex_destroy(&main_clock->lock);
@@ -468,11 +457,6 @@ void vlc_clock_Reset(vlc_clock_t * clock)
     clock->reset(clock);
 }
 
-void vlc_clock_ChangePause(vlc_clock_t * clock, vlc_tick_t system_now, bool paused)
-{
-    clock->pause(clock, system_now, paused);
-}
-
 vlc_tick_t vlc_clock_SetDelay(vlc_clock_t * clock, vlc_tick_t delay)
 {
     return clock->set_delay(clock, delay);
@@ -518,7 +502,6 @@ static void vlc_clock_set_master_cbk(vlc_clock_t * clk)
 
     clk->update = vlc_clock_master_update;
     clk->reset = vlc_clock_master_reset;
-    clk->pause = vlc_clock_master_pause;
     clk->set_delay = vlc_clock_master_set_delay;
     clk->set_dejitter = vlc_clock_master_set_dejitter;
     clk->to_system_locked = vlc_clock_master_to_system_locked;
@@ -528,7 +511,6 @@ static void vlc_clock_set_slave_cbk(vlc_clock_t * clk)
 {
     clk->update = vlc_clock_slave_update;
     clk->reset = vlc_clock_slave_reset;
-    clk->pause = vlc_clock_slave_pause;
     clk->set_delay = vlc_clock_slave_set_delay;
     clk->set_dejitter = vlc_clock_slave_set_dejitter;
     clk->to_system_locked = vlc_clock_slave_to_system_locked;
diff --git a/src/clock/clock.h b/src/clock/clock.h
index b63cccca82..6cf1937ec6 100644
--- a/src/clock/clock.h
+++ b/src/clock/clock.h
@@ -55,6 +55,11 @@ void vlc_clock_main_SetFirstPcr(vlc_clock_main_t * main, vlc_tick_t system_now,
                                 vlc_tick_t pts);
 void vlc_clock_main_SetInputDejitter(vlc_clock_main_t * main, vlc_tick_t delay);
 
+/**
+ * This function allows changing the pause status.
+ */
+void vlc_clock_main_ChangePause(vlc_clock_main_t * clock, vlc_tick_t system_now, bool paused);
+
 /**
  * This function set the allocated interface as the master making the current
  * master if any a slave.
@@ -92,11 +97,6 @@ vlc_tick_t vlc_clock_Update(vlc_clock_t * clock, vlc_tick_t system_now,
  */
 void vlc_clock_Reset(vlc_clock_t * clock);
 
-/**
- * This function allows changing the pause status.
- */
-void vlc_clock_ChangePause(vlc_clock_t * clock, vlc_tick_t system_now, bool paused);
-
 /**
  * This functions change the clock delay.
  * It returns the amount of time the clock owner need to wait in order to reach
diff --git a/src/input/es_out.c b/src/input/es_out.c
index b6a956285d..d4138ce60f 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -889,7 +889,10 @@ static void EsOutProgramChangePause( es_out_t *out, bool b_paused, vlc_tick_t i_
     es_out_pgrm_t *pgrm;
 
     vlc_list_foreach(pgrm, &p_sys->programs, node)
+    {
         input_clock_ChangePause(pgrm->p_input_clock, b_paused, i_date);
+        vlc_clock_main_ChangePause(pgrm->p_main_clock, i_date, b_paused);
+    }
 }
 
 static void EsOutDecoderChangeDelay( es_out_t *out, es_out_id_t *p_es )
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 35c8310c48..5544a6a5f2 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1233,8 +1233,6 @@ void vout_ChangePause(vout_thread_t *vout, bool is_paused, vlc_tick_t date)
     }
     vout->p->pause.is_on = is_paused;
     vout->p->pause.date  = date;
-    if (vout->p->clock)
-        vlc_clock_ChangePause(vout->p->clock, date, is_paused);
     vout_control_Release(&vout->p->control);
 
     vlc_mutex_lock(&vout->p->window_lock);
-- 
2.20.1



More information about the vlc-devel mailing list