glememory: only store and act on the map flags on first/last map/unmap
authorMatthew Waters <matthew@centricular.com>
Fri, 20 Feb 2015 07:42:23 +0000 (18:42 +1100)
committerMatthew Waters <matthew@centricular.com>
Fri, 20 Feb 2015 07:48:15 +0000 (18:48 +1100)
Anytime else, we have no idea how to match up map and unmaps.
We also don't know exactly how the calling code is using us.
Also fixes the case where we're trying to transfer while someone else
is accessing our data pointer or texture resulting in mismatched video
frames.

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

gst-libs/gst/gl/gstglmemory.c
gst-libs/gst/gl/gstglmemory.h

index a4dbb5c76ee1fb2064c075055e618e9296866136..e9e77915cd566912695556e3034367db2baed3d6 100644 (file)
@@ -859,7 +859,9 @@ _gl_mem_map (GstGLMemory * gl_mem, gsize maxsize, GstMapFlags flags)
     data = gl_mem->data;
   }
 
-  gl_mem->map_flags = flags;
+  /* only store the first map flags, subsequent maps must be a subset of this */
+  if (gl_mem->map_count++ == 0)
+    gl_mem->map_flags = flags;
 
   g_mutex_unlock (&gl_mem->lock);
 
@@ -882,13 +884,15 @@ _gl_mem_unmap (GstGLMemory * gl_mem)
 {
   g_mutex_lock (&gl_mem->lock);
 
-  if (gl_mem->map_flags & GST_MAP_WRITE) {
-    if (!(gl_mem->map_flags & GST_MAP_GL))
+  if (gl_mem->map_count <= 1 && gl_mem->map_flags & GST_MAP_WRITE) {
+    if (!(gl_mem->map_flags & GST_MAP_GL)) {
       gst_gl_context_thread_add (gl_mem->context,
           (GstGLContextThreadFunc) _transfer_upload, gl_mem);
+    }
   }
 
-  gl_mem->map_flags = 0;
+  if (--gl_mem->map_count <= 0)
+    gl_mem->map_flags = 0;
 
   g_mutex_unlock (&gl_mem->lock);
 }
index 7dad0aa2a9dd201e6b014d8a3606149517305b85..ec235775510b079dcaf04ca4e12a270e3390b974 100644 (file)
@@ -103,6 +103,7 @@ struct _GstGLMemory
   guint                 tex_width;
   guint                 transfer_pbo;
   GstMapFlags           map_flags;
+  guint                 map_count;
 
   GMutex                lock;
 };