]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_sip: Fix improper RTP framing on outgoing calls
authorJean Aunis <jean.aunis@prescom.fr>
Wed, 14 Feb 2018 13:33:18 +0000 (14:33 +0100)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 7 Mar 2018 17:22:17 +0000 (11:22 -0600)
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

channels/chan_sip.c

index 0a5caecb96111ed4263f58b4f8509a52152e73de..38cdd537503cec4188b2afd508073601a8948691 100644 (file)
@@ -10912,22 +10912,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 */
@@ -11436,6 +11439,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) {