diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-09-23 15:56:26 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-09-24 09:32:36 +0200 |
commit | 9764e22a5c150238fe5e5368c3816bcacc8dc0a4 (patch) | |
tree | 4938c92257e6f5e209d0bec50f19cb5eb274c5dc /sys/decklink | |
parent | e0fd5317df193acb671e67f276a2ca2e5fa8c4b8 (diff) | |
download | gstreamer-plugins-bad-9764e22a5c150238fe5e5368c3816bcacc8dc0a4.tar.gz |
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
Diffstat (limited to 'sys/decklink')
-rw-r--r-- | sys/decklink/gstdecklink.cpp | 2 | ||||
-rw-r--r-- | sys/decklink/gstdecklink.h | 4 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosink.cpp | 3 | ||||
-rw-r--r-- | 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); |