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

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

Issue 2753073006: [Mojo Video Capture] Add support to BuildableVideoCaptureDevice for aborting the device start. (Closed)
Patch Set: Incorporated mcasas@'s suggestions from PatchSet 2 Created 3 years, 8 months 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
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 ~DeviceInfo(); 135 ~DeviceInfo();
136 DeviceInfo& operator=(const DeviceInfo& other); 136 DeviceInfo& operator=(const DeviceInfo& other);
137 137
138 media::VideoCaptureDeviceDescriptor descriptor; 138 media::VideoCaptureDeviceDescriptor descriptor;
139 media::VideoCaptureFormats supported_formats; 139 media::VideoCaptureFormats supported_formats;
140 }; 140 };
141 141
142 // Class used for queuing request for starting a device. 142 // Class used for queuing request for starting a device.
143 class VideoCaptureManager::CaptureDeviceStartRequest { 143 class VideoCaptureManager::CaptureDeviceStartRequest {
144 public: 144 public:
145 CaptureDeviceStartRequest(int serial_id, 145 CaptureDeviceStartRequest(VideoCaptureController* controller,
146 media::VideoCaptureSessionId session_id, 146 media::VideoCaptureSessionId session_id,
147 const media::VideoCaptureParams& params); 147 const media::VideoCaptureParams& params);
148 int serial_id() const { return serial_id_; } 148 VideoCaptureController* controller() const { return controller_; }
149 media::VideoCaptureSessionId session_id() const { return session_id_; } 149 media::VideoCaptureSessionId session_id() const { return session_id_; }
150 media::VideoCaptureParams params() const { return params_; } 150 media::VideoCaptureParams params() const { return params_; }
151 151
152 // Set to true if the device should be stopped before it has successfully
153 // been started.
154 bool abort_start() const { return abort_start_; }
155 void set_abort_start() { abort_start_ = true; }
156
157 private: 152 private:
158 const int serial_id_; 153 VideoCaptureController* const controller_;
159 const media::VideoCaptureSessionId session_id_; 154 const media::VideoCaptureSessionId session_id_;
160 const media::VideoCaptureParams params_; 155 const media::VideoCaptureParams params_;
161 // Set to true if the device should be stopped before it has successfully
162 // been started.
163 bool abort_start_;
164 }; 156 };
165 157
166 VideoCaptureManager::DeviceInfo::DeviceInfo() = default; 158 VideoCaptureManager::DeviceInfo::DeviceInfo() = default;
167 159
168 VideoCaptureManager::DeviceInfo::DeviceInfo( 160 VideoCaptureManager::DeviceInfo::DeviceInfo(
169 media::VideoCaptureDeviceDescriptor descriptor) 161 media::VideoCaptureDeviceDescriptor descriptor)
170 : descriptor(descriptor) {} 162 : descriptor(descriptor) {}
171 163
172 VideoCaptureManager::DeviceInfo::DeviceInfo( 164 VideoCaptureManager::DeviceInfo::DeviceInfo(
173 const VideoCaptureManager::DeviceInfo& other) = default; 165 const VideoCaptureManager::DeviceInfo& other) = default;
174 166
175 VideoCaptureManager::DeviceInfo::~DeviceInfo() = default; 167 VideoCaptureManager::DeviceInfo::~DeviceInfo() = default;
176 168
177 VideoCaptureManager::DeviceInfo& VideoCaptureManager::DeviceInfo::operator=( 169 VideoCaptureManager::DeviceInfo& VideoCaptureManager::DeviceInfo::operator=(
178 const VideoCaptureManager::DeviceInfo& other) = default; 170 const VideoCaptureManager::DeviceInfo& other) = default;
179 171
180 VideoCaptureManager::CaptureDeviceStartRequest::CaptureDeviceStartRequest( 172 VideoCaptureManager::CaptureDeviceStartRequest::CaptureDeviceStartRequest(
181 int serial_id, 173 VideoCaptureController* controller,
182 media::VideoCaptureSessionId session_id, 174 media::VideoCaptureSessionId session_id,
183 const media::VideoCaptureParams& params) 175 const media::VideoCaptureParams& params)
184 : serial_id_(serial_id), 176 : controller_(controller), session_id_(session_id), params_(params) {}
185 session_id_(session_id),
186 params_(params),
187 abort_start_(false) {}
188 177
189 VideoCaptureManager::VideoCaptureManager( 178 VideoCaptureManager::VideoCaptureManager(
190 std::unique_ptr<media::VideoCaptureDeviceFactory> factory, 179 std::unique_ptr<media::VideoCaptureDeviceFactory> factory,
191 scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) 180 scoped_refptr<base::SingleThreadTaskRunner> device_task_runner)
192 : device_task_runner_(std::move(device_task_runner)), 181 : device_task_runner_(std::move(device_task_runner)),
193 new_capture_session_id_(1), 182 new_capture_session_id_(1),
194 video_capture_device_factory_(std::move(factory)) {} 183 video_capture_device_factory_(std::move(factory)) {}
195 184
196 VideoCaptureManager::~VideoCaptureManager() { 185 VideoCaptureManager::~VideoCaptureManager() {
197 DCHECK(controllers_.empty()); 186 DCHECK(controllers_.empty());
198 DCHECK(device_start_queue_.empty()); 187 DCHECK(device_start_request_queue_.empty());
199 } 188 }
200 189
201 void VideoCaptureManager::AddVideoCaptureObserver( 190 void VideoCaptureManager::AddVideoCaptureObserver(
202 media::VideoCaptureObserver* observer) { 191 media::VideoCaptureObserver* observer) {
203 DCHECK(observer); 192 DCHECK(observer);
204 DCHECK_CURRENTLY_ON(BrowserThread::IO); 193 DCHECK_CURRENTLY_ON(BrowserThread::IO);
205 capture_observers_.AddObserver(observer); 194 capture_observers_.AddObserver(observer);
206 } 195 }
207 196
208 void VideoCaptureManager::RemoveAllVideoCaptureObservers() { 197 void VideoCaptureManager::RemoveAllVideoCaptureObservers() {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 void VideoCaptureManager::Close(int capture_session_id) { 274 void VideoCaptureManager::Close(int capture_session_id) {
286 DCHECK_CURRENTLY_ON(BrowserThread::IO); 275 DCHECK_CURRENTLY_ON(BrowserThread::IO);
287 DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id; 276 DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id;
288 277
289 SessionMap::iterator session_it = sessions_.find(capture_session_id); 278 SessionMap::iterator session_it = sessions_.find(capture_session_id);
290 if (session_it == sessions_.end()) { 279 if (session_it == sessions_.end()) {
291 NOTREACHED(); 280 NOTREACHED();
292 return; 281 return;
293 } 282 }
294 283
295 VideoCaptureController* const existing_device = LookupControllerByTypeAndId( 284 VideoCaptureController* const existing_device =
296 session_it->second.type, session_it->second.id); 285 LookupControllerByMediaTypeAndDeviceId(session_it->second.type,
286 session_it->second.id);
297 if (existing_device) { 287 if (existing_device) {
298 // Remove any client that is still using the session. This is safe to call 288 // Remove any client that is still using the session. This is safe to call
299 // even if there are no clients using the session. 289 // even if there are no clients using the session.
300 existing_device->StopSession(capture_session_id); 290 existing_device->StopSession(capture_session_id);
301 291
302 // StopSession() may have removed the last client, so we might need to 292 // StopSession() may have removed the last client, so we might need to
303 // close the device. 293 // close the device.
304 DestroyControllerIfNoClients(existing_device); 294 DestroyControllerIfNoClients(existing_device);
305 } 295 }
306 296
307 // Notify listeners asynchronously, and forget the session. 297 // Notify listeners asynchronously, and forget the session.
308 base::ThreadTaskRunnerHandle::Get()->PostTask( 298 base::ThreadTaskRunnerHandle::Get()->PostTask(
309 FROM_HERE, base::Bind(&VideoCaptureManager::OnClosed, this, 299 FROM_HERE, base::Bind(&VideoCaptureManager::OnClosed, this,
310 session_it->second.type, capture_session_id)); 300 session_it->second.type, capture_session_id));
311 sessions_.erase(session_it); 301 sessions_.erase(session_it);
312 } 302 }
313 303
314 void VideoCaptureManager::QueueStartDevice( 304 void VideoCaptureManager::QueueStartDevice(
315 media::VideoCaptureSessionId session_id, 305 media::VideoCaptureSessionId session_id,
316 VideoCaptureController* controller, 306 VideoCaptureController* controller,
317 const media::VideoCaptureParams& params) { 307 const media::VideoCaptureParams& params) {
318 DCHECK_CURRENTLY_ON(BrowserThread::IO); 308 DCHECK_CURRENTLY_ON(BrowserThread::IO);
319 device_start_queue_.push_back( 309 device_start_request_queue_.push_back(
320 CaptureDeviceStartRequest(controller->serial_id(), session_id, params)); 310 CaptureDeviceStartRequest(controller, session_id, params));
321 if (device_start_queue_.size() == 1) 311 if (device_start_request_queue_.size() == 1)
322 HandleQueuedStartRequest(); 312 ProcessDeviceStartRequestQueue();
323 } 313 }
324 314
325 void VideoCaptureManager::DoStopDevice(VideoCaptureController* controller) { 315 void VideoCaptureManager::DoStopDevice(VideoCaptureController* controller) {
326 DCHECK_CURRENTLY_ON(BrowserThread::IO); 316 DCHECK_CURRENTLY_ON(BrowserThread::IO);
327 // TODO(mcasas): use a helper function https://crbug.com/624854. 317 // TODO(mcasas): use a helper function https://crbug.com/624854.
328 DCHECK(std::find_if( 318 DCHECK(std::find_if(
329 controllers_.begin(), controllers_.end(), 319 controllers_.begin(), controllers_.end(),
330 [controller]( 320 [controller](
331 const scoped_refptr<VideoCaptureController>& device_entry) { 321 const scoped_refptr<VideoCaptureController>& device_entry) {
332 return device_entry.get() == controller; 322 return device_entry.get() == controller;
333 }) != controllers_.end()); 323 }) != controllers_.end());
334 324
335 // Find the matching start request. 325 // If start request has not yet started processing, i.e. if it is not at the
336 for (DeviceStartQueue::reverse_iterator request = 326 // beginning of the queue, remove it from the queue.
337 device_start_queue_.rbegin(); 327 auto request_iter = device_start_request_queue_.begin();
338 request != device_start_queue_.rend(); ++request) { 328 if (request_iter != device_start_request_queue_.end()) {
339 if (request->serial_id() == controller->serial_id()) { 329 request_iter =
340 request->set_abort_start(); 330 std::find_if(++request_iter, device_start_request_queue_.end(),
341 DVLOG(3) << "DoStopDevice, aborting start request for device " 331 [controller](const CaptureDeviceStartRequest& request) {
342 << controller->device_id() 332 return request.controller() == controller;
343 << " serial_id = " << controller->serial_id(); 333 });
334 if (request_iter != device_start_request_queue_.end()) {
335 device_start_request_queue_.erase(request_iter);
344 return; 336 return;
345 } 337 }
346 } 338 }
347 339
348 const DeviceInfo* device_info = GetDeviceInfoById(controller->device_id()); 340 const DeviceInfo* device_info = GetDeviceInfoById(controller->device_id());
349 if (device_info != nullptr) { 341 if (device_info != nullptr) {
350 for (auto& observer : capture_observers_) 342 for (auto& observer : capture_observers_)
351 observer.OnVideoCaptureStopped(device_info->descriptor.facing); 343 observer.OnVideoCaptureStopped(device_info->descriptor.facing);
352 } 344 }
353 345
354 DVLOG(3) << "DoStopDevice. Send stop request for device = " 346 DVLOG(3) << "DoStopDevice. Send stop request for device = "
355 << controller->device_id() 347 << controller->device_id()
356 << " serial_id = " << controller->serial_id() << "."; 348 << " serial_id = " << controller->serial_id() << ".";
357 controller->OnLog(base::StringPrintf("Stopping device: id: %s", 349 controller->OnLog(base::StringPrintf("Stopping device: id: %s",
358 controller->device_id().c_str())); 350 controller->device_id().c_str()));
359 351
360 if (controller->IsDeviceAlive()) { 352 // Since we may be removing |controller| from |controllers_| while
361 // Since we may be removing |controller| from |controllers_| while 353 // ReleaseDeviceAsnyc() is executing, we pass it shared ownership to
362 // ReleaseDeviceAsnyc() is executing, we pass it shared ownership to 354 // |controller|.
363 // |controller|. 355 controller->ReleaseDeviceAsync(
364 controller->ReleaseDeviceAsync(base::Bind( 356 base::Bind([](scoped_refptr<VideoCaptureController>) {},
365 [](scoped_refptr<VideoCaptureController>) {}, 357 GetControllerSharedRef(controller)));
366 GetControllerSharedRefFromSerialId(controller->serial_id())));
367 }
368 } 358 }
369 359
370 void VideoCaptureManager::HandleQueuedStartRequest() { 360 void VideoCaptureManager::ProcessDeviceStartRequestQueue() {
371 DCHECK_CURRENTLY_ON(BrowserThread::IO); 361 DCHECK_CURRENTLY_ON(BrowserThread::IO);
372 // Remove all start requests that have been aborted. 362 DeviceStartQueue::iterator request = device_start_request_queue_.begin();
373 while (device_start_queue_.begin() != device_start_queue_.end() && 363 if (request == device_start_request_queue_.end())
374 device_start_queue_.begin()->abort_start()) {
375 device_start_queue_.pop_front();
376 }
377 DeviceStartQueue::iterator request = device_start_queue_.begin();
378 if (request == device_start_queue_.end())
379 return; 364 return;
380 365
381 const int serial_id = request->serial_id(); 366 VideoCaptureController* const controller = request->controller();
382 VideoCaptureController* const controller =
383 LookupControllerBySerialId(serial_id);
384 DCHECK(controller);
385 367
386 DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = " 368 DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = "
387 << controller->device_id() 369 << controller->device_id()
388 << " start id = " << controller->serial_id(); 370 << " start id = " << controller->serial_id();
389 371
390 // The method CreateAndStartDeviceAsync() is going to run asynchronously. 372 // The method CreateAndStartDeviceAsync() is going to run asynchronously.
391 // Since we may be removing the controller while it is executing, we need to 373 // Since we may be removing the controller while it is executing, we need to
392 // pass it shared ownership to itself so that it stays alive while executing. 374 // pass it shared ownership to itself so that it stays alive while executing.
393 // And since the execution may make callbacks into |this|, we also need 375 // And since the execution may make callbacks into |this|, we also need
394 // to pass it shared ownership to |this|. 376 // to pass it shared ownership to |this|.
395 // TODO(chfremer): Check if request->params() can actually be different from 377 // TODO(chfremer): Check if request->params() can actually be different from
396 // controller->parameters, and simplify if this is not the case. 378 // controller->parameters, and simplify if this is not the case.
397 controller->CreateAndStartDeviceAsync( 379 controller->CreateAndStartDeviceAsync(
398 request->params(), 380 request->params(),
399 static_cast<BuildableVideoCaptureDevice::Callbacks*>(this), 381 static_cast<BuildableVideoCaptureDevice::Callbacks*>(this),
400 base::Bind([](scoped_refptr<VideoCaptureManager>, 382 base::Bind([](scoped_refptr<VideoCaptureManager>,
401 scoped_refptr<VideoCaptureController>) {}, 383 scoped_refptr<VideoCaptureController>) {},
402 scoped_refptr<VideoCaptureManager>(this), 384 scoped_refptr<VideoCaptureManager>(this),
403 GetControllerSharedRefFromSerialId(serial_id))); 385 GetControllerSharedRef(controller)));
404 } 386 }
405 387
406 void VideoCaptureManager::WillStartDevice(media::VideoFacingMode facing_mode) { 388 void VideoCaptureManager::WillStartDevice(media::VideoFacingMode facing_mode) {
407 for (auto& observer : capture_observers_) 389 for (auto& observer : capture_observers_)
408 observer.OnVideoCaptureStarted(facing_mode); 390 observer.OnVideoCaptureStarted(facing_mode);
409 } 391 }
410 392
411 void VideoCaptureManager::DidStartDevice(VideoCaptureController* controller) { 393 void VideoCaptureManager::DidStartDevice(VideoCaptureController* controller) {
412 DVLOG(3) << __func__; 394 DVLOG(3) << __func__;
413 DCHECK_CURRENTLY_ON(BrowserThread::IO); 395 DCHECK_CURRENTLY_ON(BrowserThread::IO);
396 DCHECK(!device_start_request_queue_.empty());
397 DCHECK_EQ(controller, device_start_request_queue_.begin()->controller());
414 DCHECK(controller); 398 DCHECK(controller);
415 DCHECK_EQ(controller->serial_id(), device_start_queue_.begin()->serial_id()); 399 if (controller->stream_type() == MEDIA_DESKTOP_VIDEO_CAPTURE) {
416 if (device_start_queue_.front().abort_start()) { 400 const media::VideoCaptureSessionId session_id =
417 // A request to release the device may have arrived during the asynchronous 401 device_start_request_queue_.front().session_id();
418 // device startup. 402 DCHECK(session_id != kFakeSessionId);
419 DVLOG(3) << "Device release request has been issued while device was " 403 MaybePostDesktopCaptureWindowId(session_id);
420 << "starting up asynchronously."; 404 }
421 controller->ReleaseDeviceAsync(base::Bind(
422 [](scoped_refptr<VideoCaptureController>) {},
423 GetControllerSharedRefFromSerialId(controller->serial_id())));
424 } else {
425 if (controller->stream_type() == MEDIA_DESKTOP_VIDEO_CAPTURE) {
426 const media::VideoCaptureSessionId session_id =
427 device_start_queue_.front().session_id();
428 DCHECK(session_id != kFakeSessionId);
429 MaybePostDesktopCaptureWindowId(session_id);
430 }
431 405
432 auto it = photo_request_queue_.begin(); 406 auto it = photo_request_queue_.begin();
433 while (it != photo_request_queue_.end()) { 407 while (it != photo_request_queue_.end()) {
434 auto request = it++; 408 auto request = it++;
435 VideoCaptureController* maybe_entry = 409 VideoCaptureController* maybe_entry =
436 LookupControllerBySessionId(request->first); 410 LookupControllerBySessionId(request->first);
437 if (maybe_entry && maybe_entry->IsDeviceAlive()) { 411 if (maybe_entry && maybe_entry->IsDeviceAlive()) {
438 request->second.Run(); 412 request->second.Run();
439 photo_request_queue_.erase(request); 413 photo_request_queue_.erase(request);
440 }
441 } 414 }
442 } 415 }
443 416
444 device_start_queue_.pop_front(); 417 device_start_request_queue_.pop_front();
445 HandleQueuedStartRequest(); 418 ProcessDeviceStartRequestQueue();
446 } 419 }
447 420
448 void VideoCaptureManager::OnDeviceStartFailed( 421 void VideoCaptureManager::OnDeviceStartFailed(
449 VideoCaptureController* controller) { 422 VideoCaptureController* controller) {
450 const std::string log_message = base::StringPrintf( 423 const std::string log_message = base::StringPrintf(
451 "Starting device %s has failed. Maybe recently disconnected?", 424 "Starting device %s has failed. Maybe recently disconnected?",
452 controller->device_id().c_str()); 425 controller->device_id().c_str());
453 DLOG(ERROR) << log_message; 426 DLOG(ERROR) << log_message;
454 controller->OnLog(log_message); 427 controller->OnLog(log_message);
455 controller->OnError(); 428 controller->OnError();
456 429
457 device_start_queue_.pop_front(); 430 device_start_request_queue_.pop_front();
458 HandleQueuedStartRequest(); 431 ProcessDeviceStartRequestQueue();
459 } 432 }
460 433
461 void VideoCaptureManager::StartCaptureForClient( 434 void VideoCaptureManager::OnDeviceStartAborted() {
435 device_start_request_queue_.pop_front();
436 ProcessDeviceStartRequestQueue();
437 }
438
439 void VideoCaptureManager::ConnectClient(
462 media::VideoCaptureSessionId session_id, 440 media::VideoCaptureSessionId session_id,
463 const media::VideoCaptureParams& params, 441 const media::VideoCaptureParams& params,
464 VideoCaptureControllerID client_id, 442 VideoCaptureControllerID client_id,
465 VideoCaptureControllerEventHandler* client_handler, 443 VideoCaptureControllerEventHandler* client_handler,
466 const DoneCB& done_cb) { 444 const DoneCB& done_cb) {
467 DCHECK_CURRENTLY_ON(BrowserThread::IO); 445 DCHECK_CURRENTLY_ON(BrowserThread::IO);
468 DVLOG(1) << __func__ << ", session_id = " << session_id << ", request: " 446 DVLOG(1) << __func__ << ", session_id = " << session_id << ", request: "
469 << media::VideoCaptureFormat::ToString(params.requested_format); 447 << media::VideoCaptureFormat::ToString(params.requested_format);
470 448
471 VideoCaptureController* controller = 449 VideoCaptureController* controller =
472 GetOrCreateController(session_id, params); 450 GetOrCreateController(session_id, params);
473 if (!controller) { 451 if (!controller) {
474 done_cb.Run(base::WeakPtr<VideoCaptureController>()); 452 done_cb.Run(base::WeakPtr<VideoCaptureController>());
475 return; 453 return;
476 } 454 }
477 455
478 LogVideoCaptureEvent(VIDEO_CAPTURE_START_CAPTURE); 456 LogVideoCaptureEvent(VIDEO_CAPTURE_START_CAPTURE);
479 457
480 // First client starts the device. 458 // First client starts the device.
481 if (!controller->HasActiveClient() && !controller->HasPausedClient()) { 459 if (!controller->HasActiveClient() && !controller->HasPausedClient()) {
482 DVLOG(1) << "VideoCaptureManager starting device (id = " 460 DVLOG(1) << "VideoCaptureManager starting device (id = "
483 << controller->device_id() << ")"; 461 << controller->device_id() << ")";
484 QueueStartDevice(session_id, controller, params); 462 QueueStartDevice(session_id, controller, params);
485 } 463 }
486 // Run the callback first, as AddClient() may trigger OnFrameInfo(). 464 // Run the callback first, as AddClient() may trigger OnFrameInfo().
487 done_cb.Run(controller->GetWeakPtrForIOThread()); 465 done_cb.Run(controller->GetWeakPtrForIOThread());
488 controller->AddClient(client_id, client_handler, session_id, params); 466 controller->AddClient(client_id, client_handler, session_id, params);
489 } 467 }
490 468
491 void VideoCaptureManager::StopCaptureForClient( 469 void VideoCaptureManager::DisconnectClient(
492 VideoCaptureController* controller, 470 VideoCaptureController* controller,
493 VideoCaptureControllerID client_id, 471 VideoCaptureControllerID client_id,
494 VideoCaptureControllerEventHandler* client_handler, 472 VideoCaptureControllerEventHandler* client_handler,
495 bool aborted_due_to_error) { 473 bool aborted_due_to_error) {
496 DCHECK_CURRENTLY_ON(BrowserThread::IO); 474 DCHECK_CURRENTLY_ON(BrowserThread::IO);
497 DCHECK(controller); 475 DCHECK(controller);
498 DCHECK(client_handler); 476 DCHECK(client_handler);
499 477
500 if (!IsControllerPointerValid(controller)) { 478 if (!IsControllerPointerValid(controller)) {
501 NOTREACHED(); 479 NOTREACHED();
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 } 607 }
630 608
631 bool VideoCaptureManager::GetDeviceFormatsInUse( 609 bool VideoCaptureManager::GetDeviceFormatsInUse(
632 MediaStreamType stream_type, 610 MediaStreamType stream_type,
633 const std::string& device_id, 611 const std::string& device_id,
634 media::VideoCaptureFormats* formats_in_use) { 612 media::VideoCaptureFormats* formats_in_use) {
635 DCHECK_CURRENTLY_ON(BrowserThread::IO); 613 DCHECK_CURRENTLY_ON(BrowserThread::IO);
636 DCHECK(formats_in_use->empty()); 614 DCHECK(formats_in_use->empty());
637 // Return the currently in-use format(s) of the device, if it's started. 615 // Return the currently in-use format(s) of the device, if it's started.
638 VideoCaptureController* device_in_use = 616 VideoCaptureController* device_in_use =
639 LookupControllerByTypeAndId(stream_type, device_id); 617 LookupControllerByMediaTypeAndDeviceId(stream_type, device_id);
640 if (device_in_use) { 618 if (device_in_use) {
641 // Currently only one format-in-use is supported at the VCC level. 619 // Currently only one format-in-use is supported at the VCC level.
642 formats_in_use->push_back(device_in_use->GetVideoCaptureFormat()); 620 formats_in_use->push_back(device_in_use->GetVideoCaptureFormat());
643 } 621 }
644 return true; 622 return true;
645 } 623 }
646 624
647 void VideoCaptureManager::SetDesktopCaptureWindowId( 625 void VideoCaptureManager::SetDesktopCaptureWindowId(
648 media::VideoCaptureSessionId session_id, 626 media::VideoCaptureSessionId session_id,
649 gfx::NativeViewId window_id) { 627 gfx::NativeViewId window_id) {
650 DCHECK_CURRENTLY_ON(BrowserThread::IO); 628 DCHECK_CURRENTLY_ON(BrowserThread::IO);
651 VLOG(2) << "SetDesktopCaptureWindowId called for session " << session_id; 629 VLOG(2) << "SetDesktopCaptureWindowId called for session " << session_id;
652 630
653 notification_window_ids_[session_id] = window_id; 631 notification_window_ids_[session_id] = window_id;
654 MaybePostDesktopCaptureWindowId(session_id); 632 MaybePostDesktopCaptureWindowId(session_id);
655 } 633 }
656 634
657 void VideoCaptureManager::MaybePostDesktopCaptureWindowId( 635 void VideoCaptureManager::MaybePostDesktopCaptureWindowId(
658 media::VideoCaptureSessionId session_id) { 636 media::VideoCaptureSessionId session_id) {
659 SessionMap::iterator session_it = sessions_.find(session_id); 637 SessionMap::iterator session_it = sessions_.find(session_id);
660 if (session_it == sessions_.end()) 638 if (session_it == sessions_.end())
661 return; 639 return;
662 640
663 VideoCaptureController* const existing_device = LookupControllerByTypeAndId( 641 VideoCaptureController* const existing_device =
664 session_it->second.type, session_it->second.id); 642 LookupControllerByMediaTypeAndDeviceId(session_it->second.type,
643 session_it->second.id);
665 if (!existing_device) { 644 if (!existing_device) {
666 DVLOG(2) << "Failed to find an existing screen capture device."; 645 DVLOG(2) << "Failed to find an existing screen capture device.";
667 return; 646 return;
668 } 647 }
669 648
670 if (!existing_device->IsDeviceAlive()) { 649 if (!existing_device->IsDeviceAlive()) {
671 DVLOG(2) << "Screen capture device not yet started."; 650 DVLOG(2) << "Screen capture device not yet started.";
672 return; 651 return;
673 } 652 }
674 653
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 } 830 }
852 } 831 }
853 832
854 VideoCaptureController* VideoCaptureManager::LookupControllerBySessionId( 833 VideoCaptureController* VideoCaptureManager::LookupControllerBySessionId(
855 int session_id) { 834 int session_id) {
856 DCHECK_CURRENTLY_ON(BrowserThread::IO); 835 DCHECK_CURRENTLY_ON(BrowserThread::IO);
857 SessionMap::const_iterator session_it = sessions_.find(session_id); 836 SessionMap::const_iterator session_it = sessions_.find(session_id);
858 if (session_it == sessions_.end()) 837 if (session_it == sessions_.end())
859 return nullptr; 838 return nullptr;
860 839
861 return LookupControllerByTypeAndId(session_it->second.type, 840 return LookupControllerByMediaTypeAndDeviceId(session_it->second.type,
862 session_it->second.id); 841 session_it->second.id);
863 } 842 }
864 843
865 VideoCaptureController* VideoCaptureManager::LookupControllerByTypeAndId( 844 VideoCaptureController*
845 VideoCaptureManager::LookupControllerByMediaTypeAndDeviceId(
866 MediaStreamType type, 846 MediaStreamType type,
867 const std::string& device_id) const { 847 const std::string& device_id) const {
868 DCHECK_CURRENTLY_ON(BrowserThread::IO); 848 DCHECK_CURRENTLY_ON(BrowserThread::IO);
869 849
870 for (const auto& entry : controllers_) { 850 for (const auto& entry : controllers_) {
871 if (type == entry->stream_type() && device_id == entry->device_id()) 851 if (type == entry->stream_type() && device_id == entry->device_id())
872 return entry.get(); 852 return entry.get();
873 } 853 }
874 return nullptr; 854 return nullptr;
875 } 855 }
876 856
877 bool VideoCaptureManager::IsControllerPointerValid( 857 bool VideoCaptureManager::IsControllerPointerValid(
878 const VideoCaptureController* controller) const { 858 const VideoCaptureController* controller) const {
879 DCHECK_CURRENTLY_ON(BrowserThread::IO); 859 DCHECK_CURRENTLY_ON(BrowserThread::IO);
880 return base::ContainsValue(controllers_, controller); 860 return base::ContainsValue(controllers_, controller);
881 } 861 }
882 862
883 VideoCaptureController* VideoCaptureManager::LookupControllerBySerialId( 863 scoped_refptr<VideoCaptureController>
884 int serial_id) const { 864 VideoCaptureManager::GetControllerSharedRef(
865 VideoCaptureController* controller) const {
885 DCHECK_CURRENTLY_ON(BrowserThread::IO); 866 DCHECK_CURRENTLY_ON(BrowserThread::IO);
886 867
887 for (const auto& entry : controllers_) { 868 for (const auto& entry : controllers_) {
888 if (entry->serial_id() == serial_id) 869 if (entry.get() == controller)
889 return entry.get();
890 }
891 return nullptr;
892 }
893
894 scoped_refptr<VideoCaptureController>
895 VideoCaptureManager::GetControllerSharedRefFromSerialId(int serial_id) const {
896 DCHECK_CURRENTLY_ON(BrowserThread::IO);
897
898 for (const auto& entry : controllers_) {
899 if (entry->serial_id() == serial_id)
900 return entry; 870 return entry;
901 } 871 }
902 return nullptr; 872 return nullptr;
903 } 873 }
904 874
905 VideoCaptureManager::DeviceInfo* VideoCaptureManager::GetDeviceInfoById( 875 VideoCaptureManager::DeviceInfo* VideoCaptureManager::GetDeviceInfoById(
906 const std::string& id) { 876 const std::string& id) {
907 for (auto& it : devices_info_cache_) { 877 for (auto& it : devices_info_cache_) {
908 if (it.descriptor.device_id == id) 878 if (it.descriptor.device_id == id)
909 return &it; 879 return &it;
910 } 880 }
911 return nullptr; 881 return nullptr;
912 } 882 }
913 883
914 VideoCaptureController* VideoCaptureManager::GetOrCreateController( 884 VideoCaptureController* VideoCaptureManager::GetOrCreateController(
915 media::VideoCaptureSessionId capture_session_id, 885 media::VideoCaptureSessionId capture_session_id,
916 const media::VideoCaptureParams& params) { 886 const media::VideoCaptureParams& params) {
917 DCHECK_CURRENTLY_ON(BrowserThread::IO); 887 DCHECK_CURRENTLY_ON(BrowserThread::IO);
918 888
919 SessionMap::iterator session_it = sessions_.find(capture_session_id); 889 SessionMap::iterator session_it = sessions_.find(capture_session_id);
920 if (session_it == sessions_.end()) 890 if (session_it == sessions_.end())
921 return nullptr; 891 return nullptr;
922 const MediaStreamDevice& device_info = session_it->second; 892 const MediaStreamDevice& device_info = session_it->second;
923 893
924 // Check if another session has already opened this device. If so, just 894 // Check if another session has already opened this device. If so, just
925 // use that opened device. 895 // use that opened device.
926 VideoCaptureController* const existing_device = 896 VideoCaptureController* const existing_device =
927 LookupControllerByTypeAndId(device_info.type, device_info.id); 897 LookupControllerByMediaTypeAndDeviceId(device_info.type, device_info.id);
928 if (existing_device) { 898 if (existing_device) {
929 DCHECK_EQ(device_info.type, existing_device->stream_type()); 899 DCHECK_EQ(device_info.type, existing_device->stream_type());
930 return existing_device; 900 return existing_device;
931 } 901 }
932 902
933 VideoCaptureController* new_device_entry = new VideoCaptureController( 903 VideoCaptureController* new_controller = new VideoCaptureController(
934 device_info.id, device_info.type, params, 904 device_info.id, device_info.type, params,
935 base::MakeUnique<InProcessBuildableVideoCaptureDevice>( 905 base::MakeUnique<InProcessBuildableVideoCaptureDevice>(
936 device_task_runner_, video_capture_device_factory_.get())); 906 device_task_runner_, video_capture_device_factory_.get()));
937 controllers_.emplace_back(new_device_entry); 907 controllers_.emplace_back(new_controller);
938 return new_device_entry; 908 return new_controller;
939 } 909 }
940 910
941 base::Optional<CameraCalibration> VideoCaptureManager::GetCameraCalibration( 911 base::Optional<CameraCalibration> VideoCaptureManager::GetCameraCalibration(
942 const std::string& device_id) { 912 const std::string& device_id) {
943 VideoCaptureManager::DeviceInfo* info = GetDeviceInfoById(device_id); 913 VideoCaptureManager::DeviceInfo* info = GetDeviceInfoById(device_id);
944 if (!info) 914 if (!info)
945 return base::Optional<CameraCalibration>(); 915 return base::Optional<CameraCalibration>();
946 return info->descriptor.camera_calibration; 916 return info->descriptor.camera_calibration;
947 } 917 }
948 918
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 950
981 for (auto& controller : controllers_) { 951 for (auto& controller : controllers_) {
982 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture. 952 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture.
983 // Do not try to restart already running devices. 953 // Do not try to restart already running devices.
984 if (controller->stream_type() != MEDIA_DEVICE_VIDEO_CAPTURE || 954 if (controller->stream_type() != MEDIA_DEVICE_VIDEO_CAPTURE ||
985 controller->IsDeviceAlive()) 955 controller->IsDeviceAlive())
986 continue; 956 continue;
987 957
988 // Check if the device is already in the start queue. 958 // Check if the device is already in the start queue.
989 bool device_in_queue = false; 959 bool device_in_queue = false;
990 for (auto& request : device_start_queue_) { 960 for (auto& request : device_start_request_queue_) {
991 if (request.serial_id() == controller->serial_id()) { 961 if (request.controller() == controller.get()) {
992 device_in_queue = true; 962 device_in_queue = true;
993 break; 963 break;
994 } 964 }
995 } 965 }
996 966
997 if (!device_in_queue) { 967 if (!device_in_queue) {
998 // Session ID is only valid for Screen capture. So we can fake it to 968 // Session ID is only valid for Screen capture. So we can fake it to
999 // resume video capture devices here. 969 // resume video capture devices here.
1000 QueueStartDevice(kFakeSessionId, controller.get(), 970 QueueStartDevice(kFakeSessionId, controller.get(),
1001 controller->parameters()); 971 controller->parameters());
1002 } 972 }
1003 } 973 }
1004 } 974 }
1005 #endif // defined(OS_ANDROID) 975 #endif // defined(OS_ANDROID)
1006 976
1007 } // namespace content 977 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698