|
|
|
@ -2963,25 +2963,25 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q *
|
|
|
|
|
{
|
|
|
|
|
struct call_media *receiver_media, *sender_media;
|
|
|
|
|
struct endpoint_map *em;
|
|
|
|
|
struct call_monologue *other_ml = monologues[0];
|
|
|
|
|
struct call_monologue *monologue = monologues[1];
|
|
|
|
|
struct call_monologue *sender_ml = monologues[0];
|
|
|
|
|
struct call_monologue *receiver_ml = monologues[1];
|
|
|
|
|
unsigned int num_ports_this, num_ports_other;
|
|
|
|
|
|
|
|
|
|
/* we must have a complete dialogue, even though the to-tag (monologue->tag)
|
|
|
|
|
* may not be known yet */
|
|
|
|
|
if (!other_ml) {
|
|
|
|
|
if (!sender_ml) {
|
|
|
|
|
ilog(LOG_ERROR, "Incomplete dialogue association");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__call_monologue_init_from_flags(other_ml, monologue, flags);
|
|
|
|
|
__call_monologue_init_from_flags(sender_ml, receiver_ml, flags);
|
|
|
|
|
|
|
|
|
|
if (flags->exclude_recording) {
|
|
|
|
|
ML_SET(monologue, NO_RECORDING);
|
|
|
|
|
ML_SET(other_ml, NO_RECORDING);
|
|
|
|
|
ML_SET(receiver_ml, NO_RECORDING);
|
|
|
|
|
ML_SET(sender_ml, NO_RECORDING);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__C_DBG("this="STR_FORMAT" other="STR_FORMAT, STR_FMT(&monologue->tag), STR_FMT(&other_ml->tag));
|
|
|
|
|
__C_DBG("this="STR_FORMAT" other="STR_FORMAT, STR_FMT(&receiver_ml->tag), STR_FMT(&sender_ml->tag));
|
|
|
|
|
|
|
|
|
|
for (__auto_type sp_iter = streams->head; sp_iter; sp_iter = sp_iter->next) {
|
|
|
|
|
struct stream_params *sp = sp_iter->data;
|
|
|
|
@ -2990,16 +2990,15 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q *
|
|
|
|
|
|
|
|
|
|
/* first, check for existence of call_media struct on both sides of
|
|
|
|
|
* the dialogue */
|
|
|
|
|
receiver_media = __get_media(monologue, sp, flags, 0);
|
|
|
|
|
sender_media = __get_media(other_ml, sp, flags, 0);
|
|
|
|
|
receiver_media = __get_media(receiver_ml, sp, flags, 0);
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
/* OTHER is the side which has sent the message. SDP parameters in
|
|
|
|
|
* "sp" are as advertised by OTHER side. The message will be sent to
|
|
|
|
|
* THIS side. Parameters sent to THIS side may be overridden by
|
|
|
|
|
/* 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
|
|
|
|
|
* THIS side (recipient) before, then the structs will be populated with
|
|
|
|
|
* receiver's side before, then the structs will be populated with
|
|
|
|
|
* details already. */
|
|
|
|
|
|
|
|
|
|
/* if medias still not subscribed to each other, do it now */
|
|
|
|
@ -3121,7 +3120,7 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q *
|
|
|
|
|
|
|
|
|
|
// set ipv4/ipv6/mixed media stats
|
|
|
|
|
if (flags->opmode == OP_OFFER || flags->opmode == OP_ANSWER) {
|
|
|
|
|
statistics_update_ip46_inc_dec(monologue->call, CMC_INCREMENT);
|
|
|
|
|
statistics_update_ip46_inc_dec(receiver_ml->call, CMC_INCREMENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|