Index: sofia.c =================================================================== --- sofia.c (revision 8884) +++ sofia.c (working copy) @@ -1098,6 +1098,8 @@ profile->pflags |= PFLAG_RECIEVED_IN_NAT_REG_CONTACT; } else if (!strcasecmp(var, "aggressive-nat-detection") && switch_true(val)) { profile->pflags |= PFLAG_AGGRESSIVE_NAT_DETECTION; + } else if (!strcasecmp(var, "disable-rtp-auto-adjust") && switch_true(val)) { + profile->pflags |= PFLAG_DISABLE_RTP_AUTOADJ; } else if (!strcasecmp(var, "rfc2833-pt")) { profile->te = (switch_payload_t) atoi(val); } else if (!strcasecmp(var, "cng-pt")) { @@ -3308,5 +3310,5 @@ * c-basic-offset:4 * End: * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4: */ Index: mod_sofia.h =================================================================== --- mod_sofia.h (revision 8884) +++ mod_sofia.h (working copy) @@ -154,7 +154,8 @@ PFLAG_DISABLE_100REL = (1 << 20), PFLAG_AGGRESSIVE_NAT_DETECTION = (1 << 21), PFLAG_RECIEVED_IN_NAT_REG_CONTACT = (1 << 22), - PFLAG_3PCC = (1 << 23) + PFLAG_3PCC = (1 << 23), + PFLAG_DISABLE_RTP_AUTOADJ = (1 << 24) } PFLAGS; typedef enum { Index: sofia_glue.c =================================================================== --- sofia_glue.c (revision 8884) +++ sofia_glue.c (working copy) @@ -725,6 +725,7 @@ char rvp[128] = ""; char *p, *ip_ptr = NULL, *port_ptr = NULL, *vid_port_ptr = NULL; int x; + const char *val; if (switch_strlen_zero(tech_pvt->remote_sdp_str)) { return SWITCH_STATUS_FALSE; @@ -792,8 +793,11 @@ } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "VIDEO RTP CHANGING DEST TO: [%s:%d]\n", tech_pvt->remote_sdp_video_ip, tech_pvt->remote_sdp_video_port); - /* Reactivate the NAT buster flag. */ - switch_rtp_set_flag(tech_pvt->video_rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && + !((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { + /* Reactivate the NAT buster flag. */ + switch_rtp_set_flag(tech_pvt->video_rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + } } } } @@ -812,8 +816,11 @@ } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "AUDIO RTP CHANGING DEST TO: [%s:%d]\n", tech_pvt->remote_sdp_audio_ip, tech_pvt->remote_sdp_audio_port); - /* Reactivate the NAT buster flag. */ - switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && + !((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { + /* Reactivate the NAT buster flag. */ + switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + } } } @@ -1594,8 +1601,11 @@ if (myflags) { flags = myflags; - } else { + } else if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && + !((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_DATAWAIT); + } else { + flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_DATAWAIT); } if (switch_test_flag(tech_pvt, TFLAG_BUGGY_2833)) { @@ -1658,8 +1668,11 @@ } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "AUDIO RTP CHANGING DEST TO: [%s:%d]\n", tech_pvt->remote_sdp_audio_ip, tech_pvt->remote_sdp_audio_port); - /* Reactivate the NAT buster flag. */ - switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && + !((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { + /* Reactivate the NAT buster flag. */ + switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + } } goto video; } @@ -1668,7 +1681,12 @@ if ((status = sofia_glue_tech_proxy_remote_addr(tech_pvt)) != SWITCH_STATUS_SUCCESS) { goto end; } - flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_PROXY_MEDIA | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_DATAWAIT); + if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && + !((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { + flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_PROXY_MEDIA | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_DATAWAIT); + } else { + flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_PROXY_MEDIA | SWITCH_RTP_FLAG_DATAWAIT); + } timer_name = NULL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "PROXY AUDIO RTP [%s] %s:%d->%s:%d codec: %u ms: %d\n", @@ -1790,8 +1808,13 @@ sofia_glue_tech_choose_video_port(tech_pvt, 1); } - flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_AUTOADJ | - SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_NOBLOCK | SWITCH_RTP_FLAG_RAW_WRITE); + if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && + !((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) { + flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_AUTOADJ | + SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_NOBLOCK | SWITCH_RTP_FLAG_RAW_WRITE); + } else { + flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_NOBLOCK | SWITCH_RTP_FLAG_RAW_WRITE); + } if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MEDIA)) { flags |= SWITCH_RTP_FLAG_PROXY_MEDIA; @@ -2900,5 +2923,5 @@ * c-basic-offset:4 * End: * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab: + * vim:set softtabstop=4 shiftwidth=4 tabstop=4: */