memory: improve semantics of unmap

Make an unmap call with a different data pointer than the map call update the
offset field. This allows for both offset and size adjustements in the unmap
call.
This commit is contained in:
Wim Taymans 2012-01-06 06:43:08 +01:00
parent d483ff2db5
commit e4a58ec71e
2 changed files with 42 additions and 10 deletions

View file

@ -217,13 +217,10 @@ _default_mem_unmap (GstMemoryDefault * mem, gpointer data, gsize size)
g_return_val_if_fail ((guint8 *) data >= mem->data g_return_val_if_fail ((guint8 *) data >= mem->data
&& (guint8 *) data < mem->data + mem->maxsize, FALSE); && (guint8 *) data < mem->data + mem->maxsize, FALSE);
if (size != -1) { if (mem->data + mem->offset != data)
/* check if resize happened or unmap was called with different data */ mem->offset = (guint8 *) data - mem->data;
if (mem->data + mem->offset != data) {
/* adjust the size */
size = (guint8 *) data - mem->data + size - mem->offset;
}
if (size != -1) {
g_return_val_if_fail (mem->offset + size <= mem->maxsize, FALSE); g_return_val_if_fail (mem->offset + size <= mem->maxsize, FALSE);
mem->size = size; mem->size = size;
} }
@ -487,6 +484,9 @@ gst_memory_map (GstMemory * mem, gsize * size, gsize * maxsize,
* the memory to @size. @size can be set to -1 when the size should not be * the memory to @size. @size can be set to -1 when the size should not be
* updated. * updated.
* *
* It is possible to pass a different @data than that obtained from
* gst_memory_map() in which case the offset of @mem will be updated.
*
* Returns: TRUE when the memory was release successfully. * Returns: TRUE when the memory was release successfully.
*/ */
gboolean gboolean

View file

@ -479,7 +479,7 @@ GST_END_TEST;
GST_START_TEST (test_map_resize) GST_START_TEST (test_map_resize)
{ {
GstMemory *mem; GstMemory *mem;
gsize size, maxsize; gsize size, maxsize, maxalloc, offset;
gpointer data; gpointer data;
mem = gst_allocator_alloc (NULL, 100, 0); mem = gst_allocator_alloc (NULL, 100, 0);
@ -490,10 +490,42 @@ GST_START_TEST (test_map_resize)
fail_unless (size == 100); fail_unless (size == 100);
/* resize the buffer */ /* resize the buffer */
gst_memory_resize (mem, 1, maxsize - 1); gst_memory_resize (mem, 1, size - 1);
size = gst_memory_get_sizes (mem, &offset, &maxalloc);
fail_unless (size == 99);
fail_unless (offset == 1);
fail_unless (maxalloc >= 100);
/* unmap the buffer with original pointer and size */ /* unmap the buffer with original pointer and size, should restore the offset
gst_memory_unmap (mem, data, maxsize); * and size */
gst_memory_unmap (mem, data, 100);
size = gst_memory_get_sizes (mem, &offset, &maxalloc);
fail_unless (size == 100);
fail_unless (offset == 0);
fail_unless (maxalloc >= 100);
data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
fail_unless (data != NULL);
fail_unless (size == 100);
fail_unless (maxsize >= 100);
/* resize the buffer with unmap */
gst_memory_unmap (mem, (guint8 *) data + 1, 99);
size = gst_memory_get_sizes (mem, &offset, &maxalloc);
fail_unless (size == 99);
fail_unless (offset == 1);
fail_unless (maxalloc >= 100);
/* and larger */
data = gst_memory_map (mem, &size, &maxsize, GST_MAP_READ);
gst_memory_unmap (mem, (guint8 *) data - 1, 100);
size = gst_memory_get_sizes (mem, &offset, &maxalloc);
fail_unless (size == 100);
fail_unless (offset == 0);
fail_unless (maxalloc >= 100);
gst_memory_unref (mem); gst_memory_unref (mem);
} }