summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2010-02-03 14:43:25 +0000
committerNanang Izzuddin <nanang@teluu.com>2010-02-03 14:43:25 +0000
commit5236d4a9fdd5bb3a4e09eb3910e4cd4930e113aa (patch)
treebc978805effcb1419b26eb74dcaa5014e0229315
parentdc61d27b5e6b321067e38cb830ead225ae0b9829 (diff)
Ticket #998:
- Updated pjmedia_sdp_parse() to apply direction attribute in session to each media that has no direction attribute (no overriding). - Added python tests. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3086 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/src/pjmedia/sdp.c60
-rw-r--r--tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py28
-rw-r--r--tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py30
3 files changed, 118 insertions, 0 deletions
diff --git a/pjmedia/src/pjmedia/sdp.c b/pjmedia/src/pjmedia/sdp.c
index 1fec620f..3fae9282 100644
--- a/pjmedia/src/pjmedia/sdp.c
+++ b/pjmedia/src/pjmedia/sdp.c
@@ -1061,6 +1061,64 @@ static pjmedia_sdp_attr *parse_attr( pj_pool_t *pool, pj_scanner *scanner,
return attr;
}
+
+/*
+ * Apply direction attribute in session to all media.
+ */
+static void apply_media_direction(pjmedia_sdp_session *sdp)
+{
+ pjmedia_sdp_attr *dir_attr = NULL;
+ unsigned i;
+
+ const pj_str_t inactive = { "inactive", 8 };
+ const pj_str_t sendonly = { "sendonly", 8 };
+ const pj_str_t recvonly = { "recvonly", 8 };
+ const pj_str_t sendrecv = { "sendrecv", 8 };
+
+ /* Find direction attribute in session, don't need to find default
+ * direction "sendrecv".
+ */
+ for (i = 0; i < sdp->attr_count && !dir_attr; ++i) {
+ if (!pj_strcmp(&sdp->attr[i]->name, &sendonly) ||
+ !pj_strcmp(&sdp->attr[i]->name, &recvonly) ||
+ !pj_strcmp(&sdp->attr[i]->name, &inactive))
+ {
+ dir_attr = sdp->attr[i];
+ }
+ }
+
+ /* Found the direction attribute */
+ if (dir_attr) {
+ /* Remove the direction attribute in session */
+ pjmedia_sdp_attr_remove(&sdp->attr_count, sdp->attr, dir_attr);
+
+ /* Apply the direction attribute to all media, but not overriding it
+ * if media already has direction attribute.
+ */
+ for (i = 0; i < sdp->media_count; ++i) {
+ pjmedia_sdp_media *m;
+ unsigned j;
+
+ /* Find direction attribute in this media */
+ m = sdp->media[i];
+ for (j = 0; j < m->attr_count; ++j) {
+ if (!pj_strcmp(&m->attr[j]->name, &sendrecv) ||
+ !pj_strcmp(&m->attr[j]->name, &sendonly) ||
+ !pj_strcmp(&m->attr[j]->name, &recvonly) ||
+ !pj_strcmp(&m->attr[j]->name, &inactive))
+ {
+ break;
+ }
+ }
+
+ /* Not found, apply direction attribute from session */
+ if (j == m->attr_count)
+ pjmedia_sdp_media_add_attr(m, dir_attr);
+ }
+ }
+}
+
+
/*
* Parse SDP message.
*/
@@ -1177,6 +1235,8 @@ PJ_DEF(pj_status_t) pjmedia_sdp_parse( pj_pool_t *pool,
pj_scan_fini(&scanner);
+ apply_media_direction(session);
+
*p_sdp = session;
return ctx.last_error;
}
diff --git a/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py b/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py
new file mode 100644
index 00000000..16073eda
--- /dev/null
+++ b/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_1.py
@@ -0,0 +1,28 @@
+# $Id$
+import inc_sip as sip
+import inc_sdp as sdp
+
+# Offer contains "sendonly" attribute in the session. Answer should
+# respond with appropriate direction in session or media
+sdp = \
+"""
+v=0
+o=- 0 0 IN IP4 127.0.0.1
+s=-
+c=IN IP4 127.0.0.1
+t=0 0
+a=sendonly
+m=audio 5000 RTP/AVP 0
+"""
+
+pjsua_args = "--null-audio --auto-answer 200"
+extra_headers = ""
+include = ["Content-Type: application/sdp", # response must include SDP
+ "a=recvonly"
+ ]
+exclude = []
+
+sendto_cfg = sip.SendtoCfg("SDP direction in session", pjsua_args, sdp, 200,
+ extra_headers=extra_headers,
+ resp_inc=include, resp_exc=exclude)
+
diff --git a/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py b/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py
new file mode 100644
index 00000000..a8b1d10c
--- /dev/null
+++ b/tests/pjsua/scripts-sendto/140_sdp_with_direction_attr_in_session_2.py
@@ -0,0 +1,30 @@
+# $Id$
+import inc_sip as sip
+import inc_sdp as sdp
+
+# Offer contains "inactive" attribute in the session, however the media
+# also has "sendonly" attribute. Answer should appropriately respond
+# direction attribute in media, instead of the one in session.
+sdp = \
+"""
+v=0
+o=- 0 0 IN IP4 127.0.0.1
+s=-
+c=IN IP4 127.0.0.1
+t=0 0
+a=inactive
+m=audio 5000 RTP/AVP 0
+a=sendonly
+"""
+
+pjsua_args = "--null-audio --auto-answer 200"
+extra_headers = ""
+include = ["Content-Type: application/sdp", # response must include SDP
+ "a=recvonly"
+ ]
+exclude = []
+
+sendto_cfg = sip.SendtoCfg("SDP direction in session", pjsua_args, sdp, 200,
+ extra_headers=extra_headers,
+ resp_inc=include, resp_exc=exclude)
+