Propogate network-worker thread split to api

BUG=webrtc:5645

Review-Url: https://codereview.webrtc.org/1968393002
Cr-Commit-Position: refs/heads/master@{#12767}
diff --git a/webrtc/api/peerconnectionfactory.cc b/webrtc/api/peerconnectionfactory.cc
index d236b19..9cb5b46 100644
--- a/webrtc/api/peerconnectionfactory.cc
+++ b/webrtc/api/peerconnectionfactory.cc
@@ -74,19 +74,17 @@
                                             pc_factory);
 }
 
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactory(
+rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
+    rtc::Thread* network_thread,
     rtc::Thread* worker_thread,
     rtc::Thread* signaling_thread,
     AudioDeviceModule* default_adm,
     cricket::WebRtcVideoEncoderFactory* encoder_factory,
     cricket::WebRtcVideoDecoderFactory* decoder_factory) {
   rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
-      new rtc::RefCountedObject<PeerConnectionFactory>(worker_thread,
-                                                       signaling_thread,
-                                                       default_adm,
-                                                       encoder_factory,
-                                                       decoder_factory));
+      new rtc::RefCountedObject<PeerConnectionFactory>(
+          network_thread, worker_thread, signaling_thread, default_adm,
+          encoder_factory, decoder_factory));
 
   // Call Initialize synchronously but make sure its executed on
   // |signaling_thread|.
@@ -104,16 +102,19 @@
 PeerConnectionFactory::PeerConnectionFactory()
     : owns_ptrs_(true),
       wraps_current_thread_(false),
-      signaling_thread_(rtc::ThreadManager::Instance()->CurrentThread()),
-      worker_thread_(new rtc::Thread) {
+      network_thread_(rtc::Thread::CreateWithSocketServer().release()),
+      worker_thread_(rtc::Thread::Create().release()),
+      signaling_thread_(rtc::Thread::Current()) {
   if (!signaling_thread_) {
     signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
     wraps_current_thread_ = true;
   }
+  network_thread_->Start();
   worker_thread_->Start();
 }
 
 PeerConnectionFactory::PeerConnectionFactory(
+    rtc::Thread* network_thread,
     rtc::Thread* worker_thread,
     rtc::Thread* signaling_thread,
     AudioDeviceModule* default_adm,
@@ -121,13 +122,15 @@
     cricket::WebRtcVideoDecoderFactory* video_decoder_factory)
     : owns_ptrs_(false),
       wraps_current_thread_(false),
-      signaling_thread_(signaling_thread),
+      network_thread_(network_thread),
       worker_thread_(worker_thread),
+      signaling_thread_(signaling_thread),
       default_adm_(default_adm),
       video_encoder_factory_(video_encoder_factory),
       video_decoder_factory_(video_decoder_factory) {
-  ASSERT(worker_thread != NULL);
-  ASSERT(signaling_thread != NULL);
+  RTC_DCHECK(network_thread);
+  RTC_DCHECK(worker_thread);
+  RTC_DCHECK(signaling_thread);
   // TODO: Currently there is no way creating an external adm in
   // libjingle source tree. So we can 't currently assert if this is NULL.
   // ASSERT(default_adm != NULL);
@@ -148,6 +151,7 @@
     if (wraps_current_thread_)
       rtc::ThreadManager::Instance()->UnwrapCurrentThread();
     delete worker_thread_;
+    delete network_thread_;
   }
 }
 
@@ -161,7 +165,7 @@
   }
 
   default_socket_factory_.reset(
-      new rtc::BasicPacketSocketFactory(worker_thread_));
+      new rtc::BasicPacketSocketFactory(network_thread_));
   if (!default_socket_factory_) {
     return false;
   }
@@ -172,17 +176,16 @@
       worker_thread_->Invoke<cricket::MediaEngineInterface*>(rtc::Bind(
       &PeerConnectionFactory::CreateMediaEngine_w, this));
 
-  rtc::Thread* const network_thread = worker_thread_;
   channel_manager_.reset(new cricket::ChannelManager(
-      media_engine, worker_thread_, network_thread));
+      media_engine, worker_thread_, network_thread_));
 
   channel_manager_->SetVideoRtxEnabled(true);
   if (!channel_manager_->Init()) {
     return false;
   }
 
-  dtls_identity_store_ = new RefCountedDtlsIdentityStore(
-      signaling_thread_, worker_thread_);
+  dtls_identity_store_ =
+      new RefCountedDtlsIdentityStore(signaling_thread_, network_thread_);
 
   return true;
 }
@@ -340,6 +343,10 @@
   return worker_thread_;
 }
 
+rtc::Thread* PeerConnectionFactory::network_thread() {
+  return network_thread_;
+}
+
 cricket::MediaEngineInterface* PeerConnectionFactory::CreateMediaEngine_w() {
   ASSERT(worker_thread_ == rtc::Thread::Current());
   return cricket::WebRtcMediaEngineFactory::Create(