2006-05-04 14:19:53 +00:00
|
|
|
/* GStreamer
|
|
|
|
*
|
|
|
|
* unit test for adapter
|
|
|
|
*
|
|
|
|
* Copyright (C) <2005> Wim Taymans <wim at fluendo dot com>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <gst/check/gstcheck.h>
|
|
|
|
|
|
|
|
#include <gst/base/gstadapter.h>
|
|
|
|
|
|
|
|
/* does some implementation dependent checking that should
|
|
|
|
* also be optimal
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Start peeking on an adapter with 1 buffer pushed.
|
|
|
|
*/
|
|
|
|
GST_START_TEST (test_peek1)
|
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
GstBuffer *buffer;
|
|
|
|
guint avail;
|
|
|
|
const guint8 *bufdata, *data1, *data2;
|
|
|
|
|
|
|
|
adapter = gst_adapter_new ();
|
|
|
|
fail_if (adapter == NULL);
|
|
|
|
|
|
|
|
/* push single buffer in adapter */
|
|
|
|
buffer = gst_buffer_new_and_alloc (512);
|
2011-03-22 19:51:06 +00:00
|
|
|
|
|
|
|
bufdata = gst_buffer_map (buffer, NULL, NULL, GST_MAP_READ);
|
2006-05-04 14:19:53 +00:00
|
|
|
|
|
|
|
fail_if (buffer == NULL);
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
|
|
|
|
/* available and available_fast should return the size of the
|
|
|
|
* buffer */
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_if (avail != 512);
|
|
|
|
avail = gst_adapter_available_fast (adapter);
|
|
|
|
fail_if (avail != 512);
|
|
|
|
|
|
|
|
/* should g_critical with NULL as result */
|
2011-03-22 19:51:06 +00:00
|
|
|
ASSERT_CRITICAL (data1 = gst_adapter_map (adapter, 0));
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data1 != NULL);
|
|
|
|
|
|
|
|
/* should return NULL as result */
|
2011-03-22 19:51:06 +00:00
|
|
|
data1 = gst_adapter_map (adapter, 513);
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data1 != NULL);
|
|
|
|
|
|
|
|
/* this should work */
|
2011-03-22 19:51:06 +00:00
|
|
|
data1 = gst_adapter_map (adapter, 512);
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data1 == NULL);
|
|
|
|
/* it should point to the buffer data as well */
|
|
|
|
fail_if (data1 != bufdata);
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_adapter_unmap (adapter, 0);
|
|
|
|
|
|
|
|
data2 = gst_adapter_map (adapter, 512);
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data2 == NULL);
|
|
|
|
/* second peek should return the same pointer */
|
|
|
|
fail_if (data2 != data1);
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_adapter_unmap (adapter, 0);
|
2006-05-04 14:19:53 +00:00
|
|
|
|
|
|
|
/* this should fail since we don't have that many bytes */
|
|
|
|
ASSERT_CRITICAL (gst_adapter_flush (adapter, 513));
|
|
|
|
|
|
|
|
/* this should work fine */
|
|
|
|
gst_adapter_flush (adapter, 10);
|
|
|
|
|
|
|
|
/* see if we have 10 bytes less available */
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_if (avail != 502);
|
|
|
|
avail = gst_adapter_available_fast (adapter);
|
|
|
|
fail_if (avail != 502);
|
|
|
|
|
|
|
|
/* should return NULL as result */
|
2011-03-22 19:51:06 +00:00
|
|
|
data2 = gst_adapter_map (adapter, 503);
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data2 != NULL);
|
|
|
|
|
|
|
|
/* should work fine */
|
2011-03-22 19:51:06 +00:00
|
|
|
data2 = gst_adapter_map (adapter, 502);
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data2 == NULL);
|
|
|
|
/* peek should return the same old pointer + 10 */
|
|
|
|
fail_if (data2 != data1 + 10);
|
|
|
|
fail_if (data2 != bufdata + 10);
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_adapter_unmap (adapter, 0);
|
2006-05-04 14:19:53 +00:00
|
|
|
|
|
|
|
/* flush some more */
|
|
|
|
gst_adapter_flush (adapter, 500);
|
|
|
|
|
|
|
|
/* see if we have 2 bytes available */
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_if (avail != 2);
|
|
|
|
avail = gst_adapter_available_fast (adapter);
|
|
|
|
fail_if (avail != 2);
|
|
|
|
|
2011-03-22 19:51:06 +00:00
|
|
|
data2 = gst_adapter_map (adapter, 2);
|
2006-05-04 14:19:53 +00:00
|
|
|
fail_if (data2 == NULL);
|
|
|
|
fail_if (data2 != data1 + 510);
|
|
|
|
fail_if (data2 != bufdata + 510);
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_adapter_unmap (adapter, 0);
|
2006-05-04 14:19:53 +00:00
|
|
|
|
|
|
|
/* flush some more */
|
|
|
|
gst_adapter_flush (adapter, 2);
|
|
|
|
|
|
|
|
/* see if we have 0 bytes available */
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_if (avail != 0);
|
|
|
|
avail = gst_adapter_available_fast (adapter);
|
|
|
|
fail_if (avail != 0);
|
|
|
|
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buffer, (gpointer) bufdata, 0);
|
|
|
|
|
2006-05-04 14:19:53 +00:00
|
|
|
/* silly clear just for fun */
|
|
|
|
gst_adapter_clear (adapter);
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
/* Start peeking on an adapter with 2 non-mergeable buffers
|
|
|
|
* pushed.
|
|
|
|
*/
|
|
|
|
GST_START_TEST (test_peek2)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
/* Start peeking on an adapter with 2 mergeable buffers
|
|
|
|
* pushed.
|
|
|
|
*/
|
|
|
|
GST_START_TEST (test_peek3)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
/* take data from an adapter with 1 buffer pushed.
|
|
|
|
*/
|
|
|
|
GST_START_TEST (test_take1)
|
|
|
|
{
|
2009-04-27 08:13:01 +00:00
|
|
|
GstAdapter *adapter;
|
|
|
|
GstBuffer *buffer, *buffer2;
|
|
|
|
guint avail;
|
|
|
|
guint8 *data, *data2;
|
2011-03-22 19:51:06 +00:00
|
|
|
gsize size, size2;
|
2009-04-27 08:13:01 +00:00
|
|
|
|
|
|
|
adapter = gst_adapter_new ();
|
|
|
|
fail_unless (adapter != NULL);
|
|
|
|
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
fail_unless (buffer != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
|
|
|
|
fail_unless (data != NULL);
|
|
|
|
fail_unless (size == 100);
|
2009-04-27 08:13:01 +00:00
|
|
|
|
|
|
|
/* push in the adapter */
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
|
|
|
|
/* take out buffer */
|
|
|
|
buffer2 = gst_adapter_take_buffer (adapter, 100);
|
|
|
|
fail_unless (buffer2 != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
|
|
|
|
data2 = gst_buffer_map (buffer2, &size2, NULL, GST_MAP_READ);
|
|
|
|
fail_unless (data2 != NULL);
|
|
|
|
fail_unless (size2 == 100);
|
2009-04-27 08:13:01 +00:00
|
|
|
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 0);
|
|
|
|
|
|
|
|
/* the buffer should be the same */
|
|
|
|
fail_unless (buffer == buffer2);
|
|
|
|
fail_unless (data == data2);
|
|
|
|
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buffer, data, size);
|
|
|
|
gst_buffer_unmap (buffer2, data2, size2);
|
|
|
|
|
2009-04-27 08:13:01 +00:00
|
|
|
gst_buffer_unref (buffer2);
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
2006-05-04 14:19:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
/* take data from an adapter with 2 non-mergeable buffers
|
|
|
|
* pushed.
|
|
|
|
*/
|
|
|
|
GST_START_TEST (test_take2)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
/* take data from an adapter with 2 mergeable buffers
|
|
|
|
* pushed.
|
|
|
|
*/
|
|
|
|
GST_START_TEST (test_take3)
|
|
|
|
{
|
2010-05-27 13:10:34 +00:00
|
|
|
GstAdapter *adapter;
|
|
|
|
GstBuffer *buffer, *buffer2;
|
|
|
|
guint avail;
|
|
|
|
guint8 *data, *data2;
|
2011-03-22 19:51:06 +00:00
|
|
|
gsize size, size2;
|
2010-05-27 13:10:34 +00:00
|
|
|
|
|
|
|
adapter = gst_adapter_new ();
|
|
|
|
fail_unless (adapter != NULL);
|
|
|
|
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
fail_unless (buffer != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
|
|
|
|
fail_unless (data != NULL);
|
|
|
|
fail_unless (size == 100);
|
2010-05-27 13:10:34 +00:00
|
|
|
|
|
|
|
/* set up and push subbuffers */
|
|
|
|
buffer2 = gst_buffer_create_sub (buffer, 0, 25);
|
|
|
|
gst_adapter_push (adapter, buffer2);
|
|
|
|
buffer2 = gst_buffer_create_sub (buffer, 25, 25);
|
|
|
|
gst_adapter_push (adapter, buffer2);
|
|
|
|
buffer2 = gst_buffer_create_sub (buffer, 50, 25);
|
|
|
|
gst_adapter_push (adapter, buffer2);
|
|
|
|
buffer2 = gst_buffer_create_sub (buffer, 75, 25);
|
|
|
|
gst_adapter_push (adapter, buffer2);
|
|
|
|
|
|
|
|
gst_buffer_unref (buffer);
|
|
|
|
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
|
|
|
|
/* take out buffer */
|
|
|
|
buffer2 = gst_adapter_take_buffer (adapter, 100);
|
|
|
|
fail_unless (buffer2 != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
data2 = gst_buffer_map (buffer2, &size2, NULL, GST_MAP_READ);
|
|
|
|
fail_unless (data2 != NULL);
|
|
|
|
fail_unless (size2 == 100);
|
2010-05-27 13:10:34 +00:00
|
|
|
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 0);
|
|
|
|
|
|
|
|
/* the data should be the same */
|
|
|
|
fail_unless (data == data2);
|
|
|
|
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buffer, data, size);
|
|
|
|
gst_buffer_unmap (buffer2, data2, size2);
|
2010-05-27 13:10:34 +00:00
|
|
|
gst_buffer_unref (buffer2);
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
2006-05-04 14:19:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
static GstAdapter *
|
2008-02-29 13:59:24 +00:00
|
|
|
create_and_fill_adapter (void)
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
gint i, j;
|
|
|
|
|
|
|
|
adapter = gst_adapter_new ();
|
|
|
|
fail_unless (adapter != NULL);
|
|
|
|
|
|
|
|
for (i = 0; i < 10000; i += 4) {
|
2011-03-22 19:51:06 +00:00
|
|
|
GstBuffer *buf;
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
guint8 *data;
|
|
|
|
|
2011-03-22 19:51:06 +00:00
|
|
|
buf = gst_buffer_new_and_alloc (sizeof (guint32) * 4);
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
fail_unless (buf != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
|
|
|
|
data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
|
|
|
|
for (j = 0; j < 4; j++) {
|
|
|
|
GST_WRITE_UINT32_LE (data, i + j);
|
|
|
|
data += sizeof (guint32);
|
|
|
|
}
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buf, data, sizeof (guint32) * 4);
|
|
|
|
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
gst_adapter_push (adapter, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
return adapter;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Fill a buffer with a sequence of 32 bit ints and read them back out,
|
|
|
|
* checking that they're still in the right order */
|
|
|
|
GST_START_TEST (test_take_order)
|
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
adapter = create_and_fill_adapter ();
|
|
|
|
while (gst_adapter_available (adapter) >= sizeof (guint32)) {
|
|
|
|
guint8 *data = gst_adapter_take (adapter, sizeof (guint32));
|
|
|
|
|
|
|
|
fail_unless (GST_READ_UINT32_LE (data) == i);
|
|
|
|
i++;
|
|
|
|
g_free (data);
|
|
|
|
}
|
|
|
|
fail_unless (gst_adapter_available (adapter) == 0,
|
|
|
|
"Data was left in the adapter");
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
/* Fill a buffer with a sequence of 32 bit ints and read them back out
|
|
|
|
* using take_buffer, checking that they're still in the right order */
|
|
|
|
GST_START_TEST (test_take_buf_order)
|
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
adapter = create_and_fill_adapter ();
|
|
|
|
while (gst_adapter_available (adapter) >= sizeof (guint32)) {
|
|
|
|
GstBuffer *buf = gst_adapter_take_buffer (adapter, sizeof (guint32));
|
2011-03-22 19:51:06 +00:00
|
|
|
gpointer data;
|
|
|
|
gsize size;
|
|
|
|
|
|
|
|
data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
|
|
|
|
fail_unless (GST_READ_UINT32_LE (data) == i);
|
|
|
|
gst_buffer_unmap (buf, data, size);
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
gst_buffer_unref (buf);
|
|
|
|
}
|
|
|
|
fail_unless (gst_adapter_available (adapter) == 0,
|
|
|
|
"Data was left in the adapter");
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2009-05-13 14:48:38 +00:00
|
|
|
GST_START_TEST (test_timestamp)
|
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
GstBuffer *buffer;
|
|
|
|
guint avail;
|
|
|
|
GstClockTime timestamp;
|
|
|
|
guint64 dist;
|
2010-09-17 10:40:12 +00:00
|
|
|
guint8 *data;
|
|
|
|
const guint8 *cdata;
|
2009-05-13 14:48:38 +00:00
|
|
|
|
|
|
|
adapter = gst_adapter_new ();
|
|
|
|
fail_unless (adapter != NULL);
|
|
|
|
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
|
|
|
|
/* push in the adapter */
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
|
|
|
|
/* timestamp is now undefined */
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == GST_CLOCK_TIME_NONE);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
gst_adapter_flush (adapter, 50);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 50);
|
|
|
|
|
|
|
|
/* still undefined, dist changed, though */
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == GST_CLOCK_TIME_NONE);
|
|
|
|
fail_unless (dist == 50);
|
|
|
|
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
|
|
|
|
|
|
|
|
/* push in the adapter */
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 150);
|
|
|
|
|
|
|
|
/* timestamp is still undefined */
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == GST_CLOCK_TIME_NONE);
|
|
|
|
fail_unless (dist == 50);
|
|
|
|
|
|
|
|
/* flush out first buffer we are now at the second buffer timestamp */
|
|
|
|
gst_adapter_flush (adapter, 50);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 1 * GST_SECOND);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
/* move some more, still the same timestamp but further away */
|
|
|
|
gst_adapter_flush (adapter, 50);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 50);
|
|
|
|
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 1 * GST_SECOND);
|
|
|
|
fail_unless (dist == 50);
|
|
|
|
|
|
|
|
/* push a buffer without timestamp in the adapter */
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 150);
|
|
|
|
/* push a buffer with timestamp in the adapter */
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 250);
|
|
|
|
|
|
|
|
/* timestamp still as it was before the push */
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 1 * GST_SECOND);
|
|
|
|
fail_unless (dist == 50);
|
|
|
|
|
|
|
|
/* flush away buffer with the timestamp */
|
|
|
|
gst_adapter_flush (adapter, 50);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 200);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 1 * GST_SECOND);
|
|
|
|
fail_unless (dist == 100);
|
|
|
|
|
|
|
|
/* move into the second buffer */
|
|
|
|
gst_adapter_flush (adapter, 50);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 150);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 1 * GST_SECOND);
|
|
|
|
fail_unless (dist == 150);
|
|
|
|
|
|
|
|
/* move to third buffer we move to the new timestamp */
|
|
|
|
gst_adapter_flush (adapter, 50);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 2 * GST_SECOND);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
/* move everything out */
|
|
|
|
gst_adapter_flush (adapter, 100);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 0);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 2 * GST_SECOND);
|
|
|
|
fail_unless (dist == 100);
|
|
|
|
|
2009-05-13 15:09:32 +00:00
|
|
|
/* clear everything */
|
|
|
|
gst_adapter_clear (adapter);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 0);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == GST_CLOCK_TIME_NONE);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
2010-09-17 10:40:12 +00:00
|
|
|
/* push an empty buffer with timestamp in the adapter */
|
|
|
|
buffer = gst_buffer_new ();
|
|
|
|
GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 0);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 2 * GST_SECOND);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
/* push another empty buffer */
|
|
|
|
buffer = gst_buffer_new ();
|
|
|
|
GST_BUFFER_TIMESTAMP (buffer) = 3 * GST_SECOND;
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 0);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 2 * GST_SECOND);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
/* push a buffer with timestamp in the adapter */
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
GST_BUFFER_TIMESTAMP (buffer) = 4 * GST_SECOND;
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 2 * GST_SECOND);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
gst_adapter_flush (adapter, 1);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 99);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 4 * GST_SECOND);
|
|
|
|
fail_unless (dist == 1);
|
|
|
|
|
|
|
|
/* push an empty buffer with timestamp in the adapter */
|
|
|
|
buffer = gst_buffer_new ();
|
|
|
|
GST_BUFFER_TIMESTAMP (buffer) = 5 * GST_SECOND;
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 99);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 4 * GST_SECOND);
|
|
|
|
fail_unless (dist == 1);
|
|
|
|
|
|
|
|
/* push buffer without timestamp */
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 199);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 4 * GST_SECOND);
|
|
|
|
fail_unless (dist == 1);
|
|
|
|
|
|
|
|
/* remove first buffer, timestamp of empty buffer is visible */
|
|
|
|
buffer = gst_adapter_take_buffer (adapter, 99);
|
|
|
|
fail_unless (buffer != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
fail_unless (gst_buffer_get_size (buffer) == 99);
|
2010-09-17 10:40:12 +00:00
|
|
|
gst_buffer_unref (buffer);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 100);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 5 * GST_SECOND);
|
|
|
|
fail_unless (dist == 0);
|
|
|
|
|
|
|
|
/* remove empty buffer, timestamp still visible */
|
2011-03-22 19:51:06 +00:00
|
|
|
cdata = gst_adapter_map (adapter, 50);
|
2010-09-17 10:40:12 +00:00
|
|
|
fail_unless (cdata != NULL);
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_adapter_unmap (adapter, 0);
|
|
|
|
|
2010-09-17 10:40:12 +00:00
|
|
|
data = gst_adapter_take (adapter, 50);
|
|
|
|
fail_unless (data != NULL);
|
|
|
|
g_free (data);
|
|
|
|
avail = gst_adapter_available (adapter);
|
|
|
|
fail_unless (avail == 50);
|
|
|
|
timestamp = gst_adapter_prev_timestamp (adapter, &dist);
|
|
|
|
fail_unless (timestamp == 5 * GST_SECOND);
|
|
|
|
fail_unless (dist == 50);
|
|
|
|
|
2009-05-13 14:48:38 +00:00
|
|
|
g_object_unref (adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2009-05-19 22:37:53 +00:00
|
|
|
GST_START_TEST (test_scan)
|
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
GstBuffer *buffer;
|
|
|
|
guint8 *data;
|
|
|
|
guint offset;
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
adapter = gst_adapter_new ();
|
|
|
|
fail_unless (adapter != NULL);
|
|
|
|
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
2011-03-22 19:51:06 +00:00
|
|
|
|
|
|
|
data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
|
2009-05-19 22:37:53 +00:00
|
|
|
/* fill with pattern */
|
|
|
|
for (i = 0; i < 100; i++)
|
|
|
|
data[i] = i;
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buffer, data, 100);
|
2009-05-19 22:37:53 +00:00
|
|
|
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
|
|
|
|
/* find first bytes */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 0, 100);
|
|
|
|
fail_unless (offset == 0);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 0, 100);
|
|
|
|
fail_unless (offset == 1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 1, 99);
|
|
|
|
fail_unless (offset == 1);
|
|
|
|
/* offset is past the pattern start */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 2, 98);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
/* not enough bytes to find the pattern */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x02030405, 2, 3);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x02030405, 2, 4);
|
|
|
|
fail_unless (offset == 2);
|
|
|
|
/* size does not include the last scanned byte */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x41);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x43);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x44);
|
|
|
|
fail_unless (offset == 0x40);
|
|
|
|
/* past the start */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 65, 10);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 64, 5);
|
|
|
|
fail_unless (offset == 64);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 65, 35);
|
|
|
|
fail_unless (offset == 0x60);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x60, 4);
|
|
|
|
fail_unless (offset == 0x60);
|
|
|
|
/* past the start */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x61, 3);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
|
2009-05-20 08:28:08 +00:00
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 99, 1);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
|
2009-05-19 22:37:53 +00:00
|
|
|
/* add another buffer */
|
|
|
|
buffer = gst_buffer_new_and_alloc (100);
|
2011-03-22 19:51:06 +00:00
|
|
|
|
|
|
|
data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
|
2009-05-19 22:37:53 +00:00
|
|
|
/* fill with pattern */
|
|
|
|
for (i = 0; i < 100; i++)
|
|
|
|
data[i] = i + 100;
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buffer, data, 100);
|
2009-05-19 22:37:53 +00:00
|
|
|
|
|
|
|
gst_adapter_push (adapter, buffer);
|
|
|
|
|
|
|
|
/* past the start */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x61, 6);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
/* this should work */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x61626364, 0x61, 4);
|
|
|
|
fail_unless (offset == 0x61);
|
|
|
|
/* not enough data */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0x61, 4);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0x61, 5);
|
|
|
|
fail_unless (offset == 0x62);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0, 120);
|
|
|
|
fail_unless (offset == 0x62);
|
|
|
|
|
|
|
|
/* border conditions */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0, 200);
|
|
|
|
fail_unless (offset == 0x62);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x63646566, 0, 200);
|
|
|
|
fail_unless (offset == 0x63);
|
|
|
|
/* we completely searched the first list */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0, 200);
|
|
|
|
fail_unless (offset == 0x64);
|
|
|
|
/* skip first buffer */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x64,
|
|
|
|
100);
|
|
|
|
fail_unless (offset == 0x64);
|
|
|
|
/* past the start */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x65,
|
|
|
|
10);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
/* not enough data to scan */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x63, 4);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x63, 5);
|
|
|
|
fail_unless (offset == 0x64);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0, 199);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x62,
|
|
|
|
102);
|
|
|
|
fail_unless (offset == 0xc4);
|
|
|
|
/* different masks */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0x00ffffff, 0x00656667, 0x64,
|
|
|
|
100);
|
|
|
|
fail_unless (offset == 0x64);
|
2009-05-28 20:02:21 +00:00
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000000, 0, 100);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000003, 0, 100);
|
|
|
|
fail_unless (offset == 0);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000061, 0x61,
|
|
|
|
100);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xff000000, 0x61000000, 0, 0x62);
|
|
|
|
fail_unless (offset == -1);
|
2009-05-19 22:37:53 +00:00
|
|
|
/* does not even exist */
|
2010-09-19 14:10:16 +00:00
|
|
|
ASSERT_CRITICAL (offset =
|
2009-05-19 22:37:53 +00:00
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0x00ffffff, 0xffffffff, 0x65,
|
2010-09-19 14:10:16 +00:00
|
|
|
99));
|
2009-05-19 22:37:53 +00:00
|
|
|
fail_unless (offset == -1);
|
|
|
|
|
|
|
|
/* flush some bytes */
|
|
|
|
gst_adapter_flush (adapter, 0x20);
|
|
|
|
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x20212223, 0, 100);
|
|
|
|
fail_unless (offset == 0);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x20212223, 0, 4);
|
|
|
|
fail_unless (offset == 0);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x62,
|
|
|
|
70);
|
|
|
|
fail_unless (offset == 0xa4);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0, 168);
|
|
|
|
fail_unless (offset == 0xa4);
|
|
|
|
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 164, 4);
|
|
|
|
fail_unless (offset == 0xa4);
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x44,
|
|
|
|
100);
|
|
|
|
fail_unless (offset == 0xa4);
|
|
|
|
/* not enough bytes */
|
|
|
|
offset =
|
|
|
|
gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x44,
|
|
|
|
99);
|
|
|
|
fail_unless (offset == -1);
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2010-09-17 13:51:08 +00:00
|
|
|
/* Fill a buffer with a sequence of 32 bit ints and read them back out
|
|
|
|
* using take_buffer, checking that they're still in the right order */
|
|
|
|
GST_START_TEST (test_take_list)
|
|
|
|
{
|
|
|
|
GstAdapter *adapter;
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
adapter = create_and_fill_adapter ();
|
|
|
|
while (gst_adapter_available (adapter) >= sizeof (guint32)) {
|
|
|
|
GList *list, *walk;
|
|
|
|
GstBuffer *buf;
|
2011-03-22 19:51:06 +00:00
|
|
|
gsize size, left;
|
|
|
|
guint8 *data, *ptr;
|
2010-09-17 13:51:08 +00:00
|
|
|
|
|
|
|
list = gst_adapter_take_list (adapter, sizeof (guint32) * 5);
|
|
|
|
fail_unless (list != NULL);
|
|
|
|
|
|
|
|
for (walk = list; walk; walk = g_list_next (walk)) {
|
|
|
|
buf = walk->data;
|
|
|
|
|
2011-03-22 19:51:06 +00:00
|
|
|
ptr = data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
|
|
|
|
|
|
|
|
left = size;
|
|
|
|
while (left > 0) {
|
|
|
|
fail_unless (GST_READ_UINT32_LE (ptr) == i);
|
2010-09-17 13:51:08 +00:00
|
|
|
i++;
|
2011-03-22 19:51:06 +00:00
|
|
|
ptr += sizeof (guint32);
|
|
|
|
left -= sizeof (guint32);
|
2010-09-17 13:51:08 +00:00
|
|
|
}
|
2011-03-22 19:51:06 +00:00
|
|
|
gst_buffer_unmap (buf, data, size);
|
|
|
|
|
2010-09-17 13:51:08 +00:00
|
|
|
gst_buffer_unref (buf);
|
|
|
|
}
|
|
|
|
g_list_free (list);
|
|
|
|
}
|
|
|
|
fail_unless (gst_adapter_available (adapter) == 0,
|
|
|
|
"Data was left in the adapter");
|
|
|
|
|
|
|
|
g_object_unref (adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2008-02-29 13:59:24 +00:00
|
|
|
static Suite *
|
2006-05-04 14:19:53 +00:00
|
|
|
gst_adapter_suite (void)
|
|
|
|
{
|
|
|
|
Suite *s = suite_create ("adapter");
|
|
|
|
TCase *tc_chain = tcase_create ("general");
|
|
|
|
|
|
|
|
suite_add_tcase (s, tc_chain);
|
|
|
|
tcase_add_test (tc_chain, test_peek1);
|
|
|
|
tcase_add_test (tc_chain, test_peek2);
|
|
|
|
tcase_add_test (tc_chain, test_peek3);
|
|
|
|
tcase_add_test (tc_chain, test_take1);
|
|
|
|
tcase_add_test (tc_chain, test_take2);
|
|
|
|
tcase_add_test (tc_chain, test_take3);
|
Do some optimisation work in GstAdapter to avoid copies in more cases.
Original commit message from CVS:
* Makefile.am:
* configure.ac:
* libs/gst/base/gstadapter.c: (gst_adapter_clear),
(gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
(gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
* libs/gst/base/gstadapter.h:
* tests/check/libs/adapter.c: (create_and_fill_adapter),
(GST_START_TEST), (gst_adapter_suite):
* tests/examples/Makefile.am:
Do some optimisation work in GstAdapter to avoid copies in more cases.
It could still do slightly better by merging buffers when
gst_buffer_is_span_fast is true, but is already faster.
Also, avoid traversing a single-linked list to append each incoming
buffer inside the adapter.
Add simple test app that times the adapter behaviour in different
situations, and extend the unit test to check that bytes enter and
exit the adapter in their original order.
2006-11-09 14:37:38 +00:00
|
|
|
tcase_add_test (tc_chain, test_take_order);
|
|
|
|
tcase_add_test (tc_chain, test_take_buf_order);
|
2009-05-13 14:48:38 +00:00
|
|
|
tcase_add_test (tc_chain, test_timestamp);
|
2009-05-19 22:37:53 +00:00
|
|
|
tcase_add_test (tc_chain, test_scan);
|
2010-09-17 13:51:08 +00:00
|
|
|
tcase_add_test (tc_chain, test_take_list);
|
2006-05-04 14:19:53 +00:00
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2006-07-01 20:56:56 +00:00
|
|
|
GST_CHECK_MAIN (gst_adapter);
|