diff options
author | Matthew Waters <matthew@centricular.com> | 2019-10-14 02:22:18 -0500 |
---|---|---|
committer | Matthew Waters <matthew@centricular.com> | 2019-10-14 19:22:36 +1100 |
commit | 4d528776b6a33fe08b0b00d63f0d18244e5f5411 (patch) | |
tree | e0c5d937e481a5db4ea6161b2ba4e4dc551a7738 | |
parent | 0cc7d6f093c6eaf620792b64f97d6195e1be2630 (diff) | |
download | gstreamer-plugins-bad-4d528776b6a33fe08b0b00d63f0d18244e5f5411.tar.gz |
decklink: fix timestamp tracking when pausing
play->pause->sleep()->play would result in late frames being scheduled
-rw-r--r-- | sys/decklink/gstdecklinkvideosink.cpp | 13 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosink.h | 1 |
2 files changed, 10 insertions, 4 deletions
diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index 8cea56798..e21f3f596 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -793,7 +793,7 @@ gst_decklink_video_sink_convert_to_internal_clock (GstDecklinkVideoSink * self, else *timestamp = gst_clock_get_internal_time (self->output->clock); - GST_LOG_OBJECT (self, "Output timestamp %" GST_TIME_FORMAT + GST_DEBUG_OBJECT (self, "Output timestamp %" GST_TIME_FORMAT " using clock epoch %" GST_TIME_FORMAT, GST_TIME_ARGS (*timestamp), GST_TIME_ARGS (self->output->clock_epoch)); @@ -1200,7 +1200,7 @@ gst_decklink_video_sink_prepare (GstBaseSink * bsink, GstBuffer * buffer) gint stride; GstVideoTimeCodeMeta *tc_meta; - GST_DEBUG_OBJECT (self, "Preparing buffer %p", buffer); + GST_DEBUG_OBJECT (self, "Preparing buffer %" GST_PTR_FORMAT, buffer); // FIXME: Handle no timestamps if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer)) { @@ -1498,7 +1498,7 @@ gst_decklink_video_sink_start_scheduled_playback (GstElement * element) _wait_for_stop_notify (self); } - GST_DEBUG_OBJECT (self, + GST_INFO_OBJECT (self, "Starting scheduled playback at %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time)); @@ -1527,7 +1527,7 @@ gst_decklink_video_sink_stop_scheduled_playback (GstDecklinkVideoSink * self) start_time = gst_clock_get_internal_time (self->output->clock); - GST_DEBUG_OBJECT (self, + GST_INFO_OBJECT (self, "Stopping scheduled playback at %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time)); @@ -1599,6 +1599,9 @@ gst_decklink_video_sink_change_state (GstElement * element, self->internal_base_time = gst_clock_get_internal_time (self->output->clock); self->internal_time_offset = self->internal_base_time; + } else if (GST_CLOCK_TIME_IS_VALID (self->internal_pause_time)) { + self->internal_time_offset += + gst_clock_get_internal_time (self->output->clock) - self->internal_pause_time; } GST_INFO_OBJECT (self, "clock has been set to %" GST_PTR_FORMAT @@ -1652,6 +1655,7 @@ gst_decklink_video_sink_change_state (GstElement * element, GST_OBJECT_LOCK (self); self->internal_base_time = GST_CLOCK_TIME_NONE; self->external_base_time = GST_CLOCK_TIME_NONE; + self->internal_pause_time = GST_CLOCK_TIME_NONE; GST_OBJECT_UNLOCK (self); break; } @@ -1661,6 +1665,7 @@ gst_decklink_video_sink_change_state (GstElement * element, case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + self->internal_pause_time = gst_clock_get_internal_time (self->output->clock); break; default: break; diff --git a/sys/decklink/gstdecklinkvideosink.h b/sys/decklink/gstdecklinkvideosink.h index 02b321309..06f5b762f 100644 --- a/sys/decklink/gstdecklinkvideosink.h +++ b/sys/decklink/gstdecklinkvideosink.h @@ -64,6 +64,7 @@ struct _GstDecklinkVideoSink /* really an internal start time */ GstClockTime internal_time_offset; + GstClockTime internal_pause_time; GstDecklinkOutput *output; |