From: Sebastian Dröge Date: Wed, 23 Sep 2015 13:56:26 +0000 (+0200) Subject: decklink: Add a clock epoch that is used as offset whenever restarting the clock X-Git-Tag: 1.19.3~507^2~7964 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9764e22a5c150238fe5e5368c3816bcacc8dc0a4;p=platform%2Fupstream%2Fgstreamer.git 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 --- diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index f3ddeb9..eb39bdb 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 b601e7c..353769f 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 e1f520c..c50d09b 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 f15527b..915393e 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);