From 706b050fefbbdf5d7b9a3d02285e379ec9561486 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Wed, 13 Feb 2013 08:20:33 +0000 Subject: Re #1568: (PJSIP 1.x) No need to restart media when remote RTP address changed but ICE transport is running. git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@4346 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/transport.h | 25 ++++++++++++++++- pjsip/src/pjsua-lib/pjsua_media.c | 54 +++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/pjmedia/include/pjmedia/transport.h b/pjmedia/include/pjmedia/transport.h index 9762987b..dea4c174 100644 --- a/pjmedia/include/pjmedia/transport.h +++ b/pjmedia/include/pjmedia/transport.h @@ -533,7 +533,7 @@ PJ_INLINE(void) pjmedia_transport_info_init(pjmedia_transport_info *info) * for example to fill in the "c=" and "m=" line of local SDP. * * @param tp The transport. - * @param info Media socket info to be initialized. + * @param info Media transport info to be initialized. * * @return PJ_SUCCESS on success. */ @@ -547,6 +547,29 @@ PJ_INLINE(pj_status_t) pjmedia_transport_get_info(pjmedia_transport *tp, } +/** + * Utility API to get transport type specific info from the specified media + * transport info. + * + * @param info Media transport info. + * @param type Media transport type. + * + * @return Pointer to media transport specific info, or NULL if + * specific info for the transport type is not found. + */ +PJ_INLINE(void*) pjmedia_transport_info_get_spc_info( + pjmedia_transport_info *info, + pjmedia_transport_type type) +{ + unsigned i; + for (i = 0; i < info->specific_info_cnt; ++i) { + if (info->spc_info[i].type == type) + return (void*)info->spc_info[i].buffer; + } + return NULL; +} + + /** * Attach callbacks to be called on receipt of incoming RTP/RTCP packets. * This is just a simple wrapper which calls attach() member of diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 96ba358d..429ecbbb 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -857,18 +857,12 @@ static void on_ice_complete(pjmedia_transport *tp, */ pjmedia_transport_info tpinfo; pjmedia_ice_transport_info *ii = NULL; - unsigned i; pjmedia_transport_info_init(&tpinfo); pjmedia_transport_get_info(tp, &tpinfo); - for (i=0; irole==PJ_ICE_SESS_ROLE_CONTROLLING && pj_sockaddr_cmp(&tpinfo.sock_info.rtp_addr_name, &pjsua_var.calls[id].med_rtp_addr)) @@ -1586,6 +1580,20 @@ static pj_bool_t match_codec_fmtp(const pjmedia_codec_fmtp *fmtp1, } +static pj_bool_t is_ice_running(pjmedia_transport *tp) +{ + pjmedia_transport_info tpinfo; + pjmedia_ice_transport_info *ice_info; + + pjmedia_transport_info_init(&tpinfo); + pjmedia_transport_get_info(tp, &tpinfo); + ice_info = (pjmedia_ice_transport_info*) + pjmedia_transport_info_get_spc_info(&tpinfo, + PJMEDIA_TRANSPORT_TYPE_ICE); + return (ice_info && ice_info->sess_state == PJ_ICE_STRANS_STATE_RUNNING); +} + + static pj_bool_t is_media_changed(const pjsua_call *call, int new_audio_idx, const pjmedia_session_info *new_sess) @@ -1625,9 +1633,15 @@ static pj_bool_t is_media_changed(const pjsua_call *call, if (!old_si || (old_si && old_si->dir != new_si->dir)) return PJ_TRUE; - /* Compare remote RTP address */ - if (pj_sockaddr_cmp(&old_si->rem_addr, &new_si->rem_addr)) + /* Compare remote RTP address. If ICE is running, change in default + * address can happen after negotiation, this can be handled + * internally by ICE and does not need to cause media restart. + */ + if (!is_ice_running(call->med_tp) && + pj_sockaddr_cmp(&old_si->rem_addr, &new_si->rem_addr)) + { return PJ_TRUE; + } /* Compare codec info */ if (pj_stricmp(&old_ci->encoding_name, &new_ci->encoding_name) || @@ -1920,6 +1934,7 @@ pj_status_t pjsua_media_channel_update(pjsua_call_id call_id, } else { pjmedia_transport_info tp_info; + pjmedia_srtp_info *srtp_info; /* Start/restart media transport */ status = pjmedia_transport_media_start(call->med_tp, @@ -1934,18 +1949,11 @@ pj_status_t pjsua_media_channel_update(pjsua_call_id call_id, /* Get remote SRTP usage policy */ pjmedia_transport_info_init(&tp_info); pjmedia_transport_get_info(call->med_tp, &tp_info); - if (tp_info.specific_info_cnt > 0) { - unsigned i; - for (i = 0; i < tp_info.specific_info_cnt; ++i) { - if (tp_info.spc_info[i].type == PJMEDIA_TRANSPORT_TYPE_SRTP) - { - pjmedia_srtp_info *srtp_info = - (pjmedia_srtp_info*) tp_info.spc_info[i].buffer; - - call->rem_srtp_use = srtp_info->peer_use; - break; - } - } + srtp_info = (pjmedia_srtp_info*) + pjmedia_transport_info_get_spc_info( + &tp_info, PJMEDIA_TRANSPORT_TYPE_SRTP); + if (srtp_info) { + call->rem_srtp_use = srtp_info->peer_use; } if (media_changed) { -- cgit v1.2.3