From b170ded75d8fdd113f1337b19c681fb6122c7d31 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Fri, 13 Sep 2024 09:57:52 +0200 Subject: [PATCH] MT#60403 bandwidth: add support of CT for session level Added support of the CT (conference total) bandwidth attribute for the SDP session level. See RFC8866. Will be required later for the SDP formatting in `sdp_create()`. Change-Id: Ifc64f68d7acee8ce253882f4fa480bbf7ad7c0bd --- daemon/call.c | 4 +++- daemon/sdp.c | 11 +++++++++-- include/call.h | 2 +- include/call_interfaces.h | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index d6b6522da..21b11afc6 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2672,6 +2672,8 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c ml->sdp_session_rr = flags->session_rr; if (flags->session_rs >= 0) ml->sdp_session_rs = flags->session_rs; + if (flags->session_ct >= 0) + ml->sdp_session_ct = flags->session_ct; } // reset offer ipv4/ipv6/mixed media stats @@ -4235,7 +4237,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_as = ret->sdp_session_rr = ret->sdp_session_rs = -1; + ret->sdp_session_as = ret->sdp_session_rr = ret->sdp_session_rs = ret->sdp_session_ct = -1; gettimeofday(&ret->started, NULL); diff --git a/daemon/sdp.c b/daemon/sdp.c index 6a5a9b06f..4e57b4770 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -104,7 +104,7 @@ struct sdp_session { str session_name; str session_timing; /* t= */ struct sdp_connection connection; - int as, rr, rs; + int as, rr, rs, ct; struct sdp_attributes attributes; sdp_media_q media_streams; }; @@ -1294,7 +1294,7 @@ new_session: t_queue_push_tail(sessions, session); media = NULL; session->s.s = b; - session->as = session->rr = session->rs = -1; + session->as = session->rr = session->rs = session->ct = -1; break; @@ -1372,6 +1372,10 @@ new_session: else if (!memcmp(value, "RS:", 3)) { *(media ? &media->rs : &session->rs) = strtol((value + 3), NULL, 10); } + /* CT has only session level */ + else if (!memcmp(value, "CT:", 3)) { + session->ct = strtol((value + 3), NULL, 10); + } break; case 'k': @@ -1842,6 +1846,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f flags->session_as = session->as; flags->session_rr = session->rr; flags->session_rs = session->rs; + flags->session_ct = session->ct; flags->session_timing = session->session_timing; for (__auto_type k = session->media_streams.head; k; k = k->next) { @@ -3638,6 +3643,8 @@ static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue 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); } } diff --git a/include/call.h b/include/call.h index 1d10c0aa6..8ccde9ddb 100644 --- a/include/call.h +++ b/include/call.h @@ -571,7 +571,7 @@ struct call_monologue { GHashTable *media_ids; struct media_player *player; struct media_player *rec_player; - int sdp_session_as, sdp_session_rr, sdp_session_rs; + int sdp_session_as, sdp_session_rr, sdp_session_rs, sdp_session_ct; 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 1762a06c6..ddfec46df 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_as, session_rr, session_rs; /* b= bandwidth per session level */ + int session_as, session_rr, session_rs, session_ct; /* b= bandwidth per session level */ /* commands to manipulate attr lines in SDP */ struct sdp_manipulations * sdp_manipulations[__MT_MAX];