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/video_capture_manager.h" | 5 #include "content/browser/renderer_host/media/video_capture_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/location.h" | 14 #include "base/location.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" |
17 #include "base/metrics/histogram_macros.h" | 17 #include "base/metrics/histogram_macros.h" |
18 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
19 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
20 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
21 #include "base/task_runner_util.h" | 21 #include "base/task_runner_util.h" |
22 #include "base/threading/sequenced_worker_pool.h" | 22 #include "base/threading/sequenced_worker_pool.h" |
23 #include "base/threading/thread_task_runner_handle.h" | 23 #include "base/threading/thread_task_runner_handle.h" |
24 #include "build/build_config.h" | 24 #include "build/build_config.h" |
25 #include "content/browser/media/capture/desktop_capture_device_uma_types.h" | 25 #include "content/browser/media/capture/desktop_capture_device_uma_types.h" |
26 #include "content/browser/media/capture/web_contents_video_capture_device.h" | 26 #include "content/browser/media/capture/web_contents_video_capture_device.h" |
27 #include "content/browser/media/media_internals.h" | 27 #include "content/browser/media/media_internals.h" |
28 #include "content/browser/renderer_host/media/in_process_buildable_video_capture
_device.h" | |
29 #include "content/browser/renderer_host/media/video_capture_controller.h" | 28 #include "content/browser/renderer_host/media/video_capture_controller.h" |
30 #include "content/browser/renderer_host/media/video_capture_controller_event_han
dler.h" | 29 #include "content/browser/renderer_host/media/video_capture_controller_event_han
dler.h" |
31 #include "content/public/browser/browser_thread.h" | 30 #include "content/public/browser/browser_thread.h" |
32 #include "content/public/browser/desktop_media_id.h" | 31 #include "content/public/browser/desktop_media_id.h" |
33 #include "content/public/common/media_stream_request.h" | 32 #include "content/public/common/media_stream_request.h" |
34 #include "media/base/bind_to_current_loop.h" | 33 #include "media/base/bind_to_current_loop.h" |
35 #include "media/base/media_switches.h" | 34 #include "media/base/media_switches.h" |
36 #include "media/base/video_facing.h" | 35 #include "media/base/video_facing.h" |
37 #include "media/capture/video/video_capture_buffer_pool_impl.h" | 36 #include "media/capture/video/video_capture_buffer_pool_impl.h" |
38 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" | 37 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 const media::VideoCaptureParams params_; | 96 const media::VideoCaptureParams params_; |
98 }; | 97 }; |
99 | 98 |
100 VideoCaptureManager::CaptureDeviceStartRequest::CaptureDeviceStartRequest( | 99 VideoCaptureManager::CaptureDeviceStartRequest::CaptureDeviceStartRequest( |
101 VideoCaptureController* controller, | 100 VideoCaptureController* controller, |
102 media::VideoCaptureSessionId session_id, | 101 media::VideoCaptureSessionId session_id, |
103 const media::VideoCaptureParams& params) | 102 const media::VideoCaptureParams& params) |
104 : controller_(controller), session_id_(session_id), params_(params) {} | 103 : controller_(controller), session_id_(session_id), params_(params) {} |
105 | 104 |
106 VideoCaptureManager::VideoCaptureManager( | 105 VideoCaptureManager::VideoCaptureManager( |
107 std::unique_ptr<media::VideoCaptureSystem> video_capture_system, | 106 std::unique_ptr<VideoCaptureProvider> video_capture_provider) |
108 scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) | 107 : new_capture_session_id_(1), |
109 : device_task_runner_(std::move(device_task_runner)), | 108 video_capture_provider_(std::move(video_capture_provider)) {} |
110 new_capture_session_id_(1), | |
111 video_capture_system_(std::move(video_capture_system)) {} | |
112 | 109 |
113 VideoCaptureManager::~VideoCaptureManager() { | 110 VideoCaptureManager::~VideoCaptureManager() { |
114 DCHECK(controllers_.empty()); | 111 DCHECK(controllers_.empty()); |
115 DCHECK(device_start_request_queue_.empty()); | 112 DCHECK(device_start_request_queue_.empty()); |
116 } | 113 } |
117 | 114 |
118 void VideoCaptureManager::AddVideoCaptureObserver( | 115 void VideoCaptureManager::AddVideoCaptureObserver( |
119 media::VideoCaptureObserver* observer) { | 116 media::VideoCaptureObserver* observer) { |
120 DCHECK(observer); | 117 DCHECK(observer); |
121 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 118 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
122 capture_observers_.AddObserver(observer); | 119 capture_observers_.AddObserver(observer); |
123 } | 120 } |
124 | 121 |
125 void VideoCaptureManager::RemoveAllVideoCaptureObservers() { | 122 void VideoCaptureManager::RemoveAllVideoCaptureObservers() { |
126 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 123 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
127 capture_observers_.Clear(); | 124 capture_observers_.Clear(); |
128 } | 125 } |
129 | 126 |
130 void VideoCaptureManager::RegisterListener( | 127 void VideoCaptureManager::RegisterListener( |
131 MediaStreamProviderListener* listener) { | 128 MediaStreamProviderListener* listener) { |
132 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 129 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
133 DCHECK(listener); | 130 DCHECK(listener); |
134 DCHECK(device_task_runner_); | |
135 listeners_.AddObserver(listener); | 131 listeners_.AddObserver(listener); |
136 #if defined(OS_ANDROID) | 132 #if defined(OS_ANDROID) |
137 application_state_has_running_activities_ = true; | 133 application_state_has_running_activities_ = true; |
138 app_status_listener_.reset(new base::android::ApplicationStatusListener( | 134 app_status_listener_.reset(new base::android::ApplicationStatusListener( |
139 base::Bind(&VideoCaptureManager::OnApplicationStateChange, | 135 base::Bind(&VideoCaptureManager::OnApplicationStateChange, |
140 base::Unretained(this)))); | 136 base::Unretained(this)))); |
141 #endif | 137 #endif |
142 } | 138 } |
143 | 139 |
144 void VideoCaptureManager::UnregisterListener( | 140 void VideoCaptureManager::UnregisterListener( |
145 MediaStreamProviderListener* listener) { | 141 MediaStreamProviderListener* listener) { |
146 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 142 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
147 listeners_.RemoveObserver(listener); | 143 listeners_.RemoveObserver(listener); |
148 } | 144 } |
149 | 145 |
150 void VideoCaptureManager::EnumerateDevices( | 146 void VideoCaptureManager::EnumerateDevices( |
151 const EnumerationCallback& client_callback) { | 147 const EnumerationCallback& client_callback) { |
152 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 148 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
153 DVLOG(1) << "VideoCaptureManager::EnumerateDevices"; | 149 DVLOG(1) << "VideoCaptureManager::EnumerateDevices"; |
154 | 150 |
155 // OK to use base::Unretained(video_capture_system_) since we own the | 151 // Pass a timer for UMA histogram collection. |
156 // |video_capture_system_| and |this| is bound in | 152 video_capture_provider_->GetDeviceInfosAsync(media::BindToCurrentLoop( |
157 // |devices_enumerated_callback|. | 153 base::Bind(&VideoCaptureManager::OnDeviceInfosReceived, this, |
158 device_task_runner_->PostTask( | 154 base::Owned(new base::ElapsedTimer()), client_callback))); |
159 FROM_HERE, | |
160 base::Bind(&media::VideoCaptureSystem::GetDeviceInfosAsync, | |
161 base::Unretained(video_capture_system_.get()), | |
162 // Pass a timer for UMA histogram collection. | |
163 media::BindToCurrentLoop(base::Bind( | |
164 &VideoCaptureManager::OnDeviceInfosReceived, this, | |
165 base::Owned(new base::ElapsedTimer()), client_callback)))); | |
166 } | 155 } |
167 | 156 |
168 int VideoCaptureManager::Open(const MediaStreamDevice& device) { | 157 int VideoCaptureManager::Open(const MediaStreamDevice& device) { |
169 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 158 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
170 | 159 |
171 // Generate a new id for the session being opened. | 160 // Generate a new id for the session being opened. |
172 const media::VideoCaptureSessionId capture_session_id = | 161 const media::VideoCaptureSessionId capture_session_id = |
173 new_capture_session_id_++; | 162 new_capture_session_id_++; |
174 | 163 |
175 DCHECK(sessions_.find(capture_session_id) == sessions_.end()); | 164 DCHECK(sessions_.find(capture_session_id) == sessions_.end()); |
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 | 780 |
792 // Check if another session has already opened this device. If so, just | 781 // Check if another session has already opened this device. If so, just |
793 // use that opened device. | 782 // use that opened device. |
794 VideoCaptureController* const existing_device = | 783 VideoCaptureController* const existing_device = |
795 LookupControllerByMediaTypeAndDeviceId(device_info.type, device_info.id); | 784 LookupControllerByMediaTypeAndDeviceId(device_info.type, device_info.id); |
796 if (existing_device) { | 785 if (existing_device) { |
797 DCHECK_EQ(device_info.type, existing_device->stream_type()); | 786 DCHECK_EQ(device_info.type, existing_device->stream_type()); |
798 return existing_device; | 787 return existing_device; |
799 } | 788 } |
800 | 789 |
801 VideoCaptureController* new_controller = new VideoCaptureController( | 790 VideoCaptureController* new_controller = |
802 device_info.id, device_info.type, params, | 791 new VideoCaptureController(device_info.id, device_info.type, params, |
803 base::MakeUnique<InProcessBuildableVideoCaptureDevice>( | 792 video_capture_provider_->CreateBuildableDevice( |
804 device_task_runner_, video_capture_system_.get())); | 793 device_info.id, device_info.type)); |
805 controllers_.emplace_back(new_controller); | 794 controllers_.emplace_back(new_controller); |
806 return new_controller; | 795 return new_controller; |
807 } | 796 } |
808 | 797 |
809 base::Optional<CameraCalibration> VideoCaptureManager::GetCameraCalibration( | 798 base::Optional<CameraCalibration> VideoCaptureManager::GetCameraCalibration( |
810 const std::string& device_id) { | 799 const std::string& device_id) { |
811 media::VideoCaptureDeviceInfo* info = GetDeviceInfoById(device_id); | 800 media::VideoCaptureDeviceInfo* info = GetDeviceInfoById(device_id); |
812 if (!info) | 801 if (!info) |
813 return base::Optional<CameraCalibration>(); | 802 return base::Optional<CameraCalibration>(); |
814 return info->descriptor.camera_calibration; | 803 return info->descriptor.camera_calibration; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 // Session ID is only valid for Screen capture. So we can fake it to | 855 // Session ID is only valid for Screen capture. So we can fake it to |
867 // resume video capture devices here. | 856 // resume video capture devices here. |
868 QueueStartDevice(kFakeSessionId, controller.get(), | 857 QueueStartDevice(kFakeSessionId, controller.get(), |
869 controller->parameters()); | 858 controller->parameters()); |
870 } | 859 } |
871 } | 860 } |
872 } | 861 } |
873 #endif // defined(OS_ANDROID) | 862 #endif // defined(OS_ANDROID) |
874 | 863 |
875 } // namespace content | 864 } // namespace content |
OLD | NEW |