From 4e9e723dae91abf2307b2436c3e49c888e4374d2 Mon Sep 17 00:00:00 2001 From: Yura Yaroshevich Date: Mon, 22 Mar 2021 11:45:43 +0300 Subject: [PATCH] Expose setLocalDescription() in SDK for Android. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parameterless sLD is part of perfect negotiation algo. Bug: webrtc:12609 Change-Id: I13a6b0bf29db8b4e984da9b2645f9bfdb23e074c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/212605 Reviewed-by: Xavier Lepaul‎ Commit-Queue: Yura Yaroshevich Cr-Commit-Position: refs/heads/master@{#33641} --- .../api/org/webrtc/PeerConnection.java | 5 +++ sdk/android/src/jni/pc/peer_connection.cc | 21 ++++++++---- sdk/android/src/jni/pc/sdp_observer.cc | 34 ++++++++++++------- sdk/android/src/jni/pc/sdp_observer.h | 25 +++++++++----- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java index 97c7e77958..d998f00810 100644 --- a/sdk/android/api/org/webrtc/PeerConnection.java +++ b/sdk/android/api/org/webrtc/PeerConnection.java @@ -883,6 +883,10 @@ public class PeerConnection { nativeCreateAnswer(observer, constraints); } + public void setLocalDescription(SdpObserver observer) { + nativeSetLocalDescriptionAutomatically(observer); + } + public void setLocalDescription(SdpObserver observer, SessionDescription sdp) { nativeSetLocalDescription(observer, sdp); } @@ -1272,6 +1276,7 @@ public class PeerConnection { private native DataChannel nativeCreateDataChannel(String label, DataChannel.Init init); private native void nativeCreateOffer(SdpObserver observer, MediaConstraints constraints); private native void nativeCreateAnswer(SdpObserver observer, MediaConstraints constraints); + private native void nativeSetLocalDescriptionAutomatically(SdpObserver observer); private native void nativeSetLocalDescription(SdpObserver observer, SessionDescription sdp); private native void nativeSetRemoteDescription(SdpObserver observer, SessionDescription sdp); private native void nativeRestartIce(); diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc index 106d6d1f9b..be1cddd0e0 100644 --- a/sdk/android/src/jni/pc/peer_connection.cc +++ b/sdk/android/src/jni/pc/peer_connection.cc @@ -571,15 +571,24 @@ static void JNI_PeerConnection_CreateAnswer( ExtractNativePC(jni, j_pc)->CreateAnswer(observer, options); } +static void JNI_PeerConnection_SetLocalDescriptionAutomatically( + JNIEnv* jni, + const JavaParamRef& j_pc, + const JavaParamRef& j_observer) { + rtc::scoped_refptr observer( + new rtc::RefCountedObject(jni, j_observer)); + ExtractNativePC(jni, j_pc)->SetLocalDescription(observer); +} + static void JNI_PeerConnection_SetLocalDescription( JNIEnv* jni, const JavaParamRef& j_pc, const JavaParamRef& j_observer, const JavaParamRef& j_sdp) { - rtc::scoped_refptr observer( - new rtc::RefCountedObject(jni, j_observer, nullptr)); + rtc::scoped_refptr observer( + new rtc::RefCountedObject(jni, j_observer)); ExtractNativePC(jni, j_pc)->SetLocalDescription( - observer, JavaToNativeSessionDescription(jni, j_sdp).release()); + JavaToNativeSessionDescription(jni, j_sdp), observer); } static void JNI_PeerConnection_SetRemoteDescription( @@ -587,10 +596,10 @@ static void JNI_PeerConnection_SetRemoteDescription( const JavaParamRef& j_pc, const JavaParamRef& j_observer, const JavaParamRef& j_sdp) { - rtc::scoped_refptr observer( - new rtc::RefCountedObject(jni, j_observer, nullptr)); + rtc::scoped_refptr observer( + new rtc::RefCountedObject(jni, j_observer)); ExtractNativePC(jni, j_pc)->SetRemoteDescription( - observer, JavaToNativeSessionDescription(jni, j_sdp).release()); + JavaToNativeSessionDescription(jni, j_sdp), observer); } static void JNI_PeerConnection_RestartIce(JNIEnv* jni, diff --git a/sdk/android/src/jni/pc/sdp_observer.cc b/sdk/android/src/jni/pc/sdp_observer.cc index d1842a3db0..c8b4345af4 100644 --- a/sdk/android/src/jni/pc/sdp_observer.cc +++ b/sdk/android/src/jni/pc/sdp_observer.cc @@ -47,24 +47,34 @@ void CreateSdpObserverJni::OnFailure(webrtc::RTCError error) { NativeToJavaString(env, error.message())); } -SetSdpObserverJni::SetSdpObserverJni( +SetLocalSdpObserverJni::SetLocalSdpObserverJni( JNIEnv* env, - const JavaRef& j_observer, - std::unique_ptr constraints) - : j_observer_global_(env, j_observer), - constraints_(std::move(constraints)) {} + const JavaRef& j_observer) + : j_observer_global_(env, j_observer) {} -SetSdpObserverJni::~SetSdpObserverJni() = default; - -void SetSdpObserverJni::OnSuccess() { +void SetLocalSdpObserverJni::OnSetLocalDescriptionComplete(RTCError error) { JNIEnv* env = AttachCurrentThreadIfNeeded(); - Java_SdpObserver_onSetSuccess(env, j_observer_global_); + if (error.ok()) { + Java_SdpObserver_onSetSuccess(env, j_observer_global_); + } else { + Java_SdpObserver_onSetFailure(env, j_observer_global_, + NativeToJavaString(env, error.message())); + } } -void SetSdpObserverJni::OnFailure(webrtc::RTCError error) { +SetRemoteSdpObserverJni::SetRemoteSdpObserverJni( + JNIEnv* env, + const JavaRef& j_observer) + : j_observer_global_(env, j_observer) {} + +void SetRemoteSdpObserverJni::OnSetRemoteDescriptionComplete(RTCError error) { JNIEnv* env = AttachCurrentThreadIfNeeded(); - Java_SdpObserver_onSetFailure(env, j_observer_global_, - NativeToJavaString(env, error.message())); + if (error.ok()) { + Java_SdpObserver_onSetSuccess(env, j_observer_global_); + } else { + Java_SdpObserver_onSetFailure(env, j_observer_global_, + NativeToJavaString(env, error.message())); + } } } // namespace jni diff --git a/sdk/android/src/jni/pc/sdp_observer.h b/sdk/android/src/jni/pc/sdp_observer.h index 68ded76e7d..b33a3018c8 100644 --- a/sdk/android/src/jni/pc/sdp_observer.h +++ b/sdk/android/src/jni/pc/sdp_observer.h @@ -39,21 +39,28 @@ class CreateSdpObserverJni : public CreateSessionDescriptionObserver { std::unique_ptr constraints_; }; -class SetSdpObserverJni : public SetSessionDescriptionObserver { +class SetLocalSdpObserverJni : public SetLocalDescriptionObserverInterface { public: - SetSdpObserverJni(JNIEnv* env, - const JavaRef& j_observer, - std::unique_ptr constraints); - ~SetSdpObserverJni() override; + SetLocalSdpObserverJni(JNIEnv* env, const JavaRef& j_observer); - MediaConstraints* constraints() { return constraints_.get(); } + ~SetLocalSdpObserverJni() override = default; - void OnSuccess() override; - void OnFailure(RTCError error) override; + virtual void OnSetLocalDescriptionComplete(RTCError error) override; + + private: + const ScopedJavaGlobalRef j_observer_global_; +}; + +class SetRemoteSdpObserverJni : public SetRemoteDescriptionObserverInterface { + public: + SetRemoteSdpObserverJni(JNIEnv* env, const JavaRef& j_observer); + + ~SetRemoteSdpObserverJni() override = default; + + virtual void OnSetRemoteDescriptionComplete(RTCError error) override; private: const ScopedJavaGlobalRef j_observer_global_; - std::unique_ptr constraints_; }; } // namespace jni