From 9b3cd950457c80890920cc7f9252fbfe1d39364c Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Wed, 14 Aug 2024 09:23:33 +0200 Subject: [PATCH] MT#60403 bandwidth: add support of AS for session level Added support of the AS bandwidth attribute for the SDP session level. Will be required later for the SDP formatting in `sdp_create()`. Change-Id: I1bde4659679de6e60bdad12c0578ced2c1983300 --- daemon/call.c | 4 +++- daemon/sdp.c | 14 +++++++++----- include/call.h | 2 +- include/call_interfaces.h | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index debac5895..af62e35e6 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2659,6 +2659,8 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c flags->session_timing.len); /* 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 (flags->session_as >= 0) + ml->sdp_session_as = flags->session_as; if (flags->session_rr >= 0) ml->sdp_session_rr = flags->session_rr; if (flags->session_rs >= 0) @@ -4218,7 +4220,7 @@ struct call_monologue *__monologue_create(call_t *call) { ret->ssrc_hash = create_ssrc_hash_call(); ret->sdp_attr_print = sdp_insert_monologue_attributes; /* explicitely set b=RR/b=RS to -1 so it's not considered as 0 inadvertently */ - ret->sdp_session_rr = ret->sdp_session_rs = -1; + ret->sdp_session_as = ret->sdp_session_rr = ret->sdp_session_rs = -1; gettimeofday(&ret->started, NULL); diff --git a/daemon/sdp.c b/daemon/sdp.c index ef0f3edbe..5348e9935 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -106,7 +106,7 @@ struct sdp_session { str session_name; str session_timing; /* t= */ struct sdp_connection connection; - int rr, rs; + int as, rr, rs; struct sdp_attributes attributes; sdp_media_q media_streams; }; @@ -1299,7 +1299,7 @@ new_session: t_queue_push_tail(sessions, session); media = NULL; session->s.s = b; - session->rr = session->rs = -1; + session->as = session->rr = session->rs = -1; break; @@ -1366,9 +1366,10 @@ new_session: /* RR:0 */ if (line_end - value < 4) break; - /* AS only supported per media */ - if (media && !memcmp(value, "AS:", 3)) { - *(&media->as) = strtol((value + 3), NULL, 10); + + /* AS, RR, RS */ + if (!memcmp(value, "AS:", 3)) { + *(media ? &media->as : &session->as) = strtol((value + 3), NULL, 10); } else if (!memcmp(value, "RR:", 3)) { *(media ? &media->rr : &session->rr) = strtol((value + 3), NULL, 10); @@ -1843,6 +1844,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_timing = session->session_timing; @@ -3616,6 +3618,8 @@ 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) diff --git a/include/call.h b/include/call.h index 9090e6425..22a0569a9 100644 --- a/include/call.h +++ b/include/call.h @@ -570,7 +570,7 @@ struct call_monologue { GHashTable *media_ids; struct media_player *player; struct media_player *rec_player; - int sdp_session_rr, sdp_session_rs; + int sdp_session_as, sdp_session_rr, sdp_session_rs; str last_in_sdp; sdp_sessions_q last_in_sdp_parsed; /* last parsed `sdp_session` */ sdp_streams_q last_in_sdp_streams; /* last parsed `stream_params` */ diff --git a/include/call_interfaces.h b/include/call_interfaces.h index 6065e6eb8..e9a07ded5 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -66,7 +66,7 @@ struct sdp_ng_flags { str session_sdp_name; str session_timing; /* t= line */ - int session_rr, session_rs; /* b= bandwidth per session level */ + int session_as, session_rr, session_rs; /* b= bandwidth per session level */ /* commands to manipulate attr lines in SDP */ struct sdp_manipulations * sdp_manipulations[__MT_MAX];