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
3 // found in the LICENSE file.
5 #include "content/renderer/media/video_capture_impl_manager.h"
8 #include "base/bind_helpers.h"
9 #include "content/public/renderer/render_thread.h"
10 #include "content/renderer/media/video_capture_impl.h"
11 #include "content/renderer/media/video_capture_message_filter.h"
12 #include "media/base/bind_to_current_loop.h"
16 VideoCaptureHandle::VideoCaptureHandle(
17 media::VideoCapture* impl, base::Closure destruction_cb)
18 : impl_(impl), destruction_cb_(destruction_cb) {
21 VideoCaptureHandle::~VideoCaptureHandle() {
22 destruction_cb_.Run();
25 void VideoCaptureHandle::StartCapture(
26 EventHandler* handler,
27 const media::VideoCaptureParams& params) {
28 impl_->StartCapture(handler, params);
31 void VideoCaptureHandle::StopCapture(EventHandler* handler) {
32 impl_->StopCapture(handler);
35 bool VideoCaptureHandle::CaptureStarted() {
36 return impl_->CaptureStarted();
39 int VideoCaptureHandle::CaptureFrameRate() {
40 return impl_->CaptureFrameRate();
43 void VideoCaptureHandle::GetDeviceSupportedFormats(
44 const DeviceFormatsCallback& callback) {
45 impl_->GetDeviceSupportedFormats(callback);
48 void VideoCaptureHandle::GetDeviceFormatsInUse(
49 const DeviceFormatsInUseCallback& callback) {
50 impl_->GetDeviceFormatsInUse(callback);
53 VideoCaptureImplManager::VideoCaptureImplManager()
54 : filter_(new VideoCaptureMessageFilter()),
58 VideoCaptureImplManager::~VideoCaptureImplManager() {
59 DCHECK(thread_checker_.CalledOnValidThread());
62 scoped_ptr<VideoCaptureHandle> VideoCaptureImplManager::UseDevice(
63 media::VideoCaptureSessionId id) {
64 DCHECK(thread_checker_.CalledOnValidThread());
66 VideoCaptureImpl* video_capture_device = NULL;
67 VideoCaptureDeviceMap::iterator it = devices_.find(id);
68 if (it == devices_.end()) {
69 video_capture_device = CreateVideoCaptureImpl(id, filter_.get());
71 std::make_pair(1, linked_ptr<VideoCaptureImpl>(video_capture_device));
72 video_capture_device->Init();
75 video_capture_device = it->second.second.get();
78 // This callback ensures UnrefDevice() happens on the render thread.
79 return scoped_ptr<VideoCaptureHandle>(
80 new VideoCaptureHandle(
82 media::BindToCurrentLoop(
84 &VideoCaptureImplManager::UnrefDevice,
85 weak_factory_.GetWeakPtr(),
89 VideoCaptureImpl* VideoCaptureImplManager::CreateVideoCaptureImpl(
90 media::VideoCaptureSessionId id,
91 VideoCaptureMessageFilter* filter) const {
92 return new VideoCaptureImpl(id, filter);
95 void VideoCaptureImplManager::UnrefDevice(
96 media::VideoCaptureSessionId id) {
97 DCHECK(thread_checker_.CalledOnValidThread());
98 VideoCaptureDeviceMap::iterator it = devices_.find(id);
99 DCHECK(it != devices_.end());
101 DCHECK(it->second.first);
103 if (!it->second.first) {
104 VideoCaptureImpl* impl = it->second.second.release();
106 impl->DeInit(base::Bind(&base::DeletePointer<VideoCaptureImpl>, impl));
110 void VideoCaptureImplManager::SuspendDevices(bool suspend) {
111 DCHECK(thread_checker_.CalledOnValidThread());
112 for (VideoCaptureDeviceMap::iterator it = devices_.begin();
113 it != devices_.end(); ++it)
114 it->second.second->SuspendCapture(suspend);
117 } // namespace content