glmixer: fix caps leak in gst_gl_mixer_pad_sink_getcaps()
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 15 Apr 2015 13:22:37 +0000 (15:22 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:59 +0000 (19:31 +0000)
Caps refcounting was all wrong in this function. Rewrote it and add some
comments to make it clearer.

Fix caps leaks with the
validate.file.glvideomixer.simple.play_15s.synchronized scenario.

https://bugzilla.gnome.org/show_bug.cgi?id=747915

Signed-off-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
ext/gl/gstglmixer.c

index ab667a8..96d6e2a 100644 (file)
@@ -213,27 +213,27 @@ gst_gl_mixer_pad_sink_getcaps (GstPad * pad, GstGLMixer * mix, GstCaps * filter)
   GstCaps *template_caps;
   GstCaps *filtered_caps;
   GstCaps *returned_caps;
-  gboolean had_current_caps = TRUE;
 
   template_caps = gst_pad_get_pad_template_caps (pad);
 
   sinkcaps = gst_pad_get_current_caps (pad);
   if (sinkcaps == NULL) {
-    had_current_caps = FALSE;
-    sinkcaps = template_caps;
+    sinkcaps = gst_caps_ref (template_caps);
   } else {
-    sinkcaps = gst_caps_merge (sinkcaps, template_caps);
+    sinkcaps = gst_caps_merge (sinkcaps, gst_caps_ref (template_caps));
   }
 
-  filtered_caps = sinkcaps;
-  if (filter)
+  if (filter) {
     filtered_caps = gst_caps_intersect (sinkcaps, filter);
+    gst_caps_unref (sinkcaps);
+  } else {
+    filtered_caps = sinkcaps;   /* pass ownership */
+  }
+
   returned_caps = gst_caps_intersect (filtered_caps, template_caps);
 
-  if (filter)
-    gst_caps_unref (filtered_caps);
-  if (had_current_caps)
-    gst_caps_unref (template_caps);
+  gst_caps_unref (template_caps);
+  gst_caps_unref (filtered_caps);
 
   GST_DEBUG_OBJECT (pad, "returning %" GST_PTR_FORMAT, returned_caps);