Commit bced52d2 authored by Mathieu Duponchelle's avatar Mathieu Duponchelle 🐸 Committed by Sebastian Dröge

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.
parent 4d5d7bf1
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment