diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-05-04 11:51:41 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-06-02 11:38:15 +0200 |
commit | 0f7e80ed59dda9d11c6229ea51136d37d839c995 (patch) | |
tree | 57a2274da04c86ccd2552b3017a24f0158dae61f /gst | |
parent | 6f830e5bd5c45ea4e778002ea46964901a6f5ae0 (diff) | |
download | gstreamer-plugins-good-0f7e80ed59dda9d11c6229ea51136d37d839c995.tar.gz |
rtpsession: Only put RRs and full SDES into regular RTCP packets
If we may suppress the packet due to the rules of RFC4585 (i.e. when
below the t-rr-int), we can send a smaller RTCP packet without RRs
and full SDES. In theory we could even send a minimal RTCP packet
according to RFC5506, but we don't support that yet.
https://bugzilla.gnome.org/show_bug.cgi?id=746543
Diffstat (limited to 'gst')
-rw-r--r-- | gst/rtpmanager/rtpsession.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index c8c6908a4..187ad7b18 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -3462,7 +3462,7 @@ session_sdes (RTPSession * sess, ReportData * data) type = gst_rtcp_sdes_name_to_type (field); /* Early packets are minimal and only include the CNAME */ - if (data->is_early && type != GST_RTCP_SDES_CNAME) + if (data->may_suppress && type != GST_RTCP_SDES_CNAME) continue; if (type > GST_RTCP_SDES_END && type < GST_RTCP_SDES_PRIV) { @@ -3666,7 +3666,7 @@ generate_rtcp (const gchar * key, RTPSource * source, ReportData * data) /* send BYE */ make_source_bye (sess, source, data); is_bye = TRUE; - } else if (!data->is_early) { + } else if (!data->may_suppress) { /* loop over all known sources and add report blocks. If we are early, we * just make a minimal RTCP packet and skip this step */ g_hash_table_foreach (sess->ssrcs[sess->mask_idx], @@ -3744,6 +3744,7 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time, ReportData data = { GST_RTCP_BUFFER_INIT }; GHashTable *table_copy; ReportOutput *output; + gboolean must_not_suppress; g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR); @@ -3802,8 +3803,12 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time, if (!is_rtcp_time (sess, current_time, &data)) goto done; - GST_DEBUG ("doing RTCP generation %u for %u sources, early %d", - sess->generation, data.num_to_report, data.is_early); + /* We need to send a full RTCP packet */ + must_not_suppress = !data.is_early && !data.may_suppress; + + GST_DEBUG + ("doing RTCP generation %u for %u sources, early %d, may suppress %d", + sess->generation, data.num_to_report, data.is_early, data.may_suppress); /* generate RTCP for all internal sources */ g_hash_table_foreach (sess->ssrcs[sess->mask_idx], @@ -3815,8 +3820,9 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time, /* we keep track of the last report time in order to timeout inactive * receivers or senders */ - if (!data.is_early && !data.may_suppress) + if (must_not_suppress) sess->last_rtcp_send_time = data.current_time; + sess->last_rtcp_check_time = data.current_time; sess->first_rtcp = FALSE; sess->next_early_rtcp_time = GST_CLOCK_TIME_NONE; |