diff options
author | Havard Graff <havard.graff@gmail.com> | 2020-11-20 01:50:23 +0300 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-08-25 11:36:06 +0300 |
commit | be5fab15e00162a3cb0eb6f84e3bfdecb01c8869 (patch) | |
tree | b665d02c027f82d3109325b4ddfc08f44c4bc41f /gst/rtpmanager/rtptwcc.c | |
parent | ddcde96efef752aafca9eef329714114c28b71ae (diff) |
rtptwcc: add feedback-interval
To allow RTCP TWCC reports to be scheduled on a timer instead of per
marker-bit.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
Diffstat (limited to 'gst/rtpmanager/rtptwcc.c')
-rw-r--r-- | gst/rtpmanager/rtptwcc.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/gst/rtpmanager/rtptwcc.c b/gst/rtpmanager/rtptwcc.c index 8a7e879f6..d5039d4fc 100644 --- a/gst/rtpmanager/rtptwcc.c +++ b/gst/rtpmanager/rtptwcc.c @@ -87,6 +87,9 @@ struct _RTPTWCCManager gboolean first_fci_parse; guint16 expected_parsed_seqnum; guint8 expected_parsed_fb_pkt_count; + + GstClockTime next_feedback_send_time; + GstClockTime feedback_interval; }; G_DEFINE_TYPE (RTPTWCCManager, rtp_twcc_manager, G_TYPE_OBJECT); @@ -105,6 +108,9 @@ rtp_twcc_manager_init (RTPTWCCManager * twcc) twcc->recv_sender_ssrc = -1; twcc->first_fci_parse = TRUE; + + twcc->feedback_interval = GST_CLOCK_TIME_NONE; + twcc->next_feedback_send_time = GST_CLOCK_TIME_NONE; } static void @@ -157,6 +163,19 @@ rtp_twcc_manager_set_mtu (RTPTWCCManager * twcc, guint mtu) twcc->max_packets_per_rtcp = ((twcc->mtu - 32) * 7) / (2 + 14); } +void +rtp_twcc_manager_set_feedback_interval (RTPTWCCManager * twcc, + GstClockTime feedback_interval) +{ + twcc->feedback_interval = feedback_interval; +} + +GstClockTime +rtp_twcc_manager_get_feedback_interval (RTPTWCCManager * twcc) +{ + return twcc->feedback_interval; +} + static gint _twcc_seqnum_sort (gconstpointer a, gconstpointer b) { @@ -609,7 +628,20 @@ rtp_twcc_manager_recv_packet (RTPTWCCManager * twcc, GST_LOG ("Receive: twcc-seqnum: %u, marker: %d, ts: %" GST_TIME_FORMAT, seqnum, pinfo->marker, GST_TIME_ARGS (pinfo->running_time)); - if (pinfo->marker || _many_packets_some_lost (twcc, seqnum)) { + /* are we sending on an interval, or based on marker bit */ + if (GST_CLOCK_TIME_IS_VALID (twcc->feedback_interval)) { + if (!GST_CLOCK_TIME_IS_VALID (twcc->next_feedback_send_time)) + twcc->next_feedback_send_time = + pinfo->running_time + twcc->feedback_interval; + + if (pinfo->running_time >= twcc->next_feedback_send_time) { + rtp_twcc_manager_create_feedback (twcc); + send_feedback = TRUE; + + while (pinfo->running_time >= twcc->next_feedback_send_time) + twcc->next_feedback_send_time += twcc->feedback_interval; + } + } else if (pinfo->marker || _many_packets_some_lost (twcc, seqnum)) { rtp_twcc_manager_create_feedback (twcc); send_feedback = TRUE; } |