diff options
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia/transport_ice.h | 3 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_ice.c | 35 |
2 files changed, 28 insertions, 10 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; |