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

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

Issue 615043006: Release the camera when WebRTC is not visible in Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sync Created 6 years, 2 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 <set> 7 #include <set>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 if (!entry) { 301 if (!entry) {
302 done_cb.Run(base::WeakPtr<VideoCaptureController>()); 302 done_cb.Run(base::WeakPtr<VideoCaptureController>());
303 return; 303 return;
304 } 304 }
305 305
306 DCHECK(entry->video_capture_controller); 306 DCHECK(entry->video_capture_controller);
307 307
308 LogVideoCaptureEvent(VIDEO_CAPTURE_EVENT_START_CAPTURE); 308 LogVideoCaptureEvent(VIDEO_CAPTURE_EVENT_START_CAPTURE);
309 309
310 // First client starts the device. 310 // First client starts the device.
311 if (entry->video_capture_controller->GetClientCount() == 0) { 311 if (entry->video_capture_controller->GetActiveClientCount() == 0) {
312 DVLOG(1) << "VideoCaptureManager starting device (type = " 312 DVLOG(1) << "VideoCaptureManager starting device (type = "
313 << entry->stream_type << ", id = " << entry->id << ")"; 313 << entry->stream_type << ", id = " << entry->id << ")";
314 314
315 device_task_runner_->PostTask( 315 device_task_runner_->PostTask(
316 FROM_HERE, 316 FROM_HERE,
317 base::Bind( 317 base::Bind(
318 &VideoCaptureManager::DoStartDeviceOnDeviceThread, 318 &VideoCaptureManager::DoStartDeviceOnDeviceThread,
319 this, 319 this,
320 session_id, 320 session_id,
321 entry, 321 entry,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 // Detach client from controller. 360 // Detach client from controller.
361 media::VideoCaptureSessionId session_id = 361 media::VideoCaptureSessionId session_id =
362 controller->RemoveClient(client_id, client_handler); 362 controller->RemoveClient(client_id, client_handler);
363 DVLOG(1) << "VideoCaptureManager::StopCaptureForClient, session_id = " 363 DVLOG(1) << "VideoCaptureManager::StopCaptureForClient, session_id = "
364 << session_id; 364 << session_id;
365 365
366 // If controller has no more clients, delete controller and device. 366 // If controller has no more clients, delete controller and device.
367 DestroyDeviceEntryIfNoClients(entry); 367 DestroyDeviceEntryIfNoClients(entry);
368 } 368 }
369 369
370 void VideoCaptureManager::PauseCaptureForClient(
371 VideoCaptureController* controller,
372 VideoCaptureControllerID client_id,
373 VideoCaptureControllerEventHandler* client_handler) {
374 DCHECK_CURRENTLY_ON(BrowserThread::IO);
375 DCHECK(controller);
376 DCHECK(client_handler);
377 DeviceEntry* entry = GetDeviceEntryForController(controller);
378 if (!entry) {
379 NOTREACHED();
380 return;
381 }
382
383 // We only pause the MEDIA_DEVICE_VIDEO_CAPTURE entry to release camera to
384 // system.
385 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
386 return;
387
388 controller->PauseOrResumeClient(client_id, client_handler, true);
389 if (controller->GetActiveClientCount() != 0)
390 return;
391
392 // There is no more client, release the camera.
393 device_task_runner_->PostTask(
394 FROM_HERE,
395 base::Bind(&VideoCaptureManager::DoStopDeviceOnDeviceThread, this,
396 base::Unretained(entry)));
397 }
398
399 void VideoCaptureManager::ResumeCaptureForClient(
400 media::VideoCaptureSessionId session_id,
401 const media::VideoCaptureParams& params,
402 VideoCaptureController* controller,
403 VideoCaptureControllerID client_id,
404 VideoCaptureControllerEventHandler* client_handler) {
405 DCHECK_CURRENTLY_ON(BrowserThread::IO);
406 DCHECK(controller);
407 DCHECK(client_handler);
408
409 DeviceEntry* entry = GetDeviceEntryForController(controller);
410 if (!entry) {
411 NOTREACHED();
412 return;
413 }
414
415 // We only pause/resume the MEDIA_DEVICE_VIDEO_CAPTURE entry.
416 if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE)
417 return;
418
419 controller->PauseOrResumeClient(client_id, client_handler, false);
420 if (controller->GetActiveClientCount() != 1)
421 return;
422
423 // This is first active client, allocate the camera.
424 device_task_runner_->PostTask(
425 FROM_HERE,
426 base::Bind(
427 &VideoCaptureManager::DoStartDeviceOnDeviceThread,
428 this,
429 session_id,
430 entry,
431 params,
432 base::Passed(entry->video_capture_controller->NewDeviceClient())));
433 }
434
370 bool VideoCaptureManager::GetDeviceSupportedFormats( 435 bool VideoCaptureManager::GetDeviceSupportedFormats(
371 media::VideoCaptureSessionId capture_session_id, 436 media::VideoCaptureSessionId capture_session_id,
372 media::VideoCaptureFormats* supported_formats) { 437 media::VideoCaptureFormats* supported_formats) {
373 DCHECK_CURRENTLY_ON(BrowserThread::IO); 438 DCHECK_CURRENTLY_ON(BrowserThread::IO);
374 DCHECK(supported_formats->empty()); 439 DCHECK(supported_formats->empty());
375 440
376 SessionMap::iterator it = sessions_.find(capture_session_id); 441 SessionMap::iterator it = sessions_.find(capture_session_id);
377 if (it == sessions_.end()) 442 if (it == sessions_.end())
378 return false; 443 return false;
379 DVLOG(1) << "GetDeviceSupportedFormats for device: " << it->second.name; 444 DVLOG(1) << "GetDeviceSupportedFormats for device: " << it->second.name;
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 gfx::NativeViewId window_id) { 722 gfx::NativeViewId window_id) {
658 DCHECK(IsOnDeviceThread()); 723 DCHECK(IsOnDeviceThread());
659 DCHECK(notification_window_ids_.find(session_id) == 724 DCHECK(notification_window_ids_.find(session_id) ==
660 notification_window_ids_.end()); 725 notification_window_ids_.end());
661 notification_window_ids_[session_id] = window_id; 726 notification_window_ids_[session_id] = window_id;
662 VLOG(2) << "Screen capture notification window saved for session " 727 VLOG(2) << "Screen capture notification window saved for session "
663 << session_id << " on device thread."; 728 << session_id << " on device thread.";
664 } 729 }
665 730
666 } // namespace content 731 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/media/video_capture_manager.h ('k') | content/common/media/video_capture_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698