Chromium Code Reviews| 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_manager.h" | 5 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <cctype> | 11 #include <cctype> |
| 12 #include <list> | 12 #include <list> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
| 16 #include "base/compiler_specific.h" | 16 #include "base/compiler_specific.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/macros.h" | 18 #include "base/macros.h" |
| 19 #include "base/power_monitor/power_monitor.h" | 19 #include "base/power_monitor/power_monitor.h" |
| 20 #include "base/profiler/scoped_tracker.h" | 20 #include "base/profiler/scoped_tracker.h" |
| 21 #include "base/rand_util.h" | 21 #include "base/rand_util.h" |
| 22 #include "base/strings/string_number_conversions.h" | 22 #include "base/strings/string_number_conversions.h" |
| 23 #include "base/strings/string_util.h" | 23 #include "base/strings/string_util.h" |
| 24 #include "base/strings/stringprintf.h" | 24 #include "base/strings/stringprintf.h" |
| 25 #include "base/task_runner_util.h" | 25 #include "base/task_runner_util.h" |
| 26 #include "base/threading/thread.h" | 26 #include "base/threading/thread.h" |
| 27 #include "base/threading/thread_local.h" | 27 #include "base/threading/thread_local.h" |
| 28 #include "base/threading/thread_restrictions.h" | |
| 28 #include "build/build_config.h" | 29 #include "build/build_config.h" |
| 29 #include "content/browser/child_process_security_policy_impl.h" | 30 #include "content/browser/child_process_security_policy_impl.h" |
| 30 #include "content/browser/renderer_host/media/audio_input_device_manager.h" | 31 #include "content/browser/renderer_host/media/audio_input_device_manager.h" |
| 31 #include "content/browser/renderer_host/media/media_capture_devices_impl.h" | 32 #include "content/browser/renderer_host/media/media_capture_devices_impl.h" |
| 32 #include "content/browser/renderer_host/media/media_devices_manager.h" | 33 #include "content/browser/renderer_host/media/media_devices_manager.h" |
| 33 #include "content/browser/renderer_host/media/media_stream_requester.h" | 34 #include "content/browser/renderer_host/media/media_stream_requester.h" |
| 34 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" | 35 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" |
| 35 #include "content/browser/renderer_host/media/video_capture_manager.h" | 36 #include "content/browser/renderer_host/media/video_capture_manager.h" |
| 36 #include "content/browser/renderer_host/render_process_host_impl.h" | 37 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 37 #include "content/public/browser/browser_thread.h" | 38 #include "content/public/browser/browser_thread.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 52 #include "media/capture/video/video_capture_device_factory.h" | 53 #include "media/capture/video/video_capture_device_factory.h" |
| 53 #include "url/gurl.h" | 54 #include "url/gurl.h" |
| 54 #include "url/origin.h" | 55 #include "url/origin.h" |
| 55 | 56 |
| 56 #if defined(OS_WIN) | 57 #if defined(OS_WIN) |
| 57 #include "base/win/scoped_com_initializer.h" | 58 #include "base/win/scoped_com_initializer.h" |
| 58 #endif | 59 #endif |
| 59 | 60 |
| 60 #if defined(OS_CHROMEOS) | 61 #if defined(OS_CHROMEOS) |
| 61 #include "chromeos/audio/cras_audio_handler.h" | 62 #include "chromeos/audio/cras_audio_handler.h" |
| 63 #include "media/capture/video/linux/camera_facing_chromeos.h" | |
| 62 #endif | 64 #endif |
| 63 | 65 |
| 64 namespace content { | 66 namespace content { |
| 65 | 67 |
| 66 base::LazyInstance<base::ThreadLocalPointer<MediaStreamManager>>::Leaky | 68 base::LazyInstance<base::ThreadLocalPointer<MediaStreamManager>>::Leaky |
| 67 g_media_stream_manager_tls_ptr = LAZY_INSTANCE_INITIALIZER; | 69 g_media_stream_manager_tls_ptr = LAZY_INSTANCE_INITIALIZER; |
| 68 | 70 |
| 69 namespace { | 71 namespace { |
| 72 | |
| 73 #if defined(OS_CHROMEOS) | |
| 74 base::LazyInstance<media::CameraFacingChromeOS>::Leaky g_camera_facing = | |
| 75 LAZY_INSTANCE_INITIALIZER; | |
|
hta - Chromium
2017/01/12 19:36:41
If this is a singleton, does it make the assumptio
shenghao
2017/01/13 11:09:34
No.
| |
| 76 #endif | |
| 77 | |
| 70 // Creates a random label used to identify requests. | 78 // Creates a random label used to identify requests. |
| 71 std::string RandomLabel() { | 79 std::string RandomLabel() { |
| 72 // An earlier PeerConnection spec [1] defined MediaStream::label alphabet as | 80 // An earlier PeerConnection spec [1] defined MediaStream::label alphabet as |
| 73 // an uuid with characters from range: U+0021, U+0023 to U+0027, U+002A to | 81 // an uuid with characters from range: U+0021, U+0023 to U+0027, U+002A to |
| 74 // U+002B, U+002D to U+002E, U+0030 to U+0039, U+0041 to U+005A, U+005E to | 82 // U+002B, U+002D to U+002E, U+0030 to U+0039, U+0041 to U+005A, U+005E to |
| 75 // U+007E. That causes problems with searching for labels in bots, so we use a | 83 // U+007E. That causes problems with searching for labels in bots, so we use a |
| 76 // safe alphanumeric subset |kAlphabet|. | 84 // safe alphanumeric subset |kAlphabet|. |
| 77 // [1] http://dev.w3.org/2011/webrtc/editor/webrtc.html | 85 // [1] http://dev.w3.org/2011/webrtc/editor/webrtc.html |
| 78 static const char kAlphabet[] = "0123456789" | 86 static const char kAlphabet[] = "0123456789" |
| 79 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; | 87 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 200 return MEDIA_DEVICE_TYPE_AUDIO_INPUT; | 208 return MEDIA_DEVICE_TYPE_AUDIO_INPUT; |
| 201 case MEDIA_DEVICE_VIDEO_CAPTURE: | 209 case MEDIA_DEVICE_VIDEO_CAPTURE: |
| 202 return MEDIA_DEVICE_TYPE_VIDEO_INPUT; | 210 return MEDIA_DEVICE_TYPE_VIDEO_INPUT; |
| 203 default: | 211 default: |
| 204 NOTREACHED(); | 212 NOTREACHED(); |
| 205 } | 213 } |
| 206 | 214 |
| 207 return NUM_MEDIA_DEVICE_TYPES; | 215 return NUM_MEDIA_DEVICE_TYPES; |
| 208 } | 216 } |
| 209 | 217 |
| 218 VideoFacingMode GetVideoFacing(std::string device_id, | |
| 219 std::string model_id, | |
| 220 MediaStreamType stream_type) { | |
| 221 #if defined(OS_CHROMEOS) | |
| 222 media::CameraFacingChromeOS::LensFacing facing = | |
| 223 g_camera_facing.Get().GetCameraFacing(device_id, model_id); | |
| 224 switch (facing) { | |
| 225 case media::CameraFacingChromeOS::LensFacing::FRONT: | |
| 226 return VideoFacingMode::MEDIA_VIDEO_FACING_USER; | |
| 227 case media::CameraFacingChromeOS::LensFacing::BACK: | |
| 228 return VideoFacingMode::MEDIA_VIDEO_FACING_ENVIRONMENT; | |
| 229 } | |
| 230 #endif | |
| 231 if (IsScreenCaptureMediaType(stream_type)) { | |
| 232 return VideoFacingMode::MEDIA_VIDEO_FACING_ENVIRONMENT; | |
|
hta - Chromium
2017/01/12 19:36:41
How does this choice make sense?
I'd have thought
shenghao
2017/01/13 11:09:34
done
| |
| 233 } | |
| 234 return VideoFacingMode::MEDIA_VIDEO_FACING_NONE; | |
| 235 } | |
| 236 | |
| 210 MediaStreamDevices ConvertToMediaStreamDevices( | 237 MediaStreamDevices ConvertToMediaStreamDevices( |
| 211 MediaStreamType stream_type, | 238 MediaStreamType stream_type, |
| 212 const MediaDeviceInfoArray& device_infos) { | 239 const MediaDeviceInfoArray& device_infos) { |
| 240 base::ThreadRestrictions::SetIOAllowed(true); | |
|
jochen (gone - plz use gerrit)
2017/01/12 11:54:41
why is this required? how long will the operation
shenghao
2017/01/13 11:09:34
Because we need to access camera config file when
| |
| 213 MediaStreamDevices devices; | 241 MediaStreamDevices devices; |
| 214 for (const auto& info : device_infos) { | 242 for (const auto& info : device_infos) { |
| 215 devices.emplace_back(stream_type, info.device_id, info.label); | 243 devices.emplace_back( |
| 244 stream_type, info.device_id, info.label, | |
| 245 GetVideoFacing(info.device_id, info.model_id, stream_type)); | |
| 216 } | 246 } |
| 217 | 247 |
| 218 return devices; | 248 return devices; |
| 219 } | 249 } |
| 220 | 250 |
| 221 } // namespace | 251 } // namespace |
| 222 | 252 |
| 223 | 253 |
| 224 // MediaStreamManager::DeviceRequest represents a request to either enumerate | 254 // MediaStreamManager::DeviceRequest represents a request to either enumerate |
| 225 // available devices or open one or more devices. | 255 // available devices or open one or more devices. |
| (...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1743 generate_stream_test_callback_ = test_callback; | 1773 generate_stream_test_callback_ = test_callback; |
| 1744 } | 1774 } |
| 1745 | 1775 |
| 1746 #if defined(OS_WIN) | 1776 #if defined(OS_WIN) |
| 1747 void MediaStreamManager::FlushVideoCaptureThreadForTesting() { | 1777 void MediaStreamManager::FlushVideoCaptureThreadForTesting() { |
| 1748 video_capture_thread_.FlushForTesting(); | 1778 video_capture_thread_.FlushForTesting(); |
| 1749 } | 1779 } |
| 1750 #endif | 1780 #endif |
| 1751 | 1781 |
| 1752 } // namespace content | 1782 } // namespace content |
| OLD | NEW |