audioaggregator: Fixate to some meaningful values if no sinkpad is configured yet
authorSebastian Dröge <sebastian@centricular.com>
Thu, 16 Aug 2018 14:54:00 +0000 (17:54 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 16 Aug 2018 15:00:24 +0000 (18:00 +0300)
The default caps fixation code would select a rate of 1 for example,
which is not really ideal.

gst-libs/gst/audio/gstaudioaggregator.c

index 79aa448d524f43369b2bd3788db6978e3783f87c..def43895d9a4f957b68c0577bd56503f37c319c8 100644 (file)
@@ -750,6 +750,8 @@ gst_audio_aggregator_fixate_src_caps (GstAggregator * agg, GstCaps * caps)
 
   first_configured_pad = gst_audio_aggregator_get_first_configured_pad (agg);
 
+  caps = gst_caps_make_writable (caps);
+
   if (first_configured_pad) {
     GstStructure *s, *s2;
     GstCaps *first_configured_caps =
@@ -757,7 +759,6 @@ gst_audio_aggregator_fixate_src_caps (GstAggregator * agg, GstCaps * caps)
     gint first_configured_rate, first_configured_channels;
     gint channels;
 
-    caps = gst_caps_make_writable (caps);
     s = gst_caps_get_structure (caps, 0);
     s2 = gst_caps_get_structure (first_configured_caps, 0);
 
@@ -786,6 +787,21 @@ gst_audio_aggregator_fixate_src_caps (GstAggregator * agg, GstCaps * caps)
 
     gst_caps_unref (first_configured_caps);
     gst_object_unref (first_configured_pad);
+  } else {
+    GstStructure *s;
+    gint channels;
+
+    s = gst_caps_get_structure (caps, 0);
+
+    gst_structure_fixate_field_nearest_int (s, "rate", GST_AUDIO_DEF_RATE);
+    gst_structure_fixate_field_string (s, "format", GST_AUDIO_NE ("S16"));
+    gst_structure_fixate_field_string (s, "layout", "interleaved");
+    gst_structure_fixate_field_nearest_int (s, "channels", 2);
+
+    if (gst_structure_get_int (s, "channels", &channels) && channels > 2) {
+      if (!gst_structure_has_field_typed (s, "channel-mask", GST_TYPE_BITMASK))
+        gst_structure_set (s, "channel-mask", GST_TYPE_BITMASK, 0ULL, NULL);
+    }
   }
 
   if (!gst_caps_is_fixed (caps))