Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(391)

Side by Side Diff: content/browser/renderer_host/media/video_capture_manager.cc

Issue 2551193002: [Mojo Video Capture] Decouple VCController from VCBufferPool and VCDeviceClient (Closed)
Patch Set: Added TODO comment Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/metrics/histogram_macros.h" 16 #include "base/metrics/histogram_macros.h"
17 #include "base/single_thread_task_runner.h" 17 #include "base/single_thread_task_runner.h"
18 #include "base/stl_util.h" 18 #include "base/stl_util.h"
19 #include "base/strings/stringprintf.h" 19 #include "base/strings/stringprintf.h"
20 #include "base/task_runner_util.h" 20 #include "base/task_runner_util.h"
21 #include "base/threading/sequenced_worker_pool.h" 21 #include "base/threading/sequenced_worker_pool.h"
22 #include "base/threading/thread_task_runner_handle.h" 22 #include "base/threading/thread_task_runner_handle.h"
23 #include "build/build_config.h" 23 #include "build/build_config.h"
24 #include "content/browser/media/capture/desktop_capture_device_uma_types.h" 24 #include "content/browser/media/capture/desktop_capture_device_uma_types.h"
25 #include "content/browser/media/capture/web_contents_video_capture_device.h" 25 #include "content/browser/media/capture/web_contents_video_capture_device.h"
26 #include "content/browser/media/media_internals.h" 26 #include "content/browser/media/media_internals.h"
27 #include "content/browser/renderer_host/media/video_capture_controller.h" 27 #include "content/browser/renderer_host/media/video_capture_controller.h"
28 #include "content/browser/renderer_host/media/video_capture_controller_event_han dler.h" 28 #include "content/browser/renderer_host/media/video_capture_controller_event_han dler.h"
29 #include "content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h"
30 #include "content/browser/renderer_host/media/video_frame_receiver_on_io_thread. h"
29 #include "content/public/browser/browser_thread.h" 31 #include "content/public/browser/browser_thread.h"
30 #include "content/public/browser/desktop_media_id.h" 32 #include "content/public/browser/desktop_media_id.h"
31 #include "content/public/common/media_stream_request.h" 33 #include "content/public/common/media_stream_request.h"
32 #include "media/base/bind_to_current_loop.h" 34 #include "media/base/bind_to_current_loop.h"
33 #include "media/base/media_switches.h" 35 #include "media/base/media_switches.h"
36 #include "media/capture/video/video_capture_buffer_pool_impl.h"
37 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h"
34 #include "media/capture/video/video_capture_device.h" 38 #include "media/capture/video/video_capture_device.h"
39 #include "media/capture/video/video_capture_device_client.h"
35 #include "media/capture/video/video_capture_device_factory.h" 40 #include "media/capture/video/video_capture_device_factory.h"
36 41
37 #if defined(ENABLE_SCREEN_CAPTURE) && !defined(OS_ANDROID) 42 #if defined(ENABLE_SCREEN_CAPTURE) && !defined(OS_ANDROID)
38 #include "content/browser/media/capture/desktop_capture_device.h" 43 #include "content/browser/media/capture/desktop_capture_device.h"
39 #if defined(USE_AURA) 44 #if defined(USE_AURA)
40 #include "content/browser/media/capture/desktop_capture_device_aura.h" 45 #include "content/browser/media/capture/desktop_capture_device_aura.h"
41 #endif 46 #endif
42 #endif 47 #endif
43 48
44 #if defined(ENABLE_SCREEN_CAPTURE) && defined(OS_ANDROID) 49 #if defined(ENABLE_SCREEN_CAPTURE) && defined(OS_ANDROID)
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 formats->erase(last, formats->end()); 111 formats->erase(last, formats->end());
107 // Mark all formats as I420, since this is what the renderer side will get 112 // Mark all formats as I420, since this is what the renderer side will get
108 // anyhow: the actual pixel format is decided at the device level. 113 // anyhow: the actual pixel format is decided at the device level.
109 // Don't do this for Y16 format as it is handled separatelly. 114 // Don't do this for Y16 format as it is handled separatelly.
110 for (auto& format : *formats) { 115 for (auto& format : *formats) {
111 if (format.pixel_format != media::PIXEL_FORMAT_Y16) 116 if (format.pixel_format != media::PIXEL_FORMAT_Y16)
112 format.pixel_format = media::PIXEL_FORMAT_I420; 117 format.pixel_format = media::PIXEL_FORMAT_I420;
113 } 118 }
114 } 119 }
115 120
116 // The maximum number of buffers in the capture pipeline. See 121 // The maximum number of video frame buffers in-flight at any one time. This
117 // VideoCaptureController ctor comments for more details. 122 // value should be based on the logical capacity of the capture pipeline, and
123 // not on hardware performance. For example, tab capture requires more buffers
124 // than webcam capture because the pipeline is longer (it includes read-backs
125 // pending in the GPU pipeline).
118 const int kMaxNumberOfBuffers = 3; 126 const int kMaxNumberOfBuffers = 3;
119 // TODO(miu): The value for tab capture should be determined programmatically. 127 // TODO(miu): The value for tab capture should be determined programmatically.
120 // http://crbug.com/460318 128 // http://crbug.com/460318
121 const int kMaxNumberOfBuffersForTabCapture = 10; 129 const int kMaxNumberOfBuffersForTabCapture = 10;
122 130
123 // Used for logging capture events. 131 // Used for logging capture events.
124 // Elements in this enum should not be deleted or rearranged; the only 132 // Elements in this enum should not be deleted or rearranged; the only
125 // permitted operation is to add new elements before NUM_VIDEO_CAPTURE_EVENT. 133 // permitted operation is to add new elements before NUM_VIDEO_CAPTURE_EVENT.
126 enum VideoCaptureEvent { 134 enum VideoCaptureEvent {
127 VIDEO_CAPTURE_START_CAPTURE = 0, 135 VIDEO_CAPTURE_START_CAPTURE = 0,
128 VIDEO_CAPTURE_STOP_CAPTURE_OK = 1, 136 VIDEO_CAPTURE_STOP_CAPTURE_OK = 1,
129 VIDEO_CAPTURE_STOP_CAPTURE_DUE_TO_ERROR = 2, 137 VIDEO_CAPTURE_STOP_CAPTURE_DUE_TO_ERROR = 2,
130 VIDEO_CAPTURE_STOP_CAPTURE_OK_NO_FRAMES_PRODUCED_BY_DEVICE = 3, 138 VIDEO_CAPTURE_STOP_CAPTURE_OK_NO_FRAMES_PRODUCED_BY_DEVICE = 3,
131 VIDEO_CAPTURE_STOP_CAPTURE_OK_NO_FRAMES_PRODUCED_BY_DESKTOP_OR_TAB = 4, 139 VIDEO_CAPTURE_STOP_CAPTURE_OK_NO_FRAMES_PRODUCED_BY_DESKTOP_OR_TAB = 4,
132 NUM_VIDEO_CAPTURE_EVENT 140 NUM_VIDEO_CAPTURE_EVENT
133 }; 141 };
134 142
135 void LogVideoCaptureEvent(VideoCaptureEvent event) { 143 void LogVideoCaptureEvent(VideoCaptureEvent event) {
136 UMA_HISTOGRAM_ENUMERATION("Media.VideoCaptureManager.Event", 144 UMA_HISTOGRAM_ENUMERATION("Media.VideoCaptureManager.Event",
137 event, 145 event,
138 NUM_VIDEO_CAPTURE_EVENT); 146 NUM_VIDEO_CAPTURE_EVENT);
139 } 147 }
140 148
141 // Counter used for identifying a DeviceRequest to start a capture device. 149 // Counter used for identifying a DeviceRequest to start a capture device.
142 static int g_device_start_id = 0; 150 static int g_device_start_id = 0;
143 151
144 const media::VideoCaptureSessionId kFakeSessionId = -1; 152 const media::VideoCaptureSessionId kFakeSessionId = -1;
145 153
154 std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder(
155 const media::VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) {
156 return base::MakeUnique<content::VideoCaptureGpuJpegDecoder>(decode_done_cb);
157 }
158
146 } // namespace 159 } // namespace
147 160
148 namespace content { 161 namespace content {
149 162
150 // Instances of this struct go through 3 different phases during their lifetime. 163 // Instances of this struct go through 3 different phases during their lifetime.
151 // Phase 1: When first created (in GetOrCreateDeviceEntry()), this consists of 164 // Phase 1: When first created (in GetOrCreateDeviceEntry()), this consists of
152 // only a controller. Clients can already connect to the controller, but there 165 // only a controller. Clients can already connect to the controller, but there
153 // is no device present. 166 // is no device present.
154 // Phase 2: When a request to "start" the entry comes in (via 167 // Phase 2: When a request to "start" the entry comes in (via
155 // HandleQueuedStartRequest()), a VideoCaptureDevice::Client is created 168 // HandleQueuedStartRequest()), a VideoCaptureDevice::Client is created
156 // via video_capture_controller()->NewDeviceClient() and is used to schedule the 169 // via CreateDeviceClient() and is used to schedule the
157 // creation and start of a VideoCaptureDevice on the Device Thread. 170 // creation and start of a VideoCaptureDevice on the Device Thread.
158 // Phase 3: As soon as the creation of the VideoCaptureDevice is complete, this 171 // Phase 3: As soon as the creation of the VideoCaptureDevice is complete, this
159 // newly created VideoCaptureDevice instance is connected to the 172 // newly created VideoCaptureDevice instance is connected to the
160 // VideoCaptureController via SetConsumerFeedbackObserver(). 173 // VideoCaptureController via SetConsumerFeedbackObserver().
161 class VideoCaptureManager::DeviceEntry { 174 struct VideoCaptureManager::DeviceEntry {
162 public: 175 public:
163 DeviceEntry(MediaStreamType stream_type, 176 DeviceEntry(MediaStreamType stream_type,
164 const std::string& id, 177 const std::string& id,
165 std::unique_ptr<VideoCaptureController> controller,
166 const media::VideoCaptureParams& params); 178 const media::VideoCaptureParams& params);
167 ~DeviceEntry(); 179 ~DeviceEntry();
180 std::unique_ptr<media::VideoCaptureDevice::Client> CreateDeviceClient();
181 std::unique_ptr<media::FrameBufferPool> CreateFrameBufferPool();
168 182
169 const int serial_id; 183 const int serial_id;
170 const MediaStreamType stream_type; 184 const MediaStreamType stream_type;
171 const std::string id; 185 const std::string id;
172 const media::VideoCaptureParams parameters; 186 const media::VideoCaptureParams parameters;
173 187 VideoCaptureController video_capture_controller;
174 VideoCaptureController* video_capture_controller() const; 188 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool;
175 media::VideoCaptureDevice* video_capture_device() const; 189 std::unique_ptr<media::VideoCaptureDevice> video_capture_device;
176
177 void SetVideoCaptureDevice(std::unique_ptr<VideoCaptureDevice> device);
178 std::unique_ptr<VideoCaptureDevice> ReleaseVideoCaptureDevice();
179
180 private:
181 const std::unique_ptr<VideoCaptureController> video_capture_controller_;
182
183 std::unique_ptr<VideoCaptureDevice> video_capture_device_;
184
185 base::ThreadChecker thread_checker_;
186 }; 190 };
187 191
188 // Bundles a media::VideoCaptureDeviceDescriptor with corresponding supported 192 // Bundles a media::VideoCaptureDeviceDescriptor with corresponding supported
189 // video formats. 193 // video formats.
190 struct VideoCaptureManager::DeviceInfo { 194 struct VideoCaptureManager::DeviceInfo {
191 DeviceInfo(); 195 DeviceInfo();
192 DeviceInfo(media::VideoCaptureDeviceDescriptor descriptor); 196 DeviceInfo(media::VideoCaptureDeviceDescriptor descriptor);
193 DeviceInfo(const DeviceInfo& other); 197 DeviceInfo(const DeviceInfo& other);
194 ~DeviceInfo(); 198 ~DeviceInfo();
195 DeviceInfo& operator=(const DeviceInfo& other); 199 DeviceInfo& operator=(const DeviceInfo& other);
196 200
197 media::VideoCaptureDeviceDescriptor descriptor; 201 media::VideoCaptureDeviceDescriptor descriptor;
198 media::VideoCaptureFormats supported_formats; 202 media::VideoCaptureFormats supported_formats;
199 }; 203 };
200 204
205 class BufferPoolFrameBufferPool : public media::FrameBufferPool {
206 public:
207 explicit BufferPoolFrameBufferPool(
208 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool)
209 : buffer_pool_(std::move(buffer_pool)) {}
210
211 void SetBufferHold(int buffer_id) override {
212 buffer_pool_->HoldForConsumers(buffer_id, 1);
213 }
214
215 void ReleaseBufferHold(int buffer_id) override {
216 buffer_pool_->RelinquishConsumerHold(buffer_id, 1);
217 }
218
219 mojo::ScopedSharedBufferHandle GetHandleForTransit(int buffer_id) override {
220 return buffer_pool_->GetHandleForTransit(buffer_id);
221 }
222
223 private:
224 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool_;
225 };
226
201 // Class used for queuing request for starting a device. 227 // Class used for queuing request for starting a device.
202 class VideoCaptureManager::CaptureDeviceStartRequest { 228 class VideoCaptureManager::CaptureDeviceStartRequest {
203 public: 229 public:
204 CaptureDeviceStartRequest(int serial_id, 230 CaptureDeviceStartRequest(int serial_id,
205 media::VideoCaptureSessionId session_id, 231 media::VideoCaptureSessionId session_id,
206 const media::VideoCaptureParams& params); 232 const media::VideoCaptureParams& params);
207 int serial_id() const { return serial_id_; } 233 int serial_id() const { return serial_id_; }
208 media::VideoCaptureSessionId session_id() const { return session_id_; } 234 media::VideoCaptureSessionId session_id() const { return session_id_; }
209 media::VideoCaptureParams params() const { return params_; } 235 media::VideoCaptureParams params() const { return params_; }
210 236
211 // Set to true if the device should be stopped before it has successfully 237 // Set to true if the device should be stopped before it has successfully
212 // been started. 238 // been started.
213 bool abort_start() const { return abort_start_; } 239 bool abort_start() const { return abort_start_; }
214 void set_abort_start() { abort_start_ = true; } 240 void set_abort_start() { abort_start_ = true; }
215 241
216 private: 242 private:
217 const int serial_id_; 243 const int serial_id_;
218 const media::VideoCaptureSessionId session_id_; 244 const media::VideoCaptureSessionId session_id_;
219 const media::VideoCaptureParams params_; 245 const media::VideoCaptureParams params_;
220 // Set to true if the device should be stopped before it has successfully 246 // Set to true if the device should be stopped before it has successfully
221 // been started. 247 // been started.
222 bool abort_start_; 248 bool abort_start_;
223 }; 249 };
224 250
225 VideoCaptureManager::DeviceEntry::DeviceEntry( 251 VideoCaptureManager::DeviceEntry::DeviceEntry(
226 MediaStreamType stream_type, 252 MediaStreamType stream_type,
227 const std::string& id, 253 const std::string& id,
228 std::unique_ptr<VideoCaptureController> controller,
229 const media::VideoCaptureParams& params) 254 const media::VideoCaptureParams& params)
230 : serial_id(g_device_start_id++), 255 : serial_id(g_device_start_id++),
231 stream_type(stream_type), 256 stream_type(stream_type),
232 id(id), 257 id(id),
233 parameters(params), 258 parameters(params) {}
234 video_capture_controller_(std::move(controller)) {}
235 259
236 VideoCaptureManager::DeviceEntry::~DeviceEntry() { 260 VideoCaptureManager::DeviceEntry::~DeviceEntry() {
237 DCHECK(thread_checker_.CalledOnValidThread()); 261 DCHECK_CURRENTLY_ON(BrowserThread::IO);
238 // DCHECK that this DeviceEntry does not still own a 262 // DCHECK that this DeviceEntry does not still own a
239 // media::VideoCaptureDevice. media::VideoCaptureDevice must be deleted on 263 // media::VideoCaptureDevice. media::VideoCaptureDevice must be deleted on
240 // the device thread. 264 // the device thread.
241 DCHECK(video_capture_device_ == nullptr); 265 DCHECK(video_capture_device == nullptr);
242 } 266 }
243 267
244 void VideoCaptureManager::DeviceEntry::SetVideoCaptureDevice( 268 std::unique_ptr<media::VideoCaptureDevice::Client>
245 std::unique_ptr<VideoCaptureDevice> device) { 269 VideoCaptureManager::DeviceEntry::CreateDeviceClient() {
246 DCHECK(thread_checker_.CalledOnValidThread()); 270 DCHECK_CURRENTLY_ON(BrowserThread::IO);
247 video_capture_device_.swap(device); 271
272 const int max_buffers = stream_type == MEDIA_TAB_VIDEO_CAPTURE
273 ? kMaxNumberOfBuffersForTabCapture
274 : kMaxNumberOfBuffers;
275 buffer_pool = new media::VideoCaptureBufferPoolImpl(
276 base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(),
277 max_buffers);
278
279 return base::MakeUnique<media::VideoCaptureDeviceClient>(
280 base::MakeUnique<VideoFrameReceiverOnIOThread>(
281 video_capture_controller.GetWeakPtrForIOThread()),
282 buffer_pool,
283 base::Bind(
284 &CreateGpuJpegDecoder,
285 base::Bind(&media::VideoFrameReceiver::OnIncomingCapturedVideoFrame,
286 video_capture_controller.GetWeakPtrForIOThread())));
248 } 287 }
249 288
250 std::unique_ptr<media::VideoCaptureDevice> 289 std::unique_ptr<media::FrameBufferPool>
251 VideoCaptureManager::DeviceEntry::ReleaseVideoCaptureDevice() { 290 VideoCaptureManager::DeviceEntry::CreateFrameBufferPool() {
252 DCHECK(thread_checker_.CalledOnValidThread()); 291 DCHECK_CURRENTLY_ON(BrowserThread::IO);
253 return std::move(video_capture_device_); 292 DCHECK(buffer_pool);
254 } 293 return base::MakeUnique<BufferPoolFrameBufferPool>(buffer_pool);
255
256 VideoCaptureController*
257 VideoCaptureManager::DeviceEntry::video_capture_controller() const {
258 DCHECK(thread_checker_.CalledOnValidThread());
259 return video_capture_controller_.get();
260 }
261
262 media::VideoCaptureDevice*
263 VideoCaptureManager::DeviceEntry::video_capture_device() const {
264 DCHECK(thread_checker_.CalledOnValidThread());
265 return video_capture_device_.get();
266 } 294 }
267 295
268 VideoCaptureManager::DeviceInfo::DeviceInfo() = default; 296 VideoCaptureManager::DeviceInfo::DeviceInfo() = default;
269 297
270 VideoCaptureManager::DeviceInfo::DeviceInfo( 298 VideoCaptureManager::DeviceInfo::DeviceInfo(
271 media::VideoCaptureDeviceDescriptor descriptor) 299 media::VideoCaptureDeviceDescriptor descriptor)
272 : descriptor(descriptor) {} 300 : descriptor(descriptor) {}
273 301
274 VideoCaptureManager::DeviceInfo::DeviceInfo( 302 VideoCaptureManager::DeviceInfo::DeviceInfo(
275 const VideoCaptureManager::DeviceInfo& other) = default; 303 const VideoCaptureManager::DeviceInfo& other) = default;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 if (session_it == sessions_.end()) { 405 if (session_it == sessions_.end()) {
378 NOTREACHED(); 406 NOTREACHED();
379 return; 407 return;
380 } 408 }
381 409
382 DeviceEntry* const existing_device = 410 DeviceEntry* const existing_device =
383 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id); 411 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id);
384 if (existing_device) { 412 if (existing_device) {
385 // Remove any client that is still using the session. This is safe to call 413 // Remove any client that is still using the session. This is safe to call
386 // even if there are no clients using the session. 414 // even if there are no clients using the session.
387 existing_device->video_capture_controller() 415 existing_device->video_capture_controller.StopSession(capture_session_id);
388 ->StopSession(capture_session_id);
389 416
390 // StopSession() may have removed the last client, so we might need to 417 // StopSession() may have removed the last client, so we might need to
391 // close the device. 418 // close the device.
392 DestroyDeviceEntryIfNoClients(existing_device); 419 DestroyDeviceEntryIfNoClients(existing_device);
393 } 420 }
394 421
395 // Notify listeners asynchronously, and forget the session. 422 // Notify listeners asynchronously, and forget the session.
396 base::ThreadTaskRunnerHandle::Get()->PostTask( 423 base::ThreadTaskRunnerHandle::Get()->PostTask(
397 FROM_HERE, base::Bind(&VideoCaptureManager::OnClosed, this, 424 FROM_HERE, base::Bind(&VideoCaptureManager::OnClosed, this,
398 session_it->second.type, capture_session_id)); 425 session_it->second.type, capture_session_id));
(...skipping 27 matching lines...) Expand all
426 if (request->serial_id() == entry->serial_id) { 453 if (request->serial_id() == entry->serial_id) {
427 request->set_abort_start(); 454 request->set_abort_start();
428 DVLOG(3) << "DoStopDevice, aborting start request for device " 455 DVLOG(3) << "DoStopDevice, aborting start request for device "
429 << entry->id << " serial_id = " << entry->serial_id; 456 << entry->id << " serial_id = " << entry->serial_id;
430 return; 457 return;
431 } 458 }
432 } 459 }
433 460
434 DVLOG(3) << "DoStopDevice. Send stop request for device = " << entry->id 461 DVLOG(3) << "DoStopDevice. Send stop request for device = " << entry->id
435 << " serial_id = " << entry->serial_id << "."; 462 << " serial_id = " << entry->serial_id << ".";
436 entry->video_capture_controller()->OnLog( 463 entry->video_capture_controller.OnLog(
437 base::StringPrintf("Stopping device: id: %s", entry->id.c_str())); 464 base::StringPrintf("Stopping device: id: %s", entry->id.c_str()));
438 entry->video_capture_controller()->SetConsumerFeedbackObserver(nullptr); 465 entry->video_capture_controller.SetConsumerFeedbackObserver(nullptr);
466 entry->video_capture_controller.SetFrameBufferPool(nullptr);
439 467
440 // |entry->video_capture_device| can be null if creating the device has 468 // |entry->video_capture_device| can be null if creating the device has
441 // failed. 469 // failed.
442 if (entry->video_capture_device()) { 470 if (entry->video_capture_device) {
443 device_task_runner_->PostTask( 471 device_task_runner_->PostTask(
444 FROM_HERE, 472 FROM_HERE,
445 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this, 473 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this,
446 base::Passed(entry->ReleaseVideoCaptureDevice()))); 474 base::Passed(&entry->video_capture_device)));
447 } 475 }
448 } 476 }
449 477
450 void VideoCaptureManager::HandleQueuedStartRequest() { 478 void VideoCaptureManager::HandleQueuedStartRequest() {
451 DCHECK_CURRENTLY_ON(BrowserThread::IO); 479 DCHECK_CURRENTLY_ON(BrowserThread::IO);
452 // Remove all start requests that have been aborted. 480 // Remove all start requests that have been aborted.
453 while (device_start_queue_.begin() != device_start_queue_.end() && 481 while (device_start_queue_.begin() != device_start_queue_.end() &&
454 device_start_queue_.begin()->abort_start()) { 482 device_start_queue_.begin()->abort_start()) {
455 device_start_queue_.pop_front(); 483 device_start_queue_.pop_front();
456 } 484 }
457 DeviceStartQueue::iterator request = device_start_queue_.begin(); 485 DeviceStartQueue::iterator request = device_start_queue_.begin();
458 if (request == device_start_queue_.end()) 486 if (request == device_start_queue_.end())
459 return; 487 return;
460 488
461 const int serial_id = request->serial_id(); 489 const int serial_id = request->serial_id();
462 DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id); 490 DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id);
463 DCHECK(entry); 491 DCHECK(entry);
464 492
465 DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = " 493 DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = "
466 << entry->id << " start id = " << entry->serial_id; 494 << entry->id << " start id = " << entry->serial_id;
467 495
496 std::unique_ptr<media::VideoCaptureDevice::Client> device_client =
497 entry->CreateDeviceClient();
498 std::unique_ptr<media::FrameBufferPool> frame_buffer_pool =
499 entry->CreateFrameBufferPool();
500
468 base::Callback<std::unique_ptr<VideoCaptureDevice>(void)> 501 base::Callback<std::unique_ptr<VideoCaptureDevice>(void)>
469 start_capture_function; 502 start_capture_function;
470 503
471 switch (entry->stream_type) { 504 switch (entry->stream_type) {
472 case MEDIA_DEVICE_VIDEO_CAPTURE: { 505 case MEDIA_DEVICE_VIDEO_CAPTURE: {
473 // We look up the device id from the renderer in our local enumeration 506 // We look up the device id from the renderer in our local enumeration
474 // since the renderer does not have all the information that might be 507 // since the renderer does not have all the information that might be
475 // held in the browser-side VideoCaptureDevice::Name structure. 508 // held in the browser-side VideoCaptureDevice::Name structure.
476 const DeviceInfo* found = GetDeviceInfoById(entry->id); 509 const DeviceInfo* found = GetDeviceInfoById(entry->id);
477 if (found) { 510 if (found) {
478 entry->video_capture_controller()->OnLog( 511 entry->video_capture_controller.OnLog(
479 base::StringPrintf("Starting device: id: %s, name: %s, api: %s", 512 base::StringPrintf("Starting device: id: %s, name: %s, api: %s",
480 found->descriptor.device_id.c_str(), 513 found->descriptor.device_id.c_str(),
481 found->descriptor.GetNameAndModel().c_str(), 514 found->descriptor.GetNameAndModel().c_str(),
482 found->descriptor.GetCaptureApiTypeString())); 515 found->descriptor.GetCaptureApiTypeString()));
483 516
484 start_capture_function = base::Bind( 517 start_capture_function =
485 &VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread, this, 518 base::Bind(&VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread,
486 found->descriptor, request->params(), 519 this, found->descriptor, request->params(),
487 base::Passed(entry->video_capture_controller()->NewDeviceClient())); 520 base::Passed(std::move(device_client)));
488 } else { 521 } else {
489 // Errors from DoStartDeviceCaptureOnDeviceThread go via 522 // Errors from DoStartDeviceCaptureOnDeviceThread go via
490 // VideoCaptureDeviceClient::OnError, which needs some thread 523 // VideoCaptureDeviceClient::OnError, which needs some thread
491 // dancing to get errors processed on the IO thread. But since 524 // dancing to get errors processed on the IO thread. But since
492 // we're on that thread, we call VideoCaptureController 525 // we're on that thread, we call VideoCaptureController
493 // methods directly. 526 // methods directly.
494 const std::string log_message = base::StringPrintf( 527 const std::string log_message = base::StringPrintf(
495 "Error on %s:%d: device %s unknown. Maybe recently disconnected?", 528 "Error on %s:%d: device %s unknown. Maybe recently disconnected?",
496 __FILE__, __LINE__, entry->id.c_str()); 529 __FILE__, __LINE__, entry->id.c_str());
497 DLOG(ERROR) << log_message; 530 DLOG(ERROR) << log_message;
498 entry->video_capture_controller()->OnLog(log_message); 531 entry->video_capture_controller.OnLog(log_message);
499 entry->video_capture_controller()->OnError(); 532 entry->video_capture_controller.OnError();
500 // Drop the failed start request. 533 // Drop the failed start request.
501 device_start_queue_.pop_front(); 534 device_start_queue_.pop_front();
502 535
503 return; 536 return;
504 } 537 }
505 break; 538 break;
506 } 539 }
507 case MEDIA_TAB_VIDEO_CAPTURE: 540 case MEDIA_TAB_VIDEO_CAPTURE:
508 start_capture_function = base::Bind( 541 start_capture_function = base::Bind(
509 &VideoCaptureManager::DoStartTabCaptureOnDeviceThread, this, 542 &VideoCaptureManager::DoStartTabCaptureOnDeviceThread, this,
510 entry->id, request->params(), 543 entry->id, request->params(), base::Passed(std::move(device_client)));
511 base::Passed(entry->video_capture_controller()->NewDeviceClient()));
512 break; 544 break;
513 545
514 case MEDIA_DESKTOP_VIDEO_CAPTURE: 546 case MEDIA_DESKTOP_VIDEO_CAPTURE:
515 start_capture_function = base::Bind( 547 start_capture_function = base::Bind(
516 &VideoCaptureManager::DoStartDesktopCaptureOnDeviceThread, this, 548 &VideoCaptureManager::DoStartDesktopCaptureOnDeviceThread, this,
517 entry->id, request->params(), 549 entry->id, request->params(), base::Passed(std::move(device_client)));
518 base::Passed(entry->video_capture_controller()->NewDeviceClient()));
519 break; 550 break;
520 551
521 default: { 552 default: {
522 NOTIMPLEMENTED(); 553 NOTIMPLEMENTED();
523 return; 554 return;
524 } 555 }
525 } 556 }
526 base::PostTaskAndReplyWithResult( 557 base::PostTaskAndReplyWithResult(
527 device_task_runner_.get(), FROM_HERE, start_capture_function, 558 device_task_runner_.get(), FROM_HERE, start_capture_function,
528 base::Bind(&VideoCaptureManager::OnDeviceStarted, this, 559 base::Bind(&VideoCaptureManager::OnDeviceStarted, this,
529 request->serial_id())); 560 request->serial_id(), base::Passed(&frame_buffer_pool)));
530 } 561 }
531 562
532 void VideoCaptureManager::OnDeviceStarted( 563 void VideoCaptureManager::OnDeviceStarted(
533 int serial_id, 564 int serial_id,
565 std::unique_ptr<media::FrameBufferPool> frame_buffer_pool,
534 std::unique_ptr<VideoCaptureDevice> device) { 566 std::unique_ptr<VideoCaptureDevice> device) {
535 DVLOG(3) << __func__; 567 DVLOG(3) << __func__;
536 DCHECK_CURRENTLY_ON(BrowserThread::IO); 568 DCHECK_CURRENTLY_ON(BrowserThread::IO);
537 DCHECK_EQ(serial_id, device_start_queue_.begin()->serial_id()); 569 DCHECK_EQ(serial_id, device_start_queue_.begin()->serial_id());
538 // |device| can be null if creation failed in 570 // |device| can be null if creation failed in
539 // DoStartDeviceCaptureOnDeviceThread. 571 // DoStartDeviceCaptureOnDeviceThread.
540 if (device_start_queue_.front().abort_start()) { 572 if (device_start_queue_.front().abort_start()) {
541 // The device is no longer wanted. Stop the device again. 573 // The device is no longer wanted. Stop the device again.
542 DVLOG(3) << "OnDeviceStarted but start request have been aborted."; 574 DVLOG(3) << "OnDeviceStarted but start request have been aborted.";
543 media::VideoCaptureDevice* device_ptr = device.get(); 575 media::VideoCaptureDevice* device_ptr = device.get();
544 base::Closure closure = 576 base::Closure closure =
545 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this, 577 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this,
546 base::Passed(&device)); 578 base::Passed(&device));
547 if (device_ptr && !device_task_runner_->PostTask(FROM_HERE, closure)) { 579 if (device_ptr && !device_task_runner_->PostTask(FROM_HERE, closure)) {
548 // PostTask failed. The device must be stopped anyway. 580 // PostTask failed. The device must be stopped anyway.
549 device_ptr->StopAndDeAllocate(); 581 device_ptr->StopAndDeAllocate();
550 } 582 }
551 } else { 583 } else {
552 DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id); 584 DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id);
553 DCHECK(entry); 585 DCHECK(entry);
554 DCHECK(!entry->video_capture_device()); 586 DCHECK(!entry->video_capture_device);
555 // Passing raw pointer |device.get()| to the controller is safe, 587 if (device) {
556 // because we transfer ownership of it to |entry|. We are calling 588 entry->video_capture_controller.SetFrameBufferPool(
557 // SetConsumerFeedbackObserver(nullptr) before releasing 589 std::move(frame_buffer_pool));
558 // |entry->video_capture_device_| on the |device_task_runner_|. 590 // Passing raw pointer |device.get()| to the controller is safe,
559 entry->video_capture_controller()->SetConsumerFeedbackObserver( 591 // because we transfer ownership of it to |entry|. We are calling
560 base::MakeUnique<VideoFrameConsumerFeedbackObserverOnTaskRunner>( 592 // SetConsumerFeedbackObserver(nullptr) before releasing
561 device.get(), device_task_runner_)); 593 // |entry->video_capture_device_| on the |device_task_runner_|.
562 entry->SetVideoCaptureDevice(std::move(device)); 594 entry->video_capture_controller.SetConsumerFeedbackObserver(
595 base::MakeUnique<VideoFrameConsumerFeedbackObserverOnTaskRunner>(
596 device.get(), device_task_runner_));
597 }
598 entry->video_capture_device = std::move(device);
563 599
564 if (entry->stream_type == MEDIA_DESKTOP_VIDEO_CAPTURE) { 600 if (entry->stream_type == MEDIA_DESKTOP_VIDEO_CAPTURE) {
565 const media::VideoCaptureSessionId session_id = 601 const media::VideoCaptureSessionId session_id =
566 device_start_queue_.front().session_id(); 602 device_start_queue_.front().session_id();
567 DCHECK(session_id != kFakeSessionId); 603 DCHECK(session_id != kFakeSessionId);
568 MaybePostDesktopCaptureWindowId(session_id); 604 MaybePostDesktopCaptureWindowId(session_id);
569 } 605 }
570 606
571 auto it = photo_request_queue_.begin(); 607 auto it = photo_request_queue_.begin();
572 while (it != photo_request_queue_.end()) { 608 while (it != photo_request_queue_.end()) {
573 auto request = it++; 609 auto request = it++;
574 DeviceEntry* maybe_entry = GetDeviceEntryBySessionId(request->first); 610 DeviceEntry* maybe_entry = GetDeviceEntryBySessionId(request->first);
575 if (maybe_entry && maybe_entry->video_capture_device()) { 611 if (maybe_entry && maybe_entry->video_capture_device) {
576 request->second.Run(maybe_entry->video_capture_device()); 612 request->second.Run(maybe_entry->video_capture_device.get());
577 photo_request_queue_.erase(request); 613 photo_request_queue_.erase(request);
578 } 614 }
579 } 615 }
580 } 616 }
581 617
582 device_start_queue_.pop_front(); 618 device_start_queue_.pop_front();
583 HandleQueuedStartRequest(); 619 HandleQueuedStartRequest();
584 } 620 }
585 621
586 std::unique_ptr<media::VideoCaptureDevice> 622 std::unique_ptr<media::VideoCaptureDevice>
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 DCHECK_CURRENTLY_ON(BrowserThread::IO); 715 DCHECK_CURRENTLY_ON(BrowserThread::IO);
680 DVLOG(1) << __func__ << ", session_id = " << session_id << ", request: " 716 DVLOG(1) << __func__ << ", session_id = " << session_id << ", request: "
681 << media::VideoCaptureFormat::ToString(params.requested_format); 717 << media::VideoCaptureFormat::ToString(params.requested_format);
682 718
683 DeviceEntry* entry = GetOrCreateDeviceEntry(session_id, params); 719 DeviceEntry* entry = GetOrCreateDeviceEntry(session_id, params);
684 if (!entry) { 720 if (!entry) {
685 done_cb.Run(base::WeakPtr<VideoCaptureController>()); 721 done_cb.Run(base::WeakPtr<VideoCaptureController>());
686 return; 722 return;
687 } 723 }
688 724
689 DCHECK(entry->video_capture_controller());
690
691 LogVideoCaptureEvent(VIDEO_CAPTURE_START_CAPTURE); 725 LogVideoCaptureEvent(VIDEO_CAPTURE_START_CAPTURE);
692 726
693 // First client starts the device. 727 // First client starts the device.
694 if (!entry->video_capture_controller()->HasActiveClient() && 728 if (!entry->video_capture_controller.HasActiveClient() &&
695 !entry->video_capture_controller()->HasPausedClient()) { 729 !entry->video_capture_controller.HasPausedClient()) {
696 DVLOG(1) << "VideoCaptureManager starting device (type = " 730 DVLOG(1) << "VideoCaptureManager starting device (type = "
697 << entry->stream_type << ", id = " << entry->id << ")"; 731 << entry->stream_type << ", id = " << entry->id << ")";
698 QueueStartDevice(session_id, entry, params); 732 QueueStartDevice(session_id, entry, params);
699 } 733 }
700 // Run the callback first, as AddClient() may trigger OnFrameInfo(). 734 // Run the callback first, as AddClient() may trigger OnFrameInfo().
701 done_cb.Run(entry->video_capture_controller()->GetWeakPtrForIOThread()); 735 done_cb.Run(entry->video_capture_controller.GetWeakPtrForIOThread());
702 entry->video_capture_controller()->AddClient( 736 entry->video_capture_controller.AddClient(client_id, client_handler,
703 client_id, client_handler, session_id, params); 737 session_id, params);
704 } 738 }
705 739
706 void VideoCaptureManager::StopCaptureForClient( 740 void VideoCaptureManager::StopCaptureForClient(
707 VideoCaptureController* controller, 741 VideoCaptureController* controller,
708 VideoCaptureControllerID client_id, 742 VideoCaptureControllerID client_id,
709 VideoCaptureControllerEventHandler* client_handler, 743 VideoCaptureControllerEventHandler* client_handler,
710 bool aborted_due_to_error) { 744 bool aborted_due_to_error) {
711 DCHECK_CURRENTLY_ON(BrowserThread::IO); 745 DCHECK_CURRENTLY_ON(BrowserThread::IO);
712 DCHECK(controller); 746 DCHECK(controller);
713 DCHECK(client_handler); 747 DCHECK(client_handler);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 DCHECK(controller); 792 DCHECK(controller);
759 DCHECK(client_handler); 793 DCHECK(client_handler);
760 DeviceEntry* entry = GetDeviceEntryByController(controller); 794 DeviceEntry* entry = GetDeviceEntryByController(controller);
761 if (!entry) 795 if (!entry)
762 NOTREACHED() << "Got Null entry while pausing capture"; 796 NOTREACHED() << "Got Null entry while pausing capture";
763 797
764 const bool had_active_client = controller->HasActiveClient(); 798 const bool had_active_client = controller->HasActiveClient();
765 controller->PauseClient(client_id, client_handler); 799 controller->PauseClient(client_id, client_handler);
766 if (!had_active_client || controller->HasActiveClient()) 800 if (!had_active_client || controller->HasActiveClient())
767 return; 801 return;
768 if (media::VideoCaptureDevice* device = entry->video_capture_device()) { 802 if (media::VideoCaptureDevice* device = entry->video_capture_device.get()) {
769 device_task_runner_->PostTask( 803 device_task_runner_->PostTask(
770 FROM_HERE, 804 FROM_HERE,
771 base::Bind(&VideoCaptureDevice::MaybeSuspend, 805 base::Bind(&VideoCaptureDevice::MaybeSuspend,
772 // Unretained is safe to use here because |device| would be 806 // Unretained is safe to use here because |device| would be
773 // null if it was scheduled for shutdown and destruction, and 807 // null if it was scheduled for shutdown and destruction, and
774 // because this task is guaranteed to run before the task 808 // because this task is guaranteed to run before the task
775 // that destroys the |device|. 809 // that destroys the |device|.
776 base::Unretained(device))); 810 base::Unretained(device)));
777 } 811 }
778 } 812 }
779 813
780 void VideoCaptureManager::ResumeCaptureForClient( 814 void VideoCaptureManager::ResumeCaptureForClient(
781 media::VideoCaptureSessionId session_id, 815 media::VideoCaptureSessionId session_id,
782 const media::VideoCaptureParams& params, 816 const media::VideoCaptureParams& params,
783 VideoCaptureController* controller, 817 VideoCaptureController* controller,
784 VideoCaptureControllerID client_id, 818 VideoCaptureControllerID client_id,
785 VideoCaptureControllerEventHandler* client_handler) { 819 VideoCaptureControllerEventHandler* client_handler) {
786 DCHECK_CURRENTLY_ON(BrowserThread::IO); 820 DCHECK_CURRENTLY_ON(BrowserThread::IO);
787 DCHECK(controller); 821 DCHECK(controller);
788 DCHECK(client_handler); 822 DCHECK(client_handler);
789 823
790 DeviceEntry* entry = GetDeviceEntryByController(controller); 824 DeviceEntry* entry = GetDeviceEntryByController(controller);
791 if (!entry) 825 if (!entry)
792 NOTREACHED() << "Got Null entry while resuming capture"; 826 NOTREACHED() << "Got Null entry while resuming capture";
793 827
794 const bool had_active_client = controller->HasActiveClient(); 828 const bool had_active_client = controller->HasActiveClient();
795 controller->ResumeClient(client_id, client_handler); 829 controller->ResumeClient(client_id, client_handler);
796 if (had_active_client || !controller->HasActiveClient()) 830 if (had_active_client || !controller->HasActiveClient())
797 return; 831 return;
798 if (media::VideoCaptureDevice* device = entry->video_capture_device()) { 832 if (media::VideoCaptureDevice* device = entry->video_capture_device.get()) {
799 device_task_runner_->PostTask( 833 device_task_runner_->PostTask(
800 FROM_HERE, 834 FROM_HERE,
801 base::Bind(&VideoCaptureDevice::Resume, 835 base::Bind(&VideoCaptureDevice::Resume,
802 // Unretained is safe to use here because |device| would be 836 // Unretained is safe to use here because |device| would be
803 // null if it was scheduled for shutdown and destruction, and 837 // null if it was scheduled for shutdown and destruction, and
804 // because this task is guaranteed to run before the task 838 // because this task is guaranteed to run before the task
805 // that destroys the |device|. 839 // that destroys the |device|.
806 base::Unretained(device))); 840 base::Unretained(device)));
807 } 841 }
808 } 842 }
809 843
810 void VideoCaptureManager::RequestRefreshFrameForClient( 844 void VideoCaptureManager::RequestRefreshFrameForClient(
811 VideoCaptureController* controller) { 845 VideoCaptureController* controller) {
812 DCHECK_CURRENTLY_ON(BrowserThread::IO); 846 DCHECK_CURRENTLY_ON(BrowserThread::IO);
813 847
814 if (DeviceEntry* entry = GetDeviceEntryByController(controller)) { 848 if (DeviceEntry* entry = GetDeviceEntryByController(controller)) {
815 if (media::VideoCaptureDevice* device = entry->video_capture_device()) { 849 if (media::VideoCaptureDevice* device = entry->video_capture_device.get()) {
816 device_task_runner_->PostTask( 850 device_task_runner_->PostTask(
817 FROM_HERE, 851 FROM_HERE,
818 base::Bind(&VideoCaptureDevice::RequestRefreshFrame, 852 base::Bind(&VideoCaptureDevice::RequestRefreshFrame,
819 // Unretained is safe to use here because |device| would be 853 // Unretained is safe to use here because |device| would be
820 // null if it was scheduled for shutdown and destruction, 854 // null if it was scheduled for shutdown and destruction,
821 // and because this task is guaranteed to run before the 855 // and because this task is guaranteed to run before the
822 // task that destroys the |device|. 856 // task that destroys the |device|.
823 base::Unretained(device))); 857 base::Unretained(device)));
824 } 858 }
825 } 859 }
(...skipping 27 matching lines...) Expand all
853 if (it == sessions_.end()) 887 if (it == sessions_.end())
854 return false; 888 return false;
855 DVLOG(1) << "GetDeviceFormatsInUse for device: " << it->second.name; 889 DVLOG(1) << "GetDeviceFormatsInUse for device: " << it->second.name;
856 890
857 // Return the currently in-use format(s) of the device, if it's started. 891 // Return the currently in-use format(s) of the device, if it's started.
858 DeviceEntry* device_in_use = 892 DeviceEntry* device_in_use =
859 GetDeviceEntryByTypeAndId(it->second.type, it->second.id); 893 GetDeviceEntryByTypeAndId(it->second.type, it->second.id);
860 if (device_in_use) { 894 if (device_in_use) {
861 // Currently only one format-in-use is supported at the VCC level. 895 // Currently only one format-in-use is supported at the VCC level.
862 formats_in_use->push_back( 896 formats_in_use->push_back(
863 device_in_use->video_capture_controller()->GetVideoCaptureFormat()); 897 device_in_use->video_capture_controller.GetVideoCaptureFormat());
864 } 898 }
865 return true; 899 return true;
866 } 900 }
867 901
868 void VideoCaptureManager::SetDesktopCaptureWindowId( 902 void VideoCaptureManager::SetDesktopCaptureWindowId(
869 media::VideoCaptureSessionId session_id, 903 media::VideoCaptureSessionId session_id,
870 gfx::NativeViewId window_id) { 904 gfx::NativeViewId window_id) {
871 DCHECK_CURRENTLY_ON(BrowserThread::IO); 905 DCHECK_CURRENTLY_ON(BrowserThread::IO);
872 VLOG(2) << "SetDesktopCaptureWindowId called for session " << session_id; 906 VLOG(2) << "SetDesktopCaptureWindowId called for session " << session_id;
873 907
874 notification_window_ids_[session_id] = window_id; 908 notification_window_ids_[session_id] = window_id;
875 MaybePostDesktopCaptureWindowId(session_id); 909 MaybePostDesktopCaptureWindowId(session_id);
876 } 910 }
877 911
878 void VideoCaptureManager::MaybePostDesktopCaptureWindowId( 912 void VideoCaptureManager::MaybePostDesktopCaptureWindowId(
879 media::VideoCaptureSessionId session_id) { 913 media::VideoCaptureSessionId session_id) {
880 SessionMap::iterator session_it = sessions_.find(session_id); 914 SessionMap::iterator session_it = sessions_.find(session_id);
881 if (session_it == sessions_.end()) 915 if (session_it == sessions_.end())
882 return; 916 return;
883 917
884 DeviceEntry* const existing_device = 918 DeviceEntry* const existing_device =
885 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id); 919 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id);
886 if (!existing_device) { 920 if (!existing_device) {
887 DVLOG(2) << "Failed to find an existing screen capture device."; 921 DVLOG(2) << "Failed to find an existing screen capture device.";
888 return; 922 return;
889 } 923 }
890 924
891 if (!existing_device->video_capture_device()) { 925 if (!existing_device->video_capture_device) {
892 DVLOG(2) << "Screen capture device not yet started."; 926 DVLOG(2) << "Screen capture device not yet started.";
893 return; 927 return;
894 } 928 }
895 929
896 DCHECK_EQ(MEDIA_DESKTOP_VIDEO_CAPTURE, existing_device->stream_type); 930 DCHECK_EQ(MEDIA_DESKTOP_VIDEO_CAPTURE, existing_device->stream_type);
897 DesktopMediaID id = DesktopMediaID::Parse(existing_device->id); 931 DesktopMediaID id = DesktopMediaID::Parse(existing_device->id);
898 if (id.is_null()) 932 if (id.is_null())
899 return; 933 return;
900 934
901 auto window_id_it = notification_window_ids_.find(session_id); 935 auto window_id_it = notification_window_ids_.find(session_id);
902 if (window_id_it == notification_window_ids_.end()) { 936 if (window_id_it == notification_window_ids_.end()) {
903 DVLOG(2) << "Notification window id not set for screen capture."; 937 DVLOG(2) << "Notification window id not set for screen capture.";
904 return; 938 return;
905 } 939 }
906 940
907 // Post |existing_device->video_capture_device| to the VideoCaptureDevice to 941 // Post |existing_device->video_capture_device| to the VideoCaptureDevice to
908 // the device_task_runner_. This is safe since the device is destroyed on the 942 // the device_task_runner_. This is safe since the device is destroyed on the
909 // device_task_runner_. 943 // device_task_runner_.
910 device_task_runner_->PostTask( 944 device_task_runner_->PostTask(
911 FROM_HERE, 945 FROM_HERE,
912 base::Bind(&VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread, 946 base::Bind(&VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread,
913 this, 947 this, existing_device->video_capture_device.get(),
914 existing_device->video_capture_device(),
915 window_id_it->second)); 948 window_id_it->second));
916 949
917 notification_window_ids_.erase(window_id_it); 950 notification_window_ids_.erase(window_id_it);
918 } 951 }
919 952
920 void VideoCaptureManager::GetPhotoCapabilities( 953 void VideoCaptureManager::GetPhotoCapabilities(
921 int session_id, 954 int session_id,
922 VideoCaptureDevice::GetPhotoCapabilitiesCallback callback) { 955 VideoCaptureDevice::GetPhotoCapabilitiesCallback callback) {
923 DCHECK_CURRENTLY_ON(BrowserThread::IO); 956 DCHECK_CURRENTLY_ON(BrowserThread::IO);
924 957
925 const DeviceEntry* entry = GetDeviceEntryBySessionId(session_id); 958 const DeviceEntry* entry = GetDeviceEntryBySessionId(session_id);
926 if (!entry) 959 if (!entry)
927 return; 960 return;
928 VideoCaptureDevice* device = entry->video_capture_device(); 961 VideoCaptureDevice* device = entry->video_capture_device.get();
929 if (device) { 962 if (device) {
930 VideoCaptureManager::DoGetPhotoCapabilities(std::move(callback), device); 963 VideoCaptureManager::DoGetPhotoCapabilities(std::move(callback), device);
931 return; 964 return;
932 } 965 }
933 // |entry| is known but |device| is nullptr, queue up a request for later. 966 // |entry| is known but |device| is nullptr, queue up a request for later.
934 photo_request_queue_.emplace_back( 967 photo_request_queue_.emplace_back(
935 session_id, base::Bind(&VideoCaptureManager::DoGetPhotoCapabilities, this, 968 session_id, base::Bind(&VideoCaptureManager::DoGetPhotoCapabilities, this,
936 base::Passed(&callback))); 969 base::Passed(&callback)));
937 } 970 }
938 971
939 void VideoCaptureManager::SetPhotoOptions( 972 void VideoCaptureManager::SetPhotoOptions(
940 int session_id, 973 int session_id,
941 media::mojom::PhotoSettingsPtr settings, 974 media::mojom::PhotoSettingsPtr settings,
942 VideoCaptureDevice::SetPhotoOptionsCallback callback) { 975 VideoCaptureDevice::SetPhotoOptionsCallback callback) {
943 DCHECK_CURRENTLY_ON(BrowserThread::IO); 976 DCHECK_CURRENTLY_ON(BrowserThread::IO);
944 977
945 const DeviceEntry* entry = GetDeviceEntryBySessionId(session_id); 978 const DeviceEntry* entry = GetDeviceEntryBySessionId(session_id);
946 if (!entry) 979 if (!entry)
947 return; 980 return;
948 VideoCaptureDevice* device = entry->video_capture_device(); 981 VideoCaptureDevice* device = entry->video_capture_device.get();
949 if (device) { 982 if (device) {
950 VideoCaptureManager::DoSetPhotoOptions(std::move(callback), 983 VideoCaptureManager::DoSetPhotoOptions(std::move(callback),
951 std::move(settings), device); 984 std::move(settings), device);
952 return; 985 return;
953 } 986 }
954 // |entry| is known but |device| is nullptr, queue up a request for later. 987 // |entry| is known but |device| is nullptr, queue up a request for later.
955 photo_request_queue_.emplace_back( 988 photo_request_queue_.emplace_back(
956 session_id, base::Bind(&VideoCaptureManager::DoSetPhotoOptions, this, 989 session_id, base::Bind(&VideoCaptureManager::DoSetPhotoOptions, this,
957 base::Passed(&callback), base::Passed(&settings))); 990 base::Passed(&callback), base::Passed(&settings)));
958 } 991 }
959 992
960 void VideoCaptureManager::TakePhoto( 993 void VideoCaptureManager::TakePhoto(
961 int session_id, 994 int session_id,
962 VideoCaptureDevice::TakePhotoCallback callback) { 995 VideoCaptureDevice::TakePhotoCallback callback) {
963 DCHECK_CURRENTLY_ON(BrowserThread::IO); 996 DCHECK_CURRENTLY_ON(BrowserThread::IO);
964 997
965 const DeviceEntry* entry = GetDeviceEntryBySessionId(session_id); 998 const DeviceEntry* entry = GetDeviceEntryBySessionId(session_id);
966 if (!entry) 999 if (!entry)
967 return; 1000 return;
968 VideoCaptureDevice* device = entry->video_capture_device(); 1001 VideoCaptureDevice* device = entry->video_capture_device.get();
969 if (device) { 1002 if (device) {
970 VideoCaptureManager::DoTakePhoto(std::move(callback), device); 1003 VideoCaptureManager::DoTakePhoto(std::move(callback), device);
971 return; 1004 return;
972 } 1005 }
973 // |entry| is known but |device| is nullptr, queue up a request for later. 1006 // |entry| is known but |device| is nullptr, queue up a request for later.
974 photo_request_queue_.emplace_back( 1007 photo_request_queue_.emplace_back(
975 session_id, base::Bind(&VideoCaptureManager::DoTakePhoto, this, 1008 session_id, base::Bind(&VideoCaptureManager::DoTakePhoto, this,
976 base::Passed(&callback))); 1009 base::Passed(&callback)));
977 } 1010 }
978 1011
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 ConsolidateCaptureFormats(&device_info.supported_formats); 1099 ConsolidateCaptureFormats(&device_info.supported_formats);
1067 new_devices_info_cache.push_back(device_info); 1100 new_devices_info_cache.push_back(device_info);
1068 } 1101 }
1069 1102
1070 on_devices_enumerated_callback.Run(new_devices_info_cache); 1103 on_devices_enumerated_callback.Run(new_devices_info_cache);
1071 } 1104 }
1072 1105
1073 void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) { 1106 void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) {
1074 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1107 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1075 // Removal of the last client stops the device. 1108 // Removal of the last client stops the device.
1076 if (!entry->video_capture_controller()->HasActiveClient() && 1109 if (!entry->video_capture_controller.HasActiveClient() &&
1077 !entry->video_capture_controller()->HasPausedClient()) { 1110 !entry->video_capture_controller.HasPausedClient()) {
1078 DVLOG(1) << "VideoCaptureManager stopping device (type = " 1111 DVLOG(1) << "VideoCaptureManager stopping device (type = "
1079 << entry->stream_type << ", id = " << entry->id << ")"; 1112 << entry->stream_type << ", id = " << entry->id << ")";
1080 1113
1081 // The DeviceEntry is removed from |devices_| immediately. The controller is 1114 // The DeviceEntry is removed from |devices_| immediately. The controller is
1082 // deleted immediately, and the device is freed asynchronously. After this 1115 // deleted immediately, and the device is freed asynchronously. After this
1083 // point, subsequent requests to open this same device ID will create a new 1116 // point, subsequent requests to open this same device ID will create a new
1084 // DeviceEntry, VideoCaptureController, and VideoCaptureDevice. 1117 // DeviceEntry, VideoCaptureController, and VideoCaptureDevice.
1085 DoStopDevice(entry); 1118 DoStopDevice(entry);
1086 // TODO(mcasas): use a helper function https://crbug.com/624854. 1119 // TODO(mcasas): use a helper function https://crbug.com/624854.
1087 DeviceEntries::iterator device_it = 1120 DeviceEntries::iterator device_it =
(...skipping 29 matching lines...) Expand all
1117 return nullptr; 1150 return nullptr;
1118 } 1151 }
1119 1152
1120 VideoCaptureManager::DeviceEntry* 1153 VideoCaptureManager::DeviceEntry*
1121 VideoCaptureManager::GetDeviceEntryByController( 1154 VideoCaptureManager::GetDeviceEntryByController(
1122 const VideoCaptureController* controller) const { 1155 const VideoCaptureController* controller) const {
1123 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1156 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1124 1157
1125 // Look up |controller| in |devices_|. 1158 // Look up |controller| in |devices_|.
1126 for (const std::unique_ptr<DeviceEntry>& device : devices_) { 1159 for (const std::unique_ptr<DeviceEntry>& device : devices_) {
1127 if (device->video_capture_controller() == controller) 1160 if (&device->video_capture_controller == controller)
1128 return device.get(); 1161 return device.get();
1129 } 1162 }
1130 return nullptr; 1163 return nullptr;
1131 } 1164 }
1132 1165
1133 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetDeviceEntryBySerialId( 1166 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetDeviceEntryBySerialId(
1134 int serial_id) const { 1167 int serial_id) const {
1135 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1168 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1136 1169
1137 for (const std::unique_ptr<DeviceEntry>& device : devices_) { 1170 for (const std::unique_ptr<DeviceEntry>& device : devices_) {
(...skipping 24 matching lines...) Expand all
1162 1195
1163 // Check if another session has already opened this device. If so, just 1196 // Check if another session has already opened this device. If so, just
1164 // use that opened device. 1197 // use that opened device.
1165 DeviceEntry* const existing_device = 1198 DeviceEntry* const existing_device =
1166 GetDeviceEntryByTypeAndId(device_info.type, device_info.id); 1199 GetDeviceEntryByTypeAndId(device_info.type, device_info.id);
1167 if (existing_device) { 1200 if (existing_device) {
1168 DCHECK_EQ(device_info.type, existing_device->stream_type); 1201 DCHECK_EQ(device_info.type, existing_device->stream_type);
1169 return existing_device; 1202 return existing_device;
1170 } 1203 }
1171 1204
1172 const int max_buffers = device_info.type == MEDIA_TAB_VIDEO_CAPTURE ? 1205 devices_.emplace_back(
1173 kMaxNumberOfBuffersForTabCapture : kMaxNumberOfBuffers; 1206 new DeviceEntry(device_info.type, device_info.id, params));
1174 std::unique_ptr<VideoCaptureController> video_capture_controller( 1207 return devices_.back().get();
1175 new VideoCaptureController(max_buffers));
1176 DeviceEntry* new_device =
1177 new DeviceEntry(device_info.type, device_info.id,
1178 std::move(video_capture_controller), params);
1179 devices_.emplace_back(new_device);
1180 return new_device;
1181 } 1208 }
1182 1209
1183 void VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread( 1210 void VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread(
1184 media::VideoCaptureDevice* device, 1211 media::VideoCaptureDevice* device,
1185 gfx::NativeViewId window_id) { 1212 gfx::NativeViewId window_id) {
1186 DCHECK(IsOnDeviceThread()); 1213 DCHECK(IsOnDeviceThread());
1187 #if defined(ENABLE_SCREEN_CAPTURE) && !defined(OS_ANDROID) 1214 #if defined(ENABLE_SCREEN_CAPTURE) && !defined(OS_ANDROID)
1188 DesktopCaptureDevice* desktop_device = 1215 DesktopCaptureDevice* desktop_device =
1189 static_cast<DesktopCaptureDevice*>(device); 1216 static_cast<DesktopCaptureDevice*>(device);
1190 desktop_device->SetNotificationWindowId(window_id); 1217 desktop_device->SetNotificationWindowId(window_id);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 } 1283 }
1257 } 1284 }
1258 1285
1259 void VideoCaptureManager::ResumeDevices() { 1286 void VideoCaptureManager::ResumeDevices() {
1260 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1287 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1261 1288
1262 for (auto& entry : devices_) { 1289 for (auto& entry : devices_) {
1263 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture. 1290 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture.
1264 // Do not try to restart already running devices. 1291 // Do not try to restart already running devices.
1265 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE || 1292 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE ||
1266 entry->video_capture_device()) 1293 entry->video_capture_device)
1267 continue; 1294 continue;
1268 1295
1269 // Check if the device is already in the start queue. 1296 // Check if the device is already in the start queue.
1270 bool device_in_queue = false; 1297 bool device_in_queue = false;
1271 for (auto& request : device_start_queue_) { 1298 for (auto& request : device_start_queue_) {
1272 if (request.serial_id() == entry->serial_id) { 1299 if (request.serial_id() == entry->serial_id) {
1273 device_in_queue = true; 1300 device_in_queue = true;
1274 break; 1301 break;
1275 } 1302 }
1276 } 1303 }
1277 1304
1278 if (!device_in_queue) { 1305 if (!device_in_queue) {
1279 // Session ID is only valid for Screen capture. So we can fake it to 1306 // Session ID is only valid for Screen capture. So we can fake it to
1280 // resume video capture devices here. 1307 // resume video capture devices here.
1281 QueueStartDevice(kFakeSessionId, entry.get(), entry->parameters); 1308 QueueStartDevice(kFakeSessionId, entry.get(), entry->parameters);
1282 } 1309 }
1283 } 1310 }
1284 } 1311 }
1285 #endif // defined(OS_ANDROID) 1312 #endif // defined(OS_ANDROID)
1286 1313
1287 } // namespace content 1314 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698