From f332b700d5cf568020f3ecd9ccf50451629ed2b8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 6 Apr 2011 18:57:57 +0200 Subject: [PATCH] buffer: make memory writable in _peek Make the memory writable when we are asked to _peek with MAP_WRITE. Improve debugging of miniobject. --- gst/gstbuffer.c | 22 ++++++++++++++++++++-- gst/gstminiobject.c | 4 ++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index f37a4b45e5..53ceed02bc 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -595,6 +595,24 @@ gst_buffer_take_memory (GstBuffer * buffer, GstMemory * mem) _memory_add (buffer, mem); } +static GstMemory * +_get_memory (GstBuffer * buffer, guint idx, gboolean write) +{ + GstMemory *mem; + + mem = GST_BUFFER_MEM_PTR (buffer, idx); + + if (G_UNLIKELY (write && !GST_MEMORY_IS_WRITABLE (mem))) { + GstMemory *copy; + /* replace with a writable copy */ + copy = gst_memory_copy (mem, 0, -1); + GST_BUFFER_MEM_PTR (buffer, idx) = copy; + gst_memory_unref (mem); + mem = copy; + } + return mem; +} + /** * gst_buffer_peek_memory: * @buffer: a #GstBuffer. @@ -621,7 +639,7 @@ gst_buffer_peek_memory (GstBuffer * buffer, guint idx, GstMapFlags flags) if (G_UNLIKELY (write && !gst_buffer_is_writable (buffer))) goto not_writable; - mem = GST_BUFFER_MEM_PTR (buffer, idx); + mem = _get_memory (buffer, idx, write); return mem; @@ -914,7 +932,7 @@ gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src, gsize ssize, tocopy; GstMemory *mem; - mem = GST_BUFFER_MEM_PTR (buffer, i); + mem = _get_memory (buffer, i, TRUE); data = gst_memory_map (mem, &ssize, NULL, GST_MAP_WRITE); if (ssize > offset) { diff --git a/gst/gstminiobject.c b/gst/gstminiobject.c index e9cd726ad1..9ae4201445 100644 --- a/gst/gstminiobject.c +++ b/gst/gstminiobject.c @@ -180,9 +180,9 @@ gst_mini_object_make_writable (GstMiniObject * mini_object) if (gst_mini_object_is_writable (mini_object)) { ret = mini_object; } else { - GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy %s miniobject", - g_type_name (GST_MINI_OBJECT_TYPE (mini_object))); ret = gst_mini_object_copy (mini_object); + GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy %s miniobject %p -> %p", + g_type_name (GST_MINI_OBJECT_TYPE (mini_object)), mini_object, ret); gst_mini_object_unref (mini_object); }