From bced52d2e8618750e30398f3d03dbac2f3ef4fee Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Mon, 15 Jul 2019 16:08:34 +0200 Subject: [PATCH] audioaggregator: always use downstream's rate requirements 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 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gst-libs/gst/audio/gstaudioaggregator.c b/gst-libs/gst/audio/gstaudioaggregator.c index 1767782f0b..f5e73e004e 100644 --- a/gst-libs/gst/audio/gstaudioaggregator.c +++ b/gst-libs/gst/audio/gstaudioaggregator.c @@ -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);