From aec46143bb3ddb59b58f509863f716d4bc54dd2a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 25 Nov 2016 15:03:08 +0200 Subject: [PATCH] decklinksrc: Add property to drop frames that are marked as having no input signal https://bugzilla.gnome.org/show_bug.cgi?id=774850 --- sys/decklink/gstdecklinkaudiosrc.cpp | 10 ++++++++-- sys/decklink/gstdecklinkvideosrc.cpp | 24 +++++++++++++++++++++--- sys/decklink/gstdecklinkvideosrc.h | 1 + 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp index 63c75d2..04dc2f7 100644 --- a/sys/decklink/gstdecklinkaudiosrc.cpp +++ b/sys/decklink/gstdecklinkaudiosrc.cpp @@ -428,14 +428,20 @@ gst_decklink_audio_src_got_packet (GstElement * element, GstClockTime timestamp; GST_LOG_OBJECT (self, - "Got audio packet at %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT, - GST_TIME_ARGS (capture_time), GST_TIME_ARGS (packet_time)); + "Got audio packet at %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT + ", no signal %d", GST_TIME_ARGS (capture_time), + GST_TIME_ARGS (packet_time), no_signal); g_mutex_lock (&self->input->lock); if (self->input->videosrc) { GstDecklinkVideoSrc *videosrc = GST_DECKLINK_VIDEO_SRC_CAST (gst_object_ref (self->input->videosrc)); + if (videosrc->drop_no_signal_frames && no_signal) { + g_mutex_unlock (&self->input->lock); + return; + } + if (videosrc->first_time == GST_CLOCK_TIME_NONE) videosrc->first_time = packet_time; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index b259211..d6c0561 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -34,6 +34,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_decklink_video_src_debug); #define DEFAULT_BUFFER_SIZE (5) #define DEFAULT_OUTPUT_STREAM_TIME (FALSE) #define DEFAULT_SKIP_FIRST_TIME (0) +#define DEFAULT_DROP_NO_SIGNAL_FRAMES (FALSE) enum { @@ -45,7 +46,8 @@ enum PROP_VIDEO_FORMAT, PROP_TIMECODE_FORMAT, PROP_OUTPUT_STREAM_TIME, - PROP_SKIP_FIRST_TIME + PROP_SKIP_FIRST_TIME, + PROP_DROP_NO_SIGNAL_FRAMES }; typedef struct @@ -195,6 +197,12 @@ gst_decklink_video_src_class_init (GstDecklinkVideoSrcClass * klass) G_MAXUINT64, DEFAULT_SKIP_FIRST_TIME, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_DROP_NO_SIGNAL_FRAMES, + g_param_spec_boolean ("drop-no-signal-frames", "Drop No Signal Frames", + "Drop frames that are marked as having no input signal", + DEFAULT_DROP_NO_SIGNAL_FRAMES, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + templ_caps = gst_decklink_mode_get_template_caps (); gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, templ_caps)); @@ -222,6 +230,7 @@ gst_decklink_video_src_init (GstDecklinkVideoSrc * self) self->no_signal = FALSE; self->output_stream_time = DEFAULT_OUTPUT_STREAM_TIME; self->skip_first_time = DEFAULT_SKIP_FIRST_TIME; + self->drop_no_signal_frames = DEFAULT_DROP_NO_SIGNAL_FRAMES; self->window_size = 64; self->times = g_new (GstClockTime, 4 * self->window_size); @@ -293,6 +302,9 @@ gst_decklink_video_src_set_property (GObject * object, guint property_id, case PROP_SKIP_FIRST_TIME: self->skip_first_time = g_value_get_uint64 (value); break; + case PROP_DROP_NO_SIGNAL_FRAMES: + self->drop_no_signal_frames = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -331,6 +343,9 @@ gst_decklink_video_src_get_property (GObject * object, guint property_id, case PROP_SKIP_FIRST_TIME: g_value_set_uint64 (value, self->skip_first_time); break; + case PROP_DROP_NO_SIGNAL_FRAMES: + g_value_set_boolean (value, self->drop_no_signal_frames); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -594,8 +609,11 @@ gst_decklink_video_src_got_frame (GstElement * element, GST_LOG_OBJECT (self, "Got video frame at %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT " (%" - GST_TIME_FORMAT ")", GST_TIME_ARGS (capture_time), - GST_TIME_ARGS (stream_time), GST_TIME_ARGS (stream_duration)); + GST_TIME_FORMAT "), no signal: %d", GST_TIME_ARGS (capture_time), + GST_TIME_ARGS (stream_time), GST_TIME_ARGS (stream_duration), no_signal); + + if (self->drop_no_signal_frames && no_signal) + return; g_mutex_lock (&self->lock); if (self->first_time == GST_CLOCK_TIME_NONE) diff --git a/sys/decklink/gstdecklinkvideosrc.h b/sys/decklink/gstdecklinkvideosrc.h index 3292796..77db2b0 100644 --- a/sys/decklink/gstdecklinkvideosrc.h +++ b/sys/decklink/gstdecklinkvideosrc.h @@ -57,6 +57,7 @@ struct _GstDecklinkVideoSrc gint device_number; gboolean output_stream_time; GstClockTime skip_first_time; + gboolean drop_no_signal_frames; GstVideoInfo info; GstDecklinkVideoFormat video_format; -- 2.7.4