memory: provide a mem_map_full that takes the GstMapInfo

Follow up of 7130230ddb

Provide the memory implementation the GstMapInfo that will be used to
map/unmap the memory.  This allows the memory implementation to use
some scratch space in GstMapInfo to e.g. track different map/unmap
behaviour or store extra implementation defined data about the map
in use.

https://bugzilla.gnome.org/show_bug.cgi?id=750319
This commit is contained in:
Matthew Waters 2015-06-04 00:03:16 +10:00
parent faf05a4194
commit d61ba38118
4 changed files with 34 additions and 10 deletions

View file

@ -1456,7 +1456,9 @@ GstMapInfo
GST_MAP_INFO_INIT
GstMemoryMapFunction
GstMemoryMapFullFunction
GstMemoryUnmapFunction
GstMemoryUnmapFullFunction
GstMemoryCopyFunction
GstMemoryShareFunction
GstMemoryIsSpanFunction

View file

@ -97,6 +97,8 @@ typedef enum {
* @mem_copy: the implementation of the GstMemoryCopyFunction
* @mem_share: the implementation of the GstMemoryShareFunction
* @mem_is_span: the implementation of the GstMemoryIsSpanFunction
* @mem_map_full: the implementation of the GstMemoryMapFullFunction.
* Will be used instead of @mem_map if present. Since 1.6
* @mem_unmap_full: the implementation of the GstMemoryUnmapFullFunction.
* Will be used instead of @mem_unmap if present. Since 1.6
*
@ -116,10 +118,11 @@ struct _GstAllocator
GstMemoryShareFunction mem_share;
GstMemoryIsSpanFunction mem_is_span;
GstMemoryMapFullFunction mem_map_full;
GstMemoryUnmapFullFunction mem_unmap_full;
/*< private >*/
gpointer _gst_reserved[GST_PADDING - 1];
gpointer _gst_reserved[GST_PADDING - 2];
GstAllocatorPrivate *priv;
};

View file

@ -294,15 +294,19 @@ gst_memory_map (GstMemory * mem, GstMapInfo * info, GstMapFlags flags)
if (!gst_memory_lock (mem, (GstLockFlags) flags))
goto lock_failed;
info->data = mem->allocator->mem_map (mem, mem->maxsize, flags);
info->flags = flags;
info->memory = mem;
info->size = mem->size;
info->maxsize = mem->maxsize - mem->offset;
if (mem->allocator->mem_map_full)
info->data = mem->allocator->mem_map_full (mem, info, mem->maxsize);
else
info->data = mem->allocator->mem_map (mem, mem->maxsize, flags);
if (G_UNLIKELY (info->data == NULL))
goto error;
info->memory = mem;
info->flags = flags;
info->size = mem->size;
info->maxsize = mem->maxsize - mem->offset;
info->data = info->data + mem->offset;
return TRUE;
@ -339,7 +343,7 @@ gst_memory_unmap (GstMemory * mem, GstMapInfo * info)
g_return_if_fail (info->memory == mem);
if (mem->allocator->mem_unmap_full)
mem->allocator->mem_unmap_full (mem, info->flags);
mem->allocator->mem_unmap_full (mem, info);
else
mem->allocator->mem_unmap (mem);
gst_memory_unlock (mem, (GstLockFlags) info->flags);

View file

@ -232,6 +232,21 @@ typedef struct {
*/
typedef gpointer (*GstMemoryMapFunction) (GstMemory *mem, gsize maxsize, GstMapFlags flags);
/**
* GstMemoryMapFullFunction:
* @mem: a #GstMemory
* @info: the #GstMapInfo to map with
* @maxsize: size to map
*
* Get the memory of @mem that can be accessed according to the mode specified
* in @info's flags. The function should return a pointer that contains at least
* @maxsize bytes.
*
* Returns: a pointer to memory of which at least @maxsize bytes can be
* accessed according to the access pattern in @info's flags.
*/
typedef gpointer (*GstMemoryMapFullFunction) (GstMemory *mem, GstMapInfo * info, gsize maxsize);
/**
* GstMemoryUnmapFunction:
* @mem: a #GstMemory
@ -243,11 +258,11 @@ typedef void (*GstMemoryUnmapFunction) (GstMemory *mem);
/**
* GstMemoryUnmapFullFunction:
* @mem: a #GstMemory
* @flags: a #GstMapFlags
* @info: a #GstMapInfo
*
* Return the pointer previously retrieved with gst_memory_map() with @flags.
* Return the pointer previously retrieved with gst_memory_map() with @info.
*/
typedef void (*GstMemoryUnmapFullFunction) (GstMemory *mem, GstMapFlags flags);
typedef void (*GstMemoryUnmapFullFunction) (GstMemory *mem, GstMapInfo * info);
/**
* GstMemoryCopyFunction: