rtpjitterbuffer: Add unit test for unsolicited rtx affecting skew
authorHavard Graff <havard.graff@gmail.com>
Sun, 30 Jun 2019 05:16:44 +0000 (23:16 -0600)
committerThomas Bluemel <tbluemel@control4.com>
Wed, 3 Jul 2019 12:23:07 +0000 (06:23 -0600)
tests/check/elements/rtpjitterbuffer.c

index 078c5d6..e599162 100644 (file)
@@ -2689,6 +2689,55 @@ GST_START_TEST (test_fill_queue)
 
 GST_END_TEST;
 
+typedef struct
+{
+  gint64 dts_skew;
+  gint16 seqnum_skew;
+} RtxSkewCtx;
+
+static const RtxSkewCtx rtx_does_not_affect_pts_calculation_input[] = {
+  {0, 0},
+  {20 * GST_MSECOND, -100},
+  {20 * GST_MSECOND, 100},
+  {-10 * GST_MSECOND, 1},
+  {100 * GST_MSECOND, 0},
+};
+
+GST_START_TEST (test_rtx_does_not_affect_pts_calculation)
+{
+  GstHarness *h = gst_harness_new ("rtpjitterbuffer");
+  GstBuffer *buffer;
+  guint next_seqnum;
+  guint rtx_seqnum;
+  GstClockTime now;
+  const RtxSkewCtx *ctx = &rtx_does_not_affect_pts_calculation_input[__i__];
+
+  /* set up a deterministic state and take the time on the clock */
+  g_object_set (h->element, "do-retransmission", TRUE, "do-lost", TRUE, NULL);
+  next_seqnum = construct_deterministic_initial_state (h, 3000);
+  now = gst_clock_get_time (GST_ELEMENT_CLOCK (h->element));
+
+  /* push in a "bad" RTX buffer, arriving at various times / seqnums */
+  rtx_seqnum = next_seqnum + ctx->seqnum_skew;
+  buffer = generate_test_buffer_full (now + ctx->dts_skew, rtx_seqnum,
+      rtx_seqnum * TEST_RTP_TS_DURATION);
+  GST_BUFFER_FLAG_SET (buffer, GST_RTP_BUFFER_FLAG_RETRANSMISSION);
+  gst_harness_push (h, buffer);
+
+  /* now push in the next regular buffer at its ideal time, and verify the
+     rouge RTX-buffer did not mess things up */
+  push_test_buffer (h, next_seqnum);
+  now = gst_clock_get_time (GST_ELEMENT_CLOCK (h->element));
+  buffer = gst_harness_pull (h);
+  fail_unless_equals_int64 (now, GST_BUFFER_PTS (buffer));
+
+  gst_buffer_unref (buffer);
+
+  gst_harness_teardown (h);
+}
+
+GST_END_TEST;
+
 static Suite *
 rtpjitterbuffer_suite (void)
 {
@@ -2736,6 +2785,8 @@ rtpjitterbuffer_suite (void)
   tcase_add_test (tc_chain,
       test_rtx_large_packet_spacing_does_not_reset_jitterbuffer);
   tcase_add_test (tc_chain, test_minor_reorder_does_not_skew);
+  tcase_add_loop_test (tc_chain, test_rtx_does_not_affect_pts_calculation, 0,
+      G_N_ELEMENTS (rtx_does_not_affect_pts_calculation_input));
 
   tcase_add_test (tc_chain, test_deadline_ts_offset);
   tcase_add_test (tc_chain, test_big_gap_seqnum);