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];