| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" | 5 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 P2PSocketDispatcher* p2p_socket_dispatcher) | 167 P2PSocketDispatcher* p2p_socket_dispatcher) |
| 168 : network_manager_(NULL), | 168 : network_manager_(NULL), |
| 169 p2p_socket_dispatcher_(p2p_socket_dispatcher), | 169 p2p_socket_dispatcher_(p2p_socket_dispatcher), |
| 170 signaling_thread_(NULL), | 170 signaling_thread_(NULL), |
| 171 worker_thread_(NULL), | 171 worker_thread_(NULL), |
| 172 chrome_worker_thread_("Chrome_libJingle_WorkerThread") { | 172 chrome_worker_thread_("Chrome_libJingle_WorkerThread") { |
| 173 } | 173 } |
| 174 | 174 |
| 175 PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() { | 175 PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() { |
| 176 CleanupPeerConnectionFactory(); | 176 CleanupPeerConnectionFactory(); |
| 177 if (aec_dump_message_filter_.get()) | |
| 178 aec_dump_message_filter_->RemoveDelegate(this); | |
| 179 } | 177 } |
| 180 | 178 |
| 181 blink::WebRTCPeerConnectionHandler* | 179 blink::WebRTCPeerConnectionHandler* |
| 182 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler( | 180 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler( |
| 183 blink::WebRTCPeerConnectionHandlerClient* client) { | 181 blink::WebRTCPeerConnectionHandlerClient* client) { |
| 184 // Save histogram data so we can see how much PeerConnetion is used. | 182 // Save histogram data so we can see how much PeerConnetion is used. |
| 185 // The histogram counts the number of calls to the JS API | 183 // The histogram counts the number of calls to the JS API |
| 186 // webKitRTCPeerConnection. | 184 // webKitRTCPeerConnection. |
| 187 UpdateWebRTCMethodCount(WEBKIT_RTC_PEER_CONNECTION); | 185 UpdateWebRTCMethodCount(WEBKIT_RTC_PEER_CONNECTION); |
| 188 | 186 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 encoder_factory.release(), | 343 encoder_factory.release(), |
| 346 decoder_factory.release())); | 344 decoder_factory.release())); |
| 347 CHECK(factory.get()); | 345 CHECK(factory.get()); |
| 348 | 346 |
| 349 pc_factory_ = factory; | 347 pc_factory_ = factory; |
| 350 webrtc::PeerConnectionFactoryInterface::Options factory_options; | 348 webrtc::PeerConnectionFactoryInterface::Options factory_options; |
| 351 factory_options.disable_sctp_data_channels = false; | 349 factory_options.disable_sctp_data_channels = false; |
| 352 factory_options.disable_encryption = | 350 factory_options.disable_encryption = |
| 353 cmd_line->HasSwitch(switches::kDisableWebRtcEncryption); | 351 cmd_line->HasSwitch(switches::kDisableWebRtcEncryption); |
| 354 pc_factory_->SetOptions(factory_options); | 352 pc_factory_->SetOptions(factory_options); |
| 355 | |
| 356 // TODO(xians): Remove the following code after kDisableAudioTrackProcessing | |
| 357 // is removed. | |
| 358 if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) { | |
| 359 aec_dump_message_filter_ = AecDumpMessageFilter::Get(); | |
| 360 // In unit tests not creating a message filter, |aec_dump_message_filter_| | |
| 361 // will be NULL. We can just ignore that. Other unit tests and browser tests | |
| 362 // ensure that we do get the filter when we should. | |
| 363 if (aec_dump_message_filter_.get()) | |
| 364 aec_dump_message_filter_->AddDelegate(this); | |
| 365 } | |
| 366 } | 353 } |
| 367 | 354 |
| 368 bool PeerConnectionDependencyFactory::PeerConnectionFactoryCreated() { | 355 bool PeerConnectionDependencyFactory::PeerConnectionFactoryCreated() { |
| 369 return pc_factory_.get() != NULL; | 356 return pc_factory_.get() != NULL; |
| 370 } | 357 } |
| 371 | 358 |
| 372 scoped_refptr<webrtc::PeerConnectionInterface> | 359 scoped_refptr<webrtc::PeerConnectionInterface> |
| 373 PeerConnectionDependencyFactory::CreatePeerConnection( | 360 PeerConnectionDependencyFactory::CreatePeerConnection( |
| 374 const webrtc::PeerConnectionInterface::RTCConfiguration& config, | 361 const webrtc::PeerConnectionInterface::RTCConfiguration& config, |
| 375 const webrtc::MediaConstraintsInterface* constraints, | 362 const webrtc::MediaConstraintsInterface* constraints, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 | 436 |
| 450 StartLocalAudioTrack(audio_track.get()); | 437 StartLocalAudioTrack(audio_track.get()); |
| 451 | 438 |
| 452 // Pass the ownership of the native local audio track to the blink track. | 439 // Pass the ownership of the native local audio track to the blink track. |
| 453 blink::WebMediaStreamTrack writable_track = track; | 440 blink::WebMediaStreamTrack writable_track = track; |
| 454 writable_track.setExtraData(audio_track.release()); | 441 writable_track.setExtraData(audio_track.release()); |
| 455 } | 442 } |
| 456 | 443 |
| 457 void PeerConnectionDependencyFactory::StartLocalAudioTrack( | 444 void PeerConnectionDependencyFactory::StartLocalAudioTrack( |
| 458 WebRtcLocalAudioTrack* audio_track) { | 445 WebRtcLocalAudioTrack* audio_track) { |
| 459 // Add the WebRtcAudioDevice as the sink to the local audio track. | |
| 460 // TODO(xians): Remove the following line of code after the APM in WebRTC is | |
| 461 // completely deprecated. See http://crbug/365672. | |
| 462 if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) | |
| 463 audio_track->AddSink(GetWebRtcAudioDevice()); | |
| 464 | |
| 465 // Start the audio track. This will hook the |audio_track| to the capturer | 446 // Start the audio track. This will hook the |audio_track| to the capturer |
| 466 // as the sink of the audio, and only start the source of the capturer if | 447 // as the sink of the audio, and only start the source of the capturer if |
| 467 // it is the first audio track connecting to the capturer. | 448 // it is the first audio track connecting to the capturer. |
| 468 audio_track->Start(); | 449 audio_track->Start(); |
| 469 } | 450 } |
| 470 | 451 |
| 471 scoped_refptr<WebAudioCapturerSource> | 452 scoped_refptr<WebAudioCapturerSource> |
| 472 PeerConnectionDependencyFactory::CreateWebAudioSource( | 453 PeerConnectionDependencyFactory::CreateWebAudioSource( |
| 473 blink::WebMediaStreamSource* source) { | 454 blink::WebMediaStreamSource* source) { |
| 474 DVLOG(1) << "PeerConnectionDependencyFactory::CreateWebAudioSource()"; | 455 DVLOG(1) << "PeerConnectionDependencyFactory::CreateWebAudioSource()"; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 static_cast<webrtc::AudioTrackInterface*>(native_track), | 596 static_cast<webrtc::AudioTrackInterface*>(native_track), |
| 616 is_local_track)); | 597 is_local_track)); |
| 617 } | 598 } |
| 618 | 599 |
| 619 scoped_refptr<base::MessageLoopProxy> | 600 scoped_refptr<base::MessageLoopProxy> |
| 620 PeerConnectionDependencyFactory::GetWebRtcWorkerThread() const { | 601 PeerConnectionDependencyFactory::GetWebRtcWorkerThread() const { |
| 621 DCHECK(CalledOnValidThread()); | 602 DCHECK(CalledOnValidThread()); |
| 622 return chrome_worker_thread_.message_loop_proxy(); | 603 return chrome_worker_thread_.message_loop_proxy(); |
| 623 } | 604 } |
| 624 | 605 |
| 625 void PeerConnectionDependencyFactory::OnAecDumpFile( | |
| 626 const IPC::PlatformFileForTransit& file_handle) { | |
| 627 DCHECK(CalledOnValidThread()); | |
| 628 DCHECK(!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()); | |
| 629 DCHECK(PeerConnectionFactoryCreated()); | |
| 630 | |
| 631 base::File file = IPC::PlatformFileForTransitToFile(file_handle); | |
| 632 DCHECK(file.IsValid()); | |
| 633 | |
| 634 // |pc_factory_| always takes ownership of |aec_dump_file|. If StartAecDump() | |
| 635 // fails, |aec_dump_file| will be closed. | |
| 636 if (!GetPcFactory()->StartAecDump(file.TakePlatformFile())) | |
| 637 VLOG(1) << "Could not start AEC dump."; | |
| 638 } | |
| 639 | |
| 640 void PeerConnectionDependencyFactory::OnDisableAecDump() { | |
| 641 DCHECK(CalledOnValidThread()); | |
| 642 DCHECK(!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()); | |
| 643 // Do nothing. We never disable AEC dump for non-track-processing case. | |
| 644 } | |
| 645 | |
| 646 void PeerConnectionDependencyFactory::OnIpcClosing() { | |
| 647 DCHECK(CalledOnValidThread()); | |
| 648 aec_dump_message_filter_ = NULL; | |
| 649 } | |
| 650 | |
| 651 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { | 606 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { |
| 652 if (audio_device_.get()) | 607 if (audio_device_.get()) |
| 653 return; | 608 return; |
| 654 | 609 |
| 655 audio_device_ = new WebRtcAudioDeviceImpl(); | 610 audio_device_ = new WebRtcAudioDeviceImpl(); |
| 656 } | 611 } |
| 657 | 612 |
| 658 } // namespace content | 613 } // namespace content |
| OLD | NEW |