/** * gst_memory_unmap: * @mem: a #GstMemory * @info: a #GstMapInfo * * Release the memory obtained with gst_memory_map() */ void gst_memory_unmap (GstMemory * mem, GstMapInfo * info) { g_return_if_fail (mem != NULL); g_return_if_fail (info != NULL); g_return_if_fail (info->memory == mem); mem->allocator->mem_unmap (mem); gst_memory_unlock (mem, (GstLockFlags) info->flags); }
static void _gst_memory_free (GstMemory * mem) { GST_CAT_DEBUG (GST_CAT_MEMORY, "free memory %p", mem); if (mem->parent) { gst_memory_unlock (mem->parent, GST_LOCK_FLAG_EXCLUSIVE); gst_memory_unref (mem->parent); } gst_allocator_free (mem->allocator, mem); }
/** * gst_memory_map: * @mem: a #GstMemory * @info: (out): pointer for info * @flags: mapping flags * * Fill @info with the pointer and sizes of the memory in @mem that can be * accessed according to @flags. * * This function can return %FALSE for various reasons: * - the memory backed by @mem is not accessible with the given @flags. * - the memory was already mapped with a different mapping. * * @info and its contents remain valid for as long as @mem is valid and * until gst_memory_unmap() is called. * * For each gst_memory_map() call, a corresponding gst_memory_unmap() call * should be done. * * Returns: %TRUE if the map operation was successful. */ gboolean gst_memory_map (GstMemory * mem, GstMapInfo * info, GstMapFlags flags) { g_return_val_if_fail (mem != NULL, FALSE); g_return_val_if_fail (info != NULL, FALSE); if (!gst_memory_lock (mem, (GstLockFlags) flags)) goto lock_failed; 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; /* ERRORS */ lock_failed: { GST_CAT_DEBUG (GST_CAT_MEMORY, "mem %p: lock %d failed", mem, flags); memset (info, 0, sizeof (GstMapInfo)); return FALSE; } error: { /* something went wrong, restore the orginal state again */ GST_CAT_ERROR (GST_CAT_MEMORY, "mem %p: subclass map failed", mem); gst_memory_unlock (mem, (GstLockFlags) flags); memset (info, 0, sizeof (GstMapInfo)); return FALSE; } }