audioaggregator: always use downstream's rate requirements
authorMathieu Duponchelle <mathieu@centricular.com>
Mon, 15 Jul 2019 14:08:34 +0000 (16:08 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 18 Jul 2019 05:43:14 +0000 (08:43 +0300)
We were previously only fixating the rate in the getcaps
implementation when downstream was requiring a discrete value,
causing negotiation to fail when upstream was capable of rate
conversion, but not made aware that it had to occur.

Instead of fixating the rate, we can simply update our sink
template caps with whatever GValue the downstream caps are holding
as their rate field.

Allows negotiation to successfully complete with pipelines such as:

audiotestsrc ! audio/x-raw, rate=48000 ! audioresample ! audiomixer name=m ! \
audio/x-raw, rate={800, 1000} ! autoaudiosink \
audiotestsrc ! audio/x-raw, rate=44100 ! audioresample ! m.

gst-libs/gst/audio/gstaudioaggregator.c

index 1767782..f5e73e0 100644 (file)
@@ -719,7 +719,6 @@ gst_audio_aggregator_sink_getcaps (GstPad * pad, GstAggregator * agg,
   GstCaps *downstream_caps = gst_pad_get_allowed_caps (agg->srcpad);
   GstCaps *sink_caps;
   GstStructure *s, *s2;
-  gint downstream_rate;
 
   sink_template_caps = gst_caps_make_writable (sink_template_caps);
   s = gst_caps_get_structure (sink_template_caps, 0);
@@ -741,8 +740,8 @@ gst_audio_aggregator_sink_getcaps (GstPad * pad, GstAggregator * agg,
   else
     s2 = NULL;
 
-  if (s2 && gst_structure_get_int (s2, "rate", &downstream_rate)) {
-    gst_structure_fixate_field_nearest_int (s, "rate", downstream_rate);
+  if (s2 && gst_structure_has_field (s2, "rate")) {
+    gst_structure_set_value (s, "rate", gst_structure_get_value (s2, "rate"));
   } else if (first_configured_pad) {
     gst_structure_fixate_field_nearest_int (s, "rate",
         first_configured_pad->info.rate);