audioaggregator: fix channel-mask negotiation
authorMathieu Duponchelle <mathieu@centricular.com>
Mon, 12 Mar 2018 15:23:02 +0000 (16:23 +0100)
committerMathieu Duponchelle <mathieu@centricular.com>
Mon, 12 Mar 2018 16:35:53 +0000 (17:35 +0100)
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

gst-libs/gst/audio/gstaudioaggregator.c

index 02d4128..e75b8e5 100644 (file)
@@ -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);
   }