diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-09-22 19:35:00 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-09-24 09:32:27 +0200 |
commit | e0fd5317df193acb671e67f276a2ca2e5fa8c4b8 (patch) | |
tree | b7fb49d97958a1c1f6cca2fb36c32772fc208575 /sys | |
parent | 3417a1507657505cae943d161282dc72982c2241 (diff) | |
download | gstreamer-plugins-bad-e0fd5317df193acb671e67f276a2ca2e5fa8c4b8.tar.gz |
decklink: Disable inputs/outputs in PAUSED->READY to allow going to PAUSED again from there
https://bugzilla.gnome.org/show_bug.cgi?id=755426
Diffstat (limited to 'sys')
-rw-r--r-- | sys/decklink/gstdecklinkaudiosrc.cpp | 35 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosink.cpp | 24 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosrc.cpp | 34 |
3 files changed, 72 insertions, 21 deletions
diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp index 70cfa7496..a9284d193 100644 --- a/sys/decklink/gstdecklinkaudiosrc.cpp +++ b/sys/decklink/gstdecklinkaudiosrc.cpp @@ -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); diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index 520c50a4f..e1f520cbf 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -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; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index 4e8bceeba..f15527bda 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -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; |