From 27e7ca3389ad7b63044fe3f2ae427fab0c7776c7 Mon Sep 17 00:00:00 2001 From: Mikhail Fludkov Date: Thu, 16 Jun 2016 10:55:52 +0100 Subject: [PATCH] opusdec: test for PLC timestamp when FEC is enabled. --- tests/check/elements/opus.c | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/check/elements/opus.c b/tests/check/elements/opus.c index 5b04bb2..3678ed1 100644 --- a/tests/check/elements/opus.c +++ b/tests/check/elements/opus.c @@ -23,6 +23,7 @@ #include #include +#include #if G_BYTE_ORDER == G_BIG_ENDIAN #define AFORMAT "S16BE" @@ -420,6 +421,68 @@ GST_START_TEST (test_opusdec_getcaps) GST_END_TEST; +GST_START_TEST (test_opus_decode_plc_timestamps_with_fec) +{ + GstBuffer *buf; + GstHarness *h = + gst_harness_new_parse ("opusdec use-inband-fec=TRUE plc=TRUE"); + GstClockTime dur0 = GST_MSECOND * 35 / 10; /* because of lookahead */ + GstClockTime dur = GST_MSECOND * 10; + + gst_harness_add_src_parse (h, + "audiotestsrc samplesperbuffer=480 is-live=TRUE ! " + "opusenc frame-size=10 inband-fec=TRUE", TRUE); + + /* Push first buffer from encoder to decoder. It will not be decoded yet + * because of the delay introduced by FEC */ + gst_harness_src_crank_and_push_many (h, 1, 1); + fail_unless_equals_int (0, gst_harness_buffers_received (h)); + + /* Drop second buffer from encoder and send a GAP event to decoder + * instead with 2x duration */ + gst_harness_src_crank_and_push_many (h, 1, 0); + fail_unless (buf = gst_harness_pull (h->src_harness)); + fail_unless (gst_harness_push_event (h, + gst_event_new_gap (GST_BUFFER_PTS (buf), + GST_BUFFER_DURATION (buf) * 2))); + gst_buffer_unref (buf); + + /* Extract first buffer from decoder and verify timstamps */ + fail_unless (buf = gst_harness_pull (h)); + fail_unless_equals_int64 (0, GST_BUFFER_PTS (buf)); + fail_unless_equals_int64 (dur0, GST_BUFFER_DURATION (buf)); + fail_unless (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)); + gst_buffer_unref (buf); + + /* Third buffer is pushed from encoder to decoder with DISCONT set */ + gst_harness_src_crank_and_push_many (h, 1, 0); + fail_unless (buf = gst_harness_pull (h->src_harness)); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + gst_harness_push (h, buf); + + /* Extract second (concealed) buffer from decoder and verify timestamp + and the 2x duration */ + fail_unless (buf = gst_harness_pull (h)); + fail_unless_equals_int64 (dur0, GST_BUFFER_PTS (buf)); + fail_unless_equals_int64 (dur * 2, GST_BUFFER_DURATION (buf)); + fail_if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)); + gst_buffer_unref (buf); + + /* Push fourth buffer from encoder to decoder as normal */ + gst_harness_src_crank_and_push_many (h, 1, 1); + + /* Extract third buffer from decoder and verify timestamps */ + fail_unless (buf = gst_harness_pull (h)); + fail_unless_equals_int64 (dur0 + 1 * dur, GST_BUFFER_PTS (buf)); + fail_unless_equals_int64 (dur, GST_BUFFER_DURATION (buf)); + fail_if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)); + gst_buffer_unref (buf); + + gst_harness_teardown (h); +} + +GST_END_TEST; + static Suite * opus_suite (void) { @@ -433,6 +496,7 @@ opus_suite (void) tcase_add_test (tc_chain, test_opus_encode_samples); tcase_add_test (tc_chain, test_opus_encode_properties); tcase_add_test (tc_chain, test_opusdec_getcaps); + tcase_add_test (tc_chain, test_opus_decode_plc_timestamps_with_fec); return s; } -- 2.7.4