bufferpool: Fix the buffer size reset code

The offset in gst_buffer_resize() is additive. So to move back the
offset to zero, we need to pass the opposite of the current offset. This
was raised through the related unit test failingon 32bit as on 64bit
the alignment padding was enough to hide the issue. The test was
modified to also fail on 64bit. This patch will remove spurious
assertions like:

  assertion 'bufmax >= bufoffs + offset + size' failed

Fixes #316
This commit is contained in:
Nicolas Dufresne 2019-06-29 09:22:05 -04:00
parent 3e2f24955e
commit 8a9b20a18b
2 changed files with 6 additions and 3 deletions

View file

@ -1222,8 +1222,11 @@ default_reset_buffer (GstBufferPool * pool, GstBuffer * buffer)
GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
/* if the memory is intact reset the size to the full size */
if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY))
gst_buffer_resize (buffer, 0, pool->priv->size);
if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY)) {
gsize offset;
gst_buffer_get_sizes (buffer, &offset, NULL);
gst_buffer_resize (buffer, -offset, pool->priv->size);
}
/* remove all metadata without the POOLED flag */
gst_buffer_foreach_meta (buffer, remove_meta_unpooled, pool);

View file

@ -190,7 +190,7 @@ GST_START_TEST (test_buffer_modify_discard)
gst_buffer_pool_acquire_buffer (pool, &buf, NULL);
buffer_track_destroy (buf, &dcount);
/* do resize, as we didn't modify the memory, pool should reuse this buffer */
gst_buffer_resize (buf, 5, 2);
gst_buffer_resize (buf, 8, 2);
gst_buffer_unref (buf);
/* buffer should've gone back into pool */