/* * GStreamer * Copyright (C) 2015 Alessandro Decina * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "iosglmemory.h" GST_DEBUG_CATEGORY_STATIC (GST_CAT_IOS_GL_MEMORY); #define GST_CAT_DEFAULT GST_CAT_IOS_GL_MEMORY G_DEFINE_TYPE (GstIOSGLMemoryAllocator, gst_ios_gl_memory_allocator, GST_TYPE_GL_MEMORY_ALLOCATOR); typedef struct { GstIOSGLMemory *memory; } ContextThreadData; static GstAllocator *_ios_gl_memory_allocator; static void _ios_gl_memory_destroy (GstGLBaseMemory * gl_mem) { GstIOSGLMemory *mem = (GstIOSGLMemory *) gl_mem; mem->gl_notify (mem->gl_data); 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); } static gpointer _ios_gl_memory_allocator_map (GstGLBaseMemory * bmem, GstMapInfo * info, gsize size) { GstGLMemory *gl_mem = (GstGLMemory *) bmem; GstIOSGLMemory *mem = (GstIOSGLMemory *) gl_mem; if (info->flags & GST_MAP_GL) return &gl_mem->tex_id; return GST_MEMORY_CAST (mem->cv_mem)->allocator-> mem_map (GST_MEMORY_CAST (mem->cv_mem), size, info->flags); } static void _ios_gl_memory_allocator_unmap (GstGLBaseMemory * bmem, GstMapInfo * info) { GstIOSGLMemory *mem = (GstIOSGLMemory *) bmem; if (!(info->flags & GST_MAP_GL)) GST_MEMORY_CAST (mem->cv_mem)->allocator-> mem_unmap (GST_MEMORY_CAST (mem->cv_mem)); } static GstMemory * _mem_alloc (GstAllocator * allocator, gsize size, GstAllocationParams * params) { g_warning ("use gst_ios_gl_memory_new_wrapped () to allocate from this " "IOSGL allocator"); return NULL; } static void gst_ios_gl_memory_allocator_class_init (GstIOSGLMemoryAllocatorClass * klass) { GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass; GstGLBaseMemoryAllocatorClass *gl_base_allocator_class = (GstGLBaseMemoryAllocatorClass *) klass; allocator_class->alloc = _mem_alloc; gl_base_allocator_class->destroy = _ios_gl_memory_destroy; gl_base_allocator_class->map = _ios_gl_memory_allocator_map; gl_base_allocator_class->unmap = _ios_gl_memory_allocator_unmap; } static void gst_ios_gl_memory_allocator_init (GstIOSGLMemoryAllocator * allocator) { GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); alloc->mem_type = GST_IOS_GL_MEMORY_ALLOCATOR_NAME; GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); } void gst_ios_gl_memory_init (void) { static volatile gsize _init = 0; if (g_once_init_enter (&_init)) { GST_DEBUG_CATEGORY_INIT (GST_CAT_IOS_GL_MEMORY, "iosurface", 0, "IOSGL Buffer"); _ios_gl_memory_allocator = g_object_new (GST_TYPE_IOS_GL_MEMORY_ALLOCATOR, NULL); gst_allocator_register (GST_IOS_GL_MEMORY_ALLOCATOR_NAME, gst_object_ref (_ios_gl_memory_allocator)); g_once_init_leave (&_init, 1); } } gboolean gst_is_ios_gl_memory (GstMemory * mem) { return mem != NULL && mem->allocator != NULL && g_type_is_a (G_OBJECT_TYPE (mem->allocator), GST_TYPE_IOS_GL_MEMORY_ALLOCATOR); } static GstIOSGLMemory * _ios_gl_memory_new (GstGLContext * context, GstAppleCoreVideoMemory * cv_mem, GstGLTextureTarget target, GstVideoGLTextureType tex_type, guint tex_id, GstVideoInfo * info, guint plane, GstVideoAlignment * valign, gpointer gl_data, GDestroyNotify gl_notify) { GstIOSGLMemory *mem; mem = g_new0 (GstIOSGLMemory, 1); 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, NULL, NULL); mem->cv_mem = cv_mem; mem->gl_data = gl_data; mem->gl_notify = gl_notify; GST_MINI_OBJECT_FLAG_SET (mem, GST_MEMORY_FLAG_READONLY); return mem; } GstIOSGLMemory * gst_ios_gl_memory_new_wrapped (GstGLContext * context, GstAppleCoreVideoMemory * cv_mem, GstGLTextureTarget target, GstVideoGLTextureType tex_type, guint tex_id, GstVideoInfo * info, guint plane, GstVideoAlignment * valign, gpointer gl_data, GDestroyNotify gl_notify) { return _ios_gl_memory_new (context, cv_mem, target, tex_type, tex_id, info, plane, valign, gl_data, gl_notify); }