summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivia Nikolaidou <vivia@ahiru.eu>2015-12-17 17:26:29 +0200
committerSebastian Dröge <sebastian@centricular.com>2015-12-18 16:08:02 +0100
commitfafc8e564c59141c6f3bafa104f81bd6b56f1a46 (patch)
tree8c96e9c5f85abc3bb3cec2cc1d310c1f4fd65956
parent40d0c1aec0cd6ba6cc137fb906d701a75cd52dcd (diff)
downloadgstreamer-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
-rw-r--r--sys/decklink/gstdecklink.cpp18
-rw-r--r--sys/decklink/gstdecklink.h2
-rw-r--r--sys/decklink/gstdecklinkaudiosrc.cpp3
-rw-r--r--sys/decklink/gstdecklinkvideosink.cpp18
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);