summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2018-03-12 16:23:02 +0100
committerMathieu Duponchelle <mathieu@centricular.com>2018-03-12 17:35:53 +0100
commite9be107e4a134b5ea6d722332fb3df900b27d481 (patch)
tree15458d8dc4b1abd420b4cb0a2844f56d925e3464
parent247b22ae1a1e5a0b4e9f1cc820852a1888f2c4eb (diff)
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
-rw-r--r--gst-libs/gst/audio/gstaudioaggregator.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gst-libs/gst/audio/gstaudioaggregator.c b/gst-libs/gst/audio/gstaudioaggregator.c
index 02d4128d8..e75b8e53e 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);
}