| Index: content/browser/renderer_host/media/video_capture_manager.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc
|
| index 83b01a7fb1a2c30734bcc2c8dda5104ea9135a14..7a28856273673092a84a4d761b278ab9dec96c7e 100644
|
| --- a/content/browser/renderer_host/media/video_capture_manager.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_manager.cc
|
| @@ -308,7 +308,7 @@ void VideoCaptureManager::StartCaptureForClient(
|
| LogVideoCaptureEvent(VIDEO_CAPTURE_EVENT_START_CAPTURE);
|
|
|
| // First client starts the device.
|
| - if (entry->video_capture_controller->GetClientCount() == 0) {
|
| + if (entry->video_capture_controller->GetActiveClientCount() == 0) {
|
| DVLOG(1) << "VideoCaptureManager starting device (type = "
|
| << entry->stream_type << ", id = " << entry->id << ")";
|
|
|
| @@ -367,6 +367,71 @@ void VideoCaptureManager::StopCaptureForClient(
|
| DestroyDeviceEntryIfNoClients(entry);
|
| }
|
|
|
| +void VideoCaptureManager::PauseCaptureForClient(
|
| + VideoCaptureController* controller,
|
| + VideoCaptureControllerID client_id,
|
| + VideoCaptureControllerEventHandler* client_handler) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + DCHECK(controller);
|
| + DCHECK(client_handler);
|
| + DeviceEntry* entry = GetDeviceEntryForController(controller);
|
| + if (!entry) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + // We only pause the MEDIA_DEVICE_VIDEO_CAPTURE entry to release camera to
|
| + // system.
|
| + if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
|
| + return;
|
| +
|
| + controller->PauseOrResumeClient(client_id, client_handler, true);
|
| + if (controller->GetActiveClientCount() != 0)
|
| + return;
|
| +
|
| + // There is no more client, release the camera.
|
| + device_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this,
|
| + base::Unretained(entry)));
|
| +}
|
| +
|
| +void VideoCaptureManager::ResumeCaptureForClient(
|
| + media::VideoCaptureSessionId session_id,
|
| + const media::VideoCaptureParams& params,
|
| + VideoCaptureController* controller,
|
| + VideoCaptureControllerID client_id,
|
| + VideoCaptureControllerEventHandler* client_handler) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + DCHECK(controller);
|
| + DCHECK(client_handler);
|
| +
|
| + DeviceEntry* entry = GetDeviceEntryForController(controller);
|
| + if (!entry) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + // We only pause/resume the MEDIA_DEVICE_VIDEO_CAPTURE entry.
|
| + if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
|
| + return;
|
| +
|
| + controller->PauseOrResumeClient(client_id, client_handler, false);
|
| + if (controller->GetActiveClientCount() != 1)
|
| + return;
|
| +
|
| + // This is first active client, allocate the camera.
|
| + device_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &VideoCaptureManager::DoStartDeviceOnDeviceThread,
|
| + this,
|
| + session_id,
|
| + entry,
|
| + params,
|
| + base::Passed(entry->video_capture_controller->NewDeviceClient())));
|
| +}
|
| +
|
| bool VideoCaptureManager::GetDeviceSupportedFormats(
|
| media::VideoCaptureSessionId capture_session_id,
|
| media::VideoCaptureFormats* supported_formats) {
|
|
|