MT#56465 sdp_create: refactor bandwidth handling

Collect it all to one union and refactor the code
all around accordingly.

Change-Id: I0c9700735e52e64832363323a29beab8ccfc594f
rfuchs/test
Donat Zenichev 8 months ago
parent 24ff9ce07b
commit a44ee46201

@ -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);

@ -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);

@ -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);
}
}

@ -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` */

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

Loading…
Cancel
Save