diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2015-03-02 03:04:19 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2015-03-02 03:04:19 +0000 |
commit | 241c5d358dc228badfcd832c64ff63ff9eb06674 (patch) | |
tree | c7215427ab0dedfccc9faf49054e8e347165802e /pjsip | |
parent | f02b93fdb8602996b598e39f4b4b099f5514c066 (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')
-rw-r--r-- | pjsip/include/pjsip-ua/sip_inv.h | 2 | ||||
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 5 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 28 |
3 files changed, 35 insertions, 0 deletions
diff --git a/pjsip/include/pjsip-ua/sip_inv.h b/pjsip/include/pjsip-ua/sip_inv.h index bbf2a7b8..858cb3a5 100644 --- a/pjsip/include/pjsip-ua/sip_inv.h +++ b/pjsip/include/pjsip-ua/sip_inv.h @@ -410,6 +410,8 @@ struct pjsip_inv_session pj_int32_t last_ack_cseq; /**< CSeq of last ACK */ void *mod_data[PJSIP_MAX_MODULE];/**< Modules data. */ struct pjsip_timer *timer; /**< Session Timers. */ + pj_bool_t following_fork; /**< Internal, following + forked media? */ }; 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, |