g_return_val_if_fail ((guint8 *) data >= mem->data
&& (guint8 *) data < mem->data + mem->maxsize, FALSE);
- if (size != -1) {
- /* check if resize happened or unmap was called with different data */
- if (mem->data + mem->offset != data) {
- /* adjust the size */
- size = (guint8 *) data - mem->data + size - mem->offset;
- }
+ if (mem->data + mem->offset != data)
+ mem->offset = (guint8 *) data - mem->data;
+ if (size != -1) {
g_return_val_if_fail (mem->offset + size <= mem->maxsize, FALSE);
mem->size = size;
}
* the memory to @size. @size can be set to -1 when the size should not be
* 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.
*/
gboolean
GST_START_TEST (test_map_resize)
{
GstMemory *mem;
- gsize size, maxsize;
+ gsize size, maxsize, maxalloc, offset;
gpointer data;
mem = gst_allocator_alloc (NULL, 100, 0);
fail_unless (size == 100);
/* 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 */
- gst_memory_unmap (mem, data, maxsize);
+ /* unmap the buffer with original pointer and size, should restore the offset
+ * 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);
}