// // Created by Théo Monnom on 01/09/2022. // #include "livekit/jsep.h" #include #include #include "libwebrtc-sys/src/jsep.rs.h" #include "livekit/rtc_error.h" namespace livekit { std::string serialize_sdp_error(webrtc::SdpParseError error) { std::stringstream ss; ss << std::hex << std::setfill('0'); ss << std::setw(8) << (uint32_t)error.line.length(); ss << std::dec << std::setw(1) << error.line; ss << std::dec << std::setw(1) << error.description; return ss.str(); } IceCandidate::IceCandidate( std::unique_ptr ice_candidate) : ice_candidate_(std::move(ice_candidate)) {} rust::String IceCandidate::sdp_mid() const { return ice_candidate_->sdp_mid(); } int IceCandidate::sdp_mline_index() const { return ice_candidate_->sdp_mline_index(); } rust::String IceCandidate::candidate() const { return stringify(); } rust::String IceCandidate::stringify() const { std::string str; ice_candidate_->ToString(&str); return rust::String{str}; } std::unique_ptr IceCandidate::release() { return std::move(ice_candidate_); } std::unique_ptr create_ice_candidate(rust::String sdp_mid, int sdp_mline_index, rust::String sdp) { webrtc::SdpParseError error; auto ice_rtc = webrtc::CreateIceCandidate(sdp_mid.c_str(), sdp_mline_index, sdp.c_str(), &error); if (!ice_rtc) { throw std::runtime_error(serialize_sdp_error(error)); } return std::make_unique( std::unique_ptr(ice_rtc)); } SessionDescription::SessionDescription( std::unique_ptr session_description) : session_description_(std::move(session_description)) {} rust::String SessionDescription::stringify() const { std::string str; session_description_->ToString(&str); return rust::String{str}; } std::unique_ptr SessionDescription::clone() const { return std::make_unique(session_description_->Clone()); } std::unique_ptr SessionDescription::release() { return std::move(session_description_); } std::unique_ptr create_session_description( SdpType type, rust::String sdp) { webrtc::SdpParseError error; auto rtc_sdp = webrtc::CreateSessionDescription( static_cast(type), sdp.c_str(), &error); if (!rtc_sdp) { throw std::runtime_error(serialize_sdp_error(error)); } return std::make_unique(std::move(rtc_sdp)); } // CreateSdpObserver NativeCreateSdpObserver::NativeCreateSdpObserver( rust::Box observer) : observer_(std::move(observer)) {} void NativeCreateSdpObserver::OnSuccess( webrtc::SessionDescriptionInterface* desc) { // We have ownership of desc observer_->on_success(std::make_unique( std::unique_ptr(desc))); } void NativeCreateSdpObserver::OnFailure(webrtc::RTCError error) { observer_->on_failure(to_error(error)); } std::unique_ptr create_native_create_sdp_observer( rust::Box observer) { return std::make_unique( NativeCreateSdpObserverHandle{ rtc::make_ref_counted(std::move(observer))}); } // SetLocalSdpObserver NativeSetLocalSdpObserver::NativeSetLocalSdpObserver( rust::Box observer) : observer_(std::move(observer)) {} void NativeSetLocalSdpObserver::OnSetLocalDescriptionComplete( webrtc::RTCError error) { observer_->on_set_local_description_complete(to_error(error)); } std::unique_ptr create_native_set_local_sdp_observer( rust::Box observer) { return std::make_unique( NativeSetLocalSdpObserverHandle{ rtc::make_ref_counted( std::move(observer))}); } // SetRemoteSdpObserver NativeSetRemoteSdpObserver::NativeSetRemoteSdpObserver( rust::Box observer) : observer_(std::move(observer)) {} void NativeSetRemoteSdpObserver::OnSetRemoteDescriptionComplete( webrtc::RTCError error) { observer_->on_set_remote_description_complete(to_error(error)); } std::unique_ptr create_native_set_remote_sdp_observer( rust::Box observer) { return std::make_unique( NativeSetRemoteSdpObserverHandle{ rtc::make_ref_counted( std::move(observer))}); } } // namespace livekit