From d67253532f2fe907888200cf94d130bcdae76b76 Mon Sep 17 00:00:00 2001 From: Yura Yaroshevich Date: Fri, 5 Mar 2021 18:21:16 +0300 Subject: [PATCH] Expose parameterless setLocalDescription() in iOS SDK. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parameterless setLocalDescription is used to implement perfect negotiation algorithm. Bug: None Change-Id: I89c39ee175fec5b09d9ca1700ef682e3cf20fe94 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/209700 Commit-Queue: Kári Helgason Reviewed-by: Kári Helgason Cr-Commit-Position: refs/heads/master@{#33401} --- .../api/peerconnection/RTCPeerConnection.h | 5 + .../api/peerconnection/RTCPeerConnection.mm | 103 +++++++++++------- 2 files changed, 66 insertions(+), 42 deletions(-) diff --git a/sdk/objc/api/peerconnection/RTCPeerConnection.h b/sdk/objc/api/peerconnection/RTCPeerConnection.h index a332b2e1d5..b33cef04bf 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnection.h +++ b/sdk/objc/api/peerconnection/RTCPeerConnection.h @@ -300,6 +300,11 @@ RTC_OBJC_EXPORT - (void)setLocalDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)sdp completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler; +/** Creates an offer or answer (depending on current signaling state) and sets + * it as the local session description. */ +- (void)setLocalDescriptionWithCompletionHandler: + (nullable void (^)(NSError *_Nullable error))completionHandler; + /** Apply the supplied RTCSessionDescription as the remote description. */ - (void)setRemoteDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)sdp completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler; diff --git a/sdk/objc/api/peerconnection/RTCPeerConnection.mm b/sdk/objc/api/peerconnection/RTCPeerConnection.mm index 766b61f6af..59fcd0ca93 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnection.mm +++ b/sdk/objc/api/peerconnection/RTCPeerConnection.mm @@ -29,12 +29,58 @@ #include "api/jsep_ice_candidate.h" #include "api/rtc_event_log_output_file.h" +#include "api/set_local_description_observer_interface.h" +#include "api/set_remote_description_observer_interface.h" #include "rtc_base/checks.h" #include "rtc_base/numerics/safe_conversions.h" NSString *const kRTCPeerConnectionErrorDomain = @"org.webrtc.RTC_OBJC_TYPE(RTCPeerConnection)"; int const kRTCPeerConnnectionSessionDescriptionError = -1; +typedef void (^RTCSetSessionDescriptionCompletionHandler)(NSError *_Nullable error); + +namespace { + +class SetSessionDescriptionObserver : public webrtc::SetLocalDescriptionObserverInterface, + public webrtc::SetRemoteDescriptionObserverInterface { + public: + SetSessionDescriptionObserver( + RTCSetSessionDescriptionCompletionHandler _Nullable completionHandler) { + completion_handler_ = completionHandler; + } + + virtual void OnSetLocalDescriptionComplete(webrtc::RTCError error) override { + if (completion_handler_ != nil) { + OnCompelete(error); + } + } + + virtual void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override { + if (completion_handler_ != nil) { + OnCompelete(error); + } + } + + private: + void OnCompelete(webrtc::RTCError error) { + RTC_DCHECK(completion_handler_); + if (error.ok()) { + completion_handler_(nil); + } else { + // TODO(hta): Add handling of error.type() + NSString *str = [NSString stringForStdString:error.message()]; + NSError *err = [NSError errorWithDomain:kRTCPeerConnectionErrorDomain + code:kRTCPeerConnnectionSessionDescriptionError + userInfo:@{NSLocalizedDescriptionKey : str}]; + completion_handler_(err); + } + completion_handler_ = nil; + } + RTCSetSessionDescriptionCompletionHandler completion_handler_; +}; + +} // anonymous namespace + namespace webrtc { class CreateSessionDescriptionObserverAdapter @@ -74,38 +120,6 @@ class CreateSessionDescriptionObserverAdapter NSError *error); }; -class SetSessionDescriptionObserverAdapter : - public SetSessionDescriptionObserver { - public: - SetSessionDescriptionObserverAdapter(void (^completionHandler) - (NSError *error)) { - completion_handler_ = completionHandler; - } - - ~SetSessionDescriptionObserverAdapter() override { completion_handler_ = nil; } - - void OnSuccess() override { - RTC_DCHECK(completion_handler_); - completion_handler_(nil); - completion_handler_ = nil; - } - - void OnFailure(RTCError error) override { - RTC_DCHECK(completion_handler_); - // TODO(hta): Add handling of error.type() - NSString *str = [NSString stringForStdString:error.message()]; - NSError* err = - [NSError errorWithDomain:kRTCPeerConnectionErrorDomain - code:kRTCPeerConnnectionSessionDescriptionError - userInfo:@{ NSLocalizedDescriptionKey : str }]; - completion_handler_(err); - completion_handler_ = nil; - } - - private: - void (^completion_handler_)(NSError *error); -}; - PeerConnectionDelegateAdapter::PeerConnectionDelegateAdapter(RTC_OBJC_TYPE(RTCPeerConnection) * peerConnection) { peer_connection_ = peerConnection; @@ -548,19 +562,24 @@ void PeerConnectionDelegateAdapter::OnRemoveTrack( } - (void)setLocalDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)sdp - completionHandler:(void (^)(NSError *error))completionHandler { - rtc::scoped_refptr observer( - new rtc::RefCountedObject( - completionHandler)); - _peerConnection->SetLocalDescription(observer, sdp.nativeDescription); + completionHandler:(nullable void (^)(NSError *error))completionHandler { + rtc::scoped_refptr observer( + new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler)); + _peerConnection->SetLocalDescription(sdp.nativeDescription->Clone(), observer); +} + +- (void)setLocalDescriptionWithCompletionHandler: + (nullable void (^)(NSError *error))completionHandler { + rtc::scoped_refptr observer( + new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler)); + _peerConnection->SetLocalDescription(observer); } - (void)setRemoteDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)sdp - completionHandler:(void (^)(NSError *error))completionHandler { - rtc::scoped_refptr observer( - new rtc::RefCountedObject( - completionHandler)); - _peerConnection->SetRemoteDescription(observer, sdp.nativeDescription); + completionHandler:(nullable void (^)(NSError *error))completionHandler { + rtc::scoped_refptr observer( + new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler)); + _peerConnection->SetRemoteDescription(sdp.nativeDescription->Clone(), observer); } - (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps