-
-struct _GstMemoryImpl
-{
- GQuark name;
-
- GstMemoryInfo info;
-};
-
-/* default memory implementation */
-typedef struct
-{
- GstMemory mem;
- gsize slice_size;
- guint8 *data;
- GFreeFunc free_func;
- gsize maxsize;
- gsize offset;
- gsize size;
-} GstMemoryDefault;
-
-static const GstMemoryImpl *_default_mem_impl;
-static const GstMemoryImpl *_default_share_impl;
-
-/* initialize the fields */
-static void
-_default_mem_init (GstMemoryDefault * mem, GstMemoryFlags flags,
- GstMemory * parent, gsize slice_size, gpointer data,
- GFreeFunc free_func, gsize maxsize, gsize offset, gsize size)
-{
- mem->mem.impl = data ? _default_mem_impl : _default_share_impl;
- mem->mem.flags = flags;
- mem->mem.refcount = 1;
- mem->mem.parent = parent ? gst_memory_ref (parent) : NULL;
- mem->slice_size = slice_size;
- mem->data = data;
- mem->free_func = free_func;
- mem->maxsize = maxsize;
- mem->offset = offset;
- mem->size = size;
-}
-
-/* create a new memory block that manages the given memory */
-static GstMemoryDefault *
-_default_mem_new (GstMemoryFlags flags, GstMemory * parent, gpointer data,
- GFreeFunc free_func, gsize maxsize, gsize offset, gsize size)
-{
- GstMemoryDefault *mem;
- gsize slice_size;
-
- slice_size = sizeof (GstMemoryDefault);
-
- mem = g_slice_alloc (slice_size);
- _default_mem_init (mem, flags, parent, slice_size,
- data, free_func, maxsize, offset, size);
-
- return mem;
-}
-
-/* allocate the memory and structure in one block */
-static GstMemoryDefault *
-_default_mem_new_block (gsize maxsize, gsize align, gsize offset, gsize size)
-{
- GstMemoryDefault *mem;
- gsize aoffset, slice_size;
- guint8 *data;
-
- /* alloc header and data in one block */
- slice_size = sizeof (GstMemoryDefault) + maxsize + align;
-
- mem = g_slice_alloc (slice_size);
- if (mem == NULL)
- return NULL;
-
- data = (guint8 *) mem + sizeof (GstMemoryDefault);
-
- if ((aoffset = ((guintptr) data & align)))
- aoffset = align - aoffset;
-
- _default_mem_init (mem, 0, NULL, slice_size, data, NULL, maxsize + align,
- aoffset + offset, size);
-
- return mem;
-}
-
-static gsize
-_default_mem_get_sizes (GstMemoryDefault * mem, gsize * maxsize)
-{
- if (maxsize)
- *maxsize = mem->maxsize;
-
- return mem->size;
-}
-
-static void
-_default_mem_resize (GstMemoryDefault * mem, gsize offset, gsize size)
-{
- g_return_if_fail (size + mem->offset + offset <= mem->maxsize);
-
- mem->offset += offset;
- mem->size = size;
-}
-
-static gpointer
-_default_mem_map (GstMemoryDefault * mem, gsize * size, gsize * maxsize,
- GstMapFlags flags)
-{
- if (size)
- *size = mem->size;
- if (maxsize)
- *maxsize = mem->maxsize;
-
- return mem->data + mem->offset;
-}
-
-static gpointer
-_default_share_map (GstMemoryDefault * mem, gsize * size, gsize * maxsize,
- GstMapFlags flags)
-{
- guint8 *data;
-
- data = gst_memory_map (mem->mem.parent, size, maxsize, flags);
-
- if (size)
- *size = mem->size;
- if (maxsize)
- *maxsize -= mem->offset;
-
- return data + mem->offset;
-}
-
-static gboolean
-_default_mem_unmap (GstMemoryDefault * mem, gpointer data, gsize size)
-{
- if (size != -1)
- mem->size = size;
- return TRUE;
-}
-
-static gboolean
-_default_share_unmap (GstMemoryDefault * mem, gpointer data, gsize size)
-{
- gboolean res;
- guint8 *ptr = data;
-
- if (size != -1)
- mem->size = size;
- else
- size = mem->size - mem->offset;
-
- res =
- gst_memory_unmap (mem->mem.parent, ptr - mem->offset, size + mem->offset);
-
- return res;
-}
-
-static void
-_default_mem_free (GstMemoryDefault * mem)
-{
- if (mem->mem.parent)
- gst_memory_unref (mem->mem.parent);
-
- if (mem->free_func)
- mem->free_func (mem->data);
-
- g_slice_free1 (mem->slice_size, mem);
-}
-
-static GstMemoryDefault *
-_default_mem_copy (GstMemoryDefault * mem, gsize offset, gsize size)
-{
- GstMemoryDefault *copy;
-
- if (size == -1)
- size = mem->size > offset ? mem->size - offset : 0;
-
- copy = _default_mem_new_block (mem->maxsize, 0, mem->offset + offset, size);
- memcpy (copy->data, mem->data, mem->maxsize);
-
- return copy;
-}
-
-static GstMemoryDefault *
-_default_mem_share (GstMemoryDefault * mem, gsize offset, gsize size)
-{
- GstMemoryDefault *sub;
- GstMemory *parent;
-
- /* find the real parent */
- if ((parent = mem->mem.parent) == NULL)
- parent = (GstMemory *) mem;
-
- if (size == -1)
- size = mem->size - offset;
-
- sub = _default_mem_new (parent->flags, parent, mem->data, NULL, mem->maxsize,
- mem->offset + offset, size);
-
- return sub;
-}
-
-static gboolean
-_default_mem_is_span (GstMemoryDefault * mem1, GstMemoryDefault * mem2,
- gsize * offset)
-{
- if (offset)
- *offset = mem1->offset;
-
- /* and memory is contiguous */
- return mem1->data + mem1->offset + mem1->size == mem2->data + mem2->offset;
-}