opusdec: intersect with the filter before returning on getcaps
authorThiago Santos <thiagoss@osg.samsung.com>
Mon, 2 May 2016 17:21:55 +0000 (14:21 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Mon, 2 May 2016 17:29:25 +0000 (14:29 -0300)
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
tests/check/elements/opus.c

index aa53ff3..d403fcc 100644 (file)
@@ -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;
 }
index 0fe1041..5b04bb2 100644 (file)
@@ -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;