diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-10-05 16:32:04 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-10-05 16:32:04 +0000 |
commit | dafed581f04ba80f9376324fb29bd793f0e4aee4 (patch) | |
tree | 676cc2bf0ef13c331108b7f15448ac8cb1ae9dfe /pjsip/src/pjsua-lib/pjsua_call.c | |
parent | b3fd2f88cb9a493c43d612bbc58713b50a93bd1b (diff) |
Fix #1143:
- Fixed no audio bug when pjsua with SRTP optional-with-duplicated-offer calls pjsua with SRTP disabled, by updating active media index after SDP negotiation done.
- Fixed bug in generating SDP, pjsua_media_channel_create_sdp(), by making sure all media in the SDP candidate are aligned with current active SDP before calling pjmedia_transport_encode_sdp().
- Fixed bug in modifying SDP for call hold, the media index to be modified was hardcoded to 0, should be active media index.
- Added python tests for calls with SRTP optional-with-duplicated-offer.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3334 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_call.c')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 216efe83..b941c66c 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -3580,6 +3580,8 @@ static pj_status_t modify_sdp_of_call_hold(pjsua_call *call, pj_pool_t *pool, pjmedia_sdp_session *sdp) { + pjmedia_sdp_media *m; + /* Call-hold is done by set the media direction to 'sendonly' * (PJMEDIA_DIR_ENCODING), except when current media direction is * 'inactive' (PJMEDIA_DIR_NONE). @@ -3591,12 +3593,15 @@ static pj_status_t modify_sdp_of_call_hold(pjsua_call *call, /* https://trac.pjsip.org/repos/ticket/1142: * configuration to use c=0.0.0.0 for call hold. */ + + m = sdp->media[call->audio_idx]; + if (call->call_hold_type == PJSUA_CALL_HOLD_TYPE_RFC2543) { pjmedia_sdp_conn *conn; pjmedia_sdp_attr *attr; /* Get SDP media connection line */ - conn = sdp->media[0]->conn; + conn = m->conn; if (!conn) conn = sdp->conn; @@ -3604,33 +3609,33 @@ static pj_status_t modify_sdp_of_call_hold(pjsua_call *call, conn->addr = pj_str("0.0.0.0"); /* Remove existing directions attributes */ - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "sendrecv"); - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "sendonly"); - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "recvonly"); - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "inactive"); + pjmedia_sdp_media_remove_all_attr(m, "sendrecv"); + pjmedia_sdp_media_remove_all_attr(m, "sendonly"); + pjmedia_sdp_media_remove_all_attr(m, "recvonly"); + pjmedia_sdp_media_remove_all_attr(m, "inactive"); /* Add inactive attribute */ attr = pjmedia_sdp_attr_create(pool, "inactive", NULL); - pjmedia_sdp_media_add_attr(sdp->media[0], attr); + pjmedia_sdp_media_add_attr(m, attr); } else { pjmedia_sdp_attr *attr; /* Remove existing directions attributes */ - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "sendrecv"); - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "sendonly"); - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "recvonly"); - pjmedia_sdp_media_remove_all_attr(sdp->media[0], "inactive"); + pjmedia_sdp_media_remove_all_attr(m, "sendrecv"); + pjmedia_sdp_media_remove_all_attr(m, "sendonly"); + pjmedia_sdp_media_remove_all_attr(m, "recvonly"); + pjmedia_sdp_media_remove_all_attr(m, "inactive"); if (call->media_dir & PJMEDIA_DIR_ENCODING) { /* Add sendonly attribute */ attr = pjmedia_sdp_attr_create(pool, "sendonly", NULL); - pjmedia_sdp_media_add_attr(sdp->media[0], attr); + pjmedia_sdp_media_add_attr(m, attr); } else { /* Add inactive attribute */ attr = pjmedia_sdp_attr_create(pool, "inactive", NULL); - pjmedia_sdp_media_add_attr(sdp->media[0], attr); + pjmedia_sdp_media_add_attr(m, attr); } } @@ -3672,7 +3677,7 @@ static void pjsua_call_on_rx_offer(pjsip_inv_session *inv, const pjmedia_sdp_session *offer) { pjsua_call *call; - pjmedia_sdp_conn *conn; + pjmedia_sdp_conn *conn = NULL; pjmedia_sdp_session *answer; pj_status_t status; @@ -3680,7 +3685,9 @@ static void pjsua_call_on_rx_offer(pjsip_inv_session *inv, call = (pjsua_call*) inv->dlg->mod_data[pjsua_var.mod.id]; - conn = offer->media[0]->conn; + if (call->audio_idx < (int)offer->media_count) + conn = offer->media[call->audio_idx]->conn; + if (!conn) conn = offer->conn; |