MT#56465 sdp_create(), set the actual sdp media bandwidth

Always ensure to set the actual media session level
bandwidth, if given, when creating SDP using `sdp_create()`:
- AS
- RR
- RS

All of them can be presented simultaneously.

Adjust existing function `sdp_out_add_bandwidth()` to comply
with media session level demands.

Change-Id: I9599df051109ec05c4549ae79fae906fb5980dad
pull/1838/head
Donat Zenichev 12 months ago
parent 5c9edacf5b
commit 41331bfe75

@ -1841,6 +1841,11 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f
bf_set_clear(&sp->sp_flags, SP_FLAG_STRICT_SOURCE, flags->strict_source);
bf_set_clear(&sp->sp_flags, SP_FLAG_MEDIA_HANDOVER, flags->media_handover);
/* b= (bandwidth) */
sp->media_session_as = media->as;
sp->media_session_rr = media->rr;
sp->media_session_rs = media->rs;
// a=ptime
attr = attr_get_by_id(&media->attributes, ATTR_PTIME);
if (attr && attr->strs.value.s)
@ -3445,19 +3450,31 @@ static void sdp_out_add_session_name(GString *out, struct call_monologue *monolo
g_string_append_printf(out, "s=%s\r\n", sdp_session_name);
}
static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue)
static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue,
struct stream_params *sp, struct call_media *media)
{
struct call_monologue *ml = monologue;
struct media_subscription *ms = call_get_top_media_subscription(monologue);
if (ms && ms->monologue)
ml = ms->monologue;
/* sdp bandwidth per session level
* 0 value is supported (e.g. b=RR:0 and b=RS:0), to be able to disable rtcp */
if (ml->sdp_session_rr >= 0)
g_string_append_printf(out, "b=RR:%d\r\n", ml->sdp_session_rr);
if (ml->sdp_session_rs >= 0)
g_string_append_printf(out, "b=RS:%d\r\n", ml->sdp_session_rs);
/* sdp bandwidth per media level */
if (media) {
if (sp && sp->media_session_as >= 0)
g_string_append_printf(out, "b=AS:%d\r\n", sp->media_session_as);
if (sp && sp->media_session_rr >= 0)
g_string_append_printf(out, "b=RR:%d\r\n", sp->media_session_rr);
if (sp && sp->media_session_rs >= 0)
g_string_append_printf(out, "b=RS:%d\r\n", sp->media_session_rs);
}
else {
/* sdp bandwidth per session/media level
* 0 value is supported (e.g. b=RR:0 and b=RS:0), to be able to disable rtcp */
if (ml->sdp_session_rr >= 0)
g_string_append_printf(out, "b=RR:%d\r\n", ml->sdp_session_rr);
if (ml->sdp_session_rs >= 0)
g_string_append_printf(out, "b=RS:%d\r\n", ml->sdp_session_rs);
}
}
static void sdp_out_add_media_connection(GString *out, struct call_media *media,
@ -3525,7 +3542,7 @@ int sdp_create(str *out, struct call_monologue *monologue,
* but instead per media, below */
/* add bandwidth control per session level */
sdp_out_add_bandwidth(s, monologue);
sdp_out_add_bandwidth(s, monologue, NULL, NULL);
/* set timing to always be: 0 0 */
g_string_append(s, "t=0 0\r\n");
@ -3582,6 +3599,9 @@ int sdp_create(str *out, struct call_monologue *monologue,
/* add actual media connection */
sdp_out_add_media_connection(s, media, rtp_ps, sp, flags);
/* add per media bandwidth */
sdp_out_add_bandwidth(s, monologue, sp, media);
/* print media level attributes */
print_sdp_media_section(s, media, NULL, flags, rtp_ps_link, true, false);
}

@ -392,6 +392,7 @@ struct stream_params {
struct t38_options t38_options;
str tls_id;
int media_sdp_id;
int media_session_as, media_session_rr, media_session_rs;
};
struct endpoint_map {

Loading…
Cancel
Save