mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-05 04:32:44 +00:00
res_pjsip_sdp_rtp: Add support for default/mismatched 8K RFC 4733/2833 digits
After change made in624f509
to add support for non 8K RFC 4733/2833 digits, Asterisk would only accept RFC 4733/2833 offers that matched the sample rate of the negotiated codec(s). This change allows Asterisk to accept 8K RFC 4733/2833 offers if the UAC offfers 8K RFC 4733/2833 but negotiates for a non 8K bitrate codec. A number of corresponding tests in tests/channels/pjsip/dtmf_sdp also needed to be re-written to allow for these scenarios. Fixes: #776 (cherry picked from commitd59f1a0c44
)
This commit is contained in:
committed by
Asterisk Development Team
parent
56b0c48afe
commit
e86bd1d97d
@@ -106,6 +106,9 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define MAX_CHANNEL_ID 152
|
#define MAX_CHANNEL_ID 152
|
||||||
|
|
||||||
|
/*!< DTMF samples per second */
|
||||||
|
#define DEFAULT_DTMF_SAMPLE_RATE_MS 8000
|
||||||
|
|
||||||
struct ast_rtp_instance;
|
struct ast_rtp_instance;
|
||||||
struct ast_rtp_glue;
|
struct ast_rtp_glue;
|
||||||
|
|
||||||
|
@@ -1989,10 +1989,8 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((attr = generate_rtpmap_attr(session, media, pool, rtp_code, 1, format, 0))) {
|
if ((attr = generate_rtpmap_attr(session, media, pool, rtp_code, 1, format, 0))) {
|
||||||
int newrate = ast_rtp_lookup_sample_rate2(1, format, 0);
|
|
||||||
int i, added = 0;
|
int i, added = 0;
|
||||||
media->attr[media->attr_count++] = attr;
|
int newrate = ast_rtp_lookup_sample_rate2(1, format, 0);
|
||||||
|
|
||||||
if (build_dtmf_sample_rates) {
|
if (build_dtmf_sample_rates) {
|
||||||
for (i = 0; i < AST_VECTOR_SIZE(&sample_rates); i++) {
|
for (i = 0; i < AST_VECTOR_SIZE(&sample_rates); i++) {
|
||||||
/* Only add if we haven't already processed this sample rate. For instance
|
/* Only add if we haven't already processed this sample rate. For instance
|
||||||
@@ -2007,6 +2005,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
|
|||||||
AST_VECTOR_APPEND(&sample_rates, newrate);
|
AST_VECTOR_APPEND(&sample_rates, newrate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
media->attr[media->attr_count++] = attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((attr = generate_fmtp_attr(pool, format, rtp_code))) {
|
if ((attr = generate_fmtp_attr(pool, format, rtp_code))) {
|
||||||
@@ -2032,7 +2031,6 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (index != AST_RTP_DTMF) {
|
if (index != AST_RTP_DTMF) {
|
||||||
rtp_code = ast_rtp_codecs_payload_code(
|
rtp_code = ast_rtp_codecs_payload_code(
|
||||||
ast_rtp_instance_get_codecs(session_media->rtp), 0, NULL, index);
|
ast_rtp_instance_get_codecs(session_media->rtp), 0, NULL, index);
|
||||||
@@ -2046,7 +2044,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
|
|||||||
* Walk through the possible bitrates for the RFC 2833/4733 digits and generate the rtpmap
|
* Walk through the possible bitrates for the RFC 2833/4733 digits and generate the rtpmap
|
||||||
* attributes.
|
* attributes.
|
||||||
*/
|
*/
|
||||||
int i;
|
int i, found_default_offer = 0;
|
||||||
for (i = 0; i < AST_VECTOR_SIZE(&sample_rates); i++) {
|
for (i = 0; i < AST_VECTOR_SIZE(&sample_rates); i++) {
|
||||||
rtp_code = ast_rtp_codecs_payload_code_sample_rate(
|
rtp_code = ast_rtp_codecs_payload_code_sample_rate(
|
||||||
ast_rtp_instance_get_codecs(session_media->rtp), 0, NULL, index, AST_VECTOR_GET(&sample_rates, i));
|
ast_rtp_instance_get_codecs(session_media->rtp), 0, NULL, index, AST_VECTOR_GET(&sample_rates, i));
|
||||||
@@ -2055,12 +2053,31 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (AST_VECTOR_GET(&sample_rates, i) == DEFAULT_DTMF_SAMPLE_RATE_MS) {
|
||||||
|
/* we found and added a default offer, so no need to include a default one.*/
|
||||||
|
found_default_offer = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((attr = generate_rtpmap_attr2(session, media, pool, rtp_code, 0, NULL, index, AST_VECTOR_GET(&sample_rates, i)))) {
|
if ((attr = generate_rtpmap_attr2(session, media, pool, rtp_code, 0, NULL, index, AST_VECTOR_GET(&sample_rates, i)))) {
|
||||||
media->attr[media->attr_count++] = attr;
|
media->attr[media->attr_count++] = attr;
|
||||||
snprintf(tmp, sizeof(tmp), "%d 0-16", (rtp_code));
|
snprintf(tmp, sizeof(tmp), "%d 0-16", (rtp_code));
|
||||||
attr = pjmedia_sdp_attr_create(pool, "fmtp", pj_cstr(&stmp, tmp));
|
attr = pjmedia_sdp_attr_create(pool, "fmtp", pj_cstr(&stmp, tmp));
|
||||||
media->attr[media->attr_count++] = attr;
|
media->attr[media->attr_count++] = attr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we weren't able to add any matching RFC 2833/4733, assume this endpoint is using a
|
||||||
|
* mismatched 8K offer and try to add one as a fall-back/default.
|
||||||
|
*/
|
||||||
|
if (!found_default_offer) {
|
||||||
|
rtp_code = ast_rtp_codecs_payload_code_sample_rate(
|
||||||
|
ast_rtp_instance_get_codecs(session_media->rtp), 0, NULL, index, DEFAULT_DTMF_SAMPLE_RATE_MS);
|
||||||
|
|
||||||
|
if (rtp_code != -1 && (attr = generate_rtpmap_attr2(session, media, pool, rtp_code, 0, NULL, index, DEFAULT_DTMF_SAMPLE_RATE_MS))) {
|
||||||
|
media->attr[media->attr_count++] = attr;
|
||||||
|
snprintf(tmp, sizeof(tmp), "%d 0-16", (rtp_code));
|
||||||
|
attr = pjmedia_sdp_attr_create(pool, "fmtp", pj_cstr(&stmp, tmp));
|
||||||
|
media->attr[media->attr_count++] = attr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4326,11 +4326,17 @@ static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit)
|
|||||||
/* Grab the matching DTMF type payload */
|
/* Grab the matching DTMF type payload */
|
||||||
payload = ast_rtp_codecs_payload_code_tx_sample_rate(ast_rtp_instance_get_codecs(instance), 0, NULL, AST_RTP_DTMF, sample_rate);
|
payload = ast_rtp_codecs_payload_code_tx_sample_rate(ast_rtp_instance_get_codecs(instance), 0, NULL, AST_RTP_DTMF, sample_rate);
|
||||||
|
|
||||||
/* If this returns -1, we are being asked to send digits for a sample rate that is outside
|
/* If this returns -1, we are using a codec with a sample rate that does not have a matching RFC 2833/4733
|
||||||
what was negotiated for. Fall back if possible. */
|
offer. The offer may have included a default-rate one that doesn't match the codec rate, so try to use that. */
|
||||||
|
if (payload == -1) {
|
||||||
|
sample_rate = DEFAULT_DTMF_SAMPLE_RATE_MS;
|
||||||
|
payload = ast_rtp_codecs_payload_code_tx(ast_rtp_instance_get_codecs(instance), 0, NULL, AST_RTP_DTMF);
|
||||||
|
}
|
||||||
|
/* No default-rate offer either, trying to send a digit outside of what was negotiated for. */
|
||||||
if (payload == -1) {
|
if (payload == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_test_suite_event_notify("DTMF_BEGIN", "Digit: %d\r\nPayload: %d\r\nRate: %d\r\n", digit, payload, sample_rate);
|
ast_test_suite_event_notify("DTMF_BEGIN", "Digit: %d\r\nPayload: %d\r\nRate: %d\r\n", digit, payload, sample_rate);
|
||||||
ast_debug(1, "Sending digit '%d' at rate %d with payload %d\n", digit, sample_rate, payload);
|
ast_debug(1, "Sending digit '%d' at rate %d with payload %d\n", digit, sample_rate, payload);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user