From 9764e22a5c150238fe5e5368c3816bcacc8dc0a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 23 Sep 2015 15:56:26 +0200 Subject: decklink: Add a clock epoch that is used as offset whenever restarting the clock Otherwise we're going to return times starting at 0 again after shutting down an element for a specific input/output and then using it again later. https://bugzilla.gnome.org/show_bug.cgi?id=755426 --- sys/decklink/gstdecklink.cpp | 2 ++ sys/decklink/gstdecklink.h | 4 ++-- sys/decklink/gstdecklinkvideosink.cpp | 3 +++ sys/decklink/gstdecklinkvideosrc.cpp | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index f3ddeb907..eb39bdb46 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -885,6 +885,7 @@ gst_decklink_clock_get_internal_time (GstClock * clock) self->input->clock_last_time = result; } + result += self->input->clock_epoch; g_mutex_unlock (&self->input->lock); } else if (self->output != NULL) { g_mutex_lock (&self->output->lock); @@ -924,6 +925,7 @@ gst_decklink_clock_get_internal_time (GstClock * clock) self->output->clock_last_time = result; } + result += self->output->clock_epoch; g_mutex_unlock (&self->output->lock); } else { g_assert_not_reached (); diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h index b601e7c44..353769faa 100644 --- a/sys/decklink/gstdecklink.h +++ b/sys/decklink/gstdecklink.h @@ -134,7 +134,7 @@ struct _GstDecklinkOutput { IDeckLink *device; IDeckLinkOutput *output; GstClock *clock; - GstClockTime clock_start_time, clock_last_time; + GstClockTime clock_start_time, clock_last_time, clock_epoch; GstClockTimeDiff clock_offset; gboolean started, clock_restart; @@ -162,7 +162,7 @@ struct _GstDecklinkInput { IDeckLinkConfiguration *config; IDeckLinkAttributes *attributes; GstClock *clock; - GstClockTime clock_start_time, clock_offset, clock_last_time; + GstClockTime clock_start_time, clock_offset, clock_last_time, clock_epoch; gboolean started, clock_restart; /* Everything below protected by mutex */ diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index e1f520cbf..c50d09ba0 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -558,6 +558,7 @@ gst_decklink_video_sink_open (GstBaseSink * bsink) self->output->start_scheduled_playback = gst_decklink_video_sink_start_scheduled_playback; self->output->clock_start_time = GST_CLOCK_TIME_NONE; + self->output->clock_epoch += self->output->clock_last_time; self->output->clock_last_time = 0; self->output->clock_offset = 0; g_mutex_unlock (&self->output->lock); @@ -706,6 +707,7 @@ gst_decklink_video_sink_change_state (GstElement * element, case GST_STATE_CHANGE_READY_TO_PAUSED: g_mutex_lock (&self->output->lock); self->output->clock_start_time = GST_CLOCK_TIME_NONE; + self->output->clock_epoch += self->output->clock_last_time; self->output->clock_last_time = 0; self->output->clock_offset = 0; g_mutex_unlock (&self->output->lock); @@ -746,6 +748,7 @@ gst_decklink_video_sink_change_state (GstElement * element, gst_clock_set_calibration (self->output->clock, 0, 0, 1, 1); g_mutex_lock (&self->output->lock); self->output->clock_start_time = GST_CLOCK_TIME_NONE; + self->output->clock_epoch += self->output->clock_last_time; self->output->clock_last_time = 0; self->output->clock_offset = 0; g_mutex_unlock (&self->output->lock); diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index f15527bda..915393eaf 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -645,6 +645,7 @@ gst_decklink_video_src_open (GstDecklinkVideoSrc * self) self->input->got_video_frame = gst_decklink_video_src_got_frame; self->input->start_streams = gst_decklink_video_src_start_streams; self->input->clock_start_time = GST_CLOCK_TIME_NONE; + self->input->clock_epoch += self->input->clock_last_time; self->input->clock_last_time = 0; self->input->clock_offset = 0; g_mutex_unlock (&self->input->lock); @@ -752,6 +753,7 @@ gst_decklink_video_src_change_state (GstElement * element, case GST_STATE_CHANGE_READY_TO_PAUSED: g_mutex_lock (&self->input->lock); self->input->clock_start_time = GST_CLOCK_TIME_NONE; + self->input->clock_epoch += self->input->clock_last_time; self->input->clock_last_time = 0; self->input->clock_offset = 0; g_mutex_unlock (&self->input->lock); @@ -790,6 +792,7 @@ gst_decklink_video_src_change_state (GstElement * element, gst_clock_set_calibration (self->input->clock, 0, 0, 1, 1); g_mutex_lock (&self->input->lock); self->input->clock_start_time = GST_CLOCK_TIME_NONE; + self->input->clock_epoch += self->input->clock_last_time; self->input->clock_last_time = 0; self->input->clock_offset = 0; g_mutex_unlock (&self->input->lock); -- cgit v1.2.1