size = gst_buffer_get_size (buffer);
if (G_UNLIKELY (_is_span (mem + idx, length, &poffset, &parent))) {
-
if (GST_MEMORY_IS_NO_SHARE (parent)) {
GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy for merge %p", parent);
result = gst_memory_copy (parent, poffset, size);
{
guint i, len, end;
gsize bsize, bufsize, bufoffs, bufmax;
- GstMemory *mem;
g_return_if_fail (gst_buffer_is_writable (buffer));
g_return_if_fail (size >= -1);
end = idx + length;
/* copy and trim */
for (i = idx; i < end; i++) {
+ GstMemory *mem;
gsize left, noffs;
mem = GST_BUFFER_MEM_PTR (buffer, i);
if (gst_memory_is_exclusive (mem)) {
gst_memory_resize (mem, offset, left);
} else {
- GstMemory *tmp;
+ GstMemory *newmem;
if (GST_MEMORY_IS_NO_SHARE (mem))
- tmp = gst_memory_copy (mem, offset, left);
+ newmem = gst_memory_copy (mem, offset, left);
else
- tmp = gst_memory_share (mem, offset, left);
+ newmem = gst_memory_share (mem, offset, left);
+ gst_memory_lock (newmem, GST_LOCK_FLAG_EXCLUSIVE);
+ GST_BUFFER_MEM_PTR (buffer, i) = newmem;
+ gst_memory_unlock (mem, GST_LOCK_FLAG_EXCLUSIVE);
gst_memory_unref (mem);
- mem = tmp;
}
}
+
offset = noffs;
size -= left;
-
- /* FIXME, update exclusive counters */
- GST_BUFFER_MEM_PTR (buffer, i) = mem;
}
}