OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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); | |
Mike West
2014/10/02 11:24:39
Nit: The bool at the end makes this is pretty hard
michaelbai
2014/10/02 18:55:39
Yes, it is a little bit hard to read, but there ar
| |
420 if (controller->GetActiveClientCount() != 1) | |
421 return; | |
422 | |
423 // This is first active client, allocate the camera. | |
Mike West
2014/10/02 11:24:39
Since resuming capture assumes that the user has a
| |
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 Loading... | |
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 |
OLD | NEW |