From a44ee462010aa9ecb8f5238f07bec3c354a6d7b1 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Fri, 13 Sep 2024 14:48:15 +0200 Subject: [PATCH] MT#56465 sdp_create: refactor bandwidth handling Collect it all to one union and refactor the code all around accordingly. Change-Id: I0c9700735e52e64832363323a29beab8ccfc594f --- daemon/call.c | 24 ++++++++---------- daemon/redis.c | 40 +++++++++++++++++------------ daemon/sdp.c | 53 ++++++++++++++++++--------------------- include/call.h | 17 ++++++++++--- include/call_interfaces.h | 2 +- 5 files changed, 74 insertions(+), 62 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 21b11afc6..46540c7ad 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -666,7 +666,7 @@ struct call_media *call_media_new(call_t *call) { med->media_subscriptions_ht = subscription_ht_new(); mutex_init(&med->dtmf_lock); med->sdp_attr_print = sdp_insert_media_attributes; - med->bandwidth_as = med->bandwidth_rr = med->bandwidth_rs = -1; + RESET_BANDWIDTH(med->sdp_media_bandwidth, -1); return med; } @@ -2666,14 +2666,14 @@ 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) - ml->sdp_session_rs = flags->session_rs; - if (flags->session_ct >= 0) - ml->sdp_session_ct = flags->session_ct; + if (flags->session_bandwidth.as >= 0) + ml->sdp_session_bandwidth.as = flags->session_bandwidth.as; + if (flags->session_bandwidth.rr >= 0) + ml->sdp_session_bandwidth.rr = flags->session_bandwidth.rr; + if (flags->session_bandwidth.rs >= 0) + ml->sdp_session_bandwidth.rs = flags->session_bandwidth.rs; + if (flags->session_bandwidth.ct >= 0) + ml->sdp_session_bandwidth.ct = flags->session_bandwidth.ct; } // reset offer ipv4/ipv6/mixed media stats @@ -2898,9 +2898,7 @@ static void __media_init_from_flags(struct call_media *other_media, struct call_ } /* bandwidth */ - other_media->bandwidth_as = sp->media_session_as; - other_media->bandwidth_rr = sp->media_session_rr; - other_media->bandwidth_rs = sp->media_session_rs; + other_media->sdp_media_bandwidth = sp->media_session_bandiwdth; } unsigned int proto_num_ports(unsigned int sp_ports, struct call_media *media, sdp_ng_flags *flags, @@ -4237,7 +4235,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 = ret->sdp_session_ct = -1; + RESET_BANDWIDTH(ret->sdp_session_bandwidth, -1); gettimeofday(&ret->started, NULL); diff --git a/daemon/redis.c b/daemon/redis.c index f0b5fddb1..a9d504ebb 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1106,6 +1106,7 @@ define_get_int_type(time_t, time_t, strtoull); define_get_int_type(timeval, struct timeval, strtotimeval); define_get_int_type(int, int, strtol); define_get_int_type(llu, unsigned long long, strtoll); +define_get_int_type(ld, long, strtoll); define_get_int_type(unsigned, unsigned int, strtol); //define_get_int_type(u16, uint16_t, strtol); //define_get_int_type(u64, uint64_t, strtoull); @@ -1458,6 +1459,7 @@ static int redis_streams(call_t *c, struct redis_list *streams) { static int redis_tags(call_t *c, struct redis_list *tags, parser_arg arg) { unsigned int i; int ii; + long il; atomic64 a64; struct redis_hash *rh; struct call_monologue *ml; @@ -1529,8 +1531,10 @@ static int redis_tags(call_t *c, struct redis_list *tags, parser_arg arg) { ml->session_last_sdp_orig->address.address = str_dup_str(&s); } - ml->sdp_session_rr = (!redis_hash_get_int(&ii, rh, "sdp_session_rr")) ? ii : -1; - ml->sdp_session_rs = (!redis_hash_get_int(&ii, rh, "sdp_session_rs")) ? ii : -1; + ml->sdp_session_bandwidth.as = (!redis_hash_get_ld(&il, rh, "sdp_session_as")) ? il : -1; + ml->sdp_session_bandwidth.ct = (!redis_hash_get_ld(&il, rh, "sdp_session_ct")) ? il : -1; + ml->sdp_session_bandwidth.rr = (!redis_hash_get_ld(&il, rh, "sdp_session_rr")) ? il : -1; + ml->sdp_session_bandwidth.rs = (!redis_hash_get_ld(&il, rh, "sdp_session_rs")) ? il : -1; if (redis_hash_get_str(&s, rh, "desired_family")) return -1; @@ -1576,7 +1580,7 @@ static int json_medias(call_t *c, struct redis_list *medias, struct redis_list * parser_arg arg) { unsigned int i; - int ii; + long il; struct redis_hash *rh; struct call_media *med; str s; @@ -1628,9 +1632,9 @@ static int json_medias(call_t *c, struct redis_list *medias, struct redis_list * return -1; /* bandwidth data is not critical */ - med->bandwidth_as = (!redis_hash_get_int(&ii, rh, "bandwidth_as")) ? ii : -1; - med->bandwidth_rr = (!redis_hash_get_int(&ii, rh, "bandwidth_rr")) ? ii : -1; - med->bandwidth_rs = (!redis_hash_get_int(&ii, rh, "bandwidth_rs")) ? ii : -1; + med->sdp_media_bandwidth.as = (!redis_hash_get_ld(&il, rh, "bandwidth_as")) ? il : -1; + med->sdp_media_bandwidth.rr = (!redis_hash_get_ld(&il, rh, "bandwidth_rr")) ? il : -1; + med->sdp_media_bandwidth.rs = (!redis_hash_get_ld(&il, rh, "bandwidth_rs")) ? il : -1; json_build_list_cb(NULL, c, "payload_types", i, NULL, rbl_cb_plts_r, med, arg); /* XXX dtls */ @@ -2571,10 +2575,14 @@ static str redis_encode_json(ng_parser_ctx_t *ctx, call_t *c, void **to_free) { JSON_SET_SIMPLE_STR("last_sdp_orig_address_address", &ml->session_last_sdp_orig->address.address); } - if (ml->sdp_session_rr >= 0) - JSON_SET_SIMPLE("sdp_session_rr", "%i", ml->sdp_session_rr); - if (ml->sdp_session_rs >= 0) - JSON_SET_SIMPLE("sdp_session_rs", "%i", ml->sdp_session_rs); + if (ml->sdp_session_bandwidth.as >= 0) + JSON_SET_SIMPLE("sdp_session_as", "%ld", ml->sdp_session_bandwidth.as); + if (ml->sdp_session_bandwidth.ct >= 0) + JSON_SET_SIMPLE("sdp_session_ct", "%ld", ml->sdp_session_bandwidth.ct); + if (ml->sdp_session_bandwidth.rr >= 0) + JSON_SET_SIMPLE("sdp_session_rr", "%ld", ml->sdp_session_bandwidth.rr); + if (ml->sdp_session_bandwidth.rs >= 0) + JSON_SET_SIMPLE("sdp_session_rs", "%ld", ml->sdp_session_bandwidth.rs); } // other_tags and medias- was here before @@ -2664,12 +2672,12 @@ static str redis_encode_json(ng_parser_ctx_t *ctx, call_t *c, void **to_free) { JSON_SET_SIMPLE("maxptime","%i", media->maxptime); JSON_SET_SIMPLE("media_flags", "%" PRIu64, atomic64_get_na(&media->media_flags)); - if (media->bandwidth_as >= 0) - JSON_SET_SIMPLE("bandwidth_as","%i", media->bandwidth_as); - if (media->bandwidth_rr >= 0) - JSON_SET_SIMPLE("bandwidth_rr","%i", media->bandwidth_rr); - if (media->bandwidth_rs >= 0) - JSON_SET_SIMPLE("bandwidth_rs","%i", media->bandwidth_rs); + if (media->sdp_media_bandwidth.as >= 0) + JSON_SET_SIMPLE("bandwidth_as","%ld", media->sdp_media_bandwidth.as); + if (media->sdp_media_bandwidth.rr >= 0) + JSON_SET_SIMPLE("bandwidth_rr","%ld", media->sdp_media_bandwidth.rr); + if (media->sdp_media_bandwidth.rs >= 0) + JSON_SET_SIMPLE("bandwidth_rs","%ld", media->sdp_media_bandwidth.rs); json_update_sdes_params(parser, inner, "media", media->unique_id, "sdes_in", &media->sdes_in); diff --git a/daemon/sdp.c b/daemon/sdp.c index b0a076451..f664cae7e 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, ct; + struct session_bandwidth bandwidth; struct sdp_attributes attributes; sdp_media_q media_streams; }; @@ -123,7 +123,7 @@ struct sdp_media { struct sdp_connection connection; const char *c_line_pos; - int as, rr, rs; + struct session_bandwidth bandwidth; struct sdp_attributes attributes; str_slice_q format_list; /* list of slice-alloc'd str objects */ enum media_type media_type_id; @@ -1294,7 +1294,7 @@ new_session: t_queue_push_tail(sessions, session); media = NULL; session->s.s = b; - session->as = session->rr = session->rs = session->ct = -1; + RESET_BANDWIDTH(session->bandwidth, -1); break; @@ -1320,7 +1320,7 @@ new_session: goto error; t_queue_push_tail(&session->media_streams, media); media->s.s = b; - media->rr = media->rs = media->as = -1; + RESET_BANDWIDTH(media->bandwidth, -1); media->media_sdp_id = media_sdp_id++; break; @@ -1364,17 +1364,17 @@ new_session: /* AS, RR, RS */ if (!memcmp(value, "AS:", 3)) { - *(media ? &media->as : &session->as) = strtol((value + 3), NULL, 10); + *(media ? &media->bandwidth.as : &session->bandwidth.as) = strtol((value + 3), NULL, 10); } else if (!memcmp(value, "RR:", 3)) { - *(media ? &media->rr : &session->rr) = strtol((value + 3), NULL, 10); + *(media ? &media->bandwidth.rr : &session->bandwidth.rr) = strtol((value + 3), NULL, 10); } else if (!memcmp(value, "RS:", 3)) { - *(media ? &media->rs : &session->rs) = strtol((value + 3), NULL, 10); + *(media ? &media->bandwidth.rs : &session->bandwidth.rs) = strtol((value + 3), NULL, 10); } /* CT has only session level */ else if (!memcmp(value, "CT:", 3)) { - session->ct = strtol((value + 3), NULL, 10); + session->bandwidth.ct = strtol((value + 3), NULL, 10); } break; @@ -1843,10 +1843,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_ct = session->ct; + flags->session_bandwidth = session->bandwidth; flags->session_timing = session->session_timing; for (__auto_type k = session->media_streams.head; k; k = k->next) { @@ -1885,9 +1882,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f bf_set_clear(&sp->sp_flags, SP_FLAG_MEDIA_HANDOVER, flags->media_handover); /* b= (bandwidth), is parsed in sdp_parse() */ - sp->media_session_as = media->as; - sp->media_session_rr = media->rr; - sp->media_session_rs = media->rs; + sp->media_session_bandiwdth = media->bandwidth; // a=ptime attr = attr_get_by_id(&media->attributes, ATTR_PTIME); @@ -3627,12 +3622,12 @@ static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue struct media_subscription *ms = media->media_subscriptions.head ? media->media_subscriptions.head->data : NULL; if (!ms || !ms->media) return; - if (ms->media->bandwidth_as >= 0) - g_string_append_printf(out, "b=AS:%d\r\n", ms->media->bandwidth_as); - if (ms->media->bandwidth_rr >= 0) - g_string_append_printf(out, "b=RR:%d\r\n", ms->media->bandwidth_rr); - if (ms->media->bandwidth_rs >= 0) - g_string_append_printf(out, "b=RS:%d\r\n", ms->media->bandwidth_rs); + if (ms->media->sdp_media_bandwidth.as >= 0) + g_string_append_printf(out, "b=AS:%ld\r\n", ms->media->sdp_media_bandwidth.as); + if (ms->media->sdp_media_bandwidth.rr >= 0) + g_string_append_printf(out, "b=RR:%ld\r\n", ms->media->sdp_media_bandwidth.rr); + if (ms->media->sdp_media_bandwidth.rs >= 0) + g_string_append_printf(out, "b=RS:%ld\r\n", ms->media->sdp_media_bandwidth.rs); } else { /* sdp bandwidth per session/media level @@ -3640,14 +3635,14 @@ 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) - 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); + if (ms->monologue->sdp_session_bandwidth.as >= 0) + g_string_append_printf(out, "b=AS:%ld\r\n", ms->monologue->sdp_session_bandwidth.as); + if (ms->monologue->sdp_session_bandwidth.rr >= 0) + g_string_append_printf(out, "b=RR:%ld\r\n", ms->monologue->sdp_session_bandwidth.rr); + if (ms->monologue->sdp_session_bandwidth.rs >= 0) + g_string_append_printf(out, "b=RS:%ld\r\n", ms->monologue->sdp_session_bandwidth.rs); + if (ms->monologue->sdp_session_bandwidth.ct >= 0) + g_string_append_printf(out, "b=CT:%ld\r\n", ms->monologue->sdp_session_bandwidth.ct); } } diff --git a/include/call.h b/include/call.h index 8ccde9ddb..dda420798 100644 --- a/include/call.h +++ b/include/call.h @@ -79,6 +79,14 @@ enum message_type { || (opmode == OP_UNBLOCK_DTMF || opmode == OP_UNBLOCK_MEDIA) \ || (opmode == OP_START_FORWARDING || opmode == OP_STOP_FORWARDING)) +#define RESET_BANDWIDTH(union_var, value) \ + do { \ + union_var.as = value; \ + union_var.rr = value; \ + union_var.rs = value; \ + union_var.ct = value; \ + } while(0) + enum call_media_counted { CMC_INCREMENT = 0, CMC_DECREMENT, @@ -317,6 +325,9 @@ TYPED_DIRECT_FUNCS(media_direct_hash, media_direct_eq, struct call_media) TYPED_GHASHTABLE(subscription_ht, struct call_media, subscription_list, media_direct_hash, media_direct_eq, NULL, NULL) +struct session_bandwidth { + long as, rr, rs, ct; +}; struct codec_store { codecs_ht codecs; // int payload type -> rtp_payload_type @@ -357,7 +368,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 session_bandwidth media_session_bandiwdth; }; struct endpoint_map { @@ -517,7 +528,7 @@ struct call_media { int media_sdp_id; /* bandwidth */ - int bandwidth_as, bandwidth_rr, bandwidth_rs; + struct session_bandwidth sdp_media_bandwidth; #ifdef WITH_TRANSCODING encoder_callback_t encoder_callback; @@ -571,7 +582,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, sdp_session_ct; + struct session_bandwidth sdp_session_bandwidth; 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 ddfec46df..57667972b 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, session_ct; /* b= bandwidth per session level */ + struct session_bandwidth session_bandwidth; /* commands to manipulate attr lines in SDP */ struct sdp_manipulations * sdp_manipulations[__MT_MAX];