[vlc-devel] [PATCH V2 02/13] clock: add AddOriginPoint

Thomas Guillem thomas at gllm.fr
Fri Aug 23 16:45:07 CEST 2019


Will be used by the future "clock: forward clock update points" commit.
---
 src/clock/clock.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++
 src/clock/clock.h | 11 +++++++++
 2 files changed, 72 insertions(+)

diff --git a/src/clock/clock.c b/src/clock/clock.c
index 9cc0c66bb6..43a9cbc0ee 100644
--- a/src/clock/clock.c
+++ b/src/clock/clock.c
@@ -23,6 +23,7 @@
 
 #include <vlc_common.h>
 #include <vlc_aout.h>
+#include <vlc_vector.h>
 #include <assert.h>
 #include "clock.h"
 #include "clock_internal.h"
@@ -53,6 +54,8 @@ struct vlc_clock_main_t
     clock_point_t ref;
     vlc_tick_t output_dejitter; /* Delay used to absorb the output clock jitter */
     vlc_tick_t input_dejitter; /* Delay used to absorb the input jitter */
+    struct VLC_VECTOR(clock_point_t) origin_map;
+
     bool abort;
 };
 
@@ -80,6 +83,50 @@ static vlc_tick_t main_stream_to_system(vlc_clock_main_t *main_clock,
         (ts * main_clock->coeff / main_clock->rate + main_clock->offset);
 }
 
+static vlc_tick_t vlc_clock_main_update_origin(vlc_clock_main_t *main_clock,
+                                               vlc_tick_t ts)
+{
+    for (ssize_t i = main_clock->origin_map.size - 1; i >= 0; --i)
+    {
+        clock_point_t *point = &main_clock->origin_map.data[i];
+        if (ts >= point->stream)
+            return ts - point->system;
+    }
+    return ts;
+}
+
+int vlc_clock_main_AddOriginPoint(vlc_clock_main_t *main_clock,
+                                  vlc_tick_t origin, vlc_tick_t ts)
+{
+    vlc_mutex_lock(&main_clock->lock);
+
+    /* new_point.system=origin, new_point.stream=ts */
+    clock_point_t new_point = clock_point_Create(origin, ts);
+
+    /* Insert the point, sorted by ts */
+    size_t i;
+    for (i = 0; i < main_clock->origin_map.size; ++i)
+    {
+        clock_point_t *point = &main_clock->origin_map.data[i];
+        if (new_point.stream <= point->stream)
+        {
+            if (new_point.stream == point->stream
+             && new_point.system == point->system)
+            {
+                /* Don't add the same point more than time */
+                vlc_mutex_unlock(&main_clock->lock);
+                return VLC_SUCCESS;
+            }
+            break;
+        }
+    }
+    bool success = vlc_vector_insert(&main_clock->origin_map, i, new_point);
+
+    vlc_mutex_unlock(&main_clock->lock);
+
+    return success ? VLC_SUCCESS : VLC_EGENERIC;
+}
+
 static void vlc_clock_main_reset(vlc_clock_main_t *main_clock)
 {
     AvgReset(&main_clock->coeff_avg);
@@ -330,8 +377,16 @@ vlc_clock_main_t *vlc_clock_main_New(void)
     if (main_clock == NULL)
         return NULL;
 
+    vlc_vector_init(&main_clock->origin_map);
+    if (!vlc_vector_reserve(&main_clock->origin_map, 1))
+    {
+        free(main_clock);
+        return NULL;
+    }
+
     vlc_mutex_init(&main_clock->lock);
     vlc_cond_init(&main_clock->cond);
+
     main_clock->master = NULL;
     main_clock->rc = 1;
 
@@ -345,9 +400,14 @@ vlc_clock_main_t *vlc_clock_main_New(void)
     main_clock->wait_sync_ref = main_clock->last =
         clock_point_Create(VLC_TICK_INVALID, VLC_TICK_INVALID);
 
+    clock_point_t first_pcr_point = clock_point_Create(VLC_TICK_0, VLC_TICK_0);
+    bool success = vlc_vector_push(&main_clock->origin_map, first_pcr_point);
+    assert(success);
+
     main_clock->pause_date = VLC_TICK_INVALID;
     main_clock->input_dejitter = DEFAULT_PTS_DELAY;
     main_clock->output_dejitter = AOUT_MAX_PTS_ADVANCE * 2;
+
     main_clock->abort = false;
 
     AvgInit(&main_clock->coeff_avg, 10);
@@ -428,6 +488,7 @@ void vlc_clock_main_Delete(vlc_clock_main_t *main_clock)
 {
     vlc_mutex_destroy(&main_clock->lock);
     vlc_cond_destroy(&main_clock->cond);
+    vlc_vector_clear(&main_clock->origin_map);
     assert(main_clock->rc == 1);
     free(main_clock);
 }
diff --git a/src/clock/clock.h b/src/clock/clock.h
index 41dea67306..1fcb73887c 100644
--- a/src/clock/clock.h
+++ b/src/clock/clock.h
@@ -62,6 +62,17 @@ void vlc_clock_main_SetReferencePoint(vlc_clock_main_t *main_clock,
 void vlc_clock_main_SetInputDejitter(vlc_clock_main_t *main_clock,
                                      vlc_tick_t delay);
 
+/**
+ * Add an origin point
+ *
+ * The first origin is VLC_TICK_0/VLC_TICK_0 by default, points stay valid
+ * after a reset call. It is only used as an informative value: ts values
+ * updated via vlc_clock_Update() will be subtracted from the corresponding
+ * origin before being sent via update callbacks.
+ */
+int vlc_clock_main_AddOriginPoint(vlc_clock_main_t *main_clock,
+                                  vlc_tick_t origin, vlc_tick_t ts);
+
 /**
  * This function allows changing the pause status.
  */
-- 
2.20.1



More information about the vlc-devel mailing list