| 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()) {
|
| + 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(
|
|
|