From 9214fe3bd69944653b2fe68fe19038fc1cfe47ee Mon Sep 17 00:00:00 2001 From: Pierre Lespagnol <pierre.lespagnol@savoirfairelinux.com> Date: Tue, 26 May 2020 11:12:09 -0400 Subject: [PATCH] ice_transport: move media ice destruction in IO thread Ice destruction can take too long and delay media initialization. This causes first packets sent by the peer to be missed. This patch fix multi-device call bug with Android (and MediaCodec) Change-Id: I4ceb1838e668d5be2ed36d1e0d2f00113833f63c --- src/sip/sipcall.cpp | 4 +++- src/sip/sipcall.h | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp index c4e1c578f9..e34ed83119 100644 --- a/src/sip/sipcall.cpp +++ b/src/sip/sipcall.cpp @@ -103,6 +103,8 @@ SIPCall::SIPCall(SIPAccountBase& account, const std::string& id, Call::CallType SIPCall::~SIPCall() { std::lock_guard<std::recursive_mutex> lk {callMutex_}; + if (tmpMediaTransport_) + dht::ThreadPool::io().run([ice=std::make_shared<decltype(tmpMediaTransport_)>(std::move(tmpMediaTransport_))] { }); setTransport({}); inv.reset(); // prevents callback usage } @@ -1381,7 +1383,7 @@ SIPCall::initIceMediaTransport(bool master, unsigned channel_num) JAMI_DBG("[call:%s] create media ICE transport", getCallId().c_str()); auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); - tmpMediaTransport_ = iceTransportFactory.createTransport(getCallId().c_str(), + tmpMediaTransport_ = iceTransportFactory.createUTransport(getCallId().c_str(), channel_num, master, getAccount().getIceOptions()); return static_cast<bool>(tmpMediaTransport_); diff --git a/src/sip/sipcall.h b/src/sip/sipcall.h index 9e2cd2b273..aa4bbbc942 100644 --- a/src/sip/sipcall.h +++ b/src/sip/sipcall.h @@ -236,9 +236,6 @@ public: // NOT SIP RELATED (good candidates to be moved elsewhere) std::unique_ptr<IceSocket> newIceSocket(unsigned compId); - IceTransport* getIceMediaTransport() const { - return tmpMediaTransport_ ? tmpMediaTransport_.get() : mediaTransport_.get(); - } void deinitRecorder(); @@ -250,6 +247,9 @@ private: NON_COPYABLE(SIPCall); + IceTransport* getIceMediaTransport() const { + return tmpMediaTransport_ ? tmpMediaTransport_.get() : mediaTransport_.get(); + } void setCallMediaLocal(); void waitForIceAndStartMedia(); @@ -339,7 +339,7 @@ private: std::shared_ptr<IceTransport> mediaTransport_; ///< Temporary transport for media. Replace mediaTransport_ when connected with success - std::shared_ptr<IceTransport> tmpMediaTransport_; + std::unique_ptr<IceTransport> tmpMediaTransport_; std::string peerUri_{}; -- GitLab