summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2019-10-14 02:22:18 -0500
committerMatthew Waters <matthew@centricular.com>2019-10-14 19:22:36 +1100
commit4d528776b6a33fe08b0b00d63f0d18244e5f5411 (patch)
treee0c5d937e481a5db4ea6161b2ba4e4dc551a7738
parent0cc7d6f093c6eaf620792b64f97d6195e1be2630 (diff)
downloadgstreamer-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.cpp13
-rw-r--r--sys/decklink/gstdecklinkvideosink.h1
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;