Index: webrtc/api/java/jni/peerconnection_jni.cc |
diff --git a/webrtc/api/java/jni/peerconnection_jni.cc b/webrtc/api/java/jni/peerconnection_jni.cc |
index 09e8db24e791f31e566d13f6a3650791b14ac342..3b67413f7e3b9a83bf128464a1afcaa5f554fa7e 100644 |
--- a/webrtc/api/java/jni/peerconnection_jni.cc |
+++ b/webrtc/api/java/jni/peerconnection_jni.cc |
@@ -1038,14 +1038,16 @@ JOW(void, PeerConnectionFactory_shutdownInternalTracer)(JNIEnv* jni, jclass) { |
// single thing for Java to hold and eventually free. |
class OwnedFactoryAndThreads { |
public: |
- OwnedFactoryAndThreads(Thread* worker_thread, |
- Thread* signaling_thread, |
+ OwnedFactoryAndThreads(std::unique_ptr<Thread> network_thread, |
+ std::unique_ptr<Thread> worker_thread, |
+ std::unique_ptr<Thread> signaling_thread, |
WebRtcVideoEncoderFactory* encoder_factory, |
WebRtcVideoDecoderFactory* decoder_factory, |
rtc::NetworkMonitorFactory* network_monitor_factory, |
PeerConnectionFactoryInterface* factory) |
- : worker_thread_(worker_thread), |
- signaling_thread_(signaling_thread), |
+ : network_thread_(std::move(network_thread)), |
+ worker_thread_(std::move(worker_thread)), |
+ signaling_thread_(std::move(signaling_thread)), |
encoder_factory_(encoder_factory), |
decoder_factory_(decoder_factory), |
network_monitor_factory_(network_monitor_factory), |
@@ -1070,6 +1072,7 @@ class OwnedFactoryAndThreads { |
private: |
void JavaCallbackOnFactoryThreads(); |
+ const std::unique_ptr<Thread> network_thread_; |
const std::unique_ptr<Thread> worker_thread_; |
const std::unique_ptr<Thread> signaling_thread_; |
WebRtcVideoEncoderFactory* encoder_factory_; |
@@ -1083,11 +1086,15 @@ void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() { |
ScopedLocalRefFrame local_ref_frame(jni); |
jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory"); |
jmethodID m = nullptr; |
- if (Thread::Current() == worker_thread_.get()) { |
+ if (network_thread_->IsCurrent()) { |
+ LOG(LS_INFO) << "Network thread JavaCallback"; |
+ m = GetStaticMethodID(jni, j_factory_class, "onNetworkThreadReady", "()V"); |
+ } |
+ if (worker_thread_->IsCurrent()) { |
LOG(LS_INFO) << "Worker thread JavaCallback"; |
m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V"); |
} |
- if (Thread::Current() == signaling_thread_.get()) { |
+ if (signaling_thread_->IsCurrent()) { |
LOG(LS_INFO) << "Signaling thread JavaCallback"; |
m = GetStaticMethodID( |
jni, j_factory_class, "onSignalingThreadReady", "()V"); |
@@ -1100,10 +1107,9 @@ void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() { |
void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() { |
LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads."; |
- worker_thread_->Invoke<void>( |
- Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this)); |
- signaling_thread_->Invoke<void>( |
- Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this)); |
+ network_thread_->Invoke<void>([this] { JavaCallbackOnFactoryThreads(); }); |
+ worker_thread_->Invoke<void>([this] { JavaCallbackOnFactoryThreads(); }); |
+ signaling_thread_->Invoke<void>([this] { JavaCallbackOnFactoryThreads(); }); |
} |
PeerConnectionFactoryInterface::Options ParseOptionsFromJava(JNIEnv* jni, |
@@ -1143,12 +1149,20 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
// about ramifications of auto-wrapping there. |
rtc::ThreadManager::Instance()->WrapCurrentThread(); |
webrtc::Trace::CreateTrace(); |
- Thread* worker_thread = new Thread(); |
- worker_thread->SetName("worker_thread", NULL); |
- Thread* signaling_thread = new Thread(); |
+ |
+ std::unique_ptr<Thread> network_thread = |
+ rtc::Thread::CreateWithSocketServer(); |
+ network_thread->SetName("network_thread", nullptr); |
+ RTC_CHECK(network_thread->Start()) << "Failed to start thread"; |
+ |
+ std::unique_ptr<Thread> worker_thread = rtc::Thread::Create(); |
+ worker_thread->SetName("worker_thread", nullptr); |
+ RTC_CHECK(worker_thread->Start()) << "Failed to start thread"; |
+ |
+ std::unique_ptr<Thread> signaling_thread = rtc::Thread::Create(); |
signaling_thread->SetName("signaling_thread", NULL); |
- RTC_CHECK(worker_thread->Start() && signaling_thread->Start()) |
- << "Failed to start threads"; |
+ RTC_CHECK(signaling_thread->Start()) << "Failed to start thread"; |
+ |
WebRtcVideoEncoderFactory* encoder_factory = nullptr; |
WebRtcVideoDecoderFactory* decoder_factory = nullptr; |
rtc::NetworkMonitorFactory* network_monitor_factory = nullptr; |
@@ -1171,11 +1185,9 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
} |
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( |
- webrtc::CreatePeerConnectionFactory(worker_thread, |
- signaling_thread, |
- NULL, |
- encoder_factory, |
- decoder_factory)); |
+ webrtc::CreatePeerConnectionFactory( |
+ network_thread.get(), worker_thread.get(), signaling_thread.get(), |
+ nullptr, encoder_factory, decoder_factory)); |
RTC_CHECK(factory) << "Failed to create the peer connection factory; " |
<< "WebRTC/libjingle init likely failed on this device"; |
// TODO(honghaiz): Maybe put the options as the argument of |
@@ -1184,8 +1196,8 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
factory->SetOptions(options); |
} |
OwnedFactoryAndThreads* owned_factory = new OwnedFactoryAndThreads( |
- worker_thread, signaling_thread, |
- encoder_factory, decoder_factory, |
+ std::move(network_thread), std::move(worker_thread), |
+ std::move(signaling_thread), encoder_factory, decoder_factory, |
network_monitor_factory, factory.release()); |
owned_factory->InvokeJavaCallbacksOnFactoryThreads(); |
return jlongFromPointer(owned_factory); |