diff options
author | Vivia Nikolaidou <vivia@ahiru.eu> | 2015-12-17 17:26:29 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-12-18 16:08:02 +0100 |
commit | fafc8e564c59141c6f3bafa104f81bd6b56f1a46 (patch) | |
tree | 8c96e9c5f85abc3bb3cec2cc1d310c1f4fd65956 /sys | |
parent | 40d0c1aec0cd6ba6cc137fb906d701a75cd52dcd (diff) | |
download | gstreamer-plugins-bad-fafc8e564c59141c6f3bafa104f81bd6b56f1a46.tar.gz |
decklinkvideosink: Made "auto" mode work according to caps
When the mode of decklinkvideosink is set to "auto", the sink claims to
support the full set of caps that it can support for all modes. Then, every
time new caps are set, the sink will automatically find the correct mode for
these caps and set it.
Caveat: We have no way to know whether a specific mode will actually work for
your hardware. Therefore, if you try sending 4K video to a 1080 screen, it
will silently fail, we have no way to know that in advance. Manually setting
that mode at least gave the user a way to double-check what they are doing.
https://bugzilla.gnome.org/show_bug.cgi?id=759600
Diffstat (limited to 'sys')
-rw-r--r-- | sys/decklink/gstdecklink.cpp | 18 | ||||
-rw-r--r-- | sys/decklink/gstdecklink.h | 2 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkaudiosrc.cpp | 3 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosink.cpp | 18 |
4 files changed, 36 insertions, 5 deletions
diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index eb39bdb46..c0d1128b0 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -358,6 +358,24 @@ gst_decklink_mode_get_template_caps (void) return caps; } +const GstDecklinkMode * +gst_decklink_find_mode_for_caps (GstCaps * caps) +{ + int i; + GstCaps *mode_caps; + + for (i = 1; i < (int) G_N_ELEMENTS (modes); i++) { + mode_caps = gst_decklink_mode_get_caps ((GstDecklinkModeEnum) i); + if (gst_caps_can_intersect (caps, mode_caps)) { + gst_caps_unref (mode_caps); + return gst_decklink_get_mode ((GstDecklinkModeEnum) i); + } + gst_caps_unref (mode_caps); + } + + return NULL; +} + #define GST_TYPE_DECKLINK_CLOCK \ (gst_decklink_clock_get_type()) #define GST_DECKLINK_CLOCK(obj) \ diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h index 353769faa..493b48e5c 100644 --- a/sys/decklink/gstdecklink.h +++ b/sys/decklink/gstdecklink.h @@ -192,4 +192,6 @@ GstClock * gst_decklink_output_get_audio_clock (GstDecklinkOutput * out GstDecklinkInput * gst_decklink_acquire_nth_input (gint n, GstElement * src, gboolean is_audio); void gst_decklink_release_nth_input (gint n, GstElement * src, gboolean is_audio); +const GstDecklinkMode * gst_decklink_find_mode_for_caps (GstCaps * caps); + #endif diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp index a9284d193..e5ac8ae12 100644 --- a/sys/decklink/gstdecklinkaudiosrc.cpp +++ b/sys/decklink/gstdecklinkaudiosrc.cpp @@ -688,8 +688,7 @@ 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_foreach (&self->current_packets, (GFunc) capture_packet_free, NULL); g_queue_clear (&self->current_packets); if (self->input && self->input->audio_enabled) { diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index c50d09ba0..7111cb1c5 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -292,8 +292,17 @@ gst_decklink_video_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) self->output->output->SetScheduledFrameCompletionCallback (new GStreamerVideoOutputCallback (self)); - mode = gst_decklink_get_mode (self->mode); - g_assert (mode != NULL); + if (self->mode == GST_DECKLINK_MODE_AUTO) { + mode = gst_decklink_find_mode_for_caps (caps); + if (mode == NULL) { + GST_WARNING_OBJECT (self, + "Failed to find compatible mode for caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + } else { + mode = gst_decklink_get_mode (self->mode); + g_assert (mode != NULL); + }; ret = self->output->output->EnableVideoOutput (mode->mode, bmdVideoOutputFlagDefault); @@ -318,7 +327,10 @@ gst_decklink_video_sink_get_caps (GstBaseSink * bsink, GstCaps * filter) GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink); GstCaps *mode_caps, *caps; - mode_caps = gst_decklink_mode_get_caps (self->mode); + if (self->mode == GST_DECKLINK_MODE_AUTO) + mode_caps = gst_decklink_mode_get_template_caps (); + else + mode_caps = gst_decklink_mode_get_caps (self->mode); mode_caps = gst_caps_make_writable (mode_caps); /* For output we support any framerate and only really care about timestamps */ gst_caps_map_in_place (mode_caps, reset_framerate, NULL); |