capsfilter: only set caps when different
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 5 Aug 2009 15:55:14 +0000 (17:55 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 6 Aug 2009 08:53:12 +0000 (10:53 +0200)
When we have an input buffer with caps and when those caps are different from
the caps we want, only then make a writable copy of the input buffer as the
output buffer and set the caps on that output buffer. This avoids some cases
where we took a subbuffer for setting caps that were the same.

plugins/elements/gstcapsfilter.c

index 9d7a81a..71048e8 100644 (file)
@@ -306,14 +306,23 @@ gst_capsfilter_prepare_buf (GstBaseTransform * trans, GstBuffer * input,
     /* FIXME : Move this behaviour to basetransform. The given caps are the ones
      * of the source pad, therefore our outgoing buffers should always have
      * those caps. */
-    if (gst_buffer_is_metadata_writable (input)) {
+    if (GST_BUFFER_CAPS (input) != caps) {
+      /* caps are different, make a metadata writable output buffer to set
+       * caps */
+      if (gst_buffer_is_metadata_writable (input)) {
+        /* input is writable, just set caps and use this as the output */
+        *buf = input;
+        gst_buffer_set_caps (*buf, caps);
+        gst_buffer_ref (input);
+      } else {
+        GST_DEBUG_OBJECT (trans, "Creating sub-buffer and setting caps");
+        *buf = gst_buffer_create_sub (input, 0, GST_BUFFER_SIZE (input));
+        gst_buffer_set_caps (*buf, caps);
+      }
+    } else {
+      /* caps are right, just use a ref of the input as the outbuf */
       *buf = input;
-      gst_buffer_set_caps (*buf, caps);
       gst_buffer_ref (input);
-    } else {
-      GST_DEBUG_OBJECT (trans, "Creating sub-buffer and setting caps");
-      *buf = gst_buffer_create_sub (input, 0, GST_BUFFER_SIZE (input));
-      gst_buffer_set_caps (*buf, caps);
     }
   } else {
     /* Buffer has no caps. See if the output pad only supports fixed caps */