|
|
|
@ -104,7 +104,7 @@ struct sdp_session { |
|
|
|
str session_name; |
|
|
|
str session_timing; /* t= */ |
|
|
|
struct sdp_connection connection; |
|
|
|
int as, rr, rs, ct; |
|
|
|
struct session_bandwidth bandwidth; |
|
|
|
struct sdp_attributes attributes; |
|
|
|
sdp_media_q media_streams; |
|
|
|
}; |
|
|
|
@ -123,7 +123,7 @@ struct sdp_media { |
|
|
|
|
|
|
|
struct sdp_connection connection; |
|
|
|
const char *c_line_pos; |
|
|
|
int as, rr, rs; |
|
|
|
struct session_bandwidth bandwidth; |
|
|
|
struct sdp_attributes attributes; |
|
|
|
str_slice_q format_list; /* list of slice-alloc'd str objects */ |
|
|
|
enum media_type media_type_id; |
|
|
|
@ -1294,7 +1294,7 @@ new_session: |
|
|
|
t_queue_push_tail(sessions, session); |
|
|
|
media = NULL; |
|
|
|
session->s.s = b; |
|
|
|
session->as = session->rr = session->rs = session->ct = -1; |
|
|
|
RESET_BANDWIDTH(session->bandwidth, -1); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
@ -1320,7 +1320,7 @@ new_session: |
|
|
|
goto error; |
|
|
|
t_queue_push_tail(&session->media_streams, media); |
|
|
|
media->s.s = b; |
|
|
|
media->rr = media->rs = media->as = -1; |
|
|
|
RESET_BANDWIDTH(media->bandwidth, -1); |
|
|
|
media->media_sdp_id = media_sdp_id++; |
|
|
|
break; |
|
|
|
|
|
|
|
@ -1364,17 +1364,17 @@ new_session: |
|
|
|
|
|
|
|
/* AS, RR, RS */ |
|
|
|
if (!memcmp(value, "AS:", 3)) { |
|
|
|
*(media ? &media->as : &session->as) = strtol((value + 3), NULL, 10); |
|
|
|
*(media ? &media->bandwidth.as : &session->bandwidth.as) = strtol((value + 3), NULL, 10); |
|
|
|
} |
|
|
|
else if (!memcmp(value, "RR:", 3)) { |
|
|
|
*(media ? &media->rr : &session->rr) = strtol((value + 3), NULL, 10); |
|
|
|
*(media ? &media->bandwidth.rr : &session->bandwidth.rr) = strtol((value + 3), NULL, 10); |
|
|
|
} |
|
|
|
else if (!memcmp(value, "RS:", 3)) { |
|
|
|
*(media ? &media->rs : &session->rs) = strtol((value + 3), NULL, 10); |
|
|
|
*(media ? &media->bandwidth.rs : &session->bandwidth.rs) = strtol((value + 3), NULL, 10); |
|
|
|
} |
|
|
|
/* CT has only session level */ |
|
|
|
else if (!memcmp(value, "CT:", 3)) { |
|
|
|
session->ct = strtol((value + 3), NULL, 10); |
|
|
|
session->bandwidth.ct = strtol((value + 3), NULL, 10); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
@ -1843,10 +1843,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f |
|
|
|
if (!flags->session_sdp_orig.parsed) |
|
|
|
flags->session_sdp_orig = session->origin; |
|
|
|
flags->session_sdp_name = session->session_name; |
|
|
|
flags->session_as = session->as; |
|
|
|
flags->session_rr = session->rr; |
|
|
|
flags->session_rs = session->rs; |
|
|
|
flags->session_ct = session->ct; |
|
|
|
flags->session_bandwidth = session->bandwidth; |
|
|
|
flags->session_timing = session->session_timing; |
|
|
|
|
|
|
|
for (__auto_type k = session->media_streams.head; k; k = k->next) { |
|
|
|
@ -1885,9 +1882,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f |
|
|
|
bf_set_clear(&sp->sp_flags, SP_FLAG_MEDIA_HANDOVER, flags->media_handover); |
|
|
|
|
|
|
|
/* b= (bandwidth), is parsed in sdp_parse() */ |
|
|
|
sp->media_session_as = media->as; |
|
|
|
sp->media_session_rr = media->rr; |
|
|
|
sp->media_session_rs = media->rs; |
|
|
|
sp->media_session_bandiwdth = media->bandwidth; |
|
|
|
|
|
|
|
// a=ptime |
|
|
|
attr = attr_get_by_id(&media->attributes, ATTR_PTIME); |
|
|
|
@ -3627,12 +3622,12 @@ static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue |
|
|
|
struct media_subscription *ms = media->media_subscriptions.head ? media->media_subscriptions.head->data : NULL; |
|
|
|
if (!ms || !ms->media) |
|
|
|
return; |
|
|
|
if (ms->media->bandwidth_as >= 0) |
|
|
|
g_string_append_printf(out, "b=AS:%d\r\n", ms->media->bandwidth_as); |
|
|
|
if (ms->media->bandwidth_rr >= 0) |
|
|
|
g_string_append_printf(out, "b=RR:%d\r\n", ms->media->bandwidth_rr); |
|
|
|
if (ms->media->bandwidth_rs >= 0) |
|
|
|
g_string_append_printf(out, "b=RS:%d\r\n", ms->media->bandwidth_rs); |
|
|
|
if (ms->media->sdp_media_bandwidth.as >= 0) |
|
|
|
g_string_append_printf(out, "b=AS:%ld\r\n", ms->media->sdp_media_bandwidth.as); |
|
|
|
if (ms->media->sdp_media_bandwidth.rr >= 0) |
|
|
|
g_string_append_printf(out, "b=RR:%ld\r\n", ms->media->sdp_media_bandwidth.rr); |
|
|
|
if (ms->media->sdp_media_bandwidth.rs >= 0) |
|
|
|
g_string_append_printf(out, "b=RS:%ld\r\n", ms->media->sdp_media_bandwidth.rs); |
|
|
|
} |
|
|
|
else { |
|
|
|
/* sdp bandwidth per session/media level |
|
|
|
@ -3640,14 +3635,14 @@ static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue |
|
|
|
struct media_subscription *ms = call_get_top_media_subscription(monologue); |
|
|
|
if (!ms || !ms->monologue) |
|
|
|
return; |
|
|
|
if (ms->monologue->sdp_session_as >= 0) |
|
|
|
g_string_append_printf(out, "b=AS:%d\r\n", ms->monologue->sdp_session_as); |
|
|
|
if (ms->monologue->sdp_session_rr >= 0) |
|
|
|
g_string_append_printf(out, "b=RR:%d\r\n", ms->monologue->sdp_session_rr); |
|
|
|
if (ms->monologue->sdp_session_rs >= 0) |
|
|
|
g_string_append_printf(out, "b=RS:%d\r\n", ms->monologue->sdp_session_rs); |
|
|
|
if (ms->monologue->sdp_session_ct >= 0) |
|
|
|
g_string_append_printf(out, "b=CT:%d\r\n", ms->monologue->sdp_session_ct); |
|
|
|
if (ms->monologue->sdp_session_bandwidth.as >= 0) |
|
|
|
g_string_append_printf(out, "b=AS:%ld\r\n", ms->monologue->sdp_session_bandwidth.as); |
|
|
|
if (ms->monologue->sdp_session_bandwidth.rr >= 0) |
|
|
|
g_string_append_printf(out, "b=RR:%ld\r\n", ms->monologue->sdp_session_bandwidth.rr); |
|
|
|
if (ms->monologue->sdp_session_bandwidth.rs >= 0) |
|
|
|
g_string_append_printf(out, "b=RS:%ld\r\n", ms->monologue->sdp_session_bandwidth.rs); |
|
|
|
if (ms->monologue->sdp_session_bandwidth.ct >= 0) |
|
|
|
g_string_append_printf(out, "b=CT:%ld\r\n", ms->monologue->sdp_session_bandwidth.ct); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|