diff --git a/daemon/call.c b/daemon/call.c index 77b94733d..d87affbdd 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2962,7 +2962,7 @@ static void media_update_transcoding_flag(struct call_media *media) { int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q *streams, sdp_ng_flags *flags) { - struct call_media *receiver_media, *sender_media; + struct call_media *receiver_media, *sender_media = NULL; struct endpoint_map *em; struct call_monologue *sender_ml = monologues[0]; struct call_monologue *receiver_ml = monologues[1]; @@ -2990,13 +2990,35 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q * __C_DBG("processing media stream #%u", sp->index); assert(sp->index > 0); - /* first, check for existence of call_media struct on both sides of - * the dialogue */ - receiver_media = __get_media(receiver_ml, sp, flags, 0); + /** + * for an offer, a sequence in which the medias are gotten by index, matters. + * This affects later the sequencing of medias, e.g. for subscribe requests. + */ + + /* OP_OFFER, receiver's side, get by index */ + receiver_media = NULL; + if (is_offer) + receiver_media = __get_media(receiver_ml, sp, flags, 0); + + /* OP_OFFER/OP_ANSWER, sender's side, get by index */ sender_media = __get_media(sender_ml, sp, flags, 0); - receiver_media->media_sdp_id = sp->media_sdp_id; sender_media->media_sdp_id = sp->media_sdp_id; + /* OP_ANSWER, receiver's side, only media subscriptions lookup */ + if (!is_offer) + { + if (sender_media->media_subscriptions.head) { + __auto_type sender_media_it = sender_media->media_subscriptions.head; + struct media_subscription *ms = sender_media_it->data; + receiver_media = ms->media; + } + else { + ilog(LOG_WARNING, "No matching media (index: %d) for answer using subscription, just use an index.", sp->index); + receiver_media = __get_media(receiver_ml, sp, flags, 0); + } + } + receiver_media->media_sdp_id = sp->media_sdp_id; + /* SDP parameters in "sp" are advertised by sender side. * Parameters sent to receiver side may be overridden by * what's in "flags". If this is an answer, or if we have talked to