diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c index 2bcfe732ff..2ce05400c9 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 22cbef7bd9..d900399a7e 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); }