[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