Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: webrtc/api/java/jni/peerconnection_jni.cc

Issue 1888903003: Network thread (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/api/fakemediacontroller.h ('k') | webrtc/api/mediacontroller.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 } 1028 }
1029 1029
1030 // Helper struct for working around the fact that CreatePeerConnectionFactory() 1030 // Helper struct for working around the fact that CreatePeerConnectionFactory()
1031 // comes in two flavors: either entirely automagical (constructing its own 1031 // comes in two flavors: either entirely automagical (constructing its own
1032 // threads and deleting them on teardown, but no external codec factory support) 1032 // threads and deleting them on teardown, but no external codec factory support)
1033 // or entirely manual (requires caller to delete threads after factory 1033 // or entirely manual (requires caller to delete threads after factory
1034 // teardown). This struct takes ownership of its ctor's arguments to present a 1034 // teardown). This struct takes ownership of its ctor's arguments to present a
1035 // single thing for Java to hold and eventually free. 1035 // single thing for Java to hold and eventually free.
1036 class OwnedFactoryAndThreads { 1036 class OwnedFactoryAndThreads {
1037 public: 1037 public:
1038 OwnedFactoryAndThreads(Thread* worker_thread, 1038 OwnedFactoryAndThreads(std::unique_ptr<Thread> network_thread,
1039 Thread* signaling_thread, 1039 std::unique_ptr<Thread> worker_thread,
1040 std::unique_ptr<Thread> signaling_thread,
1040 WebRtcVideoEncoderFactory* encoder_factory, 1041 WebRtcVideoEncoderFactory* encoder_factory,
1041 WebRtcVideoDecoderFactory* decoder_factory, 1042 WebRtcVideoDecoderFactory* decoder_factory,
1042 rtc::NetworkMonitorFactory* network_monitor_factory, 1043 rtc::NetworkMonitorFactory* network_monitor_factory,
1043 PeerConnectionFactoryInterface* factory) 1044 PeerConnectionFactoryInterface* factory)
1044 : worker_thread_(worker_thread), 1045 : network_thread_(std::move(network_thread)),
1045 signaling_thread_(signaling_thread), 1046 worker_thread_(std::move(worker_thread)),
1047 signaling_thread_(std::move(signaling_thread)),
1046 encoder_factory_(encoder_factory), 1048 encoder_factory_(encoder_factory),
1047 decoder_factory_(decoder_factory), 1049 decoder_factory_(decoder_factory),
1048 network_monitor_factory_(network_monitor_factory), 1050 network_monitor_factory_(network_monitor_factory),
1049 factory_(factory) {} 1051 factory_(factory) {}
1050 1052
1051 ~OwnedFactoryAndThreads() { 1053 ~OwnedFactoryAndThreads() {
1052 CHECK_RELEASE(factory_); 1054 CHECK_RELEASE(factory_);
1053 if (network_monitor_factory_ != nullptr) { 1055 if (network_monitor_factory_ != nullptr) {
1054 rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_); 1056 rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_);
1055 } 1057 }
1056 } 1058 }
1057 1059
1058 PeerConnectionFactoryInterface* factory() { return factory_; } 1060 PeerConnectionFactoryInterface* factory() { return factory_; }
1059 WebRtcVideoEncoderFactory* encoder_factory() { return encoder_factory_; } 1061 WebRtcVideoEncoderFactory* encoder_factory() { return encoder_factory_; }
1060 WebRtcVideoDecoderFactory* decoder_factory() { return decoder_factory_; } 1062 WebRtcVideoDecoderFactory* decoder_factory() { return decoder_factory_; }
1061 rtc::NetworkMonitorFactory* network_monitor_factory() { 1063 rtc::NetworkMonitorFactory* network_monitor_factory() {
1062 return network_monitor_factory_; 1064 return network_monitor_factory_;
1063 } 1065 }
1064 void clear_network_monitor_factory() { network_monitor_factory_ = nullptr; } 1066 void clear_network_monitor_factory() { network_monitor_factory_ = nullptr; }
1065 void InvokeJavaCallbacksOnFactoryThreads(); 1067 void InvokeJavaCallbacksOnFactoryThreads();
1066 1068
1067 private: 1069 private:
1068 void JavaCallbackOnFactoryThreads(); 1070 void JavaCallbackOnFactoryThreads();
1069 1071
1072 const std::unique_ptr<Thread> network_thread_;
1070 const std::unique_ptr<Thread> worker_thread_; 1073 const std::unique_ptr<Thread> worker_thread_;
1071 const std::unique_ptr<Thread> signaling_thread_; 1074 const std::unique_ptr<Thread> signaling_thread_;
1072 WebRtcVideoEncoderFactory* encoder_factory_; 1075 WebRtcVideoEncoderFactory* encoder_factory_;
1073 WebRtcVideoDecoderFactory* decoder_factory_; 1076 WebRtcVideoDecoderFactory* decoder_factory_;
1074 rtc::NetworkMonitorFactory* network_monitor_factory_; 1077 rtc::NetworkMonitorFactory* network_monitor_factory_;
1075 PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor. 1078 PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor.
1076 }; 1079 };
1077 1080
1078 void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() { 1081 void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() {
1079 JNIEnv* jni = AttachCurrentThreadIfNeeded(); 1082 JNIEnv* jni = AttachCurrentThreadIfNeeded();
1080 ScopedLocalRefFrame local_ref_frame(jni); 1083 ScopedLocalRefFrame local_ref_frame(jni);
1081 jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory"); 1084 jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory");
1082 jmethodID m = nullptr; 1085 jmethodID m = nullptr;
1086 if (Thread::Current() == network_thread_.get()) {
1087 LOG(LS_INFO) << "Network thread JavaCallback";
1088 m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V");
1089 }
1083 if (Thread::Current() == worker_thread_.get()) { 1090 if (Thread::Current() == worker_thread_.get()) {
1084 LOG(LS_INFO) << "Worker thread JavaCallback"; 1091 LOG(LS_INFO) << "Worker thread JavaCallback";
1085 m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V"); 1092 m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V");
1086 } 1093 }
1087 if (Thread::Current() == signaling_thread_.get()) { 1094 if (Thread::Current() == signaling_thread_.get()) {
1088 LOG(LS_INFO) << "Signaling thread JavaCallback"; 1095 LOG(LS_INFO) << "Signaling thread JavaCallback";
1089 m = GetStaticMethodID( 1096 m = GetStaticMethodID(
1090 jni, j_factory_class, "onSignalingThreadReady", "()V"); 1097 jni, j_factory_class, "onSignalingThreadReady", "()V");
1091 } 1098 }
1092 if (m != nullptr) { 1099 if (m != nullptr) {
1093 jni->CallStaticVoidMethod(j_factory_class, m); 1100 jni->CallStaticVoidMethod(j_factory_class, m);
1094 CHECK_EXCEPTION(jni) << "error during JavaCallback::CallStaticVoidMethod"; 1101 CHECK_EXCEPTION(jni) << "error during JavaCallback::CallStaticVoidMethod";
1095 } 1102 }
1096 } 1103 }
1097 1104
1098 void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() { 1105 void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() {
1099 LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads."; 1106 LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads.";
1100 worker_thread_->Invoke<void>( 1107 network_thread_->Invoke<void>(
1101 Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this)); 1108 Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this));
1109 if (worker_thread_) {
1110 worker_thread_->Invoke<void>(
1111 Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this));
1112 }
1102 signaling_thread_->Invoke<void>( 1113 signaling_thread_->Invoke<void>(
1103 Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this)); 1114 Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this));
1104 } 1115 }
1105 1116
1106 PeerConnectionFactoryInterface::Options ParseOptionsFromJava(JNIEnv* jni, 1117 PeerConnectionFactoryInterface::Options ParseOptionsFromJava(JNIEnv* jni,
1107 jobject options) { 1118 jobject options) {
1108 jclass options_class = jni->GetObjectClass(options); 1119 jclass options_class = jni->GetObjectClass(options);
1109 jfieldID network_ignore_mask_field = 1120 jfieldID network_ignore_mask_field =
1110 jni->GetFieldID(options_class, "networkIgnoreMask", "I"); 1121 jni->GetFieldID(options_class, "networkIgnoreMask", "I");
1111 int network_ignore_mask = 1122 int network_ignore_mask =
(...skipping 19 matching lines...) Expand all
1131 return native_options; 1142 return native_options;
1132 } 1143 }
1133 1144
1134 JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( 1145 JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)(
1135 JNIEnv* jni, jclass, jobject joptions) { 1146 JNIEnv* jni, jclass, jobject joptions) {
1136 // talk/ assumes pretty widely that the current Thread is ThreadManager'd, but 1147 // talk/ assumes pretty widely that the current Thread is ThreadManager'd, but
1137 // ThreadManager only WrapCurrentThread()s the thread where it is first 1148 // ThreadManager only WrapCurrentThread()s the thread where it is first
1138 // created. Since the semantics around when auto-wrapping happens in 1149 // created. Since the semantics around when auto-wrapping happens in
1139 // webrtc/base/ are convoluted, we simply wrap here to avoid having to think 1150 // webrtc/base/ are convoluted, we simply wrap here to avoid having to think
1140 // about ramifications of auto-wrapping there. 1151 // about ramifications of auto-wrapping there.
1152 // TODO(danilchap): Make choice or move flag below to easier settable.
1153 const bool worker_is_network = false;
1141 rtc::ThreadManager::Instance()->WrapCurrentThread(); 1154 rtc::ThreadManager::Instance()->WrapCurrentThread();
1142 webrtc::Trace::CreateTrace(); 1155 webrtc::Trace::CreateTrace();
1143 Thread* worker_thread = new Thread(); 1156 std::unique_ptr<Thread> network_thread =
1144 worker_thread->SetName("worker_thread", NULL); 1157 rtc::Thread::CreateWithSocketServer();
1145 Thread* signaling_thread = new Thread(); 1158 network_thread->SetName("network_thread", NULL);
1159 RTC_CHECK(network_thread->Start()) << "Failed to start thread";
1160 Thread* worker_thread = nullptr;
1161 std::unique_ptr<Thread> worker_thread_own;
1162 if (worker_is_network) {
1163 worker_thread = network_thread.get();
1164 } else {
1165 worker_thread_own = rtc::Thread::Create();
1166 worker_thread = worker_thread_own.get();
1167 worker_thread->SetName("worker_thread", NULL);
1168 RTC_CHECK(worker_thread->Start()) << "Failed to start thread";
1169 }
1170 std::unique_ptr<Thread> signaling_thread = rtc::Thread::Create();
1146 signaling_thread->SetName("signaling_thread", NULL); 1171 signaling_thread->SetName("signaling_thread", NULL);
1147 RTC_CHECK(worker_thread->Start() && signaling_thread->Start()) 1172 RTC_CHECK(signaling_thread->Start()) << "Failed to start thread";
1148 << "Failed to start threads";
1149 WebRtcVideoEncoderFactory* encoder_factory = nullptr; 1173 WebRtcVideoEncoderFactory* encoder_factory = nullptr;
1150 WebRtcVideoDecoderFactory* decoder_factory = nullptr; 1174 WebRtcVideoDecoderFactory* decoder_factory = nullptr;
1151 rtc::NetworkMonitorFactory* network_monitor_factory = nullptr; 1175 rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
1152 1176
1153 PeerConnectionFactoryInterface::Options options; 1177 PeerConnectionFactoryInterface::Options options;
1154 bool has_options = joptions != NULL; 1178 bool has_options = joptions != NULL;
1155 if (has_options) { 1179 if (has_options) {
1156 options = ParseOptionsFromJava(jni, joptions); 1180 options = ParseOptionsFromJava(jni, joptions);
1157 } 1181 }
1158 1182
1159 if (video_hw_acceleration_enabled) { 1183 if (video_hw_acceleration_enabled) {
1160 encoder_factory = new MediaCodecVideoEncoderFactory(); 1184 encoder_factory = new MediaCodecVideoEncoderFactory();
1161 decoder_factory = new MediaCodecVideoDecoderFactory(); 1185 decoder_factory = new MediaCodecVideoDecoderFactory();
1162 } 1186 }
1163 // Do not create network_monitor_factory only if the options are 1187 // Do not create network_monitor_factory only if the options are
1164 // provided and disable_network_monitor therein is set to true. 1188 // provided and disable_network_monitor therein is set to true.
1165 if (!(has_options && options.disable_network_monitor)) { 1189 if (!(has_options && options.disable_network_monitor)) {
1166 network_monitor_factory = new AndroidNetworkMonitorFactory(); 1190 network_monitor_factory = new AndroidNetworkMonitorFactory();
1167 rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory); 1191 rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory);
1168 } 1192 }
1169 1193
1170 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( 1194 rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
1171 webrtc::CreatePeerConnectionFactory(worker_thread, 1195 webrtc::CreatePeerConnectionFactory(network_thread.get(), worker_thread,
1172 signaling_thread, 1196 signaling_thread.get(), NULL,
1173 NULL, 1197 encoder_factory, decoder_factory));
1174 encoder_factory,
1175 decoder_factory));
1176 RTC_CHECK(factory) << "Failed to create the peer connection factory; " 1198 RTC_CHECK(factory) << "Failed to create the peer connection factory; "
1177 << "WebRTC/libjingle init likely failed on this device"; 1199 << "WebRTC/libjingle init likely failed on this device";
1178 // TODO(honghaiz): Maybe put the options as the argument of 1200 // TODO(honghaiz): Maybe put the options as the argument of
1179 // CreatePeerConnectionFactory. 1201 // CreatePeerConnectionFactory.
1180 if (has_options) { 1202 if (has_options) {
1181 factory->SetOptions(options); 1203 factory->SetOptions(options);
1182 } 1204 }
1183 OwnedFactoryAndThreads* owned_factory = new OwnedFactoryAndThreads( 1205 OwnedFactoryAndThreads* owned_factory = new OwnedFactoryAndThreads(
1184 worker_thread, signaling_thread, 1206 std::move(network_thread), std::move(worker_thread_own),
1185 encoder_factory, decoder_factory, 1207 std::move(signaling_thread), encoder_factory, decoder_factory,
1186 network_monitor_factory, factory.release()); 1208 network_monitor_factory, factory.release());
1187 owned_factory->InvokeJavaCallbacksOnFactoryThreads(); 1209 owned_factory->InvokeJavaCallbacksOnFactoryThreads();
1188 return jlongFromPointer(owned_factory); 1210 return jlongFromPointer(owned_factory);
1189 } 1211 }
1190 1212
1191 JOW(void, PeerConnectionFactory_nativeFreeFactory)(JNIEnv*, jclass, jlong j_p) { 1213 JOW(void, PeerConnectionFactory_nativeFreeFactory)(JNIEnv*, jclass, jlong j_p) {
1192 delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p); 1214 delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p);
1193 if (field_trials_init_string) { 1215 if (field_trials_init_string) {
1194 webrtc::field_trial::InitFieldTrialsFromString(NULL); 1216 webrtc::field_trial::InitFieldTrialsFromString(NULL);
1195 delete field_trials_init_string; 1217 delete field_trials_init_string;
(...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after
2207 return JavaStringFromStdString( 2229 return JavaStringFromStdString(
2208 jni, 2230 jni,
2209 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id()); 2231 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id());
2210 } 2232 }
2211 2233
2212 JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { 2234 JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) {
2213 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release(); 2235 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release();
2214 } 2236 }
2215 2237
2216 } // namespace webrtc_jni 2238 } // namespace webrtc_jni
OLDNEW
« no previous file with comments | « webrtc/api/fakemediacontroller.h ('k') | webrtc/api/mediacontroller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698