diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-02-03 14:43:25 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-02-03 14:43:25 +0000 |
commit | 5236d4a9fdd5bb3a4e09eb3910e4cd4930e113aa (patch) | |
tree | bc978805effcb1419b26eb74dcaa5014e0229315 | |
parent | dc61d27b5e6b321067e38cb830ead225ae0b9829 (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
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) + |