summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2015-03-02 03:04:19 +0000
committerNanang Izzuddin <nanang@teluu.com>2015-03-02 03:04:19 +0000
commit241c5d358dc228badfcd832c64ff63ff9eb06674 (patch)
treec7215427ab0dedfccc9faf49054e8e347165802e /pjsip/src
parentf02b93fdb8602996b598e39f4b4b099f5514c066 (diff)
Fixed #1816: Restart media transport on following forked media.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4985 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r--pjsip/src/pjsip-ua/sip_inv.c5
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c28
2 files changed, 33 insertions, 0 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
index fda6c964..357079af 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
@@ -1894,6 +1894,9 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
tsx->mod_data[mod_inv.mod.id] = tsx_inv_data;
}
+ /* Initialize info that we are following forked media */
+ inv->following_fork = PJ_FALSE;
+
/* MUST NOT do multiple SDP offer/answer in a single transaction,
* EXCEPT if:
* - this is an initial UAC INVITE transaction (i.e. not re-INVITE), and
@@ -1947,6 +1950,8 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
return status;
}
+ inv->following_fork = PJ_TRUE;
+
} else {
if (rdata->msg_info.msg->body) {
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 6b024a61..72553b47 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -2691,6 +2691,34 @@ pj_status_t pjsua_media_channel_update(pjsua_call_id call_id,
pjmedia_transport_info tp_info;
pjmedia_srtp_info *srtp_info;
+ if (call->inv->following_fork) {
+ /* Normally media transport will automatically restart
+ * itself (if needed, based on info from the SDP) in
+ * pjmedia_transport_media_start(), however in "following
+ * forked media" case (see #1644), we need to explicitly
+ * restart it as it cannot detect fork scenario from
+ * the SDP only.
+ */
+ status = pjmedia_transport_media_stop(call_med->tp);
+ if (status != PJ_SUCCESS) {
+ PJ_PERROR(1,(THIS_FILE, status,
+ "pjmedia_transport_media_stop() failed "
+ "for call_id %d media %d",
+ call_id, mi));
+ continue;
+ }
+ status = pjmedia_transport_media_create(call_med->tp,
+ tmp_pool,
+ 0, NULL, mi);
+ if (status != PJ_SUCCESS) {
+ PJ_PERROR(1,(THIS_FILE, status,
+ "pjmedia_transport_media_create() failed "
+ "for call_id %d media %d",
+ call_id, mi));
+ continue;
+ }
+ }
+
/* Start/restart media transport based on info in SDP */
status = pjmedia_transport_media_start(call_med->tp,
tmp_pool, local_sdp,