From 60c765174f02a16eab0480c6c9971c3edfbeeed9 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Mon, 2 May 2016 14:21:55 -0300 Subject: [PATCH] opusdec: intersect with the filter before returning on getcaps So upstream gets a smaller set to decide upon as it is what it requested with the filter https://bugzilla.gnome.org/show_bug.cgi?id=765684 --- ext/opus/gstopusdec.c | 23 +++++++++++++++-------- tests/check/elements/opus.c | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ext/opus/gstopusdec.c b/ext/opus/gstopusdec.c index aa53ff3320..d403fcc280 100644 --- a/ext/opus/gstopusdec.c +++ b/ext/opus/gstopusdec.c @@ -903,20 +903,27 @@ gst_opus_dec_caps_extend_rate_options (GstCaps * caps) GstCaps * gst_opus_dec_getcaps (GstAudioDecoder * dec, GstCaps * filter) { - GstCaps *caps; + GstCaps *caps, *proxy_filter = NULL, *ret; if (filter) { - filter = gst_caps_copy (filter); - gst_opus_dec_caps_extend_channels_options (filter); - gst_opus_dec_caps_extend_rate_options (filter); + proxy_filter = gst_caps_copy (filter); + gst_opus_dec_caps_extend_channels_options (proxy_filter); + gst_opus_dec_caps_extend_rate_options (proxy_filter); } - caps = gst_audio_decoder_proxy_getcaps (dec, NULL, filter); - if (filter) - gst_caps_unref (filter); + caps = gst_audio_decoder_proxy_getcaps (dec, NULL, proxy_filter); + if (proxy_filter) + gst_caps_unref (proxy_filter); if (caps) { caps = gst_caps_make_writable (caps); gst_opus_dec_caps_extend_channels_options (caps); gst_opus_dec_caps_extend_rate_options (caps); } - return caps; + + if (filter) { + ret = gst_caps_intersect (caps, filter); + gst_caps_unref (caps); + } else { + ret = caps; + } + return ret; } diff --git a/tests/check/elements/opus.c b/tests/check/elements/opus.c index 0fe1041c35..5b04bb2112 100644 --- a/tests/check/elements/opus.c +++ b/tests/check/elements/opus.c @@ -402,6 +402,20 @@ GST_START_TEST (test_opusdec_getcaps) "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)[1,2]"); run_getcaps_check_from_strings (NULL, "audio/x-raw, channels=(int)5000", "EMPTY"); + + /* Now add filters */ + + /* Formats not acceptable */ + run_getcaps_check_from_strings ("audio/x-opus, rate=(int)1000", NULL, + "EMPTY"); + run_getcaps_check_from_strings ("audio/x-opus, channels=(int)200", NULL, + "EMPTY"); + + /* Should restrict the result of the caps query to the selected rate/channels */ + run_getcaps_check_from_strings ("audio/x-opus, rate=(int)8000", NULL, + "audio/x-opus, rate=(int)8000, channels=(int)[1,8]"); + run_getcaps_check_from_strings ("audio/x-opus, channels=(int)2", NULL, + "audio/x-opus, rate=(int){48000, 24000, 16000, 12000, 8000}, channels=(int)2"); } GST_END_TEST;