From c7ddead74bb889d70ea0cf92d56ebc57d4876d3e Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 8 Aug 2012 16:08:40 +1000 Subject: [PATCH] [554/906] GstGLMemory: update for GstAllocator API changes --- gst-libs/gst/gl/gstglmemory.c | 115 +++++++++++++++++++-------------- gst-libs/gst/gl/gstglmemory.h | 26 +++++++- tests/check/libs/gstglmemory.c | 2 +- 3 files changed, 90 insertions(+), 53 deletions(-) diff --git a/gst-libs/gst/gl/gstglmemory.c b/gst-libs/gst/gl/gstglmemory.c index 4016827809..a701fadd8f 100644 --- a/gst-libs/gst/gl/gstglmemory.c +++ b/gst-libs/gst/gl/gstglmemory.c @@ -76,38 +76,18 @@ _gl_mem_new (GstAllocator * allocator, GstMemory * parent, return mem; } -GstMemory * -_gl_allocator_alloc_func (GstAllocator * allocator, gsize size, - GstAllocationParams * params, gpointer user_data) -{ - g_warning ("use gst_gl_memory_alloc () to allocate from this " - "GstGLMemory allocator"); - - return NULL; -} - gpointer -_gl_mem_map_func (GstGLMemory * gl_mem, gsize maxsize, GstMapFlags flags) +_gl_mem_map (GstGLMemory * gl_mem, gsize maxsize, GstMapFlags flags) { /* should we perform a {up,down}load? */ return NULL; } void -_gl_mem_unmap_func (GstGLMemory * gl_mem) +_gl_mem_unmap (GstGLMemory * gl_mem) { } -void -_gl_mem_free_func (GstGLMemory * gl_mem) -{ - gst_gl_display_del_texture (gl_mem->display, &gl_mem->tex_id); - - g_object_unref (gl_mem->display); - - g_slice_free (GstGLMemory, gl_mem); -} - void _gl_mem_copy_thread (GstGLDisplay * display, gpointer data) { @@ -128,7 +108,6 @@ _gl_mem_copy_thread (GstGLDisplay * display, gpointer data) gl_format = src->gl_format; if (!GLEW_EXT_framebuffer_object) { - //turn off the pipeline because Frame buffer object is a not present gst_gl_display_set_error (display, "Context, EXT_framebuffer_object not supported"); return; @@ -197,7 +176,7 @@ _gl_mem_copy_thread (GstGLDisplay * display, gpointer data) break; default: - GST_ERROR ("General FBO error"); + GST_ERROR ("Unknown FBO error"); } goto fbo_error; } @@ -215,6 +194,9 @@ _gl_mem_copy_thread (GstGLDisplay * display, gpointer data) copy_params->tex_id = tex_id; + return; + +/* ERRORS */ fbo_error: { glDeleteRenderbuffers (1, &rboId); @@ -225,7 +207,7 @@ fbo_error: } GstMemory * -_gl_mem_copy_func (GstGLMemory * src, gssize offset, gssize size) +_gl_mem_copy (GstGLMemory * src, gssize offset, gssize size) { GstGLMemory *dest; GstGLMemoryCopyParams copy_params; @@ -250,27 +232,41 @@ _gl_mem_copy_func (GstGLMemory * src, gssize offset, gssize size) GstGLMemory * gst_gl_memory_copy (GstGLMemory * src) { - return (GstGLMemory *) _gl_mem_copy_func (src, 0, 0); + return (GstGLMemory *) _gl_mem_copy (src, 0, 0); } GstMemory * -_gl_mem_share_func (GstGLMemory * mem, gssize offset, gssize size) +_gl_mem_share (GstGLMemory * mem, gssize offset, gssize size) { return NULL; } gboolean -_gl_mem_is_span_func (GstGLMemory * mem1, GstGLMemory * mem2, gsize * offset) +_gl_mem_is_span (GstGLMemory * mem1, GstGLMemory * mem2, gsize * offset) { return FALSE; } -static void -_gl_mem_destroy_free (GstMiniObject * allocator) +GstMemory * +_gl_mem_alloc (GstAllocator * allocator, gsize size, + GstAllocationParams * params) { - GST_LOG ("GLTexture memory allocator freed"); + g_warning ("use gst_gl_memory_alloc () to allocate from this " + "GstGLMemory allocator"); - g_slice_free (GstAllocator, (GstAllocator *) allocator); + return NULL; +} + +void +_gl_mem_free (GstAllocator * allocator, GstMemory * mem) +{ + GstGLMemory *gl_mem = (GstGLMemory *) mem; + + gst_gl_display_del_texture (gl_mem->display, &gl_mem->tex_id); + + g_object_unref (gl_mem->display); + + g_slice_free (GstGLMemory, gl_mem); } /** @@ -291,35 +287,54 @@ gst_gl_memory_alloc (GstGLDisplay * display, GstVideoFormat format, height); } +G_DEFINE_TYPE (GstGLAllocator, gst_gl_allocator, GST_TYPE_ALLOCATOR); + +static void +gst_gl_allocator_class_init (GstGLAllocatorClass * klass) +{ + GstAllocatorClass *allocator_class; + + allocator_class = (GstAllocatorClass *) klass; + + allocator_class->alloc = _gl_mem_alloc; + allocator_class->free = _gl_mem_free; +} + +static void +gst_gl_allocator_init (GstGLAllocator * allocator) +{ + GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); + + alloc->mem_type = GST_GL_MEMORY_ALLOCATOR; + alloc->mem_map = (GstMemoryMapFunction) _gl_mem_map; + alloc->mem_unmap = (GstMemoryUnmapFunction) _gl_mem_unmap; + alloc->mem_copy = (GstMemoryCopyFunction) _gl_mem_copy; + alloc->mem_share = (GstMemoryShareFunction) _gl_mem_share; + alloc->mem_is_span = (GstMemoryIsSpanFunction) _gl_mem_is_span; +} + /** * gst_gl_memory_init: * - * Initializes the GL Memory allocator. It is safe to call this function multiple times - * - * Returns: a #GstAllocator + * Initializes the GL Memory allocator. It is safe to call this function + * multiple times. This must be called before any other GstGLMemory operation. */ void gst_gl_memory_init (void) { static volatile gsize _init = 0; - static const GstMemoryInfo mem_info = { - GST_GL_MEMORY_ALLOCATOR, - (GstAllocatorAllocFunction) _gl_allocator_alloc_func, - (GstMemoryMapFunction) _gl_mem_map_func, - (GstMemoryUnmapFunction) _gl_mem_unmap_func, - (GstMemoryFreeFunction) _gl_mem_free_func, - (GstMemoryCopyFunction) _gl_mem_copy_func, - (GstMemoryShareFunction) _gl_mem_share_func, - (GstMemoryIsSpanFunction) _gl_mem_is_span_func, - }; if (g_once_init_enter (&_init)) { - _gl_allocator = g_slice_new (GstAllocator); - gst_allocator_init (_gl_allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC, - &mem_info, _gl_mem_destroy_free); - gst_allocator_register (GST_GL_MEMORY_ALLOCATOR, - gst_allocator_ref (_gl_allocator)); + _gl_allocator = g_object_new (gst_gl_allocator_get_type (), NULL); + gst_allocator_register (GST_GL_MEMORY_ALLOCATOR, + gst_object_ref (_gl_allocator)); g_once_init_leave (&_init, 1); } } + +gboolean +gst_is_gl_memory (GstMemory * mem) +{ + return mem->allocator == _gl_allocator; +} diff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h index 2d52d62564..5761fe1516 100644 --- a/gst-libs/gst/gl/gstglmemory.h +++ b/gst-libs/gst/gl/gstglmemory.h @@ -23,16 +23,26 @@ #include #include +#include #include "gstgldisplay.h" G_BEGIN_DECLS -#define GST_TYPE_GL_MEMORY (gst_gl_memory_get_type()) -GType gst_gl_memory_get_type(void); +#define GST_TYPE_GL_ALLOCATOR (gst_gl_allocator_get_type()) +GType gst_gl_allocator_get_type(void); + +#define GST_IS_GL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_ALLOCATOR)) +#define GST_IS_GL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_ALLOCATOR)) +#define GST_GL_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_ALLOCATOR, GstGLAllocatorClass)) +#define GST_GL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_ALLOCATOR, GstGLAllocator)) +#define GST_GL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_ALLOCATOR, GstGLAllocatorClass)) +#define GST_GL_ALLOCATOR_CAST(obj) ((GstGLAllocator *)(obj)) typedef struct _GstGLMemoryInitParams GstGLMemoryInitParams; typedef struct _GstGLMemory GstGLMemory; +typedef struct _GstGLAllocator GstGLAllocator; +typedef struct _GstGLAllocatorClass GstGLAllocatorClass; /** * GstGLMemory: @@ -64,6 +74,18 @@ void gst_gl_memory_init (void); GstMemory * gst_gl_memory_alloc (GstGLDisplay * display, GstVideoFormat format, gsize width, gsize height); +gboolean gst_is_gl_memory (GstMemory * mem); + +struct _GstGLAllocator +{ + GstAllocator parent; +}; + +struct _GstGLAllocatorClass +{ + GstAllocatorClass parent_class; +}; + G_END_DECLS #endif /* _GST_GL_MEMORY_H_ */ diff --git a/tests/check/libs/gstglmemory.c b/tests/check/libs/gstglmemory.c index fb98990a5f..a5acb07946 100644 --- a/tests/check/libs/gstglmemory.c +++ b/tests/check/libs/gstglmemory.c @@ -102,7 +102,7 @@ GST_START_TEST (test_basic) gst_memory_unref (mem); gst_memory_unref (mem2); - gst_allocator_unref (gl_allocator); + gst_object_unref (gl_allocator); } }