From 41331bfe75e51f6507b5837796ffa4a8de39a327 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Tue, 25 Jun 2024 16:19:11 +0200 Subject: [PATCH] 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 --- daemon/sdp.c | 36 ++++++++++++++++++++++++++++-------- include/call.h | 1 + 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/daemon/sdp.c b/daemon/sdp.c index 321c82442..f7e9c32c6 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -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); } diff --git a/include/call.h b/include/call.h index 96c1e0070..e939687c8 100644 --- a/include/call.h +++ b/include/call.h @@ -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 {