From e39e25134d3595d4fc4cf39d804bd0a9d986c02a Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 19 Feb 2013 16:16:37 +0000 Subject: Re #1242: Fixed overridden media direction and c=0.0.0.0 line in the re-invite. For example when sending call hold and remote answers with multiple codecs, re-invite of lock codec is sent with SDP a=sendrecv line. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4353 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsua-lib/pjsua_call.c | 62 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) (limited to 'pjsip/src/pjsua-lib/pjsua_call.c') diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 8bda8fa6..0ff545e5 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -3156,6 +3156,7 @@ static pj_status_t process_pending_reinvite(pjsua_call *call) /* Check if we need to lock codec */ need_lock_codec = check_lock_codec(call); + need_lock_codec = PJ_TRUE; /* Check if reinvite is really needed */ if (!need_lock_codec && !ice_need_reinv) @@ -3257,10 +3258,69 @@ static pj_status_t process_pending_reinvite(pjsua_call *call) "fmtp", fmt); if (a) pjmedia_sdp_attr_add(&m->attr_count, m->attr, a); } - } } } + + /* Put back original direction and "c=0.0.0.0" line */ + { + const pjmedia_sdp_session *cur_sdp; + + /* Get local active SDP */ + status = pjmedia_sdp_neg_get_active_local(call->inv->neg, &cur_sdp); + if (status != PJ_SUCCESS) + return status; + + /* Make sure media count has not been changed */ + if (call->med_cnt != cur_sdp->media_count) + return PJMEDIA_SDPNEG_EINSTATE; + + for (i = 0; i < call->med_cnt; ++i) { + const pjmedia_sdp_media *m = cur_sdp->media[i]; + pjmedia_sdp_media *new_m = new_offer->media[i]; + pjsua_call_media *call_med = &call->media[i]; + pjmedia_sdp_attr *a = NULL; + + /* Update direction to the current dir */ + pjmedia_sdp_media_remove_all_attr(new_m, "sendrecv"); + pjmedia_sdp_media_remove_all_attr(new_m, "sendonly"); + pjmedia_sdp_media_remove_all_attr(new_m, "recvonly"); + pjmedia_sdp_media_remove_all_attr(new_m, "inactive"); + + if (call_med->dir == PJMEDIA_DIR_ENCODING_DECODING) { + a = pjmedia_sdp_attr_create(pool, "sendrecv", NULL); + } else if (call_med->dir == PJMEDIA_DIR_ENCODING) { + a = pjmedia_sdp_attr_create(pool, "sendonly", NULL); + } else if (call_med->dir == PJMEDIA_DIR_DECODING) { + a = pjmedia_sdp_attr_create(pool, "recvonly", NULL); + } else { + const pjmedia_sdp_conn *conn; + a = pjmedia_sdp_attr_create(pool, "inactive", NULL); + + /* Also check if the original c= line address is zero */ + conn = m->conn; + if (!conn) + conn = cur_sdp->conn; + if (pj_strcmp2(&conn->addr, "0.0.0.0")==0 || + pj_strcmp2(&conn->addr, "0")==0) + { + if (!new_m->conn) { + new_m->conn = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_conn); + } + + if (pj_strcmp2(&new_m->conn->addr, "0.0.0.0")) { + new_m->conn->net_type = pj_str("IN"); + new_m->conn->addr_type = pj_str("IP4"); + new_m->conn->addr = pj_str("0.0.0.0"); + } + } + } + + pj_assert(a); + pjmedia_sdp_media_add_attr(new_m, a); + } + } + if (rem_can_update) { status = pjsip_inv_update(inv, NULL, new_offer, &tdata); -- cgit v1.2.3