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

Unified Diff: content/renderer/media/webrtc/peer_connection_dependency_factory.cc

Issue 675013005: Split libjingle's signaling thread from the UI thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase after landing data channel change Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/webrtc/peer_connection_dependency_factory.cc
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
index a48d508c1365e2effcca1ae685f2fbced508b756..1d4ad5ec0daec6d4856151dffa87d5f34dffa442 100644
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -169,6 +169,7 @@ PeerConnectionDependencyFactory::PeerConnectionDependencyFactory(
p2p_socket_dispatcher_(p2p_socket_dispatcher),
signaling_thread_(NULL),
worker_thread_(NULL),
+ chrome_signaling_thread_("Chrome_libJingle_Signaling"),
chrome_worker_thread_("Chrome_libJingle_WorkerThread") {
}
@@ -186,7 +187,7 @@ PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler(
// webKitRTCPeerConnection.
UpdateWebRTCMethodCount(WEBKIT_RTC_PEER_CONNECTION);
- return new RTCPeerConnectionHandler(client, this);
+ return new RTCPeerConnectionHandler(client, this, GetWebRtcSignalingThread());
}
bool PeerConnectionDependencyFactory::InitializeMediaStreamAudioSource(
@@ -273,15 +274,16 @@ void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
DCHECK(!worker_thread_);
DCHECK(!network_manager_);
DCHECK(!socket_factory_);
+ DCHECK(!chrome_signaling_thread_.IsRunning());
DCHECK(!chrome_worker_thread_.IsRunning());
DVLOG(1) << "PeerConnectionDependencyFactory::CreatePeerConnectionFactory()";
+ // To allow sending to the signaling/worker threads.
jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
- signaling_thread_ = jingle_glue::JingleThreadWrapper::current();
- CHECK(signaling_thread_);
+ CHECK(chrome_signaling_thread_.Start());
CHECK(chrome_worker_thread_.Start());
base::WaitableEvent start_worker_event(true, false);
@@ -290,18 +292,17 @@ void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
base::Unretained(this),
&worker_thread_,
&start_worker_event));
- start_worker_event.Wait();
- CHECK(worker_thread_);
base::WaitableEvent create_network_manager_event(true, false);
chrome_worker_thread_.message_loop()->PostTask(FROM_HERE, base::Bind(
&PeerConnectionDependencyFactory::CreateIpcNetworkManagerOnWorkerThread,
base::Unretained(this),
&create_network_manager_event));
+
+ start_worker_event.Wait();
create_network_manager_event.Wait();
- socket_factory_.reset(
- new IpcPacketSocketFactory(p2p_socket_dispatcher_.get()));
+ CHECK(worker_thread_);
// Init SSL, which will be needed by PeerConnection.
#if defined(USE_OPENSSL)
@@ -315,19 +316,53 @@ void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
net::EnsureNSSSSLInit();
#endif
+ base::WaitableEvent start_signaling_event(true, false);
+ chrome_signaling_thread_.message_loop()->PostTask(FROM_HERE, base::Bind(
+ &PeerConnectionDependencyFactory::InitializeSignalingThread,
+ base::Unretained(this),
+ RenderThreadImpl::current()->GetGpuFactories(),
+ &start_signaling_event));
+
+ // TODO(xians): Remove the following code after kDisableAudioTrackProcessing
+ // is removed.
+ if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) {
no longer working on chromium 2014/10/30 11:55:14 just remove line 328-335 :) or you probably should
tommi (sloooow) - chröme 2014/10/30 20:37:36 Good point. Looked at your cl and lgtm-ed it.
+ aec_dump_message_filter_ = AecDumpMessageFilter::Get();
+ // In unit tests not creating a message filter, |aec_dump_message_filter_|
+ // will be NULL. We can just ignore that. Other unit tests and browser tests
+ // ensure that we do get the filter when we should.
+ if (aec_dump_message_filter_.get())
+ aec_dump_message_filter_->AddDelegate(this);
+ }
+
+ start_signaling_event.Wait();
+ CHECK(signaling_thread_);
+}
+
+void PeerConnectionDependencyFactory::InitializeSignalingThread(
+ const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories,
+ base::WaitableEvent* event) {
+ DCHECK(chrome_signaling_thread_.task_runner()->BelongsToCurrentThread());
+ DCHECK(worker_thread_);
+ DCHECK(p2p_socket_dispatcher_.get());
+
+ jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
+ jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
+ signaling_thread_ = jingle_glue::JingleThreadWrapper::current();
+
+ EnsureWebRtcAudioDeviceImpl();
+
+ socket_factory_.reset(
+ new IpcPacketSocketFactory(p2p_socket_dispatcher_.get()));
+
scoped_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory;
scoped_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
- scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories =
- RenderThreadImpl::current()->GetGpuFactories();
- if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) {
- if (gpu_factories.get())
+ if (gpu_factories.get()) {
+ if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding))
decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories));
- }
- if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) {
- if (gpu_factories.get())
+ if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding))
encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories));
}
@@ -336,33 +371,18 @@ void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
encoder_factory.reset();
#endif
- EnsureWebRtcAudioDeviceImpl();
-
- scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
- webrtc::CreatePeerConnectionFactory(worker_thread_,
- signaling_thread_,
- audio_device_.get(),
- encoder_factory.release(),
- decoder_factory.release()));
- CHECK(factory.get());
+ pc_factory_ = webrtc::CreatePeerConnectionFactory(
+ worker_thread_, signaling_thread_, audio_device_.get(),
+ encoder_factory.release(), decoder_factory.release());
+ CHECK(pc_factory_.get());
- pc_factory_ = factory;
webrtc::PeerConnectionFactoryInterface::Options factory_options;
factory_options.disable_sctp_data_channels = false;
factory_options.disable_encryption =
cmd_line->HasSwitch(switches::kDisableWebRtcEncryption);
pc_factory_->SetOptions(factory_options);
- // TODO(xians): Remove the following code after kDisableAudioTrackProcessing
- // is removed.
- if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) {
- aec_dump_message_filter_ = AecDumpMessageFilter::Get();
- // In unit tests not creating a message filter, |aec_dump_message_filter_|
- // will be NULL. We can just ignore that. Other unit tests and browser tests
- // ensure that we do get the filter when we should.
- if (aec_dump_message_filter_.get())
- aec_dump_message_filter_->AddDelegate(this);
- }
+ event->Signal();
}
bool PeerConnectionDependencyFactory::PeerConnectionFactoryCreated() {
@@ -600,22 +620,6 @@ PeerConnectionDependencyFactory::CreateAudioCapturer(
audio_source);
}
-void PeerConnectionDependencyFactory::AddNativeAudioTrackToBlinkTrack(
- webrtc::MediaStreamTrackInterface* native_track,
- const blink::WebMediaStreamTrack& webkit_track,
- bool is_local_track) {
- DCHECK(!webkit_track.isNull() && !webkit_track.extraData());
- DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio,
- webkit_track.source().type());
- blink::WebMediaStreamTrack track = webkit_track;
-
- DVLOG(1) << "AddNativeTrackToBlinkTrack() audio";
- track.setExtraData(
- new MediaStreamTrack(
- static_cast<webrtc::AudioTrackInterface*>(native_track),
- is_local_track));
-}
-
scoped_refptr<base::MessageLoopProxy>
PeerConnectionDependencyFactory::GetWebRtcWorkerThread() const {
DCHECK(CalledOnValidThread());
@@ -625,7 +629,7 @@ PeerConnectionDependencyFactory::GetWebRtcWorkerThread() const {
scoped_refptr<base::MessageLoopProxy>
PeerConnectionDependencyFactory::GetWebRtcSignalingThread() const {
DCHECK(CalledOnValidThread());
- return RenderThreadImpl::current()->GetMessageLoop()->message_loop_proxy();
+ return chrome_signaling_thread_.message_loop_proxy();
}
void PeerConnectionDependencyFactory::OnAecDumpFile(

Powered by Google App Engine
This is Rietveld 408576698