From 71a70e78f676f614bc10d5189e026987bfd0c5fa Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 3 Jul 2013 14:13:00 +1000 Subject: [PATCH] [763/906] memory: copy properly depending on where the most recent data is --- gst-libs/gst/gl/gstglmemory.c | 39 ++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/gst-libs/gst/gl/gstglmemory.c b/gst-libs/gst/gl/gstglmemory.c index e83299488e..0cdf8e5629 100644 --- a/gst-libs/gst/gl/gstglmemory.c +++ b/gst-libs/gst/gl/gstglmemory.c @@ -22,6 +22,8 @@ #include "config.h" #endif +#include + #include #include "gstglmemory.h" @@ -281,24 +283,33 @@ _gl_mem_copy (GstGLMemory * src, gssize offset, gssize size) GstGLMemory *dest; GstGLMemoryCopyParams copy_params; - copy_params = (GstGLMemoryCopyParams) { - src, 0,}; + if (GST_GL_MEMORY_FLAG_IS_SET (src, GST_GL_MEMORY_FLAG_NEED_UPLOAD)) { + dest = _gl_mem_new (src->mem.allocator, NULL, src->display, src->v_format, + src->width, src->height, NULL, NULL); + dest->data = g_malloc (src->mem.maxsize); + memcpy (dest->data, src->data, src->mem.maxsize); + GST_GL_MEMORY_FLAG_SET (dest, GST_GL_MEMORY_FLAG_NEED_UPLOAD); + } else { + copy_params = (GstGLMemoryCopyParams) { + src, 0,}; - gst_gl_display_thread_add (src->display, _gl_mem_copy_thread, ©_params); + gst_gl_display_thread_add (src->display, _gl_mem_copy_thread, ©_params); - dest = g_slice_alloc (sizeof (GstGLMemory)); - _gl_mem_init (dest, src->mem.allocator, NULL, src->display, src->v_format, - src->width, src->height, NULL, NULL); + dest = g_slice_alloc (sizeof (GstGLMemory)); + _gl_mem_init (dest, src->mem.allocator, NULL, src->display, src->v_format, + src->width, src->height, NULL, NULL); - if (!copy_params.tex_id) - GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory"); + if (!copy_params.tex_id) + GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory"); - dest->tex_id = copy_params.tex_id; - dest->data = g_malloc (src->mem.maxsize); - if (dest->data == NULL) { - GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory"); - gst_memory_unref ((GstMemory *) dest); - return NULL; + dest->tex_id = copy_params.tex_id; + dest->data = g_malloc (src->mem.maxsize); + if (dest->data == NULL) { + GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory"); + gst_memory_unref ((GstMemory *) dest); + return NULL; + } + GST_GL_MEMORY_FLAG_SET (dest, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD); } GST_CAT_DEBUG (GST_CAT_GL_MEMORY, "copied texture:%u into texture %u",