summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-05-04 11:51:41 +0200
committerSebastian Dröge <sebastian@centricular.com>2015-06-02 11:38:15 +0200
commit0f7e80ed59dda9d11c6229ea51136d37d839c995 (patch)
tree57a2274da04c86ccd2552b3017a24f0158dae61f /gst
parent6f830e5bd5c45ea4e778002ea46964901a6f5ae0 (diff)
downloadgstreamer-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.c16
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;