| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/renderer/media/video_capture_impl_manager.h" |
| |
| #include "base/bind.h" |
| #include "base/stl_util.h" |
| #include "content/renderer/media/video_capture_impl.h" |
| #include "content/renderer/media/video_capture_message_filter.h" |
| |
| namespace content { |
| |
| VideoCaptureImplManager::VideoCaptureImplManager() |
| : thread_("VC manager") { |
| thread_.Start(); |
| message_loop_proxy_ = thread_.message_loop_proxy(); |
| filter_ = new VideoCaptureMessageFilter(); |
| } |
| |
| media::VideoCapture* VideoCaptureImplManager::AddDevice( |
| media::VideoCaptureSessionId id, |
| media::VideoCapture::EventHandler* handler) { |
| DCHECK(handler); |
| |
| base::AutoLock auto_lock(lock_); |
| Devices::iterator it = devices_.find(id); |
| if (it == devices_.end()) { |
| VideoCaptureImpl* vc = |
| new VideoCaptureImpl(id, message_loop_proxy_.get(), filter_.get()); |
| devices_[id] = new Device(vc, handler); |
| vc->Init(); |
| return vc; |
| } |
| |
| devices_[id]->clients.push_front(handler); |
| return it->second->vc; |
| } |
| |
| void VideoCaptureImplManager::SuspendDevices(bool suspend) { |
| base::AutoLock auto_lock(lock_); |
| for (Devices::iterator it = devices_.begin(); it != devices_.end(); ++it) |
| it->second->vc->SuspendCapture(suspend); |
| } |
| |
| void VideoCaptureImplManager::RemoveDevice( |
| media::VideoCaptureSessionId id, |
| media::VideoCapture::EventHandler* handler) { |
| DCHECK(handler); |
| |
| base::AutoLock auto_lock(lock_); |
| Devices::iterator it = devices_.find(id); |
| if (it == devices_.end()) |
| return; |
| |
| size_t size = it->second->clients.size(); |
| it->second->clients.remove(handler); |
| |
| if (size == it->second->clients.size() || size > 1) |
| return; |
| |
| devices_[id]->vc->DeInit(base::Bind(&VideoCaptureImplManager::FreeDevice, |
| this, devices_[id]->vc)); |
| delete devices_[id]; |
| devices_.erase(id); |
| } |
| |
| void VideoCaptureImplManager::FreeDevice(VideoCaptureImpl* vc) { |
| delete vc; |
| } |
| |
| VideoCaptureImplManager::~VideoCaptureImplManager() { |
| thread_.Stop(); |
| // TODO(wjia): uncomment the line below after collecting enough info for |
| // crbug.com/152418. |
| // STLDeleteContainerPairSecondPointers(devices_.begin(), devices_.end()); |
| } |
| |
| VideoCaptureImplManager::Device::Device( |
| VideoCaptureImpl* device, |
| media::VideoCapture::EventHandler* handler) |
| : vc(device) { |
| clients.push_front(handler); |
| } |
| |
| VideoCaptureImplManager::Device::~Device() {} |
| |
| } // namespace content |