OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/renderer_host/media/media_stream_dispatcher_host.h" | 5 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <memory> | 8 #include <memory> |
9 #include <queue> | 9 #include <queue> |
10 #include <string> | 10 #include <string> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/callback_helpers.h" | 14 #include "base/callback_helpers.h" |
15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
16 #include "base/location.h" | 16 #include "base/location.h" |
17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
18 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
19 #include "base/system_monitor/system_monitor.h" | 19 #include "base/system_monitor/system_monitor.h" |
20 #include "base/threading/thread_task_runner_handle.h" | 20 #include "base/threading/thread_task_runner_handle.h" |
21 #include "build/build_config.h" | 21 #include "build/build_config.h" |
22 #include "content/browser/browser_thread_impl.h" | 22 #include "content/browser/browser_thread_impl.h" |
23 #include "content/browser/renderer_host/media/audio_input_device_manager.h" | 23 #include "content/browser/renderer_host/media/audio_input_device_manager.h" |
24 #include "content/browser/renderer_host/media/media_stream_manager.h" | 24 #include "content/browser/renderer_host/media/media_stream_manager.h" |
25 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" | 25 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" |
26 #include "content/browser/renderer_host/media/video_capture_manager.h" | 26 #include "content/browser/renderer_host/media/video_capture_manager.h" |
27 #include "content/common/media/media_stream_messages.h" | 27 #include "content/common/media/media_stream_messages.h" |
28 #include "content/common/media/media_stream_options.h" | 28 #include "content/common/media/media_stream_options.h" |
| 29 #include "content/public/browser/browser_context.h" |
29 #include "content/public/browser/media_device_id.h" | 30 #include "content/public/browser/media_device_id.h" |
30 #include "content/public/common/content_switches.h" | 31 #include "content/public/common/content_switches.h" |
31 #include "content/public/test/mock_resource_context.h" | |
32 #include "content/public/test/test_browser_context.h" | 32 #include "content/public/test/test_browser_context.h" |
33 #include "content/public/test/test_browser_thread_bundle.h" | 33 #include "content/public/test/test_browser_thread_bundle.h" |
34 #include "content/test/test_content_browser_client.h" | 34 #include "content/test/test_content_browser_client.h" |
35 #include "content/test/test_content_client.h" | 35 #include "content/test/test_content_client.h" |
36 #include "ipc/ipc_message_macros.h" | 36 #include "ipc/ipc_message_macros.h" |
37 #include "media/audio/audio_device_description.h" | 37 #include "media/audio/audio_device_description.h" |
38 #include "media/audio/audio_system_impl.h" | 38 #include "media/audio/audio_system_impl.h" |
39 #include "media/audio/mock_audio_manager.h" | 39 #include "media/audio/mock_audio_manager.h" |
40 #include "media/base/media_switches.h" | 40 #include "media/base/media_switches.h" |
41 #include "media/capture/video/fake_video_capture_device_factory.h" | 41 #include "media/capture/video/fake_video_capture_device_factory.h" |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 // Make sure we use fake devices to avoid long delays. | 262 // Make sure we use fake devices to avoid long delays. |
263 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 263 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
264 switches::kUseFakeDeviceForMediaStream); | 264 switches::kUseFakeDeviceForMediaStream); |
265 auto mock_video_capture_provider = | 265 auto mock_video_capture_provider = |
266 base::MakeUnique<MockVideoCaptureProvider>(); | 266 base::MakeUnique<MockVideoCaptureProvider>(); |
267 mock_video_capture_provider_ = mock_video_capture_provider.get(); | 267 mock_video_capture_provider_ = mock_video_capture_provider.get(); |
268 // Create our own MediaStreamManager. | 268 // Create our own MediaStreamManager. |
269 media_stream_manager_ = base::MakeUnique<MediaStreamManager>( | 269 media_stream_manager_ = base::MakeUnique<MediaStreamManager>( |
270 audio_system_.get(), std::move(mock_video_capture_provider)); | 270 audio_system_.get(), std::move(mock_video_capture_provider)); |
271 | 271 |
272 MockResourceContext* mock_resource_context = | |
273 static_cast<MockResourceContext*>( | |
274 browser_context_.GetResourceContext()); | |
275 | |
276 host_ = new MockMediaStreamDispatcherHost( | 272 host_ = new MockMediaStreamDispatcherHost( |
277 mock_resource_context->GetMediaDeviceIDSalt(), | 273 browser_context_.GetMediaDeviceIDSalt(), |
278 base::ThreadTaskRunnerHandle::Get(), media_stream_manager_.get()); | 274 base::ThreadTaskRunnerHandle::Get(), media_stream_manager_.get()); |
279 | 275 |
280 // Use the fake content client and browser. | 276 // Use the fake content client and browser. |
281 content_client_.reset(new TestContentClient()); | 277 content_client_.reset(new TestContentClient()); |
282 SetContentClient(content_client_.get()); | 278 SetContentClient(content_client_.get()); |
283 old_browser_client_ = SetBrowserClientForTesting(host_.get()); | 279 old_browser_client_ = SetBrowserClientForTesting(host_.get()); |
284 | 280 |
285 #if defined(OS_CHROMEOS) | 281 #if defined(OS_CHROMEOS) |
286 chromeos::CrasAudioHandler::InitializeForTesting(); | 282 chromeos::CrasAudioHandler::InitializeForTesting(); |
287 #endif | 283 #endif |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 } | 410 } |
415 | 411 |
416 bool DoesEveryDeviceMapToRawId(const StreamDeviceInfoArray& devices, | 412 bool DoesEveryDeviceMapToRawId(const StreamDeviceInfoArray& devices, |
417 const url::Origin& origin) { | 413 const url::Origin& origin) { |
418 for (size_t i = 0; i < devices.size(); ++i) { | 414 for (size_t i = 0; i < devices.size(); ++i) { |
419 bool found_match = false; | 415 bool found_match = false; |
420 media::AudioDeviceDescriptions::const_iterator audio_it = | 416 media::AudioDeviceDescriptions::const_iterator audio_it = |
421 audio_device_descriptions_.begin(); | 417 audio_device_descriptions_.begin(); |
422 for (; audio_it != audio_device_descriptions_.end(); ++audio_it) { | 418 for (; audio_it != audio_device_descriptions_.end(); ++audio_it) { |
423 if (content::DoesMediaDeviceIDMatchHMAC( | 419 if (content::DoesMediaDeviceIDMatchHMAC( |
424 browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), | 420 browser_context_.GetMediaDeviceIDSalt(), origin, |
425 origin, | 421 devices[i].device.id, audio_it->unique_id)) { |
426 devices[i].device.id, | |
427 audio_it->unique_id)) { | |
428 EXPECT_FALSE(found_match); | 422 EXPECT_FALSE(found_match); |
429 found_match = true; | 423 found_match = true; |
430 } | 424 } |
431 } | 425 } |
432 for (const std::string& device_id : stub_video_device_ids_) { | 426 for (const std::string& device_id : stub_video_device_ids_) { |
433 if (content::DoesMediaDeviceIDMatchHMAC( | 427 if (content::DoesMediaDeviceIDMatchHMAC( |
434 browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), | 428 browser_context_.GetMediaDeviceIDSalt(), origin, |
435 origin, devices[i].device.id, device_id)) { | 429 devices[i].device.id, device_id)) { |
436 EXPECT_FALSE(found_match); | 430 EXPECT_FALSE(found_match); |
437 found_match = true; | 431 found_match = true; |
438 } | 432 } |
439 } | 433 } |
440 if (!found_match) | 434 if (!found_match) |
441 return false; | 435 return false; |
442 } | 436 } |
443 return true; | 437 return true; |
444 } | 438 } |
445 | 439 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); | 508 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); |
515 | 509 |
516 EXPECT_EQ(host_->audio_devices_.size(), 1u); | 510 EXPECT_EQ(host_->audio_devices_.size(), 1u); |
517 EXPECT_EQ(host_->video_devices_.size(), 1u); | 511 EXPECT_EQ(host_->video_devices_.size(), 1u); |
518 } | 512 } |
519 | 513 |
520 TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithDepthVideo) { | 514 TEST_F(MediaStreamDispatcherHostTest, GenerateStreamWithDepthVideo) { |
521 // We specify to generate both audio and video stream. | 515 // We specify to generate both audio and video stream. |
522 StreamControls controls(true, true); | 516 StreamControls controls(true, true); |
523 std::string source_id = content::GetHMACForMediaDeviceID( | 517 std::string source_id = content::GetHMACForMediaDeviceID( |
524 browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), origin_, | 518 browser_context_.GetMediaDeviceIDSalt(), origin_, kDepthVideoDeviceId); |
525 kDepthVideoDeviceId); | |
526 // |source_id| corresponds to the depth device. As we can generate only one | 519 // |source_id| corresponds to the depth device. As we can generate only one |
527 // video stream using GenerateStreamAndWaitForResult, we use | 520 // video stream using GenerateStreamAndWaitForResult, we use |
528 // controls.video.source_id to specify that the stream is depth video. | 521 // controls.video.source_id to specify that the stream is depth video. |
529 // See also MediaStreamManager::GenerateStream and other tests here. | 522 // See also MediaStreamManager::GenerateStream and other tests here. |
530 controls.video.device_id = source_id; | 523 controls.video.device_id = source_id; |
531 | 524 |
532 SetupFakeUI(true); | 525 SetupFakeUI(true); |
533 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); | 526 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); |
534 | 527 |
535 // We specified the generation and expect to get | 528 // We specified the generation and expect to get |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 // Test that we can generate streams where a sourceId is specified in | 661 // Test that we can generate streams where a sourceId is specified in |
669 // the request. | 662 // the request. |
670 TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithSourceId) { | 663 TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithSourceId) { |
671 ASSERT_GE(audio_device_descriptions_.size(), 1u); | 664 ASSERT_GE(audio_device_descriptions_.size(), 1u); |
672 ASSERT_GE(stub_video_device_ids_.size(), 1u); | 665 ASSERT_GE(stub_video_device_ids_.size(), 1u); |
673 | 666 |
674 media::AudioDeviceDescriptions::const_iterator audio_it = | 667 media::AudioDeviceDescriptions::const_iterator audio_it = |
675 audio_device_descriptions_.begin(); | 668 audio_device_descriptions_.begin(); |
676 for (; audio_it != audio_device_descriptions_.end(); ++audio_it) { | 669 for (; audio_it != audio_device_descriptions_.end(); ++audio_it) { |
677 std::string source_id = content::GetHMACForMediaDeviceID( | 670 std::string source_id = content::GetHMACForMediaDeviceID( |
678 browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), | 671 browser_context_.GetMediaDeviceIDSalt(), origin_, audio_it->unique_id); |
679 origin_, | |
680 audio_it->unique_id); | |
681 ASSERT_FALSE(source_id.empty()); | 672 ASSERT_FALSE(source_id.empty()); |
682 StreamControls controls(true, true); | 673 StreamControls controls(true, true); |
683 controls.audio.device_id = source_id; | 674 controls.audio.device_id = source_id; |
684 | 675 |
685 SetupFakeUI(true); | 676 SetupFakeUI(true); |
686 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); | 677 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); |
687 EXPECT_EQ(host_->audio_devices_[0].device.id, source_id); | 678 EXPECT_EQ(host_->audio_devices_[0].device.id, source_id); |
688 } | 679 } |
689 | 680 |
690 for (const std::string& device_id : stub_video_device_ids_) { | 681 for (const std::string& device_id : stub_video_device_ids_) { |
691 std::string source_id = content::GetHMACForMediaDeviceID( | 682 std::string source_id = content::GetHMACForMediaDeviceID( |
692 browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(), origin_, | 683 browser_context_.GetMediaDeviceIDSalt(), origin_, device_id); |
693 device_id); | |
694 ASSERT_FALSE(source_id.empty()); | 684 ASSERT_FALSE(source_id.empty()); |
695 StreamControls controls(true, true); | 685 StreamControls controls(true, true); |
696 controls.video.device_id = source_id; | 686 controls.video.device_id = source_id; |
697 | 687 |
698 SetupFakeUI(true); | 688 SetupFakeUI(true); |
699 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); | 689 GenerateStreamAndWaitForResult(kRenderId, kPageRequestId, controls); |
700 EXPECT_EQ(host_->video_devices_[0].device.id, source_id); | 690 EXPECT_EQ(host_->video_devices_[0].device.id, source_id); |
701 } | 691 } |
702 } | 692 } |
703 | 693 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 base::RunLoop run_loop; | 871 base::RunLoop run_loop; |
882 EXPECT_CALL(*host_.get(), OnDeviceStopped(kRenderId)) | 872 EXPECT_CALL(*host_.get(), OnDeviceStopped(kRenderId)) |
883 .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); | 873 .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); |
884 media_stream_manager_->media_devices_manager()->OnDevicesChanged( | 874 media_stream_manager_->media_devices_manager()->OnDevicesChanged( |
885 base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE); | 875 base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE); |
886 | 876 |
887 run_loop.Run(); | 877 run_loop.Run(); |
888 } | 878 } |
889 | 879 |
890 }; // namespace content | 880 }; // namespace content |
OLD | NEW |