summaryrefslogtreecommitdiff
path: root/main/rtp_engine.c
diff options
context:
space:
mode:
authorKevin Harwell <kharwell@digium.com>2014-02-21 18:37:24 +0000
committerKevin Harwell <kharwell@digium.com>2014-02-21 18:37:24 +0000
commit73709e22ef96dd97231497610c1c636c7e3663c4 (patch)
treebbbd7e06dae70cd5ce8ea5bc02dc731a62e0dbbe /main/rtp_engine.c
parent9e6407c07b30fd7e4c9cb4564fc4a8f4e33955e1 (diff)
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) ........ Merged revisions 408729 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 408730 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@408731 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/rtp_engine.c')
-rw-r--r--main/rtp_engine.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/main/rtp_engine.c b/main/rtp_engine.c
index 190cffdab..fd058a403 100644
--- a/main/rtp_engine.c
+++ b/main/rtp_engine.c
@@ -839,6 +839,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;
@@ -848,7 +856,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;