summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2013-02-19 16:16:37 +0000
committerNanang Izzuddin <nanang@teluu.com>2013-02-19 16:16:37 +0000
commite39e25134d3595d4fc4cf39d804bd0a9d986c02a (patch)
treebb713db2c5a2475dcdec8c7db27156f7b5d4ed23
parent514ac6048250640820c042999cc43f613a51a93c (diff)
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
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c62
1 files changed, 61 insertions, 1 deletions
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);