diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp index 440d7808cecd515d70d6065c5796690d6b807de6..14008b565795b46817f6059b2b07e38571efbd38 100644 --- a/src/sip/sipcall.cpp +++ b/src/sip/sipcall.cpp @@ -1000,13 +1000,8 @@ SIPCall::onReceiveOffer(const pjmedia_sdp_session* offer) acc.getActiveAccountCodecInfoList(MEDIA_AUDIO), acc.getActiveAccountCodecInfoList(acc.isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE), acc.getSrtpKeyExchange(), - getState() == CallState::HOLD - ); - auto ice_attrs = Sdp::getIceAttributes(offer); - if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) { - if (initIceTransport(false)) - setupLocalSDPFromIce(); - } + getState() == CallState::HOLD); + setRemoteSdp(offer); sdp_->startNegotiation(); pjsip_inv_set_sdp_answer(inv.get(), sdp_->getLocalSdpSession()); } @@ -1136,4 +1131,20 @@ SIPCall::merge(const std::shared_ptr<SIPCall>& scall) waitForIceAndStartMedia(); } +void +SIPCall::setRemoteSdp(const pjmedia_sdp_session* sdp) +{ + if (!sdp) + return; + + auto ice_attrs = Sdp::getIceAttributes(sdp); + if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) { + if (not getIceTransport()) { + RING_DBG("Initializing ICE transport"); + initIceTransport(false); + } + setupLocalSDPFromIce(); + } +} + } // namespace ring diff --git a/src/sip/sipcall.h b/src/sip/sipcall.h index c7542f6ffc336c9bcc1bbd08ef49a7dafb14fc2d..d5bc13a97a030208bb029275d0822409d368b347 100644 --- a/src/sip/sipcall.h +++ b/src/sip/sipcall.h @@ -224,6 +224,12 @@ class SIPCall : public Call peerRegistredName_ = name; } + /** + * Give peer SDP to the call for handling + * @param sdp pointer on PJSIP sdp structure, could be nullptr (acts as no-op in such case) + */ + void setRemoteSdp(const pjmedia_sdp_session* sdp); + private: NON_COPYABLE(SIPCall); diff --git a/src/sip/sipvoiplink.cpp b/src/sip/sipvoiplink.cpp index 548b91ba2d64207d1fa4f50973a397459839c59b..413ab8682e0c0b0731837b45a7b980252c42dd3f 100644 --- a/src/sip/sipvoiplink.cpp +++ b/src/sip/sipvoiplink.cpp @@ -335,16 +335,8 @@ transaction_request_cb(pjsip_rx_data *rdata) call->getSDP().receiveOffer(r_sdp, account->getActiveAccountCodecInfoList(MEDIA_AUDIO), account->getActiveAccountCodecInfoList(account->isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE), - account->getSrtpKeyExchange() - ); - auto ice_attrs = Sdp::getIceAttributes(r_sdp); - if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) { - if (not call->getIceTransport()) { - RING_DBG("Initializing ICE transport"); - call->initIceTransport(false); - } - call->setupLocalSDPFromIce(); - } + account->getSrtpKeyExchange()); + call->setRemoteSdp(r_sdp); pjsip_dialog *dialog = nullptr; if (pjsip_dlg_create_uas_and_inc_lock(pjsip_ua_instance(), rdata, nullptr, &dialog) != PJ_SUCCESS) {