Browse Source

MT#57719 Use media subscriptions: `__update_init_subscribers()`

Start using the media subscriptions model
(based on newly introduced `media_subscription` objects)
in scope of `__update_init_subscribers()`.

Change-Id: I45446239384cf2813d9ae6ecadb2499eefa86ca8
pull/1722/head
Donat Zenichev 2 years ago
parent
commit
d753910691
1 changed files with 26 additions and 12 deletions
  1. +26
    -12
      daemon/call.c

+ 26
- 12
daemon/call.c View File

@ -2526,8 +2526,10 @@ static void __update_init_subscribers(struct call_monologue *ml, GQueue *streams
recording_setup_monologue(ml); recording_setup_monologue(ml);
for (unsigned int j = 0; j < ml->medias->len; j++) {
for (unsigned int j = 0; j < ml->medias->len; j++)
{
struct call_media *media = ml->medias->pdata[j]; struct call_media *media = ml->medias->pdata[j];
if (!media) if (!media)
continue; continue;
@ -2539,24 +2541,21 @@ static void __update_init_subscribers(struct call_monologue *ml, GQueue *streams
__ice_start(media); __ice_start(media);
// update all subscribers
/* update all subscribers */
__reset_streams(media); __reset_streams(media);
for (GList *l = ml->subscribers.head; l; l = l->next) {
struct call_subscription *cs = l->data;
struct call_monologue *sub_ml = cs->monologue;
unsigned int sub_media_idx = j + cs->media_offset;
if (sub_media_idx >= sub_ml->medias->len)
continue;
struct call_media *sub_media = sub_ml->medias->pdata[sub_media_idx];
for (GList *l = media->media_subscribers.head; l; l = l->next)
{
struct media_subscription * ms = l->data;
struct call_media * sub_media = ms->media;
if (!sub_media) if (!sub_media)
continue; continue;
if (__init_streams(media, sub_media, sp, flags, &cs->attrs))
if (__init_streams(media, sub_media, sp, flags, &ms->attrs))
ilog(LOG_WARN, "Error initialising streams"); ilog(LOG_WARN, "Error initialising streams");
} }
// we are now ready to fire up ICE if so desired and requested
ice_update(media->ice_agent, sp, opmode == OP_OFFER); // sp == NULL: update in case rtcp-mux changed
/* we are now ready to fire up ICE if so desired and requested */
ice_update(media->ice_agent, sp, opmode == OP_OFFER); /* sp == NULL: update in case rtcp-mux changed */
recording_setup_media(media); recording_setup_media(media);
t38_gateway_start(media->t38_gateway); t38_gateway_start(media->t38_gateway);
@ -2824,6 +2823,13 @@ int monologue_offer_answer(struct call_monologue *monologues[2], GQueue *streams
* THIS side (recipient) before, then the structs will be populated with * THIS side (recipient) before, then the structs will be populated with
* details already. */ * details already. */
/* if medias still not subscribed to each other, do it now */
if (!call_get_media_subscription(media->media_subscribers_ht, other_media) &&
!call_get_media_subscription(other_media->media_subscribers_ht, media))
{
__subscribe_medias_both_ways(media, other_media);
}
__media_init_from_flags(other_media, media, sp, flags); __media_init_from_flags(other_media, media, sp, flags);
codecs_offer_answer(media, other_media, sp, flags); codecs_offer_answer(media, other_media, sp, flags);
@ -3360,6 +3366,13 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca
struct call_media *dst_media = __get_media(dst_ml, sp, flags, (*index)++); struct call_media *dst_media = __get_media(dst_ml, sp, flags, (*index)++);
struct call_media *src_media = __get_media(src_ml, sp, flags, 0); struct call_media *src_media = __get_media(src_ml, sp, flags, 0);
/* subscribe dst_ml (subscriber) to src_ml, don't forget to carry the egress flag, if required */
__add_media_subscription(dst_media, src_media, &(struct sink_attrs) { .egress = !!flags->egress });
/* mirroring, so vice-versa: src_media gets subscribed to dst_media (subscriber) */
if (flags->rtcp_mirror)
__add_media_subscription(src_media, dst_media,
&(struct sink_attrs) { .egress = !!flags->egress, .rtcp_only = true });
// track media index difference if one ml is subscribed to multiple other mls // track media index difference if one ml is subscribed to multiple other mls
if (idx_diff == 0 && dst_media->index > src_media->index) if (idx_diff == 0 && dst_media->index > src_media->index)
idx_diff = dst_media->index - src_media->index; idx_diff = dst_media->index - src_media->index;
@ -3425,6 +3438,7 @@ int monologue_subscribe_request(const GQueue *srcs, struct call_monologue *dst_m
struct sdp_ng_flags *flags) struct sdp_ng_flags *flags)
{ {
__unsubscribe_from_all(dst_ml); __unsubscribe_from_all(dst_ml);
__unsubscribe_medias_from_all(dst_ml); /* analogy for media subscriptions */
__call_monologue_init_from_flags(dst_ml, flags); __call_monologue_init_from_flags(dst_ml, flags);


Loading…
Cancel
Save