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

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

Issue 2108293002: VideoCaptureManager: remove ScopedVector and other smaller cleanups (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: emircan@s nits Created 4 years, 5 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
« no previous file with comments | « content/browser/renderer_host/media/video_capture_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 DCHECK_CURRENTLY_ON(BrowserThread::IO); 323 DCHECK_CURRENTLY_ON(BrowserThread::IO);
324 DCHECK(listener_); 324 DCHECK(listener_);
325 DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id; 325 DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id;
326 326
327 SessionMap::iterator session_it = sessions_.find(capture_session_id); 327 SessionMap::iterator session_it = sessions_.find(capture_session_id);
328 if (session_it == sessions_.end()) { 328 if (session_it == sessions_.end()) {
329 NOTREACHED(); 329 NOTREACHED();
330 return; 330 return;
331 } 331 }
332 332
333 DeviceEntry* const existing_device = GetDeviceEntryForMediaStreamDevice( 333 DeviceEntry* const existing_device =
334 session_it->second); 334 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id);
335 if (existing_device) { 335 if (existing_device) {
336 // Remove any client that is still using the session. This is safe to call 336 // Remove any client that is still using the session. This is safe to call
337 // even if there are no clients using the session. 337 // even if there are no clients using the session.
338 existing_device->video_capture_controller() 338 existing_device->video_capture_controller()
339 ->StopSession(capture_session_id); 339 ->StopSession(capture_session_id);
340 340
341 // StopSession() may have removed the last client, so we might need to 341 // StopSession() may have removed the last client, so we might need to
342 // close the device. 342 // close the device.
343 DestroyDeviceEntryIfNoClients(existing_device); 343 DestroyDeviceEntryIfNoClients(existing_device);
344 } 344 }
(...skipping 11 matching lines...) Expand all
356 const media::VideoCaptureParams& params) { 356 const media::VideoCaptureParams& params) {
357 DCHECK_CURRENTLY_ON(BrowserThread::IO); 357 DCHECK_CURRENTLY_ON(BrowserThread::IO);
358 device_start_queue_.push_back( 358 device_start_queue_.push_back(
359 CaptureDeviceStartRequest(entry->serial_id, session_id, params)); 359 CaptureDeviceStartRequest(entry->serial_id, session_id, params));
360 if (device_start_queue_.size() == 1) 360 if (device_start_queue_.size() == 1)
361 HandleQueuedStartRequest(); 361 HandleQueuedStartRequest();
362 } 362 }
363 363
364 void VideoCaptureManager::DoStopDevice(DeviceEntry* entry) { 364 void VideoCaptureManager::DoStopDevice(DeviceEntry* entry) {
365 DCHECK_CURRENTLY_ON(BrowserThread::IO); 365 DCHECK_CURRENTLY_ON(BrowserThread::IO);
366 DCHECK(std::find(devices_.begin(), devices_.end(), entry) != devices_.end()); 366 // TODO(mcasas): use a helper function https://crbug.com/624854.
367 DCHECK(
368 std::find_if(devices_.begin(), devices_.end(),
369 [entry](const std::unique_ptr<DeviceEntry>& device_entry) {
370 return device_entry.get() == entry;
371 }) != devices_.end());
367 372
368 // Find the matching start request. 373 // Find the matching start request.
369 for (DeviceStartQueue::reverse_iterator request = 374 for (DeviceStartQueue::reverse_iterator request =
370 device_start_queue_.rbegin(); 375 device_start_queue_.rbegin();
371 request != device_start_queue_.rend(); ++request) { 376 request != device_start_queue_.rend(); ++request) {
372 if (request->serial_id() == entry->serial_id) { 377 if (request->serial_id() == entry->serial_id) {
373 request->set_abort_start(); 378 request->set_abort_start();
374 DVLOG(3) << "DoStopDevice, aborting start request for device " 379 DVLOG(3) << "DoStopDevice, aborting start request for device "
375 << entry->id << " serial_id = " << entry->serial_id; 380 << entry->id << " serial_id = " << entry->serial_id;
376 return; 381 return;
(...skipping 19 matching lines...) Expand all
396 // Remove all start requests that have been aborted. 401 // Remove all start requests that have been aborted.
397 while (device_start_queue_.begin() != device_start_queue_.end() && 402 while (device_start_queue_.begin() != device_start_queue_.end() &&
398 device_start_queue_.begin()->abort_start()) { 403 device_start_queue_.begin()->abort_start()) {
399 device_start_queue_.pop_front(); 404 device_start_queue_.pop_front();
400 } 405 }
401 DeviceStartQueue::iterator request = device_start_queue_.begin(); 406 DeviceStartQueue::iterator request = device_start_queue_.begin();
402 if (request == device_start_queue_.end()) 407 if (request == device_start_queue_.end())
403 return; 408 return;
404 409
405 const int serial_id = request->serial_id(); 410 const int serial_id = request->serial_id();
406 DeviceEntries::iterator entry_it = std::find_if( 411 DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id);
407 devices_.begin(), devices_.end(), 412 DCHECK(entry);
408 [serial_id] (const DeviceEntry* e) {
409 return e->serial_id == serial_id;
410 });
411 DCHECK(entry_it != devices_.end());
412 DeviceEntry* entry = (*entry_it);
413 413
414 #if defined(OS_MACOSX) 414 #if defined(OS_MACOSX)
415 if (NeedToInitializeCaptureDeviceApi(entry->stream_type)) { 415 if (NeedToInitializeCaptureDeviceApi(entry->stream_type)) {
416 InitializeCaptureDeviceApiOnUIThread( 416 InitializeCaptureDeviceApiOnUIThread(
417 base::Bind(&VideoCaptureManager::HandleQueuedStartRequest, this)); 417 base::Bind(&VideoCaptureManager::HandleQueuedStartRequest, this));
418 return; 418 return;
419 } 419 }
420 #endif 420 #endif
421 421
422 DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = " 422 DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = "
423 << entry->id << " start id = " << entry->serial_id; 423 << entry->id << " start id = " << entry->serial_id;
424 424
425 base::Callback<std::unique_ptr<VideoCaptureDevice>(void)> 425 base::Callback<std::unique_ptr<VideoCaptureDevice>(void)>
426 start_capture_function; 426 start_capture_function;
427 427
428 switch (entry->stream_type) { 428 switch (entry->stream_type) {
429 case MEDIA_DEVICE_VIDEO_CAPTURE: { 429 case MEDIA_DEVICE_VIDEO_CAPTURE: {
430 // We look up the device id from the renderer in our local enumeration 430 // We look up the device id from the renderer in our local enumeration
431 // since the renderer does not have all the information that might be 431 // since the renderer does not have all the information that might be
432 // held in the browser-side VideoCaptureDevice::Name structure. 432 // held in the browser-side VideoCaptureDevice::Name structure.
433 const media::VideoCaptureDeviceInfo* found = 433 const media::VideoCaptureDeviceInfo* found = GetDeviceInfoById(entry->id);
434 FindDeviceInfoById(entry->id, devices_info_cache_);
435 if (found) { 434 if (found) {
436 entry->video_capture_controller()->DoLogOnIOThread(base::StringPrintf( 435 entry->video_capture_controller()->DoLogOnIOThread(base::StringPrintf(
437 "Starting device: id: %s, name: %s, api: %s", 436 "Starting device: id: %s, name: %s, api: %s",
438 found->name.id().c_str(), found->name.GetNameAndModel().c_str(), 437 found->name.id().c_str(), found->name.GetNameAndModel().c_str(),
439 found->name.GetCaptureApiTypeString())); 438 found->name.GetCaptureApiTypeString()));
440 439
441 start_capture_function = base::Bind( 440 start_capture_function = base::Bind(
442 &VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread, this, 441 &VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread, this,
443 found->name, request->params(), 442 found->name, request->params(),
444 base::Passed(entry->video_capture_controller()->NewDeviceClient())); 443 base::Passed(entry->video_capture_controller()->NewDeviceClient()));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 DVLOG(3) << "OnDeviceStarted but start request have been aborted."; 498 DVLOG(3) << "OnDeviceStarted but start request have been aborted.";
500 media::VideoCaptureDevice* device_ptr = device.get(); 499 media::VideoCaptureDevice* device_ptr = device.get();
501 base::Closure closure = 500 base::Closure closure =
502 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this, 501 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this,
503 base::Passed(&device)); 502 base::Passed(&device));
504 if (device_ptr && !device_task_runner_->PostTask(FROM_HERE, closure)) { 503 if (device_ptr && !device_task_runner_->PostTask(FROM_HERE, closure)) {
505 // PostTask failed. The device must be stopped anyway. 504 // PostTask failed. The device must be stopped anyway.
506 device_ptr->StopAndDeAllocate(); 505 device_ptr->StopAndDeAllocate();
507 } 506 }
508 } else { 507 } else {
509 DeviceEntries::iterator entry_it = std::find_if( 508 DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id);
510 devices_.begin(), devices_.end(), 509 DCHECK(entry);
511 [serial_id] (const DeviceEntry* e) {
512 return e->serial_id == serial_id;
513 });
514 DCHECK(entry_it != devices_.end());
515 DeviceEntry* entry = *entry_it;
516 DCHECK(!entry->video_capture_device()); 510 DCHECK(!entry->video_capture_device());
517 entry->SetVideoCaptureDevice(std::move(device)); 511 entry->SetVideoCaptureDevice(std::move(device));
518 512
519 if (entry->stream_type == MEDIA_DESKTOP_VIDEO_CAPTURE) { 513 if (entry->stream_type == MEDIA_DESKTOP_VIDEO_CAPTURE) {
520 const media::VideoCaptureSessionId session_id = 514 const media::VideoCaptureSessionId session_id =
521 device_start_queue_.front().session_id(); 515 device_start_queue_.front().session_id();
522 DCHECK(session_id != kFakeSessionId); 516 DCHECK(session_id != kFakeSessionId);
523 MaybePostDesktopCaptureWindowId(session_id); 517 MaybePostDesktopCaptureWindowId(session_id);
524 } 518 }
525 } 519 }
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 636
643 void VideoCaptureManager::StopCaptureForClient( 637 void VideoCaptureManager::StopCaptureForClient(
644 VideoCaptureController* controller, 638 VideoCaptureController* controller,
645 VideoCaptureControllerID client_id, 639 VideoCaptureControllerID client_id,
646 VideoCaptureControllerEventHandler* client_handler, 640 VideoCaptureControllerEventHandler* client_handler,
647 bool aborted_due_to_error) { 641 bool aborted_due_to_error) {
648 DCHECK_CURRENTLY_ON(BrowserThread::IO); 642 DCHECK_CURRENTLY_ON(BrowserThread::IO);
649 DCHECK(controller); 643 DCHECK(controller);
650 DCHECK(client_handler); 644 DCHECK(client_handler);
651 645
652 DeviceEntry* entry = GetDeviceEntryForController(controller); 646 DeviceEntry* entry = GetDeviceEntryByController(controller);
653 if (!entry) { 647 if (!entry) {
654 NOTREACHED(); 648 NOTREACHED();
655 return; 649 return;
656 } 650 }
657 if (!aborted_due_to_error) { 651 if (!aborted_due_to_error) {
658 if (controller->has_received_frames()) { 652 if (controller->has_received_frames()) {
659 LogVideoCaptureEvent(VIDEO_CAPTURE_STOP_CAPTURE_OK); 653 LogVideoCaptureEvent(VIDEO_CAPTURE_STOP_CAPTURE_OK);
660 } else if (entry->stream_type == MEDIA_DEVICE_VIDEO_CAPTURE) { 654 } else if (entry->stream_type == MEDIA_DEVICE_VIDEO_CAPTURE) {
661 LogVideoCaptureEvent( 655 LogVideoCaptureEvent(
662 VIDEO_CAPTURE_STOP_CAPTURE_OK_NO_FRAMES_PRODUCED_BY_DEVICE); 656 VIDEO_CAPTURE_STOP_CAPTURE_OK_NO_FRAMES_PRODUCED_BY_DEVICE);
(...skipping 23 matching lines...) Expand all
686 DestroyDeviceEntryIfNoClients(entry); 680 DestroyDeviceEntryIfNoClients(entry);
687 } 681 }
688 682
689 void VideoCaptureManager::PauseCaptureForClient( 683 void VideoCaptureManager::PauseCaptureForClient(
690 VideoCaptureController* controller, 684 VideoCaptureController* controller,
691 VideoCaptureControllerID client_id, 685 VideoCaptureControllerID client_id,
692 VideoCaptureControllerEventHandler* client_handler) { 686 VideoCaptureControllerEventHandler* client_handler) {
693 DCHECK_CURRENTLY_ON(BrowserThread::IO); 687 DCHECK_CURRENTLY_ON(BrowserThread::IO);
694 DCHECK(controller); 688 DCHECK(controller);
695 DCHECK(client_handler); 689 DCHECK(client_handler);
696 DeviceEntry* entry = GetDeviceEntryForController(controller); 690 DeviceEntry* entry = GetDeviceEntryByController(controller);
697 if (!entry) { 691 if (!entry)
698 NOTREACHED(); 692 NOTREACHED() << "Got Null entry while pausing capture";
699 DVLOG(1) << "Got Null entry while pausing capture";
700 }
701 693
702 // Do not pause Content Video Capture devices, e.g. Tab or Screen capture. 694 // Do not pause Content Video Capture devices, e.g. Tab or Screen capture.
703 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE) 695 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
704 return; 696 return;
705 697
706 controller->PauseClient(client_id, client_handler); 698 controller->PauseClient(client_id, client_handler);
707 } 699 }
708 700
709 void VideoCaptureManager::ResumeCaptureForClient( 701 void VideoCaptureManager::ResumeCaptureForClient(
710 media::VideoCaptureSessionId session_id, 702 media::VideoCaptureSessionId session_id,
711 const media::VideoCaptureParams& params, 703 const media::VideoCaptureParams& params,
712 VideoCaptureController* controller, 704 VideoCaptureController* controller,
713 VideoCaptureControllerID client_id, 705 VideoCaptureControllerID client_id,
714 VideoCaptureControllerEventHandler* client_handler) { 706 VideoCaptureControllerEventHandler* client_handler) {
715 DCHECK_CURRENTLY_ON(BrowserThread::IO); 707 DCHECK_CURRENTLY_ON(BrowserThread::IO);
716 DCHECK(controller); 708 DCHECK(controller);
717 DCHECK(client_handler); 709 DCHECK(client_handler);
718 710
719 DeviceEntry* entry = GetDeviceEntryForController(controller); 711 DeviceEntry* entry = GetDeviceEntryByController(controller);
720 if (!entry) { 712 if (!entry)
721 NOTREACHED(); 713 NOTREACHED() << "Got Null entry while resuming capture";
722 DVLOG(1) << "Got Null entry while resuming capture";
723 }
724 714
725 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture. 715 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture.
726 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE) 716 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
727 return; 717 return;
728 718
729 controller->ResumeClient(client_id, client_handler); 719 controller->ResumeClient(client_id, client_handler);
730 } 720 }
731 721
732 void VideoCaptureManager::RequestRefreshFrameForClient( 722 void VideoCaptureManager::RequestRefreshFrameForClient(
733 VideoCaptureController* controller) { 723 VideoCaptureController* controller) {
734 DCHECK_CURRENTLY_ON(BrowserThread::IO); 724 DCHECK_CURRENTLY_ON(BrowserThread::IO);
735 725
736 if (DeviceEntry* entry = GetDeviceEntryForController(controller)) { 726 if (DeviceEntry* entry = GetDeviceEntryByController(controller)) {
737 if (media::VideoCaptureDevice* device = entry->video_capture_device()) { 727 if (media::VideoCaptureDevice* device = entry->video_capture_device()) {
738 device_task_runner_->PostTask( 728 device_task_runner_->PostTask(
739 FROM_HERE, 729 FROM_HERE,
740 base::Bind(&VideoCaptureDevice::RequestRefreshFrame, 730 base::Bind(&VideoCaptureDevice::RequestRefreshFrame,
741 // Unretained is safe to use here because |device| would be 731 // Unretained is safe to use here because |device| would be
742 // null if it was scheduled for shutdown and destruction, 732 // null if it was scheduled for shutdown and destruction,
743 // and because this task is guaranteed to run before the 733 // and because this task is guaranteed to run before the
744 // task that destroys the |device|. 734 // task that destroys the |device|.
745 base::Unretained(device))); 735 base::Unretained(device)));
746 } 736 }
747 } 737 }
748 } 738 }
749 739
750 bool VideoCaptureManager::GetDeviceSupportedFormats( 740 bool VideoCaptureManager::GetDeviceSupportedFormats(
751 media::VideoCaptureSessionId capture_session_id, 741 media::VideoCaptureSessionId capture_session_id,
752 media::VideoCaptureFormats* supported_formats) { 742 media::VideoCaptureFormats* supported_formats) {
753 DCHECK_CURRENTLY_ON(BrowserThread::IO); 743 DCHECK_CURRENTLY_ON(BrowserThread::IO);
754 DCHECK(supported_formats->empty()); 744 DCHECK(supported_formats->empty());
755 745
756 SessionMap::iterator it = sessions_.find(capture_session_id); 746 SessionMap::iterator it = sessions_.find(capture_session_id);
757 if (it == sessions_.end()) 747 if (it == sessions_.end())
758 return false; 748 return false;
759 DVLOG(1) << "GetDeviceSupportedFormats for device: " << it->second.name; 749 DVLOG(1) << "GetDeviceSupportedFormats for device: " << it->second.name;
760 750
761 // Return all available formats of the device, regardless its started state. 751 // Return all available formats of the device, regardless its started state.
762 media::VideoCaptureDeviceInfo* existing_device = 752 media::VideoCaptureDeviceInfo* existing_device =
763 FindDeviceInfoById(it->second.id, devices_info_cache_); 753 GetDeviceInfoById(it->second.id);
764 if (existing_device) 754 if (existing_device)
765 *supported_formats = existing_device->supported_formats; 755 *supported_formats = existing_device->supported_formats;
766 return true; 756 return true;
767 } 757 }
768 758
769 bool VideoCaptureManager::GetDeviceFormatsInUse( 759 bool VideoCaptureManager::GetDeviceFormatsInUse(
770 media::VideoCaptureSessionId capture_session_id, 760 media::VideoCaptureSessionId capture_session_id,
771 media::VideoCaptureFormats* formats_in_use) { 761 media::VideoCaptureFormats* formats_in_use) {
772 DCHECK_CURRENTLY_ON(BrowserThread::IO); 762 DCHECK_CURRENTLY_ON(BrowserThread::IO);
773 DCHECK(formats_in_use->empty()); 763 DCHECK(formats_in_use->empty());
774 764
775 SessionMap::iterator it = sessions_.find(capture_session_id); 765 SessionMap::iterator it = sessions_.find(capture_session_id);
776 if (it == sessions_.end()) 766 if (it == sessions_.end())
777 return false; 767 return false;
778 DVLOG(1) << "GetDeviceFormatsInUse for device: " << it->second.name; 768 DVLOG(1) << "GetDeviceFormatsInUse for device: " << it->second.name;
779 769
780 // Return the currently in-use format(s) of the device, if it's started. 770 // Return the currently in-use format(s) of the device, if it's started.
781 DeviceEntry* device_in_use = 771 DeviceEntry* device_in_use =
782 GetDeviceEntryForMediaStreamDevice(it->second); 772 GetDeviceEntryByTypeAndId(it->second.type, it->second.id);
783 if (device_in_use) { 773 if (device_in_use) {
784 // Currently only one format-in-use is supported at the VCC level. 774 // Currently only one format-in-use is supported at the VCC level.
785 formats_in_use->push_back( 775 formats_in_use->push_back(
786 device_in_use->video_capture_controller()->GetVideoCaptureFormat()); 776 device_in_use->video_capture_controller()->GetVideoCaptureFormat());
787 } 777 }
788 return true; 778 return true;
789 } 779 }
790 780
791 void VideoCaptureManager::SetDesktopCaptureWindowId( 781 void VideoCaptureManager::SetDesktopCaptureWindowId(
792 media::VideoCaptureSessionId session_id, 782 media::VideoCaptureSessionId session_id,
793 gfx::NativeViewId window_id) { 783 gfx::NativeViewId window_id) {
794 DCHECK_CURRENTLY_ON(BrowserThread::IO); 784 DCHECK_CURRENTLY_ON(BrowserThread::IO);
795 VLOG(2) << "SetDesktopCaptureWindowId called for session " << session_id; 785 VLOG(2) << "SetDesktopCaptureWindowId called for session " << session_id;
796 786
797 notification_window_ids_[session_id] = window_id; 787 notification_window_ids_[session_id] = window_id;
798 MaybePostDesktopCaptureWindowId(session_id); 788 MaybePostDesktopCaptureWindowId(session_id);
799 } 789 }
800 790
801 void VideoCaptureManager::MaybePostDesktopCaptureWindowId( 791 void VideoCaptureManager::MaybePostDesktopCaptureWindowId(
802 media::VideoCaptureSessionId session_id) { 792 media::VideoCaptureSessionId session_id) {
803 SessionMap::iterator session_it = sessions_.find(session_id); 793 SessionMap::iterator session_it = sessions_.find(session_id);
804 if (session_it == sessions_.end()) { 794 if (session_it == sessions_.end())
805 return; 795 return;
806 }
807 796
808 DeviceEntry* const existing_device = 797 DeviceEntry* const existing_device =
809 GetDeviceEntryForMediaStreamDevice(session_it->second); 798 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id);
810 if (!existing_device) { 799 if (!existing_device) {
811 DVLOG(2) << "Failed to find an existing screen capture device."; 800 DVLOG(2) << "Failed to find an existing screen capture device.";
812 return; 801 return;
813 } 802 }
814 803
815 if (!existing_device->video_capture_device()) { 804 if (!existing_device->video_capture_device()) {
816 DVLOG(2) << "Screen capture device not yet started."; 805 DVLOG(2) << "Screen capture device not yet started.";
817 return; 806 return;
818 } 807 }
819 808
(...skipping 19 matching lines...) Expand all
839 window_id_it->second)); 828 window_id_it->second));
840 829
841 notification_window_ids_.erase(window_id_it); 830 notification_window_ids_.erase(window_id_it);
842 } 831 }
843 832
844 void VideoCaptureManager::GetPhotoCapabilities( 833 void VideoCaptureManager::GetPhotoCapabilities(
845 int session_id, 834 int session_id,
846 media::ScopedResultCallback< 835 media::ScopedResultCallback<
847 VideoCaptureDevice::GetPhotoCapabilitiesCallback> callback) { 836 VideoCaptureDevice::GetPhotoCapabilitiesCallback> callback) {
848 DCHECK_CURRENTLY_ON(BrowserThread::IO); 837 DCHECK_CURRENTLY_ON(BrowserThread::IO);
849 VideoCaptureDevice* device = GetVideoCaptureDeviceFromSessionId(session_id); 838 VideoCaptureDevice* device = GetVideoCaptureDeviceBySessionId(session_id);
850 if (!device) 839 if (!device)
851 return; 840 return;
852 // Unretained(device) is safe to use here because |device| would be null if it 841 // Unretained(device) is safe to use here because |device| would be null if it
853 // was scheduled for shutdown and destruction, and because this task is 842 // was scheduled for shutdown and destruction, and because this task is
854 // guaranteed to run before the task that destroys the |device|. 843 // guaranteed to run before the task that destroys the |device|.
855 device_task_runner_->PostTask( 844 device_task_runner_->PostTask(
856 FROM_HERE, base::Bind(&VideoCaptureDevice::GetPhotoCapabilities, 845 FROM_HERE, base::Bind(&VideoCaptureDevice::GetPhotoCapabilities,
857 base::Unretained(device), base::Passed(&callback))); 846 base::Unretained(device), base::Passed(&callback)));
858 } 847 }
859 848
860 void VideoCaptureManager::TakePhoto( 849 void VideoCaptureManager::TakePhoto(
861 int session_id, 850 int session_id,
862 media::ScopedResultCallback<VideoCaptureDevice::TakePhotoCallback> 851 media::ScopedResultCallback<VideoCaptureDevice::TakePhotoCallback>
863 callback) { 852 callback) {
864 DCHECK_CURRENTLY_ON(BrowserThread::IO); 853 DCHECK_CURRENTLY_ON(BrowserThread::IO);
865 VideoCaptureDevice* device = GetVideoCaptureDeviceFromSessionId(session_id); 854 VideoCaptureDevice* device = GetVideoCaptureDeviceBySessionId(session_id);
866 if (!device) 855 if (!device)
867 return; 856 return;
868 // Unretained(device) is safe to use here because |device| would be null if it 857 // Unretained(device) is safe to use here because |device| would be null if it
869 // was scheduled for shutdown and destruction, and because this task is 858 // was scheduled for shutdown and destruction, and because this task is
870 // guaranteed to run before the task that destroys the |device|. 859 // guaranteed to run before the task that destroys the |device|.
871 device_task_runner_->PostTask( 860 device_task_runner_->PostTask(
872 FROM_HERE, base::Bind(&VideoCaptureDevice::TakePhoto, 861 FROM_HERE, base::Bind(&VideoCaptureDevice::TakePhoto,
873 base::Unretained(device), base::Passed(&callback))); 862 base::Unretained(device), base::Passed(&callback)));
874 } 863 }
875 864
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 media::VideoCaptureDeviceInfo device_info(it, media::VideoCaptureFormats()); 950 media::VideoCaptureDeviceInfo device_info(it, media::VideoCaptureFormats());
962 video_capture_device_factory_->GetDeviceSupportedFormats( 951 video_capture_device_factory_->GetDeviceSupportedFormats(
963 it, &(device_info.supported_formats)); 952 it, &(device_info.supported_formats));
964 ConsolidateCaptureFormats(&device_info.supported_formats); 953 ConsolidateCaptureFormats(&device_info.supported_formats);
965 new_devices_info_cache.push_back(device_info); 954 new_devices_info_cache.push_back(device_info);
966 } 955 }
967 956
968 on_devices_enumerated_callback.Run(new_devices_info_cache); 957 on_devices_enumerated_callback.Run(new_devices_info_cache);
969 } 958 }
970 959
971 VideoCaptureManager::DeviceEntry*
972 VideoCaptureManager::GetDeviceEntryForMediaStreamDevice(
973 const MediaStreamDevice& device_info) {
974 DCHECK_CURRENTLY_ON(BrowserThread::IO);
975
976 for (DeviceEntry* device : devices_) {
977 if (device_info.type == device->stream_type && device_info.id == device->id)
978 return device;
979 }
980 return nullptr;
981 }
982
983 media::VideoCaptureDevice*
984 VideoCaptureManager::GetVideoCaptureDeviceFromSessionId(int session_id) {
985 DCHECK_CURRENTLY_ON(BrowserThread::IO);
986 SessionMap::const_iterator session_it = sessions_.find(session_id);
987 if (session_it == sessions_.end())
988 return nullptr;
989
990 DeviceEntry* const device_info =
991 GetDeviceEntryForMediaStreamDevice(session_it->second);
992 if (!device_info)
993 return nullptr;
994 return device_info->video_capture_device();
995 }
996
997 VideoCaptureManager::DeviceEntry*
998 VideoCaptureManager::GetDeviceEntryForController(
999 const VideoCaptureController* controller) const {
1000 // Look up |controller| in |devices_|.
1001 for (DeviceEntry* device : devices_) {
1002 if (device->video_capture_controller() == controller)
1003 return device;
1004 }
1005 return nullptr;
1006 }
1007
1008 void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) { 960 void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) {
1009 DCHECK_CURRENTLY_ON(BrowserThread::IO); 961 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1010 // Removal of the last client stops the device. 962 // Removal of the last client stops the device.
1011 if (!entry->video_capture_controller()->HasActiveClient() && 963 if (!entry->video_capture_controller()->HasActiveClient() &&
1012 !entry->video_capture_controller()->HasPausedClient()) { 964 !entry->video_capture_controller()->HasPausedClient()) {
1013 DVLOG(1) << "VideoCaptureManager stopping device (type = " 965 DVLOG(1) << "VideoCaptureManager stopping device (type = "
1014 << entry->stream_type << ", id = " << entry->id << ")"; 966 << entry->stream_type << ", id = " << entry->id << ")";
1015 967
1016 // The DeviceEntry is removed from |devices_| immediately. The controller is 968 // The DeviceEntry is removed from |devices_| immediately. The controller is
1017 // deleted immediately, and the device is freed asynchronously. After this 969 // deleted immediately, and the device is freed asynchronously. After this
1018 // point, subsequent requests to open this same device ID will create a new 970 // point, subsequent requests to open this same device ID will create a new
1019 // DeviceEntry, VideoCaptureController, and VideoCaptureDevice. 971 // DeviceEntry, VideoCaptureController, and VideoCaptureDevice.
1020 DoStopDevice(entry); 972 DoStopDevice(entry);
1021 DeviceEntries::iterator device_it = std::find(devices_.begin(), 973 // TODO(mcasas): use a helper function https://crbug.com/624854.
1022 devices_.end(), 974 DeviceEntries::iterator device_it =
1023 entry); 975 std::find_if(devices_.begin(), devices_.end(),
976 [entry](const std::unique_ptr<DeviceEntry>& device_entry) {
977 return device_entry.get() == entry;
978 });
1024 devices_.erase(device_it); 979 devices_.erase(device_it);
1025 } 980 }
1026 } 981 }
1027 982
983 media::VideoCaptureDevice*
984 VideoCaptureManager::GetVideoCaptureDeviceBySessionId(int session_id) {
985 DCHECK_CURRENTLY_ON(BrowserThread::IO);
986 SessionMap::const_iterator session_it = sessions_.find(session_id);
987 if (session_it == sessions_.end())
988 return nullptr;
989
990 DeviceEntry* const device_info =
991 GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id);
992 return device_info ? device_info->video_capture_device() : nullptr;
993 }
994
995 VideoCaptureManager::DeviceEntry*
996 VideoCaptureManager::GetDeviceEntryByTypeAndId(
997 MediaStreamType type,
998 const std::string& device_id) const {
999 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1000
1001 for (const std::unique_ptr<DeviceEntry>& device : devices_) {
1002 if (type == device->stream_type && device_id == device->id)
1003 return device.get();
1004 }
1005 return nullptr;
1006 }
1007
1008 VideoCaptureManager::DeviceEntry*
1009 VideoCaptureManager::GetDeviceEntryByController(
1010 const VideoCaptureController* controller) const {
1011 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1012
1013 // Look up |controller| in |devices_|.
1014 for (const std::unique_ptr<DeviceEntry>& device : devices_) {
1015 if (device->video_capture_controller() == controller)
1016 return device.get();
1017 }
1018 return nullptr;
1019 }
1020
1021 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetDeviceEntryBySerialId(
1022 int serial_id) const {
1023 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1024
1025 for (const std::unique_ptr<DeviceEntry>& device : devices_) {
1026 if (device->serial_id == serial_id)
1027 return device.get();
1028 }
1029 return nullptr;
1030 }
1031
1032 media::VideoCaptureDeviceInfo* VideoCaptureManager::GetDeviceInfoById(
1033 const std::string& id) {
1034 for (auto& it : devices_info_cache_) {
1035 if (it.name.id() == id)
1036 return &it;
1037 }
1038 return nullptr;
1039 }
1040
1028 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry( 1041 VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry(
1029 media::VideoCaptureSessionId capture_session_id, 1042 media::VideoCaptureSessionId capture_session_id,
1030 const media::VideoCaptureParams& params) { 1043 const media::VideoCaptureParams& params) {
1031 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1044 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1032 1045
1033 SessionMap::iterator session_it = sessions_.find(capture_session_id); 1046 SessionMap::iterator session_it = sessions_.find(capture_session_id);
1034 if (session_it == sessions_.end()) 1047 if (session_it == sessions_.end())
1035 return nullptr; 1048 return nullptr;
1036 const MediaStreamDevice& device_info = session_it->second; 1049 const MediaStreamDevice& device_info = session_it->second;
1037 1050
1038 // Check if another session has already opened this device. If so, just 1051 // Check if another session has already opened this device. If so, just
1039 // use that opened device. 1052 // use that opened device.
1040 DeviceEntry* const existing_device = 1053 DeviceEntry* const existing_device =
1041 GetDeviceEntryForMediaStreamDevice(device_info); 1054 GetDeviceEntryByTypeAndId(device_info.type, device_info.id);
1042 if (existing_device) { 1055 if (existing_device) {
1043 DCHECK_EQ(device_info.type, existing_device->stream_type); 1056 DCHECK_EQ(device_info.type, existing_device->stream_type);
1044 return existing_device; 1057 return existing_device;
1045 } 1058 }
1046 1059
1047 const int max_buffers = device_info.type == MEDIA_TAB_VIDEO_CAPTURE ? 1060 const int max_buffers = device_info.type == MEDIA_TAB_VIDEO_CAPTURE ?
1048 kMaxNumberOfBuffersForTabCapture : kMaxNumberOfBuffers; 1061 kMaxNumberOfBuffersForTabCapture : kMaxNumberOfBuffers;
1049 std::unique_ptr<VideoCaptureController> video_capture_controller( 1062 std::unique_ptr<VideoCaptureController> video_capture_controller(
1050 new VideoCaptureController(max_buffers)); 1063 new VideoCaptureController(max_buffers));
1051 DeviceEntry* new_device = 1064 DeviceEntry* new_device =
1052 new DeviceEntry(device_info.type, device_info.id, 1065 new DeviceEntry(device_info.type, device_info.id,
1053 std::move(video_capture_controller), params); 1066 std::move(video_capture_controller), params);
1054 devices_.push_back(new_device); 1067 devices_.emplace_back(new_device);
1055 return new_device; 1068 return new_device;
1056 } 1069 }
1057 1070
1058 media::VideoCaptureDeviceInfo* VideoCaptureManager::FindDeviceInfoById(
1059 const std::string& id,
1060 media::VideoCaptureDeviceInfos& device_vector) {
1061 for (auto& it : device_vector) {
1062 if (it.name.id() == id)
1063 return &(it);
1064 }
1065 return nullptr;
1066 }
1067
1068 void VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread( 1071 void VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread(
1069 media::VideoCaptureDevice* device, 1072 media::VideoCaptureDevice* device,
1070 gfx::NativeViewId window_id) { 1073 gfx::NativeViewId window_id) {
1071 DCHECK(IsOnDeviceThread()); 1074 DCHECK(IsOnDeviceThread());
1072 #if defined(ENABLE_SCREEN_CAPTURE) 1075 #if defined(ENABLE_SCREEN_CAPTURE)
1073 DesktopCaptureDevice* desktop_device = 1076 DesktopCaptureDevice* desktop_device =
1074 static_cast<DesktopCaptureDevice*>(device); 1077 static_cast<DesktopCaptureDevice*>(device);
1075 desktop_device->SetNotificationWindowId(window_id); 1078 desktop_device->SetNotificationWindowId(window_id);
1076 VLOG(2) << "Screen capture notification window passed on device thread."; 1079 VLOG(2) << "Screen capture notification window passed on device thread.";
1077 #endif 1080 #endif
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 } 1124 }
1122 1125
1123 void VideoCaptureManager::ReleaseDevices() { 1126 void VideoCaptureManager::ReleaseDevices() {
1124 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1127 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1125 1128
1126 for (auto& entry : devices_) { 1129 for (auto& entry : devices_) {
1127 // Do not stop Content Video Capture devices, e.g. Tab or Screen capture. 1130 // Do not stop Content Video Capture devices, e.g. Tab or Screen capture.
1128 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE) 1131 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
1129 continue; 1132 continue;
1130 1133
1131 DoStopDevice(entry); 1134 DoStopDevice(entry.get());
1132 } 1135 }
1133 } 1136 }
1134 1137
1135 void VideoCaptureManager::ResumeDevices() { 1138 void VideoCaptureManager::ResumeDevices() {
1136 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1139 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1137 1140
1138 for (auto& entry : devices_) { 1141 for (auto& entry : devices_) {
1139 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture. 1142 // Do not resume Content Video Capture devices, e.g. Tab or Screen capture.
1140 // Do not try to restart already running devices. 1143 // Do not try to restart already running devices.
1141 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE || 1144 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE ||
1142 entry->video_capture_device()) 1145 entry->video_capture_device())
1143 continue; 1146 continue;
1144 1147
1145 // Check if the device is already in the start queue. 1148 // Check if the device is already in the start queue.
1146 bool device_in_queue = false; 1149 bool device_in_queue = false;
1147 for (auto& request : device_start_queue_) { 1150 for (auto& request : device_start_queue_) {
1148 if (request.serial_id() == entry->serial_id) { 1151 if (request.serial_id() == entry->serial_id) {
1149 device_in_queue = true; 1152 device_in_queue = true;
1150 break; 1153 break;
1151 } 1154 }
1152 } 1155 }
1153 1156
1154 if (!device_in_queue) { 1157 if (!device_in_queue) {
1155 // Session ID is only valid for Screen capture. So we can fake it to 1158 // Session ID is only valid for Screen capture. So we can fake it to
1156 // resume video capture devices here. 1159 // resume video capture devices here.
1157 QueueStartDevice(kFakeSessionId, entry, entry->parameters); 1160 QueueStartDevice(kFakeSessionId, entry.get(), entry->parameters);
1158 } 1161 }
1159 } 1162 }
1160 } 1163 }
1161 #endif // defined(OS_ANDROID) 1164 #endif // defined(OS_ANDROID)
1162 1165
1163 } // namespace content 1166 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/media/video_capture_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698