MT#57719 call_interfaces: Use media subscriptions

Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of:
- `ng_stats_monologue()`
- `ng_call_stats()`

Change-Id: I158aedd1fae9d65135144b3331089bfc11020f13
pull/1722/head
Donat Zenichev 2 years ago
parent 530a569d1e
commit d1e29f1dff

@ -2335,20 +2335,43 @@ static void ng_stats_monologue(bencode_item_t *dict, const struct call_monologue
if (ml->label.s)
bencode_dictionary_add_str(sub, "label", &ml->label);
bencode_dictionary_add_integer(sub, "created", ml->created);
bencode_item_t *subs = bencode_dictionary_add_list(sub, "subscriptions");
for (GList *l = ml->subscriptions.head; l; l = l->next) {
struct call_subscription *cs = l->data;
bencode_item_t *sub1 = bencode_list_add_dictionary(subs);
bencode_dictionary_add_str(sub1, "tag", &cs->monologue->tag);
bencode_dictionary_add_string(sub1, "type", cs->attrs.offer_answer ? "offer/answer" : "pub/sub");
}
subs = bencode_dictionary_add_list(sub, "subscribers");
for (GList *l = ml->subscribers.head; l; l = l->next) {
struct call_subscription *cs = l->data;
bencode_item_t *sub1 = bencode_list_add_dictionary(subs);
bencode_dictionary_add_str(sub1, "tag", &cs->monologue->tag);
bencode_dictionary_add_string(sub1, "type", cs->attrs.offer_answer ? "offer/answer" : "pub/sub");
bencode_item_t *b_subscriptions = bencode_dictionary_add_list(sub, "subscriptions");
bencode_item_t *b_subscribers = bencode_dictionary_add_list(sub, "subscribers");
AUTO_CLEANUP(GQueue mls_subscriptions, g_queue_clear) = G_QUEUE_INIT; /* to avoid duplications */
AUTO_CLEANUP(GQueue mls_subscribers, g_queue_clear) = G_QUEUE_INIT; /* to avoid duplications */
for (int i = 0; i < ml->medias->len; i++)
{
struct call_media * media = ml->medias->pdata[i];
if (!media)
continue;
for (GList * subscription = media->media_subscriptions.head;
subscription;
subscription = subscription->next)
{
struct media_subscription * ms = subscription->data;
if (!g_queue_find(&mls_subscriptions, ms->monologue)) {
bencode_item_t *sub1 = bencode_list_add_dictionary(b_subscriptions);
bencode_dictionary_add_str(sub1, "tag", &ms->monologue->tag);
bencode_dictionary_add_string(sub1, "type", ms->attrs.offer_answer ? "offer/answer" : "pub/sub");
g_queue_push_tail(&mls_subscriptions, ms->monologue);
}
}
for (GList * subscriber = media->media_subscribers.head;
subscriber;
subscriber = subscriber->next)
{
struct media_subscription * ms = subscriber->data;
if (!g_queue_find(&mls_subscribers, ms->monologue)) {
bencode_item_t *sub1 = bencode_list_add_dictionary(b_subscribers);
bencode_dictionary_add_str(sub1, "tag", &ms->monologue->tag);
bencode_dictionary_add_string(sub1, "type", ms->attrs.offer_answer ? "offer/answer" : "pub/sub");
g_queue_push_tail(&mls_subscribers, ms->monologue);
}
}
}
ng_stats_ssrc(ssrc, ml->ssrc_hash);
medias = bencode_dictionary_add_list(sub, "medias");
@ -2474,9 +2497,23 @@ stats:
ml = call_get_monologue(call, match_tag);
if (ml) {
ng_stats_monologue(tags, ml, totals, ssrc);
for (GList *k = ml->subscriptions.head; k; k = k->next) {
struct call_subscription *cs = k->data;
ng_stats_monologue(tags, cs->monologue, totals, ssrc);
AUTO_CLEANUP(GQueue mls, g_queue_clear) = G_QUEUE_INIT; /* to avoid duplications */
for (int i = 0; i < ml->medias->len; i++)
{
struct call_media * media = ml->medias->pdata[i];
if (!media)
continue;
for (GList * subscription = media->media_subscriptions.head;
subscription;
subscription = subscription->next)
{
struct media_subscription * ms = subscription->data;
if (!g_queue_find(&mls, ms->monologue)) {
ng_stats_monologue(tags, ms->monologue, totals, ssrc);
g_queue_push_tail(&mls, ms->monologue);
}
}
}
}
}

Loading…
Cancel
Save