}
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);
+ }
}
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);
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());
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;
#include <sofia-sip/sdp.h>
#include <sofia-sip/su.h>
-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
}
-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;
}
-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;
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;
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->hash = switch_ci_hashfunc_default(pmap->iananame, &hlen);
+ }
+
+ pmap->sdp_type = sdp_type;
+
+ if (ptime) {
pmap->ptime = ptime;
+ }
+
+ if (rate) {
pmap->rate = rate;
- pmap->hash = switch_ci_hashfunc_default(pmap->iananame, &hlen);
}
pmap->allocated = 1;
//?
-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;
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);
}
-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;
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) {