diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h index b9a0b67625..cfbe9921eb 100644 --- a/src/include/switch_core_media.h +++ b/src/include/switch_core_media.h @@ -292,7 +292,7 @@ SWITCH_DECLARE(stfu_instance_t *) switch_core_media_get_jb(switch_core_session_t SWITCH_DECLARE(switch_rtp_stats_t *) switch_core_media_get_stats(switch_core_session_t *session, switch_media_type_t type, switch_memory_pool_t *pool); -SWITCH_DECLARE(void) switch_core_media_set_sdp_codec_string(switch_core_session_t *session, const char *r_sdp); +SWITCH_DECLARE(void) switch_core_media_set_sdp_codec_string(switch_core_session_t *session, const char *r_sdp, switch_sdp_type_t sdp_type); SWITCH_DECLARE(void) switch_core_media_reset_autofix(switch_core_session_t *session, switch_media_type_t type); SWITCH_DECLARE(void) switch_core_media_check_outgoing_proxy(switch_core_session_t *session, switch_core_session_t *o_session); SWITCH_DECLARE(switch_status_t) switch_core_media_codec_chosen(switch_core_session_t *session, switch_media_type_t media); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 527de9b8fb..cd566c22bd 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -5118,8 +5118,12 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status } tech_pvt->mparams.last_sdp_str = NULL; - if (!sofia_use_soa(tech_pvt) && sip->sip_payload && sip->sip_payload->pl_data) { - tech_pvt->mparams.last_sdp_str = switch_core_session_strdup(session, sip->sip_payload->pl_data); + if (sip->sip_payload && sip->sip_payload->pl_data) { + switch_core_media_set_sdp_codec_string(session, sip->sip_payload->pl_data, SDP_TYPE_RESPONSE); + + if (!sofia_use_soa(tech_pvt)) { + tech_pvt->mparams.last_sdp_str = switch_core_session_strdup(session, sip->sip_payload->pl_data); + } } @@ -5867,9 +5871,9 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Remote SDP:\n%s\n", r_sdp); tech_pvt->mparams.remote_sdp_str = switch_core_session_strdup(session, r_sdp); - if ((sofia_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) || switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND)) { - switch_core_media_set_sdp_codec_string(session, r_sdp); - } + //if ((sofia_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) || switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND)) { + // switch_core_media_set_sdp_codec_string(session, r_sdp, status < 200 ? SDP_TYPE_REQUEST : SDP_TYPE_RESPONSE); + //} sofia_glue_pass_sdp(tech_pvt, (char *) r_sdp); sofia_set_flag(tech_pvt, TFLAG_NEW_SDP); @@ -7882,8 +7886,13 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia const char *from_tag = ""; char *sql = NULL; char *acl_context = NULL; + const char *r_sdp = NULL; + profile->ib_calls++; + if (sip->sip_payload && sip->sip_payload->pl_data) { + r_sdp = sip->sip_payload->pl_data; + } if (!session || (sess_count >= sess_max || !sofia_test_pflag(profile, PFLAG_RUNNING))) { nua_respond(nh, 503, "Maximum Calls In Progress", SIPTAG_RETRY_AFTER_STR("300"), TAG_END()); @@ -7910,6 +7919,12 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia is_nat = "websockets"; } + + if (r_sdp) { + switch_core_media_set_sdp_codec_string(session, r_sdp, SDP_TYPE_REQUEST); + } + + if (sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION)) { if (sip && sip->sip_via) { const char *port = sip->sip_via->v_port; diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 758b2816a4..e55cb537a1 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -40,9 +40,9 @@ #include #include -SWITCH_DECLARE(switch_t38_options_t *) switch_core_media_process_udptl(switch_core_session_t *session, sdp_session_t *sdp, sdp_media_t *m); -SWITCH_DECLARE(void) switch_core_media_find_zrtp_hash(switch_core_session_t *session, sdp_session_t *sdp); -SWITCH_DECLARE(void) switch_core_media_set_r_sdp_codec_string(switch_core_session_t *session, const char *codec_string, sdp_session_t *sdp); +static switch_t38_options_t * switch_core_media_process_udptl(switch_core_session_t *session, sdp_session_t *sdp, sdp_media_t *m); +static void switch_core_media_find_zrtp_hash(switch_core_session_t *session, sdp_session_t *sdp); +static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *session, const char *codec_string, sdp_session_t *sdp, switch_sdp_type_t sdp_type); //#define GOOGLE_ICE #define RTCP_MUX @@ -263,7 +263,7 @@ SWITCH_DECLARE(const char *) switch_core_media_get_zrtp_hash(switch_core_session } -SWITCH_DECLARE(void) switch_core_media_find_zrtp_hash(switch_core_session_t *session, sdp_session_t *sdp) +static void switch_core_media_find_zrtp_hash(switch_core_session_t *session, sdp_session_t *sdp) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_rtp_engine_t *audio_engine; @@ -307,7 +307,7 @@ SWITCH_DECLARE(void) switch_core_media_find_zrtp_hash(switch_core_session_t *ses } -SWITCH_DECLARE(switch_t38_options_t *) switch_core_media_process_udptl(switch_core_session_t *session, sdp_session_t *sdp, sdp_media_t *m) +static switch_t38_options_t * switch_core_media_process_udptl(switch_core_session_t *session, sdp_session_t *sdp, sdp_media_t *m) { switch_t38_options_t *t38_options = switch_channel_get_private(session->channel, "t38_options"); sdp_attribute_t *attr; @@ -481,7 +481,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_get_payload_code(switch_core engine = &smh->engines[type]; switch_mutex_lock(smh->sdp_mutex); - for (pmap = engine->payload_map; pmap && pmap->allocated; pmap = pmap->next) { + for (pmap = engine->payload_map; pmap ; pmap = pmap->next) { + + if (!pmap->allocated) continue; + if (!strcasecmp(pmap->iananame, iananame)) { pt = pmap->pt; recv_pt = pmap->recv_pt; @@ -548,15 +551,22 @@ SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_se pmap = switch_core_alloc(session->pool, sizeof(*pmap)); } - pmap->sdp_type = sdp_type; pmap->type = type; pmap->iananame = switch_core_strdup(session->pool, name); pmap->rm_encoding = pmap->iananame; - pmap->ptime = ptime; - pmap->rate = rate; pmap->hash = switch_ci_hashfunc_default(pmap->iananame, &hlen); } + pmap->sdp_type = sdp_type; + + if (ptime) { + pmap->ptime = ptime; + } + + if (rate) { + pmap->rate = rate; + } + pmap->allocated = 1; pmap->recv_pt = (switch_payload_t)pt; @@ -7701,7 +7711,7 @@ SWITCH_DECLARE(stfu_instance_t *) switch_core_media_get_jb(switch_core_session_t //? -SWITCH_DECLARE(void) switch_core_media_set_sdp_codec_string(switch_core_session_t *session, const char *r_sdp) +SWITCH_DECLARE(void) switch_core_media_set_sdp_codec_string(switch_core_session_t *session, const char *r_sdp, switch_sdp_type_t sdp_type) { sdp_parser_t *parser; sdp_session_t *sdp; @@ -7717,7 +7727,7 @@ SWITCH_DECLARE(void) switch_core_media_set_sdp_codec_string(switch_core_session_ if ((parser = sdp_parse(NULL, r_sdp, (int) strlen(r_sdp), 0))) { if ((sdp = sdp_session(parser))) { - switch_core_media_set_r_sdp_codec_string(session, switch_core_media_get_codec_string(session), sdp); + switch_core_media_set_r_sdp_codec_string(session, switch_core_media_get_codec_string(session), sdp, sdp_type); } sdp_parser_free(parser); @@ -7781,7 +7791,7 @@ static void add_audio_codec(sdp_rtpmap_t *map, int ptime, char *buf, switch_size } -SWITCH_DECLARE(void) switch_core_media_set_r_sdp_codec_string(switch_core_session_t *session, const char *codec_string, sdp_session_t *sdp) +static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *session, const char *codec_string, sdp_session_t *sdp, switch_sdp_type_t sdp_type) { char buf[1024] = { 0 }; sdp_media_t *m; @@ -7839,8 +7849,25 @@ SWITCH_DECLARE(void) switch_core_media_set_r_sdp_codec_string(switch_core_sessio switch_core_media_find_zrtp_hash(session, sdp); switch_core_media_pass_zrtp_hash(session); + for (m = sdp->sdp_media; m; m = m->m_next) { + if ((m->m_type == sdp_media_audio || m->m_type == sdp_media_video) && m->m_port) { + for (map = m->m_rtpmaps; map; map = map->rm_next) { + + switch_core_media_add_payload_map(session, + m->m_type == sdp_media_audio ? SWITCH_MEDIA_TYPE_AUDIO : SWITCH_MEDIA_TYPE_VIDEO, + map->rm_encoding, + sdp_type, + map->rm_pt, + 0, + 0, + SWITCH_FALSE); + } + } + } + for (m = sdp->sdp_media; m; m = m->m_next) { ptime = dptime; + if (m->m_type == sdp_media_image && m->m_port) { switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",t38"); } else if (m->m_type == sdp_media_audio && m->m_port) {