summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjsip/include/pjsip-ua/sip_inv.h2
-rw-r--r--pjsip/src/pjsip-ua/sip_inv.c5
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c28
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,