// 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