summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-03-27 11:00:38 +0000
committerBenny Prijono <bennylp@teluu.com>2007-03-27 11:00:38 +0000
commitd700d4a60001dd6a9c0c515e6cb359c9118d00ce (patch)
tree56d431bc74745df0fe73f41e6e1cf2c0f592d3a4
parent63bbc72f8536347656ac59dea7fb9576c82ac55d (diff)
ICE: added media index in pjmedia when handling SDP containing ICE candidates
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1108 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/include/pjmedia/transport_ice.h3
-rw-r--r--pjmedia/src/pjmedia/transport_ice.c35
-rw-r--r--pjnath/src/pjnath-test/ice_test.c11
-rw-r--r--pjnath/src/pjnath-test/test.c2
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c2
5 files changed, 40 insertions, 13 deletions
diff --git a/pjmedia/include/pjmedia/transport_ice.h b/pjmedia/include/pjmedia/transport_ice.h
index 0fcd5a4b..ab973c7b 100644
--- a/pjmedia/include/pjmedia/transport_ice.h
+++ b/pjmedia/include/pjmedia/transport_ice.h
@@ -66,7 +66,8 @@ PJ_DECL(pj_status_t) pjmedia_ice_modify_sdp(pjmedia_transport *tp,
pjmedia_sdp_session *sdp);
PJ_DECL(pj_status_t) pjmedia_ice_start_ice(pjmedia_transport *tp,
pj_pool_t *pool,
- pjmedia_sdp_session *rem_sdp);
+ pjmedia_sdp_session *rem_sdp,
+ unsigned media_index);
PJ_DECL(pj_status_t) pjmedia_ice_stop_ice(pjmedia_transport *tp);
diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c
index 3397e3e1..8ad0a4ed 100644
--- a/pjmedia/src/pjmedia/transport_ice.c
+++ b/pjmedia/src/pjmedia/transport_ice.c
@@ -400,39 +400,56 @@ static void set_no_ice(struct transport_ice *tp_ice)
PJ_DEF(pj_status_t) pjmedia_ice_start_ice(pjmedia_transport *tp,
pj_pool_t *pool,
- pjmedia_sdp_session *rem_sdp)
+ pjmedia_sdp_session *rem_sdp,
+ unsigned media_index)
{
struct transport_ice *tp_ice = (struct transport_ice*)tp;
pjmedia_sdp_attr *attr;
unsigned i, cand_cnt;
pj_ice_cand cand[PJ_ICE_MAX_CAND];
+ pjmedia_sdp_media *sdp_med;
pj_str_t uname, pass;
pj_status_t status;
- /* Find ice-ufrag attribute */
+ PJ_ASSERT_RETURN(tp && pool && rem_sdp, PJ_EINVAL);
+ PJ_ASSERT_RETURN(media_index < rem_sdp->media_count, PJ_EINVAL);
+
+ sdp_med = rem_sdp->media[media_index];
+
+ /* Find ice-ufrag attribute in session descriptor */
attr = pjmedia_sdp_attr_find2(rem_sdp->attr_count, rem_sdp->attr,
"ice-ufrag", NULL);
if (attr == NULL) {
- set_no_ice(tp_ice);
- return PJ_SUCCESS;
+ /* Find in media descriptor */
+ attr = pjmedia_sdp_attr_find2(sdp_med->attr_count, sdp_med->attr,
+ "ice-ufrag", NULL);
+ if (attr == NULL) {
+ set_no_ice(tp_ice);
+ return PJ_SUCCESS;
+ }
}
uname = attr->value;
- /* Find ice-pwd attribute */
+ /* Find ice-pwd attribute in session descriptor */
attr = pjmedia_sdp_attr_find2(rem_sdp->attr_count, rem_sdp->attr,
"ice-pwd", NULL);
if (attr == NULL) {
- set_no_ice(tp_ice);
- return PJ_SUCCESS;
+ /* Not found, find in media descriptor */
+ attr = pjmedia_sdp_attr_find2(sdp_med->attr_count, sdp_med->attr,
+ "ice-pwd", NULL);
+ if (attr == NULL) {
+ set_no_ice(tp_ice);
+ return PJ_SUCCESS;
+ }
}
pass = attr->value;
/* Get all candidates */
cand_cnt = 0;
- for (i=0; i<rem_sdp->media[0]->attr_count; ++i) {
+ for (i=0; i<sdp_med->attr_count; ++i) {
pjmedia_sdp_attr *attr;
- attr = rem_sdp->media[0]->attr[i];
+ attr = sdp_med->attr[i];
if (pj_strcmp2(&attr->name, "candidate")!=0)
continue;
diff --git a/pjnath/src/pjnath-test/ice_test.c b/pjnath/src/pjnath-test/ice_test.c
index f8673356..d9a97ee6 100644
--- a/pjnath/src/pjnath-test/ice_test.c
+++ b/pjnath/src/pjnath-test/ice_test.c
@@ -459,7 +459,11 @@ int ice_test(void)
pj_stun_config_init(&stun_cfg, mem, 0, ioqueue, timer_heap);
- //pj_log_set_level(4);
+#if 1
+ pj_log_set_level(5);
+#endif
+
+ goto test;
/* Basic create/destroy */
rc = ice_basic_create_destroy_test();
@@ -487,10 +491,13 @@ int ice_test(void)
goto on_return;
/* Direct communication with two components */
+test:
rc = perform_ice_test("With two components (RTP and RTCP)", PJ_TRUE, 2, PJ_TRUE, D1, D2, 0, NULL, 0, NULL);
if (rc != 0)
goto on_return;
+ goto on_return;
+
/* Direct communication with mismatch number of components */
/* Direct communication with 2 components and 2 invalid address */
@@ -501,7 +508,7 @@ int ice_test(void)
on_return:
- //pj_log_set_level(3);
+ pj_log_set_level(3);
pj_ioqueue_destroy(stun_cfg.ioqueue);
pj_pool_release(pool);
return rc;
diff --git a/pjnath/src/pjnath-test/test.c b/pjnath/src/pjnath-test/test.c
index 6cc829d5..3dc2085d 100644
--- a/pjnath/src/pjnath-test/test.c
+++ b/pjnath/src/pjnath-test/test.c
@@ -49,9 +49,11 @@ static int test_inner(void)
mem = &caching_pool.factory;
+#if 0
pj_log_set_level(3);
pj_log_set_decor(PJ_LOG_HAS_NEWLINE | PJ_LOG_HAS_TIME |
PJ_LOG_HAS_MICRO_SEC);
+#endif
rc = pj_init();
if (rc != 0) {
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index c91a1ead..2e0af481 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -822,7 +822,7 @@ pj_status_t pjsua_media_channel_update(pjsua_call_id call_id,
/* Start ICE */
if (pjsua_var.media_cfg.enable_ice) {
status = pjmedia_ice_start_ice(call->med_tp, call->inv->pool,
- remote_sdp);
+ remote_sdp, 0);
if (status != PJ_SUCCESS)
return status;
}