basetransform: Don't push out identical caps
authorEdward Hervey <edward@collabora.com>
Thu, 22 Aug 2013 17:01:32 +0000 (19:01 +0200)
committerEdward Hervey <edward@collabora.com>
Thu, 22 Aug 2013 17:06:47 +0000 (19:06 +0200)
This avoids triggering plenty of extra code/methods/overhead downstream when
we can just quickly check whenever we want to set caps whether they are
identical or not

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

libs/gst/base/gstbasetransform.c

index df672bf873f0f2f5ab0e119db70feee81176f808..83420dc0e62c4a5278f7d1a97ef70dcfa25f0623 100644 (file)
@@ -1298,7 +1298,7 @@ gst_base_transform_setcaps (GstBaseTransform * trans, GstPad * pad,
     GstCaps * incaps)
 {
   GstBaseTransformPrivate *priv = trans->priv;
-  GstCaps *outcaps;
+  GstCaps *outcaps, *prevcaps;
   gboolean ret = TRUE;
 
   GST_DEBUG_OBJECT (pad, "have new caps %p %" GST_PTR_FORMAT, incaps, incaps);
@@ -1321,8 +1321,14 @@ gst_base_transform_setcaps (GstBaseTransform * trans, GstPad * pad,
   if (!(ret = gst_base_transform_configure_caps (trans, incaps, outcaps)))
     goto failed_configure;
 
-  /* let downstream know about our caps */
-  ret = gst_pad_set_caps (trans->srcpad, outcaps);
+  prevcaps = gst_pad_get_current_caps (trans->srcpad);
+
+  if (!prevcaps || !gst_caps_is_equal (outcaps, prevcaps))
+    /* let downstream know about our caps */
+    ret = gst_pad_set_caps (trans->srcpad, outcaps);
+
+  if (prevcaps)
+    gst_caps_unref (prevcaps);
 
   if (ret) {
     /* try to get a pool when needed */