summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorJean Aunis <jean.aunis@prescom.fr>2018-02-14 14:33:18 +0100
committerJean Aunis - Prescom <jean.aunis@prescom.fr>2018-03-07 01:34:54 -0600
commit75a35ee5e8eaab02b127746c2c1c87342867beb8 (patch)
tree8bc3480bd72793db11c4b04ffe7c70f6886df9e6 /channels
parent91a8c7a28114dd4d64dd5216a7cffd0f36d35bab (diff)
chan_sip: Fix improper RTP framing on outgoing calls
The "ptime" SDP parameter received in a SIP response was not honoured. Moreover, in the abscence of this "ptime" parameter, locally configured framing was lost during response processing. This patch systematically stores the framing information in the ast_rtp_codecs structure, taking it from the response or from the configuration as appropriate. ASTERISK-27674 Change-Id: I828a6a98d27a45a8afd07236a2bd0aa3cbd3fb2c
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 85701634c..f0cc2a6bd 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -10964,22 +10964,25 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
if (portno != -1 || vportno != -1 || tportno != -1) {
/* We are now ready to change the sip session and RTP structures with the offered codecs, since
they are acceptable */
+ unsigned int framing;
ast_format_cap_remove_by_type(p->jointcaps, AST_MEDIA_TYPE_UNKNOWN);
ast_format_cap_append_from_cap(p->jointcaps, newjointcapability, AST_MEDIA_TYPE_UNKNOWN); /* Our joint codec profile for this call */
ast_format_cap_remove_by_type(p->peercaps, AST_MEDIA_TYPE_UNKNOWN);
ast_format_cap_append_from_cap(p->peercaps, newpeercapability, AST_MEDIA_TYPE_UNKNOWN); /* The other side's capability in latest offer */
p->jointnoncodeccapability = newnoncodeccapability; /* DTMF capabilities */
+ tmp_fmt = ast_format_cap_get_format(p->jointcaps, 0);
+ framing = ast_format_cap_get_format_framing(p->jointcaps, tmp_fmt);
/* respond with single most preferred joint codec, limiting the other side's choice */
if (ast_test_flag(&p->flags[1], SIP_PAGE2_PREFERRED_CODEC)) {
- unsigned int framing;
-
- tmp_fmt = ast_format_cap_get_format(p->jointcaps, 0);
- framing = ast_format_cap_get_format_framing(p->jointcaps, tmp_fmt);
ast_format_cap_remove_by_type(p->jointcaps, AST_MEDIA_TYPE_UNKNOWN);
ast_format_cap_append(p->jointcaps, tmp_fmt, framing);
- ao2_ref(tmp_fmt, -1);
}
+ if (!ast_rtp_codecs_get_framing(&newaudiortp)) {
+ /* Peer did not force us to use a specific framing, so use our own */
+ ast_rtp_codecs_set_framing(&newaudiortp, framing);
+ }
+ ao2_ref(tmp_fmt, -1);
}
/* Setup audio address and port */
@@ -11488,6 +11491,7 @@ static int process_sdp_a_audio(const char *a, struct sip_pvt *p, struct ast_rtp_
if (framing && p->autoframing) {
ast_debug(1, "Setting framing to %ld\n", framing);
ast_format_cap_set_framing(p->caps, framing);
+ ast_rtp_codecs_set_framing(newaudiortp, framing);
}
found = TRUE;
} else if (sscanf(a, "rtpmap: %30u %127[^/]/%30u", &codec, mimeSubtype, &sample_rate) == 3) {