buffer: fix resize function some more

Don't remove memory blocks from the buffer when we clip and resize, instead set
the memory offset and size to 0. This allows us to make the buffer larger again
later.
This commit is contained in:
Wim Taymans 2011-07-12 14:07:57 +02:00
parent a19baf77e7
commit 1a3f48f427

View file

@ -817,7 +817,7 @@ void
gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size) gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size)
{ {
guint len; guint len;
guint si, di; guint i;
gsize bsize, bufsize, bufoffs, bufmax; gsize bsize, bufsize, bufoffs, bufmax;
GstMemory *mem; GstMemory *mem;
@ -842,46 +842,47 @@ gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size)
len = GST_BUFFER_MEM_LEN (buffer); len = GST_BUFFER_MEM_LEN (buffer);
/* copy and trim */ /* copy and trim */
for (di = si = 0; si < len; si++) { for (i = 0; i < len; i++) {
mem = GST_BUFFER_MEM_PTR (buffer, si); gsize left, noffs;
mem = GST_BUFFER_MEM_PTR (buffer, i);
bsize = gst_memory_get_sizes (mem, NULL, NULL); bsize = gst_memory_get_sizes (mem, NULL, NULL);
if ((gssize) bsize <= offset) { noffs = 0;
/* remove buffer */ /* last buffer always gets resized to the remaining size */
GST_CAT_LOG (GST_CAT_BUFFER, "remove memory %p", mem); if (i + 1 == len)
gst_memory_unref (mem); left = size;
offset -= bsize; /* shrink buffers before the offset */
} else { else if ((gssize) bsize <= offset) {
gsize left; left = 0;
noffs = offset - bsize;
/* last buffer always gets resized to the remaining size */ offset = 0;
if (si + 1 == len)
left = size;
else
left = MIN (bsize - offset, size);
if (offset != 0 || left != bsize) {
/* we need to clip something */
if (GST_MEMORY_IS_WRITABLE (mem)) {
gst_memory_resize (mem, offset, left);
} else {
GstMemory *tmp;
if (mem->flags & GST_MEMORY_FLAG_NO_SHARE)
tmp = gst_memory_copy (mem, offset, left);
else
tmp = gst_memory_share (mem, offset, left);
gst_memory_unref (mem);
mem = tmp;
}
offset = 0;
}
GST_BUFFER_MEM_PTR (buffer, di++) = mem;
size -= left;
} }
/* clip other buffers */
else
left = MIN (bsize - offset, size);
if (offset != 0 || left != bsize) {
/* we need to clip something */
if (GST_MEMORY_IS_WRITABLE (mem)) {
gst_memory_resize (mem, offset, left);
} else {
GstMemory *tmp;
if (mem->flags & GST_MEMORY_FLAG_NO_SHARE)
tmp = gst_memory_copy (mem, offset, left);
else
tmp = gst_memory_share (mem, offset, left);
gst_memory_unref (mem);
mem = tmp;
}
}
offset = noffs;
size -= left;
GST_BUFFER_MEM_PTR (buffer, i) = mem;
} }
GST_BUFFER_MEM_LEN (buffer) = di;
} }
/** /**