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. 4 5 #include "content/renderer/media/video_capture_impl_manager.h" 6 7 #include "base/bind.h" 8 #include "base/stl_util.h" 9 #include "content/renderer/media/video_capture_impl.h" 10 #include "content/renderer/media/video_capture_message_filter.h" 11 12 namespace content { 13 14 VideoCaptureImplManager::VideoCaptureImplManager() 15 : thread_("VC manager") { 16 thread_.Start(); 17 message_loop_proxy_ = thread_.message_loop_proxy(); 18 filter_ = new VideoCaptureMessageFilter(); 19 } 20 21 media::VideoCapture* VideoCaptureImplManager::AddDevice( 22 media::VideoCaptureSessionId id, 23 media::VideoCapture::EventHandler* handler) { 24 DCHECK(handler); 25 26 base::AutoLock auto_lock(lock_); 27 Devices::iterator it = devices_.find(id); 28 if (it == devices_.end()) { 29 VideoCaptureImpl* vc = 30 new VideoCaptureImpl(id, message_loop_proxy_.get(), filter_.get()); 31 devices_[id] = new Device(vc, handler); 32 vc->Init(); 33 return vc; 34 } 35 36 devices_[id]->clients.push_front(handler); 37 return it->second->vc; 38 } 39 40 void VideoCaptureImplManager::SuspendDevices(bool suspend) { 41 base::AutoLock auto_lock(lock_); 42 for (Devices::iterator it = devices_.begin(); it != devices_.end(); ++it) 43 it->second->vc->SuspendCapture(suspend); 44 } 45 46 void VideoCaptureImplManager::RemoveDevice( 47 media::VideoCaptureSessionId id, 48 media::VideoCapture::EventHandler* handler) { 49 DCHECK(handler); 50 51 base::AutoLock auto_lock(lock_); 52 Devices::iterator it = devices_.find(id); 53 if (it == devices_.end()) 54 return; 55 56 size_t size = it->second->clients.size(); 57 it->second->clients.remove(handler); 58 59 if (size == it->second->clients.size() || size > 1) 60 return; 61 62 devices_[id]->vc->DeInit(base::Bind(&VideoCaptureImplManager::FreeDevice, 63 this, devices_[id]->vc)); 64 delete devices_[id]; 65 devices_.erase(id); 66 } 67 68 void VideoCaptureImplManager::FreeDevice(VideoCaptureImpl* vc) { 69 delete vc; 70 } 71 72 VideoCaptureImplManager::~VideoCaptureImplManager() { 73 thread_.Stop(); 74 // TODO(wjia): uncomment the line below after collecting enough info for 75 // crbug.com/152418. 76 // STLDeleteContainerPairSecondPointers(devices_.begin(), devices_.end()); 77 } 78 79 VideoCaptureImplManager::Device::Device( 80 VideoCaptureImpl* device, 81 media::VideoCapture::EventHandler* handler) 82 : vc(device) { 83 clients.push_front(handler); 84 } 85 86 VideoCaptureImplManager::Device::~Device() {} 87 88 } // namespace content 89