From bff00fdab670bb178e6f1cd541a413d6684ba51f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 27 Feb 2013 13:16:03 -0500 Subject: [PATCH] support b=RR:0 and b=RS:0 to disable rtcp --- daemon/sdp.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/daemon/sdp.c b/daemon/sdp.c index 91e82da72..1d845a16d 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -38,6 +38,7 @@ struct sdp_session { str s; struct sdp_origin origin; struct sdp_connection connection; + int rr, rs; struct sdp_attributes attributes; GQueue media_streams; }; @@ -53,6 +54,7 @@ struct sdp_media { int port_count; struct sdp_connection connection; + int rr, rs; struct sdp_attributes attributes; }; @@ -335,6 +337,7 @@ int sdp_parse(str *body, GQueue *sessions) { g_queue_push_tail(sessions, session); media = NULL; session->s.s = b; + session->rr = session->rs = -1; break; @@ -356,6 +359,7 @@ int sdp_parse(str *body, GQueue *sessions) { goto error; g_queue_push_tail(&session->media_streams, media); media->s.s = b; + media->rr = media->rs = -1; break; @@ -386,12 +390,23 @@ int sdp_parse(str *body, GQueue *sessions) { break; + case 'b': + /* RR:0 */ + if (line_end - value < 4) + break; + if (!memcmp(value, "RR:", 3)) + *(media ? &media->rr : &session->rr) = + (line_end - value == 4 && value[3] == '0') ? 0 : 1; + else if (!memcmp(value, "RS:", 3)) + *(media ? &media->rs : &session->rs) = + (line_end - value == 4 && value[3] == '0') ? 0 : 1; + break; + case 's': case 'i': case 'u': case 'e': case 'p': - case 'b': case 't': case 'r': case 'z': @@ -803,6 +818,13 @@ static GList *find_stream_num(GList *m, int num) { return m; } +static int has_rtcp(struct sdp_session *session, struct sdp_media *media) { + if ((media->rr == -1 ? session->rr : media->rr) != 0 + && (media->rs == -1 ? session->rs : media->rs) != 0) + return 1; + return 0; +} + int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, enum call_opmode opmode, struct sdp_ng_flags *flags, GHashTable *streamhash) { @@ -875,10 +897,11 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, copy_up_to_end_of(chop, &media->s); - /* XXX create exception for b=..:0 cases */ - chopper_append_c(chop, "a=rtcp:"); - chopper_append_printf(chop, "%hu", rtcp->fd.localport); - chopper_append_c(chop, "\r\n"); + if (has_rtcp(session, media)) { + chopper_append_c(chop, "a=rtcp:"); + chopper_append_printf(chop, "%hu", rtcp->fd.localport); + chopper_append_c(chop, "\r\n"); + } if (flags->ice_force) { /* prio = (2^24) * 126 + (2^8) * 65535 + (256 - componentID) */ @@ -887,11 +910,13 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, chopper_append_c(chop, " 1 UDP 2130706431 "); insert_ice_address(chop, flags, rtp); chopper_append_c(chop, " typ host\r\n"); - chopper_append_c(chop, "a=candidate:"); - chopper_append_str(chop, &ice_foundation_str); - chopper_append_c(chop, " 2 UDP 2130706430 "); - insert_ice_address(chop, flags, rtcp); - chopper_append_c(chop, " typ host\r\n"); + if (has_rtcp(session, media)) { + chopper_append_c(chop, "a=candidate:"); + chopper_append_str(chop, &ice_foundation_str); + chopper_append_c(chop, " 2 UDP 2130706430 "); + insert_ice_address(chop, flags, rtcp); + chopper_append_c(chop, " typ host\r\n"); + } } } }