summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTulio Beloqui <tulio.beloqui@pexip.com>2020-12-16 16:31:18 +0100
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-08-25 08:36:06 +0000
commit3484f21b9545521394c9227a5a48616d26f95d87 (patch)
tree39b48662764aa8439a5eb8faaddba658c2020c0e
parentabf4b57a1c23da969f2bb6749e6c7cf9f4694be4 (diff)
downloadgstreamer-plugins-good-3484f21b9545521394c9227a5a48616d26f95d87.tar.gz
rtptwcc: fixed parsing of old sequence number
Co-authored-by: Havard Graff <havard.graff@gmail.com> Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
-rw-r--r--gst/rtpmanager/rtptwcc.c10
-rw-r--r--tests/check/elements/rtpsession.c53
2 files changed, 61 insertions, 2 deletions
diff --git a/gst/rtpmanager/rtptwcc.c b/gst/rtpmanager/rtptwcc.c
index eab88fc51..3bb054063 100644
--- a/gst/rtpmanager/rtptwcc.c
+++ b/gst/rtpmanager/rtptwcc.c
@@ -794,7 +794,7 @@ _check_for_lost_packets (RTPTWCCManager * twcc, GArray * twcc_packets,
/* we have gone backwards, don't reset the expectations,
but process the packet nonetheless */
if (fb_pkt_count_diff < 0) {
- GST_WARNING ("feedback packet count going backwards (%u < %u)",
+ GST_DEBUG ("feedback packet count going backwards (%u < %u)",
fb_pkt_count, twcc->expected_parsed_fb_pkt_count);
return;
}
@@ -802,11 +802,17 @@ _check_for_lost_packets (RTPTWCCManager * twcc, GArray * twcc_packets,
/* we have jumped forwards, reset expectations, but don't trigger
lost packets in case the missing fb-packet(s) arrive later */
if (fb_pkt_count_diff > 0) {
- GST_WARNING ("feedback packet count jumped ahead (%u > %u)",
+ GST_DEBUG ("feedback packet count jumped ahead (%u > %u)",
fb_pkt_count, twcc->expected_parsed_fb_pkt_count);
goto done;
}
+ if (base_seqnum < twcc->expected_parsed_seqnum) {
+ GST_DEBUG ("twcc seqnum is older than expected (%u < %u)", base_seqnum,
+ twcc->expected_parsed_seqnum);
+ return;
+ }
+
packets_lost = base_seqnum - twcc->expected_parsed_seqnum;
for (i = 0; i < packets_lost; i++) {
_add_twcc_packet (twcc_packets, twcc->expected_parsed_seqnum + i,
diff --git a/tests/check/elements/rtpsession.c b/tests/check/elements/rtpsession.c
index a11ed278c..451ae2d29 100644
--- a/tests/check/elements/rtpsession.c
+++ b/tests/check/elements/rtpsession.c
@@ -3780,6 +3780,58 @@ GST_START_TEST (test_twcc_feedback_count_wrap)
GST_END_TEST;
+GST_START_TEST (test_twcc_feedback_old_seqnum)
+{
+ SessionHarness *h = session_harness_new ();
+ guint i;
+ GstBuffer *buf;
+ GstEvent *event;
+ GValueArray *packets_array;
+
+ guint8 fci1[] = {
+ 0x05, 0xfd, /* base sequence number: 1533 */
+ 0x00, 0x00, /* packet status count: 0 */
+ 0x00, 0x00, 0x00, /* reference time: 0 */
+ 0x00, /* feedback packet count: 255 */
+ 0x00, 0x00, /* packet chunk: run-length, 0 */
+ 0x00, /* 0 recv-delta */
+ };
+
+ guint8 fci2[] = {
+ 0x05, 0xdc, /* base sequence number: 1500 */
+ 0x00, 0x00, /* packet status count: 0 */
+ 0x00, 0x00, 0x00, /* reference time: 0 */
+ 0x01, /* feedback packet count: 1 */
+ 0x00, 0x00, /* packet chunk: run-length, 0 */
+ 0x00, /* 0 recv-delta */
+ };
+
+ buf = generate_twcc_feedback_rtcp (fci1, sizeof (fci1));
+ session_harness_recv_rtcp (h, buf);
+
+ buf = generate_twcc_feedback_rtcp (fci2, sizeof (fci2));
+ session_harness_recv_rtcp (h, buf);
+
+ /* two reconfigure events */
+ for (i = 0; i < 2; i++)
+ gst_event_unref (gst_harness_pull_upstream_event (h->send_rtp_h));
+
+ for (i = 0; i < 2; i++) {
+ event = gst_harness_pull_upstream_event (h->send_rtp_h);
+ packets_array =
+ g_value_get_boxed (gst_structure_get_value (gst_event_get_structure
+ (event), "packets"));
+
+ /* we expect zero packets due to old sequence number */
+ fail_unless_equals_int (packets_array->n_values, 0);
+ gst_event_unref (event);
+ }
+
+ session_harness_free (h);
+}
+
+GST_END_TEST;
+
static Suite *
rtpsession_suite (void)
@@ -3848,6 +3900,7 @@ rtpsession_suite (void)
tcase_add_loop_test (tc_chain, test_twcc_feedback_interval, 0,
G_N_ELEMENTS (test_twcc_feedback_interval_ctx));
tcase_add_test (tc_chain, test_twcc_feedback_count_wrap);
+ tcase_add_test (tc_chain, test_twcc_feedback_old_seqnum);
return s;