From 574fefa004bec539bb3b68e9cc5f1cec401a6f4f Mon Sep 17 00:00:00 2001 From: Kevin Harwell <kharwell@digium.com> Date: Fri, 21 Feb 2014 18:25:51 +0000 Subject: [PATCH] rtp_engine: Dynamic payload change in rtp mapping not supported Asterisk didn't support the dynamic payload change in rtp mapping in the 200 OK response. Scenario: Asterisk sends the INVITE proposing alaw and telephone-event, it proposes rtpmap:101 for telephone-event. Peer responds with 2xx, it answers with alaw and telephone-event also, but it proposes a different rtpmap number (rtpmap:103) for telephone-event. Expected Behaviour: Asterisk should honour the rtpmapping in the response and send DTMF packets using 103 as payload type for DTMF. Actual Behaviour: Asterisk sends DTMF packets using payload type 101. With this patch asterisk now supports changes that can occur in the rtp mapping in the response. (closes issue ASTERISK-23279) Reported by: NITESH BANSAL Review: https://reviewboard.asterisk.org/r/3225/ Patches: dynamic_payload_change.patch uploaded by nbansal (license 6418) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@408729 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- contrib/scripts/install_prereq | 2 +- main/rtp_engine.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/contrib/scripts/install_prereq b/contrib/scripts/install_prereq index 4e44a5be5c..11d2a40e82 100755 --- a/contrib/scripts/install_prereq +++ b/contrib/scripts/install_prereq @@ -21,7 +21,7 @@ usage() { # Basic build system: PACKAGES_DEBIAN="build-essential" # Asterisk: basic requirements: -PACKAGES_DEBIAN="$PACKAGES_DEBIAN libncurses-dev libz-dev libssl-dev libxml2-dev libsqlite3-dev" +PACKAGES_DEBIAN="$PACKAGES_DEBIAN libncurses-dev libz-dev libssl-dev libxml2-dev libsqlite3-dev uuid-dev" # Asterisk: for addons: PACKAGES_DEBIAN="$PACKAGES_DEBIAN libcurl-dev libspeex-dev libspeexdsp-dev libogg-dev libvorbis-dev libasound2-dev portaudio19-dev libcurl4-openssl-dev" PACKAGES_DEBIAN="$PACKAGES_DEBIAN libpq-dev unixodbc-dev libsqlite0-dev libmysqlclient15-dev libneon27-dev libgmime-dev libusb-dev liblua5.1-0-dev lua5.1" diff --git a/main/rtp_engine.c b/main/rtp_engine.c index fce41e6e17..a29d09e274 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -731,6 +731,14 @@ static int rtp_payload_type_find_format(void *obj, void *arg, int flags) return (type->asterisk_format && (ast_format_cmp(&type->format, format) != AST_FORMAT_CMP_NOT_EQUAL)) ? CMP_MATCH | CMP_STOP : 0; } +static int rtp_payload_type_find_nonast_format(void *obj, void *arg, int flags) +{ + struct ast_rtp_payload_type *type = obj; + int *rtp_code = arg; + + return ((!type->asterisk_format && (type->rtp_code == *rtp_code)) ? CMP_MATCH | CMP_STOP : 0); +} + int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, int asterisk_format, const struct ast_format *format, int code) { struct ast_rtp_payload_type *type; @@ -740,7 +748,7 @@ int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, int asterisk_form res = type->payload; ao2_ref(type, -1); return res; - } else if (!asterisk_format && (type = ao2_find(codecs->payloads, &code, OBJ_NOLOCK | OBJ_KEY))) { + } else if (!asterisk_format && (type = ao2_callback(codecs->payloads, OBJ_NOLOCK, rtp_payload_type_find_nonast_format, (void*)&code))) { res = type->payload; ao2_ref(type, -1); return res; -- GitLab