From: Mathieu Duponchelle Date: Mon, 12 Mar 2018 15:23:02 +0000 (+0100) Subject: audioaggregator: fix channel-mask negotiation X-Git-Tag: 1.19.3~511^2~1808 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e9be107e4a134b5ea6d722332fb3df900b27d481;p=platform%2Fupstream%2Fgstreamer.git audioaggregator: fix channel-mask negotiation When outputting more than two channels, a channel-mask has to be specified in the output caps. We follow the same heuristic as other cases, when downstream does not specify a channel-mask, we use that of the first configured pad, and if there was none we generate a fallback mask. https://bugzilla.gnome.org/show_bug.cgi?id=794257 --- diff --git a/gst-libs/gst/audio/gstaudioaggregator.c b/gst-libs/gst/audio/gstaudioaggregator.c index 02d4128..e75b8e5 100644 --- a/gst-libs/gst/audio/gstaudioaggregator.c +++ b/gst-libs/gst/audio/gstaudioaggregator.c @@ -773,6 +773,7 @@ gst_audio_aggregator_fixate_src_caps (GstAggregator * agg, GstCaps * caps) GstCaps *first_configured_caps = gst_audio_info_to_caps (&first_configured_pad->info); gint first_configured_rate, first_configured_channels; + gint channels; caps = gst_caps_make_writable (caps); s = gst_caps_get_structure (caps, 0); @@ -789,6 +790,18 @@ gst_audio_aggregator_fixate_src_caps (GstAggregator * agg, GstCaps * caps) gst_structure_fixate_field_nearest_int (s, "channels", first_configured_channels); + gst_structure_get_int (s, "channels", &channels); + + if (!gst_structure_has_field (s, "channel-mask") && channels > 2) { + guint64 mask; + + if (!gst_structure_get (s2, "channel-mask", GST_TYPE_BITMASK, &mask, + NULL)) { + mask = gst_audio_channel_get_fallback_mask (channels); + } + gst_structure_set (s, "channel-mask", GST_TYPE_BITMASK, mask, NULL); + } + gst_caps_unref (first_configured_caps); gst_object_unref (first_configured_pad); }