decklink: Disable inputs/outputs in PAUSED->READY to allow going to PAUSED again...
authorSebastian Dröge <sebastian@centricular.com>
Tue, 22 Sep 2015 17:35:00 +0000 (19:35 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 24 Sep 2015 07:32:27 +0000 (09:32 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=755426

sys/decklink/gstdecklinkaudiosrc.cpp
sys/decklink/gstdecklinkvideosink.cpp
sys/decklink/gstdecklinkvideosrc.cpp

index 70cfa74..a9284d1 100644 (file)
@@ -109,6 +109,8 @@ static GstFlowReturn gst_decklink_audio_src_create (GstPushSrc * psrc,
 static gboolean gst_decklink_audio_src_open (GstDecklinkAudioSrc * self);
 static gboolean gst_decklink_audio_src_close (GstDecklinkAudioSrc * self);
 
+static gboolean gst_decklink_audio_src_stop (GstDecklinkAudioSrc * self);
+
 #define parent_class gst_decklink_audio_src_parent_class
 G_DEFINE_TYPE (GstDecklinkAudioSrc, gst_decklink_audio_src, GST_TYPE_PUSH_SRC);
 
@@ -646,7 +648,7 @@ gst_decklink_audio_src_unlock_stop (GstBaseSrc * bsrc)
 static gboolean
 gst_decklink_audio_src_open (GstDecklinkAudioSrc * self)
 {
-  GST_DEBUG_OBJECT (self, "Starting");
+  GST_DEBUG_OBJECT (self, "Opening");
 
   self->input =
       gst_decklink_acquire_nth_input (self->device_number,
@@ -666,18 +668,13 @@ gst_decklink_audio_src_open (GstDecklinkAudioSrc * self)
 static gboolean
 gst_decklink_audio_src_close (GstDecklinkAudioSrc * self)
 {
-
-  GST_DEBUG_OBJECT (self, "Stopping");
+  GST_DEBUG_OBJECT (self, "Closing");
 
   if (self->input) {
     g_mutex_lock (&self->input->lock);
     self->input->got_audio_packet = NULL;
-    self->input->audio_enabled = FALSE;
-    if (self->input->start_streams && self->input->videosrc)
-      self->input->start_streams (self->input->videosrc);
     g_mutex_unlock (&self->input->lock);
 
-    self->input->input->DisableAudioInput ();
     gst_decklink_release_nth_input (self->device_number,
         GST_ELEMENT_CAST (self), TRUE);
     self->input = NULL;
@@ -686,6 +683,26 @@ gst_decklink_audio_src_close (GstDecklinkAudioSrc * self)
   return TRUE;
 }
 
+static gboolean
+gst_decklink_audio_src_stop (GstDecklinkAudioSrc * self)
+{
+  GST_DEBUG_OBJECT (self, "Stopping");
+
+  g_queue_foreach (&self->current_packets, (GFunc) capture_packet_free,
+      NULL);
+  g_queue_clear (&self->current_packets);
+
+  if (self->input && self->input->audio_enabled) {
+    g_mutex_lock (&self->input->lock);
+    self->input->audio_enabled = FALSE;
+    g_mutex_unlock (&self->input->lock);
+
+    self->input->input->DisableAudioInput ();
+  }
+
+  return TRUE;
+}
+
 #if 0
 static gboolean
 in_same_pipeline (GstElement * a, GstElement * b)
@@ -769,9 +786,7 @@ gst_decklink_audio_src_change_state (GstElement * element,
 
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-      g_queue_foreach (&self->current_packets, (GFunc) capture_packet_free,
-          NULL);
-      g_queue_clear (&self->current_packets);
+      gst_decklink_audio_src_stop (self);
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
       gst_decklink_audio_src_close (self);
index 520c50a..e1f520c 100644 (file)
@@ -142,6 +142,7 @@ static GstFlowReturn gst_decklink_video_sink_render (GstBaseSink * bsink,
     GstBuffer * buffer);
 static gboolean gst_decklink_video_sink_open (GstBaseSink * bsink);
 static gboolean gst_decklink_video_sink_close (GstBaseSink * bsink);
+static gboolean gst_decklink_video_sink_stop (GstDecklinkVideoSink * self);
 static gboolean gst_decklink_video_sink_propose_allocation (GstBaseSink * bsink,
     GstQuery * query);
 
@@ -539,7 +540,7 @@ gst_decklink_video_sink_open (GstBaseSink * bsink)
   GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink);
   const GstDecklinkMode *mode;
 
-  GST_DEBUG_OBJECT (self, "Starting");
+  GST_DEBUG_OBJECT (self, "Stopping");
 
   self->output =
       gst_decklink_acquire_nth_output (self->device_number,
@@ -569,7 +570,7 @@ gst_decklink_video_sink_close (GstBaseSink * bsink)
 {
   GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink);
 
-  GST_DEBUG_OBJECT (self, "Stopping");
+  GST_DEBUG_OBJECT (self, "Closing");
 
   if (self->output) {
     g_mutex_lock (&self->output->lock);
@@ -580,7 +581,6 @@ gst_decklink_video_sink_close (GstBaseSink * bsink)
     g_mutex_unlock (&self->output->lock);
 
     self->output->output->DisableVideoOutput ();
-    self->output->output->SetScheduledFrameCompletionCallback (NULL);
     gst_decklink_release_nth_output (self->device_number,
         GST_ELEMENT_CAST (self), FALSE);
     self->output = NULL;
@@ -589,6 +589,23 @@ gst_decklink_video_sink_close (GstBaseSink * bsink)
   return TRUE;
 }
 
+static gboolean
+gst_decklink_video_sink_stop (GstDecklinkVideoSink * self)
+{
+  GST_DEBUG_OBJECT (self, "Stopping");
+
+  if (self->output && self->output->video_enabled) {
+    g_mutex_lock (&self->output->lock);
+    self->output->video_enabled = FALSE;
+    g_mutex_unlock (&self->output->lock);
+
+    self->output->output->DisableVideoOutput ();
+    self->output->output->SetScheduledFrameCompletionCallback (NULL);
+  }
+
+  return TRUE;
+}
+
 static void
 gst_decklink_video_sink_start_scheduled_playback (GstElement * element)
 {
@@ -732,6 +749,7 @@ gst_decklink_video_sink_change_state (GstElement * element,
       self->output->clock_last_time = 0;
       self->output->clock_offset = 0;
       g_mutex_unlock (&self->output->lock);
+      gst_decklink_video_sink_stop (self);
       break;
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:{
       GstClockTime start_time;
index 4e8bcee..f15527b 100644 (file)
@@ -100,6 +100,8 @@ static GstFlowReturn gst_decklink_video_src_create (GstPushSrc * psrc,
 static gboolean gst_decklink_video_src_open (GstDecklinkVideoSrc * self);
 static gboolean gst_decklink_video_src_close (GstDecklinkVideoSrc * self);
 
+static gboolean gst_decklink_video_src_stop (GstDecklinkVideoSrc * self);
+
 static void gst_decklink_video_src_start_streams (GstElement * element);
 
 #define parent_class gst_decklink_video_src_parent_class
@@ -626,7 +628,7 @@ gst_decklink_video_src_open (GstDecklinkVideoSrc * self)
 {
   const GstDecklinkMode *mode;
 
-  GST_DEBUG_OBJECT (self, "Starting");
+  GST_DEBUG_OBJECT (self, "Opening");
 
   self->input =
       gst_decklink_acquire_nth_input (self->device_number,
@@ -654,18 +656,16 @@ static gboolean
 gst_decklink_video_src_close (GstDecklinkVideoSrc * self)
 {
 
-  GST_DEBUG_OBJECT (self, "Stopping");
+  GST_DEBUG_OBJECT (self, "Closing");
 
   if (self->input) {
     g_mutex_lock (&self->input->lock);
     self->input->got_video_frame = NULL;
     self->input->mode = NULL;
     self->input->video_enabled = FALSE;
-    if (self->input->start_streams)
-      self->input->start_streams (self->input->videosrc);
+    self->input->start_streams = NULL;
     g_mutex_unlock (&self->input->lock);
 
-    self->input->input->DisableVideoInput ();
     gst_decklink_release_nth_input (self->device_number,
         GST_ELEMENT_CAST (self), FALSE);
     self->input = NULL;
@@ -674,6 +674,26 @@ gst_decklink_video_src_close (GstDecklinkVideoSrc * self)
   return TRUE;
 }
 
+static gboolean
+gst_decklink_video_src_stop (GstDecklinkVideoSrc * self)
+{
+  GST_DEBUG_OBJECT (self, "Stopping");
+
+  g_queue_foreach (&self->current_frames, (GFunc) capture_frame_free, NULL);
+  g_queue_clear (&self->current_frames);
+  self->caps_mode = GST_DECKLINK_MODE_AUTO;
+
+  if (self->input && self->input->video_enabled) {
+    g_mutex_lock (&self->input->lock);
+    self->input->video_enabled = FALSE;
+    g_mutex_unlock (&self->input->lock);
+
+    self->input->input->DisableVideoInput ();
+  }
+
+  return TRUE;
+}
+
 static void
 gst_decklink_video_src_start_streams (GstElement * element)
 {
@@ -774,9 +794,7 @@ gst_decklink_video_src_change_state (GstElement * element,
       self->input->clock_offset = 0;
       g_mutex_unlock (&self->input->lock);
 
-      g_queue_foreach (&self->current_frames, (GFunc) capture_frame_free, NULL);
-      g_queue_clear (&self->current_frames);
-      self->caps_mode = GST_DECKLINK_MODE_AUTO;
+      gst_decklink_video_src_stop (self);
       break;
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:{
       HRESULT res;