applemedia: free videotexturecache texture in gl thread
authorNick Kallen <nickkallen@me.com>
Fri, 10 Feb 2017 10:32:23 +0000 (11:32 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Sun, 19 Feb 2017 10:52:20 +0000 (12:52 +0200)
The cached texture was treated as user_data passed to GstGLBaseMemory
and freed with a GDestroyNotify function. However, this data must
be treated specially: it must be destroyed in the GL thread.

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

sys/applemedia/iosglmemory.c
sys/applemedia/iosglmemory.h
sys/applemedia/videotexturecache.m

index 65507b485909b916560da7daaf1693947a49145e..ac753670a85cfa090ecd9e2d077db49717bf90c4 100644 (file)
@@ -42,6 +42,7 @@ _ios_gl_memory_destroy (GstGLBaseMemory * gl_mem)
 {
   GstIOSGLMemory *mem = (GstIOSGLMemory *) gl_mem;
 
+  CFRelease (mem->texture);
   gst_memory_unref (GST_MEMORY_CAST (mem->cv_mem));
   GST_GL_BASE_MEMORY_ALLOCATOR_CLASS
       (gst_ios_gl_memory_allocator_parent_class)->destroy (gl_mem);
@@ -134,8 +135,7 @@ _ios_gl_memory_new (GstGLContext * context,
     GstVideoGLTextureType tex_type,
     guint tex_id,
     GstVideoInfo * info,
-    guint plane,
-    GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
+    guint plane, GstVideoAlignment * valign, CVOpenGLESTextureRef texture)
 {
   GstIOSGLMemory *mem;
 
@@ -143,8 +143,9 @@ _ios_gl_memory_new (GstGLContext * context,
   mem->gl_mem.tex_id = tex_id;
   mem->gl_mem.texture_wrapped = TRUE;
   gst_gl_memory_init (&mem->gl_mem, _ios_gl_memory_allocator, NULL, context,
-      target, tex_type, NULL, info, plane, valign, user_data, notify);
+      target, tex_type, NULL, info, plane, valign, NULL, NULL);
   mem->cv_mem = cv_mem;
+  mem->texture = texture;
 
   GST_MINI_OBJECT_FLAG_SET (mem, GST_MEMORY_FLAG_READONLY);
 
@@ -158,9 +159,8 @@ gst_ios_gl_memory_new_wrapped (GstGLContext * context,
     GstVideoGLTextureType tex_type,
     guint tex_id,
     GstVideoInfo * info,
-    guint plane,
-    GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
+    guint plane, GstVideoAlignment * valign, CVOpenGLESTextureRef texture)
 {
   return _ios_gl_memory_new (context, cv_mem, target, tex_type, tex_id, info,
-      plane, valign, user_data, notify);
+      plane, valign, texture);
 }
index ae9816a0b272b51a3c851196ad3378f70f172f1d..f55d4fd3d085325388f97cf734bf03caa71d0e1d 100644 (file)
@@ -43,6 +43,7 @@ typedef struct _GstIOSGLMemory
 {
   GstGLMemory gl_mem;
   GstAppleCoreVideoMemory *cv_mem;
+  CVOpenGLESTextureRef texture;
 } GstIOSGLMemory;
 
 #define GST_IOS_GL_MEMORY_ALLOCATOR_NAME   "IOSGLMemory"
@@ -58,8 +59,7 @@ gst_ios_gl_memory_new_wrapped (GstGLContext * context,
     GstVideoInfo * info,
     guint plane,
     GstVideoAlignment *valign,
-    gpointer user_data,
-    GDestroyNotify notify);
+    CVOpenGLESTextureRef texture);
 
 gboolean gst_is_ios_gl_memory (GstMemory * mem);
 
index 8315a3bba044c1666d4c15c893f313c1a76a29aa..529a1033ec069ec26377f82fcd65c7df66330684 100644 (file)
@@ -157,7 +157,7 @@ _do_create_memory (GstGLContext * context, ContextThreadData * data)
             gl_target, GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
             CVOpenGLESTextureGetName (texture),
             &cache->input_info,
-            0, NULL, texture, (GDestroyNotify) CFRelease);
+            0, NULL, texture);
         break;
       case GST_VIDEO_FORMAT_NV12: {
         GstVideoGLTextureType textype;
@@ -181,7 +181,7 @@ _do_create_memory (GstGLContext * context, ContextThreadData * data)
         memory = gst_apple_core_video_memory_new_wrapped (gpixbuf, plane, size);
         gl_memory = gst_ios_gl_memory_new_wrapped (context, memory,
                 gl_target, textype, CVOpenGLESTextureGetName (texture), &cache->input_info,
-                plane, NULL, texture, (GDestroyNotify) CFRelease);
+                plane, NULL, texture);
         break;
       }
     default: