diff options
Diffstat (limited to 'sys/decklink/gstdecklinkvideosrc.cpp')
-rw-r--r-- | sys/decklink/gstdecklinkvideosrc.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
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; |