From e17e8077d26db110cee880b4d785a3f12efe17bf Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 4 Jul 2021 17:19:47 +0200 Subject: [PATCH] wip --- app/src/screen.c | 2 +- app/src/v4l2_sink.c | 2 +- app/src/video_buffer.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/app/src/screen.c b/app/src/screen.c index 126caf9b..02f2f9cb 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -308,7 +308,7 @@ screen_init(struct screen *screen, const struct screen_params *params) { .on_new_frame = sc_video_buffer_on_new_frame, }; - bool ok = sc_video_buffer_init(&screen->vb, 0, &cbs, screen); + bool ok = sc_video_buffer_init(&screen->vb, 1000, &cbs, screen); if (!ok) { LOGE("Could not initialize video buffer"); return false; diff --git a/app/src/v4l2_sink.c b/app/src/v4l2_sink.c index 8f8b98ee..63f14dd9 100644 --- a/app/src/v4l2_sink.c +++ b/app/src/v4l2_sink.c @@ -159,7 +159,7 @@ sc_v4l2_sink_open(struct sc_v4l2_sink *vs) { .on_new_frame = sc_video_buffer_on_new_frame, }; - bool ok = sc_video_buffer_init(&vs->vb, 0, &cbs, vs); + bool ok = sc_video_buffer_init(&vs->vb, 1, &cbs, vs); if (!ok) { LOGE("Could not initialize video buffer"); return false; diff --git a/app/src/video_buffer.c b/app/src/video_buffer.c index 2b527db8..967b29ce 100644 --- a/app/src/video_buffer.c +++ b/app/src/video_buffer.c @@ -6,6 +6,40 @@ #include "util/log.h" +struct sc_clock { + double coeff; + sc_tick offset; + unsigned range; + + struct { + sc_tick system; + sc_tick stream; + } last; +}; + +static void +sc_clock_init(struct sc_clock *clock) { + clock->coeff = 1; + clock->offset = 0; + clock->range = 0; + + clock->last.system = 0; + clock->last.stream = 0; +} + +static void +sc_clock_update(struct sc_clock *clock, sc_tick now, sc_tick stream_ts) { + sc_tick system_delta = now - clock->last.system; + sc_tick stream_delta = stream_ts - clock->last.stream; + double instant_coeff = (double) system_delta / stream_delta; + +} + +static sc_tick +sc_clock_get_system_ts(struct sc_clock *clock, sc_tick stream_ts) { + return (sc_tick) (stream_ts * clock->coeff) + clock->offset; +} + static struct sc_video_buffer_frame * sc_video_buffer_frame_new(const AVFrame *frame) { struct sc_video_buffer_frame *vb_frame = malloc(sizeof(*vb_frame));