audioaggregator: fix filtered getcaps

In the situation described in
https://bugzilla.gnome.org/show_bug.cgi?id=795397,

downstream_caps consists of two structures, the first with
the preferred rate, if at all possible (44100), the second
containing the full range of allowed rates, as audioresample
correctly tries to negotiate passthrough caps.

As audioaggregator cannot perform rate conversion, it wants
to return a fixated rate in its getcaps implementation,
however it previously directly used the first structure in
the caps allowed downstream, without taking the filter into
consideration, to determine the rate to fixate to.

With this, we first intersect our downstream caps with the
filter, in order not to fixate to an unsupported rate.
This commit is contained in:
Mathieu Duponchelle 2018-04-23 16:32:41 +02:00
parent cc3942e673
commit 83939c81e7

View file

@ -650,6 +650,18 @@ gst_audio_aggregator_sink_getcaps (GstPad * pad, GstAggregator * agg,
sink_template_caps = gst_caps_make_writable (sink_template_caps);
s = gst_caps_get_structure (sink_template_caps, 0);
/* We will then use the rate in the first structure as the expected
* rate, we want to make sure only the compatible structures remain
* in downstream_caps
*/
if (downstream_caps && filter) {
GstCaps *tmp = gst_caps_intersect_full (downstream_caps, filter,
GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (downstream_caps);
downstream_caps = tmp;
}
if (downstream_caps && !gst_caps_is_empty (downstream_caps))
s2 = gst_caps_get_structure (downstream_caps, 0);
else