From f811652699c4a7394cab2d48a38918ba65a602a9 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 20 Oct 2016 15:54:17 -0500 Subject: [PATCH] FS-9654 #resolve [Issue with RTP payload negotiation] --- src/include/switch_types.h | 1 - src/switch_core_media.c | 97 ++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 8dc2472f81..cdd7cc58c1 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -2542,7 +2542,6 @@ typedef struct payload_map_s { char *rm_fmtp; - switch_payload_t agreed_pt; switch_payload_t recv_pt; char *fmtp_out; diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 0ade8c2d6c..e70d662d31 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -760,23 +760,35 @@ SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_se switch_mutex_lock(smh->sdp_mutex); for (pmap = engine->payload_map; pmap && pmap->allocated; pmap = pmap->next) { - exists = (!strcasecmp(name, pmap->iananame) && pmap->pt == pt && (!pmap->rate || rate == pmap->rate) && (!pmap->ptime || pmap->ptime == ptime)); - - if (exists) { - - if (!zstr(fmtp) && !zstr(pmap->rm_fmtp)) { - if (strcmp(pmap->rm_fmtp, fmtp)) { - exists = 0; - local_pt = pmap->pt; - continue; - } + if (sdp_type == SDP_TYPE_RESPONSE) { + switch(type) { + case SWITCH_MEDIA_TYPE_AUDIO: + exists = (type == pmap->type && !strcasecmp(name, pmap->iananame) && pmap->pt == pt && (!pmap->rate || rate == pmap->rate) && (!pmap->ptime || pmap->ptime == ptime)); + break; + case SWITCH_MEDIA_TYPE_VIDEO: + exists = (type == pmap->type && !strcasecmp(name, pmap->iananame)); + break; } + + if (exists) break; + + } else { + exists = (type == pmap->type && !strcasecmp(name, pmap->iananame) && pmap->pt == pt && (!pmap->rate || rate == pmap->rate) && (!pmap->ptime || pmap->ptime == ptime)); + + if (exists) { + if (!zstr(fmtp) && !zstr(pmap->rm_fmtp)) { + if (strcmp(pmap->rm_fmtp, fmtp)) { + exists = 0; + local_pt = pmap->pt; + continue; + } + } - break; + break; + } } } - if (!exists) { switch_ssize_t hlen = -1; @@ -2535,7 +2547,6 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_read_frame(switch_core_session (!smh->mparams->recv_te || engine->read_frame.payload != smh->mparams->recv_te) && (!smh->mparams->te || engine->read_frame.payload != smh->mparams->te) && engine->read_frame.payload != engine->cur_payload_map->recv_pt && - engine->read_frame.payload != engine->cur_payload_map->agreed_pt && engine->read_frame.payload != engine->cur_payload_map->pt) { payload_map_t *pmap; @@ -2543,7 +2554,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_read_frame(switch_core_session switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "alternate payload received (received %d, expecting %d)\n", - (int) engine->read_frame.payload, (int) engine->cur_payload_map->agreed_pt); + (int) engine->read_frame.payload, (int) engine->cur_payload_map->pt); /* search for payload type */ @@ -2835,8 +2846,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_codec(switch_core_se v_engine->write_codec.fmtp_out = switch_core_session_strdup(session, v_engine->write_codec.fmtp_out); - v_engine->write_codec.agreed_pt = v_engine->cur_payload_map->agreed_pt; - v_engine->read_codec.agreed_pt = v_engine->cur_payload_map->agreed_pt; + v_engine->write_codec.agreed_pt = v_engine->cur_payload_map->pt; + v_engine->read_codec.agreed_pt = v_engine->cur_payload_map->pt; switch_core_session_set_video_read_codec(session, &v_engine->read_codec); switch_core_session_set_video_write_codec(session, &v_engine->write_codec); @@ -2851,7 +2862,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_codec(switch_core_se msg.from = __FILE__; msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ; - switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->agreed_pt); + switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->pt); //XX @@ -3024,8 +3035,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_codec(switch_core_session_ a_engine->read_impl.samples_per_packet, a_engine->read_impl.bits_per_second, a_engine->read_impl.number_of_channels); a_engine->read_frame.codec = &a_engine->read_codec; a_engine->read_frame.channels = a_engine->read_impl.number_of_channels; - a_engine->write_codec.agreed_pt = a_engine->cur_payload_map->agreed_pt; - a_engine->read_codec.agreed_pt = a_engine->cur_payload_map->agreed_pt; + a_engine->write_codec.agreed_pt = a_engine->cur_payload_map->pt; + a_engine->read_codec.agreed_pt = a_engine->cur_payload_map->pt; if (force != 2) { switch_core_session_set_real_read_codec(session, &a_engine->read_codec); @@ -4496,8 +4507,6 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s pmap->remote_sdp_port = (switch_port_t) m->m_port; pmap->rm_fmtp = switch_core_session_strdup(session, (char *) mmap->rm_fmtp); - pmap->agreed_pt = (switch_payload_t) mmap->rm_pt; - smh->negotiated_codecs[smh->num_negotiated_codecs++] = mimp; pmap->recv_pt = (switch_payload_t)mmap->rm_pt; @@ -4901,8 +4910,6 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s pmap->rm_fmtp = switch_core_session_strdup(session, (char *) map->rm_fmtp); - pmap->agreed_pt = (switch_payload_t) map->rm_pt; - smh->negotiated_codecs[smh->num_negotiated_codecs++] = mimp; #if 0 @@ -4916,7 +4923,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s switch_channel_set_variable(session->channel, SWITCH_REMOTE_VIDEO_IP_VARIABLE, v_engine->cur_payload_map->remote_sdp_ip); switch_channel_set_variable(session->channel, SWITCH_REMOTE_VIDEO_PORT_VARIABLE, tmp); switch_channel_set_variable(session->channel, "rtp_video_fmtp", v_engine->cur_payload_map->rm_fmtp); - switch_snprintf(tmp, sizeof(tmp), "%d", v_engine->cur_payload_map->agreed_pt); + switch_snprintf(tmp, sizeof(tmp), "%d", v_engine->cur_payload_map->pt); switch_channel_set_variable(session->channel, "rtp_video_pt", tmp); switch_core_media_check_video_codecs(session); switch_snprintf(tmp, sizeof(tmp), "%d", v_engine->cur_payload_map->recv_pt); @@ -4977,7 +4984,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s pmap->remote_sdp_ip = "127.0.0.1"; pmap->remote_sdp_port = 9999; - pmap->agreed_pt = 97; + pmap->pt = 97; pmap->recv_pt = 97; pmap->codec_ms = 20; a_engine->cur_payload_map = pmap; @@ -5727,7 +5734,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_start_video_thread(switch_co switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Starting Video thread\n", switch_core_session_get_name(session)); if (v_engine->rtp_session) { - switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->agreed_pt); + switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->pt); } v_engine->mh.session = session; @@ -6595,7 +6602,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi a_engine->local_sdp_ip, a_engine->local_sdp_port, a_engine->cur_payload_map->remote_sdp_ip, - a_engine->cur_payload_map->remote_sdp_port, a_engine->cur_payload_map->agreed_pt, a_engine->read_impl.microseconds_per_packet / 1000); + a_engine->cur_payload_map->remote_sdp_port, a_engine->cur_payload_map->pt, a_engine->read_impl.microseconds_per_packet / 1000); //XX } @@ -6661,10 +6668,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi a_engine->cur_payload_map->remote_sdp_ip, a_engine->cur_payload_map->remote_sdp_port, a_engine->cur_payload_map->remote_sdp_ip, - a_engine->cur_payload_map->remote_sdp_port, a_engine->cur_payload_map->agreed_pt, a_engine->read_impl.microseconds_per_packet / 1000); + a_engine->cur_payload_map->remote_sdp_port, a_engine->cur_payload_map->pt, a_engine->read_impl.microseconds_per_packet / 1000); if (switch_rtp_ready(a_engine->rtp_session)) { - switch_rtp_set_default_payload(a_engine->rtp_session, a_engine->cur_payload_map->agreed_pt); + switch_rtp_set_default_payload(a_engine->rtp_session, a_engine->cur_payload_map->pt); } } else { @@ -6682,7 +6689,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi a_engine->local_sdp_port, a_engine->cur_payload_map->remote_sdp_ip, a_engine->cur_payload_map->remote_sdp_port, - a_engine->cur_payload_map->agreed_pt, + a_engine->cur_payload_map->pt, a_engine->read_impl.samples_per_packet, a_engine->cur_payload_map->codec_ms * 1000, flags, timer_name, &err, switch_core_session_get_pool(session)); @@ -6717,7 +6724,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi switch_channel_set_flag(session->channel, CF_FS_RTP); - switch_channel_set_variable_printf(session->channel, "rtp_use_pt", "%d", a_engine->cur_payload_map->agreed_pt); + switch_channel_set_variable_printf(session->channel, "rtp_use_pt", "%d", a_engine->cur_payload_map->pt); if ((val = switch_channel_get_variable(session->channel, "rtp_enable_vad_in")) && switch_true(val)) { vad_in = 1; @@ -6982,9 +6989,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "VIDEO RTP [%s] %s port %d -> %s port %d codec: %u\n", switch_channel_get_name(session->channel), v_engine->local_sdp_ip, v_engine->local_sdp_port, v_engine->cur_payload_map->remote_sdp_ip, - v_engine->cur_payload_map->remote_sdp_port, v_engine->cur_payload_map->agreed_pt); + v_engine->cur_payload_map->remote_sdp_port, v_engine->cur_payload_map->pt); - switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->agreed_pt); + switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->pt); } } @@ -7041,10 +7048,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi a_engine->cur_payload_map->remote_sdp_ip, v_engine->local_sdp_port, v_engine->cur_payload_map->remote_sdp_ip, - v_engine->cur_payload_map->remote_sdp_port, v_engine->cur_payload_map->agreed_pt, v_engine->read_impl.microseconds_per_packet / 1000); + v_engine->cur_payload_map->remote_sdp_port, v_engine->cur_payload_map->pt, v_engine->read_impl.microseconds_per_packet / 1000); if (switch_rtp_ready(v_engine->rtp_session)) { - switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->agreed_pt); + switch_rtp_set_default_payload(v_engine->rtp_session, v_engine->cur_payload_map->pt); } } else { timer_name = smh->mparams->timer_name; @@ -7104,7 +7111,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi v_engine->local_sdp_port, v_engine->cur_payload_map->remote_sdp_ip, v_engine->cur_payload_map->remote_sdp_port, - v_engine->cur_payload_map->agreed_pt, + v_engine->cur_payload_map->pt, 1, 90000, flags, NULL, &err, switch_core_session_get_pool(session)); @@ -7114,7 +7121,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi a_engine->local_sdp_ip, v_engine->local_sdp_port, v_engine->cur_payload_map->remote_sdp_ip, - v_engine->cur_payload_map->remote_sdp_port, v_engine->cur_payload_map->agreed_pt, + v_engine->cur_payload_map->remote_sdp_port, v_engine->cur_payload_map->pt, 0, switch_rtp_ready(v_engine->rtp_session) ? "SUCCESS" : err); @@ -7256,7 +7263,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi //XX - switch_channel_set_variable_printf(session->channel, "rtp_use_video_pt", "%d", v_engine->cur_payload_map->agreed_pt); + switch_channel_set_variable_printf(session->channel, "rtp_use_video_pt", "%d", v_engine->cur_payload_map->pt); v_engine->ssrc = switch_rtp_get_ssrc(v_engine->rtp_session); switch_channel_set_variable_printf(session->channel, "rtp_use_video_ssrc", "%u", v_engine->ssrc); @@ -8144,14 +8151,14 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (a_engine->cur_payload_map->adv_channels > 1) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d/%d\r\n", - a_engine->cur_payload_map->agreed_pt, a_engine->cur_payload_map->rm_encoding, rate, a_engine->cur_payload_map->adv_channels); + a_engine->cur_payload_map->pt, a_engine->cur_payload_map->rm_encoding, rate, a_engine->cur_payload_map->adv_channels); } else { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d\r\n", - a_engine->cur_payload_map->agreed_pt, a_engine->cur_payload_map->rm_encoding, rate); + a_engine->cur_payload_map->pt, a_engine->cur_payload_map->rm_encoding, rate); } if (fmtp_out) { - switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=fmtp:%d %s\r\n", a_engine->cur_payload_map->agreed_pt, fmtp_out); + switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=fmtp:%d %s\r\n", a_engine->cur_payload_map->pt, fmtp_out); } if (switch_media_handle_test_media_flag(smh, SCMF_MULTI_ANSWER_AUDIO)) { @@ -8474,7 +8481,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (v_engine->codec_negotiated) { payload_map_t *pmap; switch_core_media_set_video_codec(session, 0); - switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), " %d", v_engine->cur_payload_map->agreed_pt); + switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), " %d", v_engine->cur_payload_map->pt); if (switch_media_handle_test_media_flag(smh, SCMF_MULTI_ANSWER_VIDEO)) { switch_mutex_lock(smh->sdp_mutex); @@ -8717,7 +8724,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (v_engine->codec_negotiated) { - add_fb(buf, SDPBUFLEN, v_engine->cur_payload_map->agreed_pt, v_engine->fir || fir, + add_fb(buf, SDPBUFLEN, v_engine->cur_payload_map->pt, v_engine->fir || fir, v_engine->nack || nack, v_engine->pli || pli, v_engine->tmmbr || tmmbr); if (switch_media_handle_test_media_flag(smh, SCMF_MULTI_ANSWER_VIDEO)) { @@ -10863,7 +10870,7 @@ SWITCH_DECLARE (void) switch_core_media_recover_session(switch_core_session_t *s } if ((tmp = switch_channel_get_variable(session->channel, "rtp_use_pt"))) { - a_engine->cur_payload_map->pt = a_engine->cur_payload_map->agreed_pt = (switch_payload_t)(smh->payload_space = atoi(tmp)); + a_engine->cur_payload_map->pt = (switch_payload_t)(smh->payload_space = atoi(tmp)); } if ((tmp = switch_channel_get_variable(session->channel, "rtp_audio_recv_pt"))) { @@ -10892,7 +10899,7 @@ SWITCH_DECLARE (void) switch_core_media_recover_session(switch_core_session_t *s if (switch_channel_test_flag(session->channel, CF_VIDEO)) { if ((tmp = switch_channel_get_variable(session->channel, "rtp_use_video_pt"))) { - v_engine->cur_payload_map->pt = v_engine->cur_payload_map->agreed_pt = (switch_payload_t)atoi(tmp); + v_engine->cur_payload_map->pt = (switch_payload_t)atoi(tmp); } if ((tmp = switch_channel_get_variable(session->channel, "rtp_video_recv_pt"))) {