adapter: Take account of the skip in gst_adapter_take_buffer_fast()

Include regression test
This commit is contained in:
Olivier Crête 2013-07-16 15:35:08 -04:00
parent 5920491597
commit 915f418cc4
2 changed files with 32 additions and 4 deletions

View file

@ -776,12 +776,12 @@ gst_adapter_take_buffer_fast (GstAdapter * adapter, gsize nbytes)
gsize size;
cur = item->data;
size = MIN (gst_buffer_get_size (cur), left);
size = MIN (gst_buffer_get_size (cur) - skip, left);
GST_LOG_OBJECT (adapter, "appending %" G_GSIZE_FORMAT " bytes"
" via region copy", size);
if (buffer)
gst_buffer_copy_into (buffer, cur, GST_BUFFER_COPY_MEMORY, 0, size);
gst_buffer_copy_into (buffer, cur, GST_BUFFER_COPY_MEMORY, skip, size);
else
buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_ALL, skip, size);
skip = 0;

View file

@ -858,13 +858,41 @@ GST_START_TEST (test_take_buffer_fast)
buffer = gst_adapter_take_buffer_fast (adapter, 30);
fail_unless (gst_adapter_available (adapter) == 0);
fail_unless (gst_buffer_n_memory (buffer) == 3);
fail_unless (gst_buffer_get_sizes_range (buffer, 0, 1, NULL, NULL) == 5);
fail_unless (gst_buffer_get_sizes_range (buffer, 1, 1, NULL, NULL) == 10);
fail_unless (gst_buffer_get_sizes_range (buffer, 2, 1, NULL, NULL) == 15);
gst_buffer_unref (buffer);
fail_unless (gst_adapter_available (adapter) == 0);
buffer = gst_buffer_new_and_alloc (10);
fail_if (buffer == NULL);
gst_adapter_push (adapter, buffer);
buffer = gst_buffer_new_and_alloc (20);
fail_if (buffer == NULL);
gst_adapter_push (adapter, buffer);
gst_adapter_flush (adapter, 2);
fail_unless (gst_adapter_available (adapter) == 28);
buffer = gst_adapter_take_buffer_fast (adapter, 10);
fail_unless (gst_buffer_n_memory (buffer) == 2);
fail_unless (gst_buffer_get_sizes_range (buffer, 0, 1, NULL, NULL) == 8);
fail_unless (gst_buffer_get_sizes_range (buffer, 1, 1, NULL, NULL) == 2);
fail_unless (gst_adapter_available (adapter) == 18);
gst_buffer_unref (buffer);
buffer = gst_adapter_take_buffer_fast (adapter, 8);
fail_unless (gst_buffer_n_memory (buffer) == 1);
fail_unless (gst_buffer_get_size (buffer) == 8);
fail_unless (gst_adapter_available (adapter) == 10);
gst_buffer_unref (buffer);
gst_adapter_clear (adapter);
fail_unless (gst_adapter_available (adapter) == 0);
g_object_unref (adapter);
}