From 6c51a80f6f3b92780e3f7882d4216b1a06f6f93b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 13 Feb 2012 17:07:25 +0100 Subject: [PATCH] videometa: adjust for memory api change --- gst-libs/gst/video/gstvideometa.c | 56 ++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/gst-libs/gst/video/gstvideometa.c b/gst-libs/gst/video/gstvideometa.c index fe40031..eef6128 100644 --- a/gst-libs/gst/video/gstvideometa.c +++ b/gst-libs/gst/video/gstvideometa.c @@ -164,27 +164,48 @@ gst_buffer_add_video_meta_full (GstBuffer * buffer, GstVideoFlags flags, return meta; } -static GstMemory * -find_mem_for_offset (GstBuffer * buffer, guint * offset, GstMapFlags flags) +static gboolean +map_mem_for_offset (GstBuffer * buffer, guint * offset, GstMapInfo * info, + GstMapFlags flags) { guint n, i; - GstMemory *res = NULL; - n = gst_buffer_n_memory (buffer); + if ((n = gst_buffer_n_memory (buffer)) == 0) + goto no_memory; + for (i = 0; i < n; i++) { GstMemory *mem = NULL; gsize size; - mem = gst_buffer_peek_memory (buffer, i, flags); + mem = gst_buffer_get_memory (buffer, i); size = gst_memory_get_sizes (mem, NULL, NULL); if (*offset < size) { - res = mem; + GstMemory *mapped; + + if (!(mapped = gst_memory_make_mapped (mem, info, flags))) + goto cannot_map; + + if (mapped != mem && (flags & GST_MAP_WRITE)) + gst_buffer_replace_memory (buffer, i, gst_memory_ref (mapped)); break; } *offset -= size; + gst_memory_unref (mem); + } + return TRUE; + + /* ERRORS */ +no_memory: + { + GST_DEBUG ("no memory"); + return FALSE; + } +cannot_map: + { + GST_DEBUG ("cannot map memory"); + return FALSE; } - return res; } /** @@ -207,7 +228,6 @@ gst_video_meta_map (GstVideoMeta * meta, guint plane, GstMapInfo * info, guint offset; gboolean write, res; GstBuffer *buffer; - GstMemory *mem; g_return_val_if_fail (meta != NULL, FALSE); g_return_val_if_fail (plane < meta->n_planes, FALSE); @@ -224,14 +244,13 @@ gst_video_meta_map (GstVideoMeta * meta, guint plane, GstMapInfo * info, *stride = meta->stride[plane]; /* find the memory block for this plane, this is the memory block containing * the plane offset */ - mem = find_mem_for_offset (buffer, &offset, flags); - - res = gst_memory_map (mem, info, flags); - - /* move to the right offset inside the block */ - info->data += offset; - info->size -= offset; - info->maxsize -= offset; + res = map_mem_for_offset (buffer, &offset, info, flags); + if (G_LIKELY (res)) { + /* move to the right offset inside the block */ + info->data += offset; + info->size -= offset; + info->maxsize -= offset; + } return res; } @@ -251,7 +270,6 @@ gst_video_meta_unmap (GstVideoMeta * meta, guint plane, GstMapInfo * info) { guint offset; GstBuffer *buffer; - GstMemory *mem; g_return_val_if_fail (meta != NULL, FALSE); g_return_val_if_fail (plane < meta->n_planes, FALSE); @@ -261,14 +279,14 @@ gst_video_meta_unmap (GstVideoMeta * meta, guint plane, GstMapInfo * info) g_return_val_if_fail (buffer != NULL, FALSE); offset = meta->offset[plane]; - mem = find_mem_for_offset (buffer, &offset, GST_MAP_READ); /* move to the right offset inside the block */ info->data -= offset; info->size += offset; info->maxsize += offset; - gst_memory_unmap (mem, info); + gst_memory_unmap (info->memory, info); + gst_memory_unref (info->memory); return TRUE; } -- 2.7.4