From a5ee20db3f933314b48f8ef5beff1eb9548f8cb0 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 12 Jul 2011 12:00:58 +0200 Subject: [PATCH] buffer: fix _resize some more Add more debug. Alow resize to 0 bytes. Do clipping correctly. Add more unit tests. Also add a failing test: when we resize to 0 and then try to resize back to the original size it fails because the memory was removed. --- gst/gstbuffer.c | 12 +++++++----- tests/check/gst/gstbuffer.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index 2bcfe73..2ce0540 100644 --- a/gst/gstbuffer.c +++ b/gst/gstbuffer.c @@ -820,13 +820,14 @@ gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size) gsize bsize, bufsize, bufoffs, bufmax; GstMemory *mem; - GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSSIZE_FORMAT "-%" G_GSIZE_FORMAT, - buffer, offset, size); - g_return_if_fail (gst_buffer_is_writable (buffer)); bufsize = gst_buffer_get_sizes (buffer, &bufoffs, &bufmax); + GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSSIZE_FORMAT "-%" G_GSIZE_FORMAT + " size:%" G_GSIZE_FORMAT " offs:%" G_GSIZE_FORMAT " max:%" G_GSIZE_FORMAT, + buffer, offset, size, bufsize, bufoffs, bufmax); + /* we can't go back further than the current offset or past the end of the * buffer */ g_return_if_fail ((offset < 0 && bufoffs >= -offset) || (offset >= 0 @@ -840,12 +841,13 @@ gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size) len = GST_BUFFER_MEM_LEN (buffer); /* copy and trim */ - for (di = si = 0; si < len && size > 0; si++) { + for (di = si = 0; si < len; si++) { mem = GST_BUFFER_MEM_PTR (buffer, si); bsize = gst_memory_get_sizes (mem, NULL, NULL); if ((gssize) bsize <= offset) { /* remove buffer */ + GST_CAT_LOG (GST_CAT_BUFFER, "remove memory %p", mem); gst_memory_unref (mem); offset -= bsize; } else { @@ -857,7 +859,7 @@ gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size) else left = MIN (bsize - offset, size); - if (left) { + if (offset != 0 || left != bsize) { /* we need to clip something */ if (GST_MEMORY_IS_WRITABLE (mem)) { gst_memory_resize (mem, offset, left); diff --git a/tests/check/gst/gstbuffer.c b/tests/check/gst/gstbuffer.c index 22cbef7..d900399 100644 --- a/tests/check/gst/gstbuffer.c +++ b/tests/check/gst/gstbuffer.c @@ -515,6 +515,24 @@ GST_START_TEST (test_resize) fail_unless (offset == 0); fail_unless (maxsize == maxalloc); + gst_buffer_resize (buf, 0, 0); + size = gst_buffer_get_sizes (buf, &offset, &maxsize); + fail_unless (size == 0); + fail_unless (offset == 0); + fail_unless (maxsize == maxalloc); + + gst_buffer_resize (buf, 0, 100); + size = gst_buffer_get_sizes (buf, &offset, &maxsize); + fail_unless (size == 100); + fail_unless (offset == 0); + fail_unless (maxsize == maxalloc); + + gst_buffer_resize (buf, 0, 100); + size = gst_buffer_get_sizes (buf, &offset, &maxsize); + fail_unless (size == 100); + fail_unless (offset == 0); + fail_unless (maxsize == maxalloc); + gst_buffer_unref (buf); } -- 2.7.4