]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_session: Reduce SDP size by removing duplicate connection lines.
authorJoshua Colp <jcolp@digium.com>
Sat, 27 Sep 2014 17:29:05 +0000 (17:29 +0000)
committerJoshua Colp <jcolp@digium.com>
Sat, 27 Sep 2014 17:29:05 +0000 (17:29 +0000)
Due to the architecture of how media streams are handled each individual
handler adds connection details (IP address) for it. The first media stream
is then used as the top level SDP connection line. In practice each
line ends up being the same so to reduce the SDP size stream-level connection
information is also added to the SDP if it differs from the top level SDP
connection line.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@424077 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_pjsip_session.c

index c31e4d252fea5a71e2a22d1c07868e2e0d64130b..3b924ac2f9f6fc54c7f5067e9138175abee3c61d 100644 (file)
@@ -2132,10 +2132,27 @@ static struct pjmedia_sdp_session *create_local_sdp(pjsip_inv_session *inv, stru
 
        /* Use the connection details of the first media stream if possible for SDP level */
        if (local->media_count) {
+               int stream;
+
+               /* Since we are using the first media stream as the SDP level we can get rid of it
+                * from the stream itself
+                */
                local->conn = local->media[0]->conn;
+               local->media[0]->conn = NULL;
                pj_strassign(&local->origin.net_type, &local->conn->net_type);
                pj_strassign(&local->origin.addr_type, &local->conn->addr_type);
                pj_strassign(&local->origin.addr, &local->conn->addr);
+
+               /* Go through each media stream seeing if the connection details actually differ,
+                * if not just use SDP level and reduce the SDP size
+                */
+               for (stream = 1; stream < local->media_count; stream++) {
+                       if (!pj_strcmp(&local->conn->net_type, &local->media[stream]->conn->net_type) &&
+                               !pj_strcmp(&local->conn->addr_type, &local->media[stream]->conn->addr_type) &&
+                               !pj_strcmp(&local->conn->addr, &local->media[stream]->conn->addr)) {
+                               local->media[stream]->conn = NULL;
+                       }
+               }
        } else {
                local->origin.net_type = STR_IN;
                local->origin.addr_type = session->endpoint->media.rtp.ipv6 ? STR_IP6 : STR_IP4;