| 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 P2PSocketDispatcher* p2p_socket_dispatcher) | 173 P2PSocketDispatcher* p2p_socket_dispatcher) |
| 174 : network_manager_(NULL), | 174 : network_manager_(NULL), |
| 175 p2p_socket_dispatcher_(p2p_socket_dispatcher), | 175 p2p_socket_dispatcher_(p2p_socket_dispatcher), |
| 176 signaling_thread_(NULL), | 176 signaling_thread_(NULL), |
| 177 worker_thread_(NULL), | 177 worker_thread_(NULL), |
| 178 chrome_worker_thread_("Chrome_libJingle_WorkerThread") { | 178 chrome_worker_thread_("Chrome_libJingle_WorkerThread") { |
| 179 } | 179 } |
| 180 | 180 |
| 181 PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() { | 181 PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() { |
| 182 CleanupPeerConnectionFactory(); | 182 CleanupPeerConnectionFactory(); |
| 183 if (aec_dump_message_filter_) | 183 if (aec_dump_message_filter_.get()) |
| 184 aec_dump_message_filter_->RemoveDelegate(this); | 184 aec_dump_message_filter_->RemoveDelegate(this); |
| 185 } | 185 } |
| 186 | 186 |
| 187 blink::WebRTCPeerConnectionHandler* | 187 blink::WebRTCPeerConnectionHandler* |
| 188 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler( | 188 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler( |
| 189 blink::WebRTCPeerConnectionHandlerClient* client) { | 189 blink::WebRTCPeerConnectionHandlerClient* client) { |
| 190 // Save histogram data so we can see how much PeerConnetion is used. | 190 // Save histogram data so we can see how much PeerConnetion is used. |
| 191 // The histogram counts the number of calls to the JS API | 191 // The histogram counts the number of calls to the JS API |
| 192 // webKitRTCPeerConnection. | 192 // webKitRTCPeerConnection. |
| 193 UpdateWebRTCMethodCount(WEBKIT_RTC_PEER_CONNECTION); | 193 UpdateWebRTCMethodCount(WEBKIT_RTC_PEER_CONNECTION); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 217 source_data)); | 217 source_data)); |
| 218 if (!capturer.get()) { | 218 if (!capturer.get()) { |
| 219 DLOG(WARNING) << "Failed to create the capturer for device " | 219 DLOG(WARNING) << "Failed to create the capturer for device " |
| 220 << device_info.device.id; | 220 << device_info.device.id; |
| 221 // TODO(xians): Don't we need to check if source_observer is observing | 221 // TODO(xians): Don't we need to check if source_observer is observing |
| 222 // something? If not, then it looks like we have a leak here. | 222 // something? If not, then it looks like we have a leak here. |
| 223 // OTOH, if it _is_ observing something, then the callback might | 223 // OTOH, if it _is_ observing something, then the callback might |
| 224 // be called multiple times which is likely also a bug. | 224 // be called multiple times which is likely also a bug. |
| 225 return false; | 225 return false; |
| 226 } | 226 } |
| 227 source_data->SetAudioCapturer(capturer); | 227 source_data->SetAudioCapturer(capturer.get()); |
| 228 | 228 |
| 229 // Creates a LocalAudioSource object which holds audio options. | 229 // Creates a LocalAudioSource object which holds audio options. |
| 230 // TODO(xians): The option should apply to the track instead of the source. | 230 // TODO(xians): The option should apply to the track instead of the source. |
| 231 // TODO(perkj): Move audio constraints parsing to Chrome. | 231 // TODO(perkj): Move audio constraints parsing to Chrome. |
| 232 // Currently there are a few constraints that are parsed by libjingle and | 232 // Currently there are a few constraints that are parsed by libjingle and |
| 233 // the state is set to ended if parsing fails. | 233 // the state is set to ended if parsing fails. |
| 234 scoped_refptr<webrtc::AudioSourceInterface> rtc_source( | 234 scoped_refptr<webrtc::AudioSourceInterface> rtc_source( |
| 235 CreateLocalAudioSource(&constraints).get()); | 235 CreateLocalAudioSource(&constraints).get()); |
| 236 if (rtc_source->state() != webrtc::MediaSourceInterface::kLive) { | 236 if (rtc_source->state() != webrtc::MediaSourceInterface::kLive) { |
| 237 DLOG(WARNING) << "Failed to create rtc LocalAudioSource."; | 237 DLOG(WARNING) << "Failed to create rtc LocalAudioSource."; |
| 238 return false; | 238 return false; |
| 239 } | 239 } |
| 240 source_data->SetLocalAudioSource(rtc_source); | 240 source_data->SetLocalAudioSource(rtc_source.get()); |
| 241 return true; | 241 return true; |
| 242 } | 242 } |
| 243 | 243 |
| 244 WebRtcVideoCapturerAdapter* | 244 WebRtcVideoCapturerAdapter* |
| 245 PeerConnectionDependencyFactory::CreateVideoCapturer( | 245 PeerConnectionDependencyFactory::CreateVideoCapturer( |
| 246 bool is_screeencast) { | 246 bool is_screeencast) { |
| 247 // We need to make sure the libjingle thread wrappers have been created | 247 // We need to make sure the libjingle thread wrappers have been created |
| 248 // before we can use an instance of a WebRtcVideoCapturerAdapter. This is | 248 // before we can use an instance of a WebRtcVideoCapturerAdapter. This is |
| 249 // since the base class of WebRtcVideoCapturerAdapter is a | 249 // since the base class of WebRtcVideoCapturerAdapter is a |
| 250 // cricket::VideoCapturer and it uses the libjingle thread wrappers. | 250 // cricket::VideoCapturer and it uses the libjingle thread wrappers. |
| 251 if (!GetPcFactory()) | 251 if (!GetPcFactory().get()) |
| 252 return NULL; | 252 return NULL; |
| 253 return new WebRtcVideoCapturerAdapter(is_screeencast); | 253 return new WebRtcVideoCapturerAdapter(is_screeencast); |
| 254 } | 254 } |
| 255 | 255 |
| 256 scoped_refptr<webrtc::VideoSourceInterface> | 256 scoped_refptr<webrtc::VideoSourceInterface> |
| 257 PeerConnectionDependencyFactory::CreateVideoSource( | 257 PeerConnectionDependencyFactory::CreateVideoSource( |
| 258 cricket::VideoCapturer* capturer, | 258 cricket::VideoCapturer* capturer, |
| 259 const blink::WebMediaConstraints& constraints) { | 259 const blink::WebMediaConstraints& constraints) { |
| 260 RTCMediaConstraints webrtc_constraints(constraints); | 260 RTCMediaConstraints webrtc_constraints(constraints); |
| 261 scoped_refptr<webrtc::VideoSourceInterface> source = | 261 scoped_refptr<webrtc::VideoSourceInterface> source = |
| 262 GetPcFactory()->CreateVideoSource(capturer, &webrtc_constraints).get(); | 262 GetPcFactory()->CreateVideoSource(capturer, &webrtc_constraints).get(); |
| 263 return source; | 263 return source; |
| 264 } | 264 } |
| 265 | 265 |
| 266 const scoped_refptr<webrtc::PeerConnectionFactoryInterface>& | 266 const scoped_refptr<webrtc::PeerConnectionFactoryInterface>& |
| 267 PeerConnectionDependencyFactory::GetPcFactory() { | 267 PeerConnectionDependencyFactory::GetPcFactory() { |
| 268 if (!pc_factory_) | 268 if (!pc_factory_.get()) |
| 269 CreatePeerConnectionFactory(); | 269 CreatePeerConnectionFactory(); |
| 270 CHECK(pc_factory_); | 270 CHECK(pc_factory_.get()); |
| 271 return pc_factory_; | 271 return pc_factory_; |
| 272 } | 272 } |
| 273 | 273 |
| 274 void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() { | 274 void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() { |
| 275 DCHECK(!pc_factory_.get()); | 275 DCHECK(!pc_factory_.get()); |
| 276 DCHECK(!signaling_thread_); | 276 DCHECK(!signaling_thread_); |
| 277 DCHECK(!worker_thread_); | 277 DCHECK(!worker_thread_); |
| 278 DCHECK(!network_manager_); | 278 DCHECK(!network_manager_); |
| 279 DCHECK(!socket_factory_); | 279 DCHECK(!socket_factory_); |
| 280 DCHECK(!chrome_worker_thread_.IsRunning()); | 280 DCHECK(!chrome_worker_thread_.IsRunning()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 net::EnsureNSSSSLInit(); | 319 net::EnsureNSSSSLInit(); |
| 320 #endif | 320 #endif |
| 321 | 321 |
| 322 scoped_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory; | 322 scoped_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory; |
| 323 scoped_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory; | 323 scoped_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory; |
| 324 | 324 |
| 325 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 325 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
| 326 scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories = | 326 scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories = |
| 327 RenderThreadImpl::current()->GetGpuFactories(); | 327 RenderThreadImpl::current()->GetGpuFactories(); |
| 328 if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) { | 328 if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) { |
| 329 if (gpu_factories) | 329 if (gpu_factories.get()) |
| 330 decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); | 330 decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); |
| 331 } | 331 } |
| 332 | 332 |
| 333 if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) { | 333 if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) { |
| 334 if (gpu_factories) | 334 if (gpu_factories.get()) |
| 335 encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); | 335 encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); |
| 336 } | 336 } |
| 337 | 337 |
| 338 #if defined(OS_ANDROID) | 338 #if defined(OS_ANDROID) |
| 339 if (!media::MediaCodecBridge::SupportsSetParameters()) | 339 if (!media::MediaCodecBridge::SupportsSetParameters()) |
| 340 encoder_factory.reset(); | 340 encoder_factory.reset(); |
| 341 #endif | 341 #endif |
| 342 | 342 |
| 343 EnsureWebRtcAudioDeviceImpl(); | 343 EnsureWebRtcAudioDeviceImpl(); |
| 344 | 344 |
| 345 scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory( | 345 scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory( |
| 346 webrtc::CreatePeerConnectionFactory(worker_thread_, | 346 webrtc::CreatePeerConnectionFactory(worker_thread_, |
| 347 signaling_thread_, | 347 signaling_thread_, |
| 348 audio_device_.get(), | 348 audio_device_.get(), |
| 349 encoder_factory.release(), | 349 encoder_factory.release(), |
| 350 decoder_factory.release())); | 350 decoder_factory.release())); |
| 351 CHECK(factory); | 351 CHECK(factory.get()); |
| 352 | 352 |
| 353 pc_factory_ = factory; | 353 pc_factory_ = factory; |
| 354 webrtc::PeerConnectionFactoryInterface::Options factory_options; | 354 webrtc::PeerConnectionFactoryInterface::Options factory_options; |
| 355 factory_options.disable_sctp_data_channels = false; | 355 factory_options.disable_sctp_data_channels = false; |
| 356 factory_options.disable_encryption = | 356 factory_options.disable_encryption = |
| 357 cmd_line->HasSwitch(switches::kDisableWebRtcEncryption); | 357 cmd_line->HasSwitch(switches::kDisableWebRtcEncryption); |
| 358 pc_factory_->SetOptions(factory_options); | 358 pc_factory_->SetOptions(factory_options); |
| 359 | 359 |
| 360 // TODO(xians): Remove the following code after kDisableAudioTrackProcessing | 360 // TODO(xians): Remove the following code after kDisableAudioTrackProcessing |
| 361 // is removed. | 361 // is removed. |
| 362 if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) { | 362 if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) { |
| 363 aec_dump_message_filter_ = AecDumpMessageFilter::Get(); | 363 aec_dump_message_filter_ = AecDumpMessageFilter::Get(); |
| 364 // In unit tests not creating a message filter, |aec_dump_message_filter_| | 364 // In unit tests not creating a message filter, |aec_dump_message_filter_| |
| 365 // will be NULL. We can just ignore that. Other unit tests and browser tests | 365 // will be NULL. We can just ignore that. Other unit tests and browser tests |
| 366 // ensure that we do get the filter when we should. | 366 // ensure that we do get the filter when we should. |
| 367 if (aec_dump_message_filter_) | 367 if (aec_dump_message_filter_.get()) |
| 368 aec_dump_message_filter_->AddDelegate(this); | 368 aec_dump_message_filter_->AddDelegate(this); |
| 369 } | 369 } |
| 370 } | 370 } |
| 371 | 371 |
| 372 bool PeerConnectionDependencyFactory::PeerConnectionFactoryCreated() { | 372 bool PeerConnectionDependencyFactory::PeerConnectionFactoryCreated() { |
| 373 return pc_factory_.get() != NULL; | 373 return pc_factory_.get() != NULL; |
| 374 } | 374 } |
| 375 | 375 |
| 376 scoped_refptr<webrtc::PeerConnectionInterface> | 376 scoped_refptr<webrtc::PeerConnectionInterface> |
| 377 PeerConnectionDependencyFactory::CreatePeerConnection( | 377 PeerConnectionDependencyFactory::CreatePeerConnection( |
| 378 const webrtc::PeerConnectionInterface::RTCConfiguration& config, | 378 const webrtc::PeerConnectionInterface::RTCConfiguration& config, |
| 379 const webrtc::MediaConstraintsInterface* constraints, | 379 const webrtc::MediaConstraintsInterface* constraints, |
| 380 blink::WebFrame* web_frame, | 380 blink::WebFrame* web_frame, |
| 381 webrtc::PeerConnectionObserver* observer) { | 381 webrtc::PeerConnectionObserver* observer) { |
| 382 CHECK(web_frame); | 382 CHECK(web_frame); |
| 383 CHECK(observer); | 383 CHECK(observer); |
| 384 if (!GetPcFactory()) | 384 if (!GetPcFactory().get()) |
| 385 return NULL; | 385 return NULL; |
| 386 | 386 |
| 387 scoped_refptr<P2PPortAllocatorFactory> pa_factory = | 387 scoped_refptr<P2PPortAllocatorFactory> pa_factory = |
| 388 new rtc::RefCountedObject<P2PPortAllocatorFactory>( | 388 new rtc::RefCountedObject<P2PPortAllocatorFactory>( |
| 389 p2p_socket_dispatcher_.get(), | 389 p2p_socket_dispatcher_.get(), |
| 390 network_manager_, | 390 network_manager_, |
| 391 socket_factory_.get(), | 391 socket_factory_.get(), |
| 392 web_frame); | 392 web_frame); |
| 393 | 393 |
| 394 PeerConnectionIdentityService* identity_service = | 394 PeerConnectionIdentityService* identity_service = |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 // Creates an adapter to hold all the libjingle objects. | 442 // Creates an adapter to hold all the libjingle objects. |
| 443 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( | 443 scoped_refptr<WebRtcLocalAudioTrackAdapter> adapter( |
| 444 WebRtcLocalAudioTrackAdapter::Create(track.id().utf8(), | 444 WebRtcLocalAudioTrackAdapter::Create(track.id().utf8(), |
| 445 source_data->local_audio_source())); | 445 source_data->local_audio_source())); |
| 446 static_cast<webrtc::AudioTrackInterface*>(adapter.get())->set_enabled( | 446 static_cast<webrtc::AudioTrackInterface*>(adapter.get())->set_enabled( |
| 447 track.isEnabled()); | 447 track.isEnabled()); |
| 448 | 448 |
| 449 // TODO(xians): Merge |source| to the capturer(). We can't do this today | 449 // TODO(xians): Merge |source| to the capturer(). We can't do this today |
| 450 // because only one capturer() is supported while one |source| is created | 450 // because only one capturer() is supported while one |source| is created |
| 451 // for each audio track. | 451 // for each audio track. |
| 452 scoped_ptr<WebRtcLocalAudioTrack> audio_track( | 452 scoped_ptr<WebRtcLocalAudioTrack> audio_track(new WebRtcLocalAudioTrack( |
| 453 new WebRtcLocalAudioTrack(adapter, | 453 adapter.get(), source_data->GetAudioCapturer(), webaudio_source.get())); |
| 454 source_data->GetAudioCapturer(), | |
| 455 webaudio_source)); | |
| 456 | 454 |
| 457 StartLocalAudioTrack(audio_track.get()); | 455 StartLocalAudioTrack(audio_track.get()); |
| 458 | 456 |
| 459 // Pass the ownership of the native local audio track to the blink track. | 457 // Pass the ownership of the native local audio track to the blink track. |
| 460 blink::WebMediaStreamTrack writable_track = track; | 458 blink::WebMediaStreamTrack writable_track = track; |
| 461 writable_track.setExtraData(audio_track.release()); | 459 writable_track.setExtraData(audio_track.release()); |
| 462 } | 460 } |
| 463 | 461 |
| 464 void PeerConnectionDependencyFactory::StartLocalAudioTrack( | 462 void PeerConnectionDependencyFactory::StartLocalAudioTrack( |
| 465 WebRtcLocalAudioTrack* audio_track) { | 463 WebRtcLocalAudioTrack* audio_track) { |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 DCHECK(!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()); | 647 DCHECK(!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()); |
| 650 // Do nothing. We never disable AEC dump for non-track-processing case. | 648 // Do nothing. We never disable AEC dump for non-track-processing case. |
| 651 } | 649 } |
| 652 | 650 |
| 653 void PeerConnectionDependencyFactory::OnIpcClosing() { | 651 void PeerConnectionDependencyFactory::OnIpcClosing() { |
| 654 DCHECK(CalledOnValidThread()); | 652 DCHECK(CalledOnValidThread()); |
| 655 aec_dump_message_filter_ = NULL; | 653 aec_dump_message_filter_ = NULL; |
| 656 } | 654 } |
| 657 | 655 |
| 658 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { | 656 void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { |
| 659 if (audio_device_) | 657 if (audio_device_.get()) |
| 660 return; | 658 return; |
| 661 | 659 |
| 662 audio_device_ = new WebRtcAudioDeviceImpl(); | 660 audio_device_ = new WebRtcAudioDeviceImpl(); |
| 663 } | 661 } |
| 664 | 662 |
| 665 } // namespace content | 663 } // namespace content |
| OLD | NEW |