diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 3b3cc9af72..81f3bb9997 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -669,6 +669,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) switch_core_media_set_local_sdp(session, b_sdp, SWITCH_TRUE); if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MEDIA)) { + sofia_media_activate_rtp(tech_pvt); switch_core_media_patch_sdp(tech_pvt->session); switch_core_media_proxy_remote_addr(tech_pvt->session, NULL); } diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index de780ef41a..2cb191949f 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1702,6 +1702,7 @@ static void our_sofia_event_callback(nua_event_t event, switch_channel_set_variable_partner(tech_pvt->channel, SWITCH_B_SDP_VARIABLE, r_sdp); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "3PCC-PROXY, Got my ACK\n"); + sofia_media_activate_rtp(tech_pvt); switch_core_media_proxy_remote_addr(tech_pvt->session, r_sdp); sofia_set_flag(tech_pvt, TFLAG_3PCC_HAS_ACK); sofia_clear_flag(tech_pvt, TFLAG_PASS_ACK); @@ -7934,10 +7935,13 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, } } - if (switch_channel_test_flag(channel, CF_PROXY_MEDIA) && !(tech_pvt->profile->mndlb & SM_NDLB_NEVER_PATCH_REINVITE)) { - if (switch_core_media_proxy_remote_addr(session, r_sdp) == SWITCH_STATUS_SUCCESS && !is_t38) { + if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { + sofia_media_activate_rtp(tech_pvt); + switch_core_media_proxy_remote_addr(session, r_sdp); + + if ((tech_pvt->profile->mndlb & SM_NDLB_NEVER_PATCH_REINVITE)) { nua_respond(tech_pvt->nh, SIP_200_OK, TAG_END()); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio params changed, NOT proxying re-invite.\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "NOT proxying re-invite.\n"); switch_core_session_rwunlock(other_session); goto done; } diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 12dd673d29..f413618ede 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1230,9 +1230,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) } if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { - if (switch_core_media_ready(tech_pvt->session, SWITCH_MEDIA_TYPE_AUDIO)) { - switch_core_media_proxy_remote_addr(session, NULL); - } + switch_core_media_proxy_remote_addr(session, NULL); switch_core_media_patch_sdp(tech_pvt->session); } diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 8caa3a88d9..e326004e0b 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -7018,18 +7018,19 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_proxy_remote_addr(switch_core_ } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "VIDEO RTP CHANGING DEST TO: [%s:%d]\n", v_engine->cur_payload_map->remote_sdp_ip, v_engine->cur_payload_map->remote_sdp_port); - if (!switch_media_handle_test_media_flag(smh, SCMF_DISABLE_RTP_AUTOADJ) && !switch_channel_test_flag(session->channel, CF_PROXY_MODE) && - !((val = switch_channel_get_variable(session->channel, "disable_rtp_auto_adjust")) && switch_true(val)) && - !switch_channel_test_flag(session->channel, CF_AVPF)) { - /* Reactivate the NAT buster flag. */ - switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); - } if (switch_media_handle_test_media_flag(smh, SCMF_AUTOFIX_TIMING)) { v_engine->check_frames = 0; } } } } + if (!switch_media_handle_test_media_flag(smh, SCMF_DISABLE_RTP_AUTOADJ) && !switch_channel_test_flag(session->channel, CF_PROXY_MODE) && + !((val = switch_channel_get_variable(session->channel, "disable_rtp_auto_adjust")) && switch_true(val)) && + v_engine->rtp_session && + !switch_channel_test_flag(session->channel, CF_AVPF)) { + /* Reactivate the NAT buster flag. */ + switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + } } if (t_engine->cur_payload_map && t_engine->cur_payload_map->remote_sdp_ip && t_engine->cur_payload_map->remote_sdp_port) { @@ -7056,18 +7057,19 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_proxy_remote_addr(switch_core_ } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "TEXT RTP CHANGING DEST TO: [%s:%d]\n", t_engine->cur_payload_map->remote_sdp_ip, t_engine->cur_payload_map->remote_sdp_port); - if (!switch_media_handle_test_media_flag(smh, SCMF_DISABLE_RTP_AUTOADJ) && !switch_channel_test_flag(session->channel, CF_PROXY_MODE) && - !((val = switch_channel_get_variable(session->channel, "disable_rtp_auto_adjust")) && switch_true(val)) && - !switch_channel_test_flag(session->channel, CF_AVPF)) { - /* Reactivate the NAT buster flag. */ - switch_rtp_set_flag(t_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); - } if (switch_media_handle_test_media_flag(smh, SCMF_AUTOFIX_TIMING)) { t_engine->check_frames = 0; } } } } + if (!switch_media_handle_test_media_flag(smh, SCMF_DISABLE_RTP_AUTOADJ) && !switch_channel_test_flag(session->channel, CF_PROXY_MODE) && + !((val = switch_channel_get_variable(session->channel, "disable_rtp_auto_adjust")) && switch_true(val)) && + t_engine->rtp_session && + !switch_channel_test_flag(session->channel, CF_AVPF)) { + /* Reactivate the NAT buster flag. */ + switch_rtp_set_flag(t_engine->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + } } if (switch_rtp_ready(a_engine->rtp_session)) { @@ -7264,6 +7266,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_choose_port(switch_core_sessio } } + /* Always too late when RTP has already started */ + if (engine->rtp_session) { + return SWITCH_STATUS_SUCCESS; + } + /* Release the local sdp port */ if (engine->local_sdp_port) { switch_rtp_release_port(smh->mparams->rtpip, engine->local_sdp_port);