diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2012-06-14 16:30:12 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2012-06-14 16:34:28 +0200 |
commit | a1c5b00e72cb75c198d1533d6ab0cfe58ce66274 (patch) | |
tree | 7ee3560635af49d56d55d7609fc8c6ada4605d3f /gst | |
parent | ec8ac0bb1642b2d63759bfda94e4e2a0eebad967 (diff) |
memory: make GstMemory a miniobject
Diffstat (limited to 'gst')
-rw-r--r-- | gst/gstbuffer.c | 6 | ||||
-rw-r--r-- | gst/gstmemory.c | 112 | ||||
-rw-r--r-- | gst/gstmemory.h | 65 |
3 files changed, 82 insertions, 101 deletions
diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index b9783c57b..37d4bf89e 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -214,7 +214,7 @@ _get_merged_memory (GstBuffer * buffer, guint idx, guint length) if (G_UNLIKELY (_is_span (mem + idx, length, &poffset, &parent))) { - if (parent->flags & GST_MEMORY_FLAG_NO_SHARE) { + if (GST_MEMORY_IS_NO_SHARE (parent)) { GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy for merge %p", parent); result = gst_memory_copy (parent, poffset, size); } else { @@ -402,7 +402,7 @@ gst_buffer_copy_into (GstBuffer * dest, GstBuffer * src, gsize tocopy; tocopy = MIN (bsize - skip, left); - if (mem->flags & GST_MEMORY_FLAG_NO_SHARE) { + if (GST_MEMORY_IS_NO_SHARE (mem)) { /* no share, always copy then */ mem = gst_memory_copy (mem, skip, tocopy); skip = 0; @@ -1118,7 +1118,7 @@ gst_buffer_resize_range (GstBuffer * buffer, guint idx, gint length, } else { GstMemory *tmp; - if (mem->flags & GST_MEMORY_FLAG_NO_SHARE) + if (GST_MEMORY_IS_NO_SHARE (mem)) tmp = gst_memory_copy (mem, offset, left); else tmp = gst_memory_share (mem, offset, left); diff --git a/gst/gstmemory.c b/gst/gstmemory.c index 03a97ce81..4bc467413 100644 --- a/gst/gstmemory.c +++ b/gst/gstmemory.c @@ -71,14 +71,7 @@ #include "gst_private.h" #include "gstmemory.h" -#ifndef GST_DISABLE_TRACE -#include "gsttrace.h" -static GstAllocTrace *_gst_memory_trace; -static GstAllocTrace *_gst_allocator_trace; -#endif - -G_DEFINE_BOXED_TYPE (GstMemory, gst_memory, (GBoxedCopyFunc) gst_memory_ref, - (GBoxedFreeFunc) gst_memory_unref); +GST_DEFINE_MINI_OBJECT_TYPE (GstMemory, gst_memory); GST_DEFINE_MINI_OBJECT_TYPE (GstAllocator, gst_allocator); @@ -112,7 +105,6 @@ struct _GstAllocator typedef struct { GstMemory mem; - gsize slice_size; guint8 *data; gpointer user_data; GDestroyNotify notify; @@ -124,6 +116,20 @@ static GstAllocator *_default_allocator; /* our predefined allocators */ static GstAllocator *_default_mem_impl; +static GstMemory * +_gst_memory_copy (GstMemory * mem) +{ + return gst_memory_copy (mem, 0, -1); +} + +static void +_gst_memory_free (GstMemory * mem) +{ + /* there should be no outstanding mappings */ + g_return_if_fail (g_atomic_int_get (&mem->state) < 4); + mem->allocator->info.mem_free (mem); +} + /* initialize the fields */ static void _default_mem_init (GstMemoryDefault * mem, GstMemoryFlags flags, @@ -131,16 +137,21 @@ _default_mem_init (GstMemoryDefault * mem, GstMemoryFlags flags, gsize maxsize, gsize offset, gsize size, gsize align, gpointer user_data, GDestroyNotify notify) { + gst_mini_object_init (GST_MINI_OBJECT_CAST (mem), GST_TYPE_MEMORY, + slice_size); + + mem->mem.mini_object.copy = (GstMiniObjectCopyFunction) _gst_memory_copy; + mem->mem.mini_object.dispose = NULL; + mem->mem.mini_object.free = (GstMiniObjectFreeFunction) _gst_memory_free; + mem->mem.mini_object.flags = flags; + mem->mem.allocator = _default_mem_impl; - mem->mem.flags = flags; - mem->mem.refcount = 1; mem->mem.parent = parent ? gst_memory_ref (parent) : NULL; mem->mem.state = (flags & GST_MEMORY_FLAG_READONLY ? 0x1 : 0); mem->mem.maxsize = maxsize; mem->mem.align = align; mem->mem.offset = offset; mem->mem.size = size; - mem->slice_size = slice_size; mem->data = data; mem->user_data = user_data; mem->notify = notify; @@ -243,7 +254,7 @@ _default_mem_free (GstMemoryDefault * mem) if (mem->notify) mem->notify (mem->user_data); - g_slice_free1 (mem->slice_size, mem); + g_slice_free1 (GST_MINI_OBJECT_SIZE (mem), mem); } static GstMemoryDefault * @@ -279,7 +290,7 @@ _default_mem_share (GstMemoryDefault * mem, gssize offset, gsize size) size = mem->mem.size - offset; sub = - _default_mem_new (parent->flags, parent, mem->data, + _default_mem_new (GST_MINI_OBJECT_FLAGS (parent), parent, mem->data, mem->mem.maxsize, mem->mem.offset + offset, size, mem->mem.align, NULL, NULL); @@ -363,11 +374,6 @@ _priv_gst_memory_initialize (void) (GstMemoryIsSpanFunction) _default_mem_is_span, }; -#ifndef GST_DISABLE_TRACE - _gst_memory_trace = _gst_alloc_trace_register ("GstMemory", -1); - _gst_allocator_trace = _gst_alloc_trace_register ("GstAllocator", -1); -#endif - g_rw_lock_init (&lock); allocators = g_hash_table_new (g_str_hash, g_str_equal); @@ -418,61 +424,10 @@ gst_memory_new_wrapped (GstMemoryFlags flags, gpointer data, _default_mem_new (flags, NULL, data, maxsize, offset, size, 0, user_data, notify); -#ifndef GST_DISABLE_TRACE - _gst_alloc_trace_new (_gst_memory_trace, mem); -#endif - return (GstMemory *) mem; } /** - * gst_memory_ref: - * @mem: a #GstMemory - * - * Increases the refcount of @mem. - * - * Returns: @mem with increased refcount - */ -GstMemory * -gst_memory_ref (GstMemory * mem) -{ - g_return_val_if_fail (mem != NULL, NULL); - - GST_CAT_TRACE (GST_CAT_MEMORY, "memory %p, %d->%d", mem, mem->refcount, - mem->refcount + 1); - - g_atomic_int_inc (&mem->refcount); - - return mem; -} - -/** - * gst_memory_unref: - * @mem: a #GstMemory - * - * Decreases the refcount of @mem. When the refcount reaches 0, the free - * function of @mem will be called. - */ -void -gst_memory_unref (GstMemory * mem) -{ - g_return_if_fail (mem != NULL); - g_return_if_fail (mem->allocator != NULL); - - GST_CAT_TRACE (GST_CAT_MEMORY, "memory %p, %d->%d", mem, mem->refcount, - mem->refcount - 1); - - if (g_atomic_int_dec_and_test (&mem->refcount)) { - /* there should be no outstanding mappings */ - g_return_if_fail (g_atomic_int_get (&mem->state) < 4); -#ifndef GST_DISABLE_TRACE - _gst_alloc_trace_free (_gst_memory_trace, mem); -#endif - mem->allocator->info.mem_free (mem); - } -} - -/** * gst_memory_is_exclusive: * @mem: a #GstMemory * @@ -484,7 +439,7 @@ gst_memory_is_exclusive (GstMemory * mem) { g_return_val_if_fail (mem != NULL, FALSE); - return (g_atomic_int_get (&mem->refcount) == 1); + return GST_MINI_OBJECT_REFCOUNT_VALUE (mem) == 1; } /** @@ -737,10 +692,6 @@ gst_memory_copy (GstMemory * mem, gssize offset, gssize size) copy = mem->allocator->info.mem_copy (mem, offset, size); -#ifndef GST_DISABLE_TRACE - _gst_alloc_trace_new (_gst_memory_trace, copy); -#endif - return copy; } @@ -768,10 +719,6 @@ gst_memory_share (GstMemory * mem, gssize offset, gssize size) shared = mem->allocator->info.mem_share (mem, offset, size); -#ifndef GST_DISABLE_TRACE - _gst_alloc_trace_new (_gst_memory_trace, shared); -#endif - return shared; } @@ -855,10 +802,10 @@ gst_allocator_new (const GstMemoryInfo * info, gpointer user_data, g_return_val_if_fail (info->mem_free != NULL, NULL); g_return_val_if_fail (info->mem_share != NULL, NULL); - allocator = g_slice_new (GstAllocator); + allocator = g_slice_new0 (GstAllocator); gst_mini_object_init (GST_MINI_OBJECT_CAST (allocator), - gst_allocator_get_type (), sizeof (GstAllocator)); + GST_TYPE_ALLOCATOR, sizeof (GstAllocator)); allocator->mini_object.copy = (GstMiniObjectCopyFunction) _gst_allocator_copy; allocator->mini_object.free = (GstMiniObjectFreeFunction) _gst_allocator_free; @@ -1057,8 +1004,5 @@ gst_allocator_alloc (GstAllocator * allocator, gsize size, mem = allocator->info.alloc (allocator, size, params, allocator->user_data); -#ifndef GST_DISABLE_TRACE - _gst_alloc_trace_new (_gst_memory_trace, mem); -#endif return mem; } diff --git a/gst/gstmemory.h b/gst/gstmemory.h index 701249d1f..73fe663e4 100644 --- a/gst/gstmemory.h +++ b/gst/gstmemory.h @@ -66,12 +66,12 @@ GST_EXPORT gsize gst_memory_alignment; * Flags for wrapped memory. */ typedef enum { - GST_MEMORY_FLAG_READONLY = (1 << 0), - GST_MEMORY_FLAG_NO_SHARE = (1 << 1), - GST_MEMORY_FLAG_ZERO_PREFIXED = (1 << 2), - GST_MEMORY_FLAG_ZERO_PADDED = (1 << 3), + GST_MEMORY_FLAG_READONLY = (GST_MINI_OBJECT_FLAG_LAST << 0), + GST_MEMORY_FLAG_NO_SHARE = (GST_MINI_OBJECT_FLAG_LAST << 1), + GST_MEMORY_FLAG_ZERO_PREFIXED = (GST_MINI_OBJECT_FLAG_LAST << 2), + GST_MEMORY_FLAG_ZERO_PADDED = (GST_MINI_OBJECT_FLAG_LAST << 3), - GST_MEMORY_FLAG_LAST = (1 << 16) + GST_MEMORY_FLAG_LAST = (GST_MINI_OBJECT_FLAG_LAST << 16) } GstMemoryFlags; /** @@ -80,7 +80,7 @@ typedef enum { * * A flags word containing #GstMemoryFlags flags set on @mem */ -#define GST_MEMORY_FLAGS(mem) (GST_MEMORY_CAST (mem)->flags) +#define GST_MEMORY_FLAGS(mem) GST_MINI_OBJECT_FLAGS (mem) /** * GST_MEMORY_FLAG_IS_SET: * @mem: a #GstMemory. @@ -88,7 +88,7 @@ typedef enum { * * Gives the status of a specific flag on a @mem. */ -#define GST_MEMORY_FLAG_IS_SET(mem,flag) !!(GST_MEMORY_FLAGS (mem) & (flag)) +#define GST_MEMORY_FLAG_IS_SET(mem,flag) GST_MINI_OBJECT_FLAG_IS_SET (mem,flag) /** * GST_MEMORY_FLAG_UNSET: * @mem: a #GstMemory. @@ -96,7 +96,7 @@ typedef enum { * * Clear a specific flag on a @mem. */ -#define GST_MEMORY_FLAG_UNSET(mem,flag) (GST_MEMORY_FLAGS (mem) &= ~(flag)) +#define GST_MEMORY_FLAG_UNSET(mem,flag) GST_MINI_OBJECT_FLAG_UNSET (mem, flag) /** * GST_MEMORY_IS_READONLY: @@ -106,6 +106,13 @@ typedef enum { */ #define GST_MEMORY_IS_READONLY(mem) GST_MEMORY_FLAG_IS_SET(mem,GST_MEMORY_FLAG_READONLY) /** + * GST_MEMORY_IS_NO_SHARE: + * @mem: a #GstMemory. + * + * Check if @mem cannot be shared between buffers + */ +#define GST_MEMORY_IS_NO_SHARE(mem) GST_MEMORY_FLAG_IS_SET(mem,GST_MEMORY_FLAG_NO_SHARE) +/** * GST_MEMORY_IS_ZERO_PREFIXED: * @mem: a #GstMemory. * @@ -123,9 +130,8 @@ typedef enum { /** * GstMemory: + * @mini_object: parent structure * @allocator: pointer to the #GstAllocator - * @flags: memory flags - * @refcount: refcount * @parent: parent memory block * @state: private state * @maxsize: the maximum size allocated @@ -137,10 +143,10 @@ typedef enum { * as the first member of their structure. */ struct _GstMemory { + GstMiniObject mini_object; + GstAllocator *allocator; - GstMemoryFlags flags; - gint refcount; GstMemory *parent; volatile gint state; gsize maxsize; @@ -421,8 +427,39 @@ GstMemory * gst_memory_new_wrapped (GstMemoryFlags flags, gpointer data, gsi GDestroyNotify notify); /* refcounting */ -GstMemory * gst_memory_ref (GstMemory *mem); -void gst_memory_unref (GstMemory *mem); +/** + * gst_memory_ref: + * @memory: The memory to refcount + * + * Increase the refcount of this memory. + * + * Returns: (transfer full): @memory (for convenience when doing assignments) + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC GstMemory * gst_memory_ref (GstMemory * memory); +#endif + +static inline GstMemory * +gst_memory_ref (GstMemory * memory) +{ + return (GstMemory *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (memory)); +} + +/** + * gst_memory_unref: + * @memory: (transfer full): the memory to refcount + * + * Decrease the refcount of an memory, freeing it if the refcount reaches 0. + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC void gst_memory_unref (GstMemory * memory); +#endif + +static inline void +gst_memory_unref (GstMemory * memory) +{ + gst_mini_object_unref (GST_MINI_OBJECT_CAST (memory)); +} gboolean gst_memory_is_exclusive (GstMemory *mem); |