diff --git a/daemon/call.c b/daemon/call.c index 1f34f15cd7..a27bfc7dcf 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -3270,6 +3270,24 @@ struct media_subscription *call_get_media_subscription(subscription_ht ht, struc return l->data; } +/** + * Retrieve top most media subscription of top media for a given call monologue. + * It's useful for offer/answer model cases, + * where most of cases single-to-single subscription model is used. + */ +struct media_subscription *call_get_top_media_subscription(struct call_monologue *ml) { + for (int i = 0; i < ml->medias->len; i++) + { + struct call_media * media = ml->medias->pdata[i]; + if (!media) + continue; + __auto_type subcription = media->media_subscriptions.head; + if (subcription) + return subcription->data; + } + return NULL; +} + /* called with call->master_lock held in W */ __attribute__((nonnull(1, 2, 3))) int monologue_publish(struct call_monologue *ml, sdp_streams_q *streams, sdp_ng_flags *flags) { diff --git a/include/call.h b/include/call.h index ff81585b2a..062840310a 100644 --- a/include/call.h +++ b/include/call.h @@ -803,6 +803,7 @@ void __monologue_viabranch(struct call_monologue *ml, const str *viabranch); struct packet_stream *__packet_stream_new(call_t *call); void __add_media_subscription(struct call_media * which, struct call_media * to, const struct sink_attrs *attrs); +struct media_subscription *call_get_top_media_subscription(struct call_monologue *ml); struct media_subscription *call_get_media_subscription(subscription_ht ht, struct call_media * cm); struct call_monologue * ml_medias_subscribed_to_single_ml(struct call_monologue *ml);