From e2a186cb37a8c0fbb738c1e6c32f8e33ac97d7e1 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 1 Sep 2017 13:55:33 -0500 Subject: [PATCH] FS-10613: [core] freeswitch using the the wrong PT value (using the transmit PT instead of the receive PT) #resolve --- src/switch_core_media.c | 20 ++++++++++++++++---- src/switch_rtp.c | 11 ++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 72d0875210..192c8c3955 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -820,6 +820,7 @@ 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) { if (sdp_type == SDP_TYPE_RESPONSE) { @@ -831,7 +832,16 @@ SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_se 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)); + if (sdp_type == SDP_TYPE_RESPONSE) { + exists = (pmap->sdp_type == SDP_TYPE_REQUEST && type == pmap->type && !strcasecmp(name, pmap->iananame)); + } else { + exists = (type == pmap->type && !strcasecmp(name, pmap->iananame)); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "CHECK PMAP %s:%s %d %s:%s %d ... %d\n", + name, sdp_type == SDP_TYPE_REQUEST ? "REQ" : "RES", pt, + pmap->iananame, pmap->sdp_type == SDP_TYPE_REQUEST ? "REQ" : "RES", pmap->pt, exists); + + break; } @@ -883,8 +893,6 @@ SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_se pmap->channels = 1; } - pmap->sdp_type = sdp_type; - if (ptime) { pmap->ptime = ptime; } @@ -921,6 +929,10 @@ SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_se } if (!exists) { + pmap->sdp_type = sdp_type; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "ADD PMAP %s %s %d\n", sdp_type == SDP_TYPE_REQUEST ? "REQ" : "RES", name, pt); + if (pmap == engine->payload_map) { engine->pmap_tail = pmap; } else if (!engine->payload_map) { @@ -5791,7 +5803,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s SWITCH_MEDIA_TYPE_VIDEO, matches[j].map->rm_encoding, matches[j].imp->modname, - matches[j].map->rm_fmtp, + consider_video_fmtp ? matches[j].map->rm_fmtp : NULL, sdp_type, matches[j].map->rm_pt, matches[j].imp->samples_per_second, diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 3aeb5aaaa6..55d1381c70 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -5463,7 +5463,7 @@ static int check_recv_payload(switch_rtp_t *rtp_session) { int ok = 1; - if (rtp_session->pmaps && *rtp_session->pmaps) { + if (!(rtp_session->rtp_bugs & RTP_BUG_ACCEPT_ANY_PAYLOAD) && rtp_session->pmaps && *rtp_session->pmaps) { payload_map_t *pmap; ok = 0; @@ -5474,7 +5474,7 @@ static int check_recv_payload(switch_rtp_t *rtp_session) continue; } - if (rtp_session->last_rtp_hdr.pt == pmap->recv_pt) { + if (rtp_session->last_rtp_hdr.pt == pmap->pt) { ok = 1; } } @@ -5639,7 +5639,8 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t int accept_packet = 1; - if (rtp_session->pmaps && *rtp_session->pmaps) { + if (!(rtp_session->rtp_bugs & RTP_BUG_ACCEPT_ANY_PAYLOAD) && + !(rtp_session->rtp_bugs & RTP_BUG_ACCEPT_ANY_PACKETS) && rtp_session->pmaps && *rtp_session->pmaps) { payload_map_t *pmap; accept_packet = 0; @@ -5655,7 +5656,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t continue; } - if (rtp_session->last_rtp_hdr.pt == pmap->recv_pt) { + if (rtp_session->last_rtp_hdr.pt == pmap->pt) { accept_packet = 1; if (pmapP) { *pmapP = pmap; @@ -5666,7 +5667,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t switch_mutex_unlock(rtp_session->flag_mutex); } - if (!accept_packet && !(rtp_session->rtp_bugs & RTP_BUG_ACCEPT_ANY_PAYLOAD) && !(rtp_session->rtp_bugs & RTP_BUG_ACCEPT_ANY_PACKETS)) { + if (!accept_packet) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG1, "Invalid Packet SEQ: %d TS: %d PT:%d ignored\n", ntohs(rtp_session->recv_msg.header.seq), ntohl(rtp_session->last_rtp_hdr.ts), rtp_session->last_rtp_hdr.pt);