diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 5419a1dd8b49f720d51fd819430a5991619c6a14..792df5c38b729a0dccd76768d3803e27021e4322 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -13097,7 +13097,7 @@ static void add_codec_to_sdp(const struct sip_pvt *p, /* Opus mandates 2 channels in rtpmap */ if (ast_format_cmp(format, ast_format_opus) == AST_FORMAT_CMP_EQUAL) { ast_str_append(a_buf, 0, "a=rtpmap:%d %s/%u/2\r\n", rtp_code, mime, rate); - } else if ((35 <= rtp_code) || !(sip_cfg.compactheaders)) { + } else if ((AST_RTP_PT_LAST_STATIC < rtp_code) || !(sip_cfg.compactheaders)) { ast_str_append(a_buf, 0, "a=rtpmap:%d %s/%u\r\n", rtp_code, mime, rate); } diff --git a/include/asterisk/rtp_engine.h b/include/asterisk/rtp_engine.h index fa7fed8a1344c89671c67c8a270d986854389f03..55acf6529187ef0a3981ec5d730bad1515f4c3f9 100644 --- a/include/asterisk/rtp_engine.h +++ b/include/asterisk/rtp_engine.h @@ -81,6 +81,12 @@ extern "C" { /*! Maximum number of payload types RTP can support. */ #define AST_RTP_MAX_PT 128 +/*! + * Last RTP payload type statically assigned, see + * http://www.iana.org/assignments/rtp-parameters + */ +#define AST_RTP_PT_LAST_STATIC 34 + /*! First dynamic RTP payload type */ #define AST_RTP_PT_FIRST_DYNAMIC 96 diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 00f9d595fccea87fc991611259759a4bc05b2c25..19ca31cb633bcef7925a3b382648d62e0692a79a 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -1348,28 +1348,31 @@ static int find_unused_payload(const struct ast_rtp_codecs *codecs) * https://tools.ietf.org/html/draft-roach-mmusic-unified-plan#section-3.2.1.2 * https://tools.ietf.org/html/draft-wu-avtcore-dynamic-pt-usage#section-3 */ - res = find_unused_payload_in_range(codecs, MAX(ast_option_rtpptdynamic, 35), + res = find_unused_payload_in_range( + codecs, MAX(ast_option_rtpptdynamic, AST_RTP_PT_LAST_STATIC + 1), AST_RTP_PT_LAST_REASSIGN, static_RTP_PT); if (res != -1) { return res; } - /* Yet, reusing mappings below 35 is not supported in Asterisk because - * when Compact Headers are activated, no rtpmap is send for those below - * 35. If you want to use 35 and below + /* Yet, reusing mappings below AST_RTP_PT_LAST_STATIC (35) is not supported + * in Asterisk because when Compact Headers are activated, no rtpmap is + * send for those below 35. If you want to use 35 and below * A) do not use Compact Headers, * B) remove that code in chan_sip/res_pjsip, or * C) add a flag that this RTP Payload Type got reassigned dynamically * and requires a rtpmap even with Compact Headers enabled. */ res = find_unused_payload_in_range( - codecs, MAX(ast_option_rtpptdynamic, 20), 35, static_RTP_PT); + codecs, MAX(ast_option_rtpptdynamic, 20), + AST_RTP_PT_LAST_STATIC + 1, static_RTP_PT); if (res != -1) { return res; } return find_unused_payload_in_range( - codecs, MAX(ast_option_rtpptdynamic, 0), 20, static_RTP_PT); + codecs, MAX(ast_option_rtpptdynamic, 0), + 20, static_RTP_PT); } /*! diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index 701edc3c2024ffd68a1c81e69ab5c3e8a9e9be5d..64c5066577687f2ac02e38c94975b63f81f0cc9d 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -447,6 +447,7 @@ static int set_caps(struct ast_sip_session *session, static pjmedia_sdp_attr* generate_rtpmap_attr(struct ast_sip_session *session, pjmedia_sdp_media *media, pj_pool_t *pool, int rtp_code, int asterisk_format, struct ast_format *format, int code) { + extern pj_bool_t pjsip_use_compact_form; pjmedia_sdp_rtpmap rtpmap; pjmedia_sdp_attr *attr = NULL; char tmp[64]; @@ -455,6 +456,11 @@ static pjmedia_sdp_attr* generate_rtpmap_attr(struct ast_sip_session *session, p snprintf(tmp, sizeof(tmp), "%d", rtp_code); pj_strdup2(pool, &media->desc.fmt[media->desc.fmt_count++], tmp); + + if (rtp_code <= AST_RTP_PT_LAST_STATIC && pjsip_use_compact_form) { + return NULL; + } + rtpmap.pt = media->desc.fmt[media->desc.fmt_count - 1]; rtpmap.clock_rate = ast_rtp_lookup_sample_rate2(asterisk_format, format, code); pj_strdup2(pool, &rtpmap.enc_name, ast_rtp_lookup_mime_subtype2(asterisk_format, format, code, options)); @@ -1254,11 +1260,9 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as continue; } - if (!(attr = generate_rtpmap_attr(session, media, pool, rtp_code, 1, format, 0))) { - ao2_ref(format, -1); - continue; + if ((attr = generate_rtpmap_attr(session, media, pool, rtp_code, 1, format, 0))) { + media->attr[media->attr_count++] = attr; } - media->attr[media->attr_count++] = attr; if ((attr = generate_fmtp_attr(pool, format, rtp_code))) { media->attr[media->attr_count++] = attr; @@ -1287,12 +1291,10 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as continue; } - if (!(attr = generate_rtpmap_attr(session, media, pool, rtp_code, 0, NULL, index))) { - continue; + if ((attr = generate_rtpmap_attr(session, media, pool, rtp_code, 0, NULL, index))) { + media->attr[media->attr_count++] = attr; } - media->attr[media->attr_count++] = attr; - if (index == AST_RTP_DTMF) { snprintf(tmp, sizeof(tmp), "%d 0-16", rtp_code); attr = pjmedia_sdp_attr_create(pool, "fmtp", pj_cstr(&stmp, tmp));