decklinkvideosink: Stop scheduled playback shortly in PAUSED->PLAYING if it was running already

This fixes handling of flushing seeks, where we will get a PAUSED->PLAYING
state transition after the previous one without actually going to PAUSED
first.
This commit is contained in:
Sebastian Dröge 2015-01-14 16:33:53 +01:00
parent 92fa187d11
commit 5a12b2670e

View file

@ -539,7 +539,6 @@ gst_decklink_video_sink_change_state (GstElement * element,
GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (element);
GstStateChangeReturn ret;
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
gst_element_post_message (element,
@ -614,6 +613,7 @@ gst_decklink_video_sink_change_state (GstElement * element,
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:{
GstClockTime start_time;
HRESULT res;
bool active;
// FIXME: start time is the same for the complete pipeline,
// but what we need here is the start time of this element!
@ -638,6 +638,20 @@ gst_decklink_video_sink_change_state (GstElement * element,
convert_to_internal_clock (self, &start_time, NULL);
active = false;
self->output->output->IsScheduledPlaybackRunning (&active);
if (active) {
GST_DEBUG_OBJECT (self, "Stopping scheduled playback");
res = self->output->output->StopScheduledPlayback (0, 0, 0);
if (res != S_OK) {
GST_ELEMENT_ERROR (self, STREAM, FAILED,
(NULL), ("Failed to stop scheduled playback: 0x%08x", res));
ret = GST_STATE_CHANGE_FAILURE;
break;
}
}
GST_DEBUG_OBJECT (self,
"Starting scheduled playback at %" GST_TIME_FORMAT,
GST_TIME_ARGS (start_time));