From 5d78c5cca6532ce1e3593a9dbcc14f38700ff9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Wed, 1 Apr 2015 20:32:41 -0400 Subject: [PATCH] audiomixer: Allow downstream caps with a non-default channel-mask Instead of failing, take the downstream channel mask if the channel count is 1. --- gst/audiomixer/gstaudiomixer.c | 28 +++++++++++++++++++++++++++- tests/check/elements/audiomixer.c | 3 ++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/gst/audiomixer/gstaudiomixer.c b/gst/audiomixer/gstaudiomixer.c index 40ede84346..f0e8f66ebc 100644 --- a/gst/audiomixer/gstaudiomixer.c +++ b/gst/audiomixer/gstaudiomixer.c @@ -350,11 +350,12 @@ static gboolean gst_audiomixer_setcaps (GstAudioMixer * audiomixer, GstPad * pad, GstCaps * orig_caps) { + GstAggregator *agg = GST_AGGREGATOR (audiomixer); GstAudioAggregator *aagg = GST_AUDIO_AGGREGATOR (audiomixer); GstCaps *caps; GstAudioInfo info; GstStructure *s; - gint channels; + gint channels = 0; gboolean ret; caps = gst_caps_copy (orig_caps); @@ -367,6 +368,31 @@ gst_audiomixer_setcaps (GstAudioMixer * audiomixer, GstPad * pad, if (!gst_audio_info_from_caps (&info, caps)) goto invalid_format; + if (channels == 1) { + GstCaps *filter; + GstCaps *downstream_caps; + + if (audiomixer->filter_caps) + filter = gst_caps_intersect_full (caps, audiomixer->filter_caps, + GST_CAPS_INTERSECT_FIRST); + else + filter = gst_caps_ref (caps); + + downstream_caps = gst_pad_peer_query_caps (agg->srcpad, filter); + gst_caps_unref (filter); + + if (downstream_caps) { + gst_caps_unref (caps); + caps = downstream_caps; + + if (gst_caps_is_empty (caps)) { + gst_caps_unref (caps); + return FALSE; + } + caps = gst_caps_fixate (caps); + } + } + GST_OBJECT_LOCK (audiomixer); /* don't allow reconfiguration for now; there's still a race between the * different upstream threads doing query_caps + accept_caps + sending diff --git a/tests/check/elements/audiomixer.c b/tests/check/elements/audiomixer.c index d758e75eea..b6235dce0c 100644 --- a/tests/check/elements/audiomixer.c +++ b/tests/check/elements/audiomixer.c @@ -89,7 +89,8 @@ GST_START_TEST (test_filter_caps) filter_caps = gst_caps_new_simple ("audio/x-raw", "format", G_TYPE_STRING, GST_AUDIO_NE (F32), "layout", G_TYPE_STRING, "interleaved", - "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 1, NULL); + "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 1, + "channel-mask", GST_TYPE_BITMASK, 0x04, NULL); /* build pipeline */ pipeline = gst_pipeline_new ("pipeline");