support b=RR:0 and b=RS:0 to disable rtcp

2.2
Richard Fuchs 12 years ago
parent d928ccd37d
commit bff00fdab6

@ -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");
}
}
}
}

Loading…
Cancel
Save