buffer: make memory writable in _peek

Make the memory writable when we are asked to _peek with MAP_WRITE.
Improve debugging of miniobject.
This commit is contained in:
Wim Taymans 2011-04-06 18:57:57 +02:00
parent 20ba453244
commit f332b700d5
2 changed files with 22 additions and 4 deletions

View file

@ -595,6 +595,24 @@ gst_buffer_take_memory (GstBuffer * buffer, GstMemory * mem)
_memory_add (buffer, 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: * gst_buffer_peek_memory:
* @buffer: a #GstBuffer. * @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))) if (G_UNLIKELY (write && !gst_buffer_is_writable (buffer)))
goto not_writable; goto not_writable;
mem = GST_BUFFER_MEM_PTR (buffer, idx); mem = _get_memory (buffer, idx, write);
return mem; return mem;
@ -914,7 +932,7 @@ gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src,
gsize ssize, tocopy; gsize ssize, tocopy;
GstMemory *mem; 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); data = gst_memory_map (mem, &ssize, NULL, GST_MAP_WRITE);
if (ssize > offset) { if (ssize > offset) {

View file

@ -180,9 +180,9 @@ gst_mini_object_make_writable (GstMiniObject * mini_object)
if (gst_mini_object_is_writable (mini_object)) { if (gst_mini_object_is_writable (mini_object)) {
ret = mini_object; ret = mini_object;
} else { } 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); 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); gst_mini_object_unref (mini_object);
} }