buffer: Don't copy "memory" metas unconditionally
authorSebastian Dröge <sebastian@centricular.com>
Wed, 1 Jul 2015 08:36:36 +0000 (10:36 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 1 Jul 2015 08:37:37 +0000 (10:37 +0200)
Don't copy memory metas if we only copied part of the buffer, didn't
copy memories or merged memories. In all these cases the memory
structure has changed and the memory meta becomes meaningless.

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

gst/gstbuffer.c

index f86df33ab567841b83aaaa931f61a89c785130fc..56b190a4bbce06e8c47107fc85d8972334d96079 100644 (file)
@@ -534,7 +534,17 @@ gst_buffer_copy_into (GstBuffer * dest, GstBuffer * src,
       GstMeta *meta = &walk->meta;
       const GstMetaInfo *info = meta->info;
 
-      if (info->transform_func) {
+      /* Don't copy memory metas if we only copied part of the buffer, didn't
+       * copy memories or merged memories. In all these cases the memory
+       * structure has changed and the memory meta becomes meaningless.
+       */
+      if ((region || !(flags & GST_BUFFER_COPY_MEMORY)
+              || (flags & GST_BUFFER_COPY_MERGE))
+          && gst_meta_api_type_has_tag (info->api, _gst_meta_tag_memory)) {
+        GST_CAT_DEBUG (GST_CAT_BUFFER,
+            "don't copy memory meta %p of API type %s", meta,
+            g_type_name (info->api));
+      } else if (info->transform_func) {
         GstMetaTransformCopy copy_data;
 
         copy_data.region = region;