summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2014-10-03 07:54:33 +0000
committerJoshua Colp <jcolp@digium.com>2014-10-03 07:54:33 +0000
commit6246189df7fb4a2612905ab67f7408015a61405f (patch)
tree8203621369f41aacdfe9f275d8175d3e6d2e7b58 /res
parent94105b30a602881c9f6bf5176a28cbf9e4bdf3db (diff)
res_pjsip_session: Reduce SDP size by removing duplicate connection lines.
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. ........ Merged revisions 424414 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@424415 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_session.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 7bf96e02b..42f7281a8 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -2127,10 +2127,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;