Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Unified Diff: content/renderer/media/video_capture_impl_manager.cc

Issue 6902166: Add VideoCaptureImpl (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/video_capture_impl_manager.cc
===================================================================
--- content/renderer/media/video_capture_impl_manager.cc (revision 0)
+++ content/renderer/media/video_capture_impl_manager.cc (revision 0)
@@ -0,0 +1,113 @@
+// Copyright (c) 2011 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/memory/singleton.h"
+#include "content/common/child_process.h"
+#include "content/common/child_thread.h"
+#include "content/common/video_capture_messages.h"
+#include "content/common/view_messages.h"
+#include "media/base/message_loop_factory_impl.h"
+
+namespace {
+
+// VideoCaptureMessageFilterCreator is to be used as a singleton so we can get
+// access to a shared VideoCaptureMessageFilter.
+// Example usage:
+// VideoCaptureMessageFilter* filter =
+// VideoCaptureMessageFilterCreator::SharedFilter();
+
+class VideoCaptureMessageFilterCreator {
+ public:
+ VideoCaptureMessageFilterCreator() {
+ int routing_id;
+ ChildThread::current()->Send(
+ new ViewHostMsg_GenerateRoutingID(&routing_id));
+ filter_ = new VideoCaptureMessageFilter(routing_id);
+ filter_->AddFilter();
+ }
+
+ static VideoCaptureMessageFilter* SharedFilter() {
+ return GetInstance()->filter_.get();
+ }
+
+ static VideoCaptureMessageFilterCreator* GetInstance() {
+ return Singleton<VideoCaptureMessageFilterCreator>::get();
+ }
+
+ private:
+ scoped_refptr<VideoCaptureMessageFilter> filter_;
+};
+
+} // namespace
+
+VideoCaptureImplManager::VideoCaptureImplManager() {
+ ml_factory_.reset(new media::MessageLoopFactoryImpl());
+ ml_proxy_ = ml_factory_->GetMessageLoopProxy("VC manager");
+}
+
+// static
+media::VideoCapture* VideoCaptureImplManager::AddDevice(
+ media::VideoCaptureSessionId id,
+ media::VideoCapture::EventHandler* handler) {
+ DCHECK(handler);
+ VideoCaptureImplManager* manager = GetInstance();
+
+ base::AutoLock auto_lock(manager->lock_);
+ Devices::iterator it = manager->devices_.find(id);
+ if (it == manager->devices_.end()) {
+ VideoCaptureImpl* vc =
+ new VideoCaptureImpl(id, manager->ml_proxy_,
+ VideoCaptureMessageFilterCreator::SharedFilter());
+ manager->devices_[id] = Device(vc, handler);
+ vc->Init();
+ return vc;
+ }
+
+ manager->devices_[id].clients.push_front(handler);
+ return it->second.vc;
+}
+
+// static
+void VideoCaptureImplManager::RemoveDevice(
+ media::VideoCaptureSessionId id,
+ media::VideoCapture::EventHandler* handler) {
+ DCHECK(handler);
+ VideoCaptureImplManager* manager = GetInstance();
+
+ base::AutoLock auto_lock(manager->lock_);
+ Devices::iterator it = manager->devices_.find(id);
+ if (it == manager->devices_.end())
+ return;
+
+ size_t size = it->second.clients.size();
+ it->second.clients.remove(handler);
+
+ if (size == it->second.clients.size() || size > 1)
+ return;
+
+ manager->devices_[id].vc->DeInit(NewRunnableMethod(manager,
+ &VideoCaptureImplManager::FreeDevice, manager->devices_[id].vc));
+ manager->devices_.erase(id);
+ return;
+}
+
+// static
+VideoCaptureImplManager* VideoCaptureImplManager::GetInstance() {
+ return Singleton<VideoCaptureImplManager>::get();
+}
+
+void VideoCaptureImplManager::FreeDevice(VideoCaptureImpl* vc) {
+ delete vc;
+}
+
+VideoCaptureImplManager::Device::Device() : vc(NULL) {}
+
+VideoCaptureImplManager::Device::Device(
+ VideoCaptureImpl* device,
+ media::VideoCapture::EventHandler* handler)
+ : vc(device) {
+ clients.push_front(handler);
+}
Property changes on: content/renderer/media/video_capture_impl_manager.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698