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");