decklinkvideosink: Stop scheduled playback shortly in PAUSED->PLAYING if it was runni...
authorSebastian Dröge <sebastian@centricular.com>
Wed, 14 Jan 2015 15:33:53 +0000 (16:33 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 14 Jan 2015 15:33:53 +0000 (16:33 +0100)
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.

sys/decklink/gstdecklinkvideosink.cpp

index d9b77ef27c7e8cc8b77c413aebf66b1ab693d84c..72d0797e86cab05ca58663341bb510d019c0747d 100644 (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));