From 38bd5e5106efbd8e61bfcd3554f3a72db84397ba Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Wed, 25 Nov 2009 10:17:34 +0200 Subject: [PATCH] jitterbuffertest: improve the test the tests are a bit more solid now but still not produce reliable results. Wonder if they are still flawky or if its a bug in jitterbuffer. --- tests/check/elements/rtpjitterbuffer.c | 66 ++++++++++++++++---------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/tests/check/elements/rtpjitterbuffer.c b/tests/check/elements/rtpjitterbuffer.c index 7f2317ad2f..78897ae857 100644 --- a/tests/check/elements/rtpjitterbuffer.c +++ b/tests/check/elements/rtpjitterbuffer.c @@ -27,6 +27,7 @@ static GstPad *mysrcpad, *mysinkpad; /* we also have a list of src buffers */ static GList *inbuffers = NULL; +static gint num_dropped = 0; #define RTP_CAPS_STRING \ "application/x-rtp, " \ @@ -49,6 +50,16 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", "clock-rate = (int) [ 1, 2147483647 ]") ); +static void +buffer_dropped (gpointer mem) +{ + if (mem) { + GST_DEBUG ("dropping buffer: data=%p", mem); + g_free (mem); + num_dropped++; + } +} + static GstElement * setup_jitterbuffer (gint num_buffers) { @@ -56,7 +67,7 @@ setup_jitterbuffer (gint num_buffers) GstClock *clock; GstBuffer *buffer; GstCaps *caps; - /* generated with + /* a 20 sample audio block (2,5 ms) generated with * gst-launch audiotestsrc wave=silence blocksize=40 num-buffers=3 ! * "audio/x-raw-int,channels=1,rate=8000" ! mulawenc ! rtppcmupay ! * fakesink dump=1 @@ -68,7 +79,7 @@ setup_jitterbuffer (gint num_buffers) }; GstClockTime ts = G_GUINT64_CONSTANT (0); GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); - /*guint latency = GST_TIME_AS_MSECONDS (num_buffers*tso); */ + /*guint latency = GST_TIME_AS_MSECONDS (num_buffers * tso); */ gint i; GST_DEBUG ("setup_jitterbuffer"); @@ -96,6 +107,8 @@ setup_jitterbuffer (gint num_buffers) gst_buffer_set_caps (buffer, caps); GST_BUFFER_TIMESTAMP (buffer) = ts; GST_BUFFER_DURATION (buffer) = tso; + GST_BUFFER_FREE_FUNC (buffer) = buffer_dropped; + GST_DEBUG ("created buffer: %p, data=%p", buffer, GST_BUFFER_DATA (buffer)); if (!i) GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); @@ -109,6 +122,7 @@ setup_jitterbuffer (gint num_buffers) ts += tso; } gst_caps_unref (caps); + num_dropped = 0; return jitterbuffer; } @@ -139,10 +153,19 @@ check_jitterbuffer_results (GstElement * jitterbuffer, gint num_buffers) GList *node; GstClockTime ts = G_GUINT64_CONSTANT (0); GstClockTime tso = gst_util_uint64_scale (RTP_FRAME_SIZE, GST_SECOND, 8000); + guint test_duration = GST_TIME_AS_USECONDS (num_buffers * tso); guint8 *data; guint16 prev_sn = 0, cur_sn; guint32 prev_ts = 0, cur_ts; + /* sleep for twice the duration of the tested buffers */ + g_usleep (2 * test_duration); + + GST_INFO ("of %d buffer %d/%d received/dropped", num_buffers, + g_list_length (buffers), num_dropped); + /* if this fails, not all buffers have been processed */ + fail_unless_equals_int ((g_list_length (buffers) + num_dropped), num_buffers); + /* check the buffer list */ fail_unless_equals_int (g_list_length (buffers), num_buffers); for (node = buffers; node; node = g_list_next (node)) { @@ -191,7 +214,6 @@ GST_START_TEST (test_push_forward_seq) GST_END_TEST; -#if 0 GST_START_TEST (test_push_backward_seq) { GstElement *jitterbuffer; @@ -210,13 +232,6 @@ GST_START_TEST (test_push_backward_seq) fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); } - /* attempt to flush the jitterbuffer */ -#if 0 - gst_pad_push_event (mysrcpad, gst_event_new_eos ()); - gst_element_set_state (jitterbuffer, GST_STATE_READY); - gst_element_get_state (jitterbuffer, NULL, NULL, GST_CLOCK_TIME_NONE); -#endif - /* check the buffer list */ check_jitterbuffer_results (jitterbuffer, num_buffers); @@ -226,7 +241,6 @@ GST_START_TEST (test_push_backward_seq) GST_END_TEST; - GST_START_TEST (test_push_unordered) { GstElement *jitterbuffer; @@ -246,13 +260,6 @@ GST_START_TEST (test_push_unordered) buffer = g_list_nth_data (inbuffers, 1); fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); - /* attempt to flush the jitterbuffer */ -#if 0 - gst_pad_push_event (mysrcpad, gst_event_new_eos ()); - gst_element_set_state (jitterbuffer, GST_STATE_READY); - gst_element_get_state (jitterbuffer, NULL, NULL, GST_CLOCK_TIME_NONE); -#endif - /* check the buffer list */ check_jitterbuffer_results (jitterbuffer, num_buffers); @@ -261,7 +268,6 @@ GST_START_TEST (test_push_unordered) } GST_END_TEST; -#endif static Suite * rtpjitterbuffer_suite (void) @@ -270,15 +276,23 @@ rtpjitterbuffer_suite (void) TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_push_forward_seq); if (0) { - tcase_add_test (tc_chain, test_push_forward_seq); + /* this one does not work yet (bug in test or jitter buffer?), sometimes I get + elements/rtpjitterbuffer.c:168:F:general:test_push_backward_seq:0: 'g_list_length (buffers)' (1) is not equal to 'num_buffers' (3) + 0:00:00.113317818 761 0x9a74008 WARN rtpjitterbuffer rtpjitterbuffer.c:249:calculate_skew: backward timestamps at server, taking new base time + 0:00:00.113547177 761 0x9a74008 WARN rtpjitterbuffer rtpjitterbuffer.c:249:calculate_skew: backward timestamps at server, taking new base time + */ + tcase_add_test (tc_chain, test_push_backward_seq); + } + if (0) { + /* this one does not work yet (bug in test or jitter buffer?), sometimes I get + elements/rtpjitterbuffer.c:168:F:general:test_push_unordered:0: 'g_list_length (buffers)' (2) is not equal to 'num_buffers' (3) + 0:00:00.090439642 1216 0x9096008 WARN gstrtpjitterbuffer gstrtpjitterbuffer.c:1309:gst_rtp_jitter_buffer_chain: Packet #7205 too late as #7206 was already popped, dropping + 0:00:00.090674798 1216 0x9096008 WARN gstrtpjitterbuffer gstrtpjitterbuffer.c:1309:gst_rtp_jitter_buffer_chain: Packet #7204 too late as #7206 was already popped, dropping + */ + tcase_add_test (tc_chain, test_push_unordered); } -#if 0 - /* these don't work yet, buffers get dropped or never arrive in the buffers - * list */ - tcase_add_test (tc_chain, test_push_backward_seq); - tcase_add_test (tc_chain, test_push_unordered); -#endif /* FIXME: test buffer lists */