opusdec: test for PLC timestamp when FEC is enabled.
authorMikhail Fludkov <misha@pexip.com>
Thu, 16 Jun 2016 09:55:52 +0000 (10:55 +0100)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 16 Jun 2016 10:01:06 +0000 (11:01 +0100)
tests/check/elements/opus.c

index 5b04bb2..3678ed1 100644 (file)
@@ -23,6 +23,7 @@
 #include <unistd.h>
 
 #include <gst/check/gstcheck.h>
+#include <gst/check/gstharness.h>
 
 #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;
 }