videometa: Implement copying of GstVideoGLTextureUploadMeta
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 29 Mar 2013 15:37:01 +0000 (16:37 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 29 Mar 2013 15:37:01 +0000 (16:37 +0100)
gst-libs/gst/video/gstvideometa.c
gst-libs/gst/video/gstvideometa.h

index b36b67a..a330245 100644 (file)
@@ -399,8 +399,36 @@ gst_video_gl_texture_upload_meta_free (GstMeta * meta, GstBuffer * buffer)
 {
   GstVideoGLTextureUploadMeta *vmeta = (GstVideoGLTextureUploadMeta *) meta;
 
-  if (vmeta->destroy_notify)
-    vmeta->destroy_notify (vmeta->user_data);
+  if (vmeta->user_data_free)
+    vmeta->user_data_free (vmeta->user_data);
+}
+
+static gboolean
+gst_video_gl_texture_upload_meta_transform (GstBuffer * dest, GstMeta * meta,
+    GstBuffer * buffer, GQuark type, gpointer data)
+{
+  GstVideoGLTextureUploadMeta *dmeta, *smeta;
+
+  smeta = (GstVideoGLTextureUploadMeta *) meta;
+
+  if (GST_META_TRANSFORM_IS_COPY (type)) {
+    GstMetaTransformCopy *copy = data;
+
+    if (!copy->region) {
+      /* only copy if the complete data is copied as well */
+      dmeta =
+          (GstVideoGLTextureUploadMeta *) gst_buffer_add_meta (dest,
+          GST_VIDEO_GL_TEXTURE_UPLOAD_META_INFO, NULL);
+      dmeta->buffer = dest;
+      dmeta->upload = smeta->upload;
+      dmeta->user_data = smeta->user_data;
+      dmeta->user_data_copy = smeta->user_data_copy;
+      dmeta->user_data_free = smeta->user_data_free;
+      if (dmeta->user_data_copy)
+        dmeta->user_data = dmeta->user_data_copy (dmeta->user_data);
+    }
+  }
+  return TRUE;
 }
 
 const GstMetaInfo *
@@ -415,7 +443,7 @@ gst_video_gl_texture_upload_meta_get_info (void)
         sizeof (GstVideoGLTextureUploadMeta),
         NULL,
         gst_video_gl_texture_upload_meta_free,
-        NULL);
+        gst_video_gl_texture_upload_meta_transform);
     g_once_init_leave (&info, meta);
   }
   return info;
@@ -440,7 +468,7 @@ gst_video_gl_texture_upload_meta_get_info (void)
 GstVideoGLTextureUploadMeta *
 gst_buffer_add_video_gl_texture_upload_meta (GstBuffer * buffer,
     GstVideoGLTextureUpload upload, gpointer user_data,
-    GDestroyNotify destroy_notify)
+    GBoxedCopyFunc user_data_copy, GBoxedFreeFunc user_data_free)
 {
   GstVideoGLTextureUploadMeta *meta;
 
@@ -454,7 +482,8 @@ gst_buffer_add_video_gl_texture_upload_meta (GstBuffer * buffer,
   meta->buffer = buffer;
   meta->upload = upload;
   meta->user_data = user_data;
-  meta->destroy_notify = destroy_notify;
+  meta->user_data_copy = user_data_copy;
+  meta->user_data_free = user_data_free;
 
   return meta;
 }
index 5485c48..21b4a72 100644 (file)
@@ -165,11 +165,12 @@ struct _GstVideoGLTextureUploadMeta {
   GstVideoGLTextureUpload upload;
 
   gpointer      user_data;
-  GDestroyNotify destroy_notify;
+  GBoxedCopyFunc user_data_copy;
+  GBoxedFreeFunc user_data_free;
 };
 
 #define gst_buffer_get_video_gl_texture_upload_meta(b) ((GstVideoGLTextureUploadMeta*)gst_buffer_get_meta((b),GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE))
-GstVideoGLTextureUploadMeta * gst_buffer_add_video_gl_texture_upload_meta (GstBuffer *buffer, GstVideoGLTextureUpload upload, gpointer user_data, GDestroyNotify destroy_notify);
+GstVideoGLTextureUploadMeta * gst_buffer_add_video_gl_texture_upload_meta (GstBuffer *buffer, GstVideoGLTextureUpload upload, gpointer user_data, GBoxedCopyFunc copy_user_data, GBoxedFreeFunc free_user_data);
 gboolean gst_video_gl_texture_upload_meta_upload (GstVideoGLTextureUploadMeta *meta, guint format, guint texture_id);
 
 GType gst_video_gl_texture_upload_meta_api_get_type (void);