summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwjia@chromium.org <wjia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-27 17:42:11 +0000
committerwjia@chromium.org <wjia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-27 17:42:11 +0000
commit80b161a1954b9a3e8c9efe43c2d82488be7b9081 (patch)
tree4d8bb0452cabc5bff5e31ab202253e4ac50ba061
parent5c18c409e1164c4320788dcd4f6a48d4ee590e4d (diff)
downloadchromium_src-80b161a1954b9a3e8c9efe43c2d82488be7b9081.zip
chromium_src-80b161a1954b9a3e8c9efe43c2d82488be7b9081.tar.gz
chromium_src-80b161a1954b9a3e8c9efe43c2d82488be7b9081.tar.bz2
move VideoCaptureImplManager from singleton to a member of RenderThread.
fix some comments. BUG=none TEST=try bots Review URL: http://codereview.chromium.org/7265004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90605 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/renderer_host/media/video_capture_host.h9
-rw-r--r--content/common/media/video_capture_messages.h8
-rw-r--r--content/content_renderer.gypi2
-rw-r--r--content/renderer/media/video_capture_impl_manager.cc68
-rw-r--r--content/renderer/media/video_capture_impl_manager.h33
-rw-r--r--content/renderer/media/video_capture_message_filter_creator.cc26
-rw-r--r--content/renderer/media/video_capture_message_filter_creator.h35
-rw-r--r--content/renderer/render_thread.cc13
-rw-r--r--content/renderer/render_thread.h8
9 files changed, 68 insertions, 134 deletions
diff --git a/content/browser/renderer_host/media/video_capture_host.h b/content/browser/renderer_host/media/video_capture_host.h
index 76288a0..4abed9a 100644
--- a/content/browser/renderer_host/media/video_capture_host.h
+++ b/content/browser/renderer_host/media/video_capture_host.h
@@ -77,22 +77,21 @@ class VideoCaptureHost : public BrowserMessageFilter,
virtual ~VideoCaptureHost();
// IPC message: Start capture on the VideoCaptureDevice referenced by
- // VideoCaptureParams::session_id. device_id is an id created by
+ // VideoCaptureParams::session_id. |device_id| is an id created by
// VideCaptureMessageFilter to identify a session
// between a VideCaptureMessageFilter and a VideoCaptureHost.
void OnStartCapture(int device_id,
const media::VideoCaptureParams& params);
- // IPC message: Stop capture on device referenced by device_id.
+ // IPC message: Stop capture on device referenced by |device_id|.
void OnStopCapture(int device_id);
- // IPC message: Pause capture on device referenced by device_id.
+ // IPC message: Pause capture on device referenced by |device_id|.
void OnPauseCapture(int device_id);
// IPC message: Receive an empty buffer from renderer. Send it to device
// referenced by |device_id|.
- void OnReceiveEmptyBuffer(int device_id,
- int buffer_id);
+ void OnReceiveEmptyBuffer(int device_id, int buffer_id);
// Called on the IO thread when VideoCaptureController have
diff --git a/content/common/media/video_capture_messages.h b/content/common/media/video_capture_messages.h
index 1458718..00fe046 100644
--- a/content/common/media/video_capture_messages.h
+++ b/content/common/media/video_capture_messages.h
@@ -41,21 +41,21 @@ IPC_MESSAGE_CONTROL2(VideoCaptureMsg_DeviceInfo,
int /* device_id */,
media::VideoCaptureParams)
-// Start the video capture specified by (routing_id, device_id).
+// Start the video capture specified by |device_id|.
IPC_MESSAGE_CONTROL2(VideoCaptureHostMsg_Start,
int /* device_id */,
media::VideoCaptureParams)
-// Pause the video capture specified by (routing_id, device_id).
+// Pause the video capture specified by |device_id|.
IPC_MESSAGE_CONTROL1(VideoCaptureHostMsg_Pause,
int /* device_id */)
-// Close the video capture specified by (routing_id, device_id).
+// Close the video capture specified by |device_id|.
IPC_MESSAGE_CONTROL1(VideoCaptureHostMsg_Stop,
int /* device_id */)
// Tell the browser process that the video frame buffer |handle| is ready for
-// device (routing_id, device_id) to fill up.
+// device |device_id| to fill up.
IPC_MESSAGE_CONTROL2(VideoCaptureHostMsg_BufferReady,
int /* device_id */,
int /* buffer_id */)
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
index b2eddc6..595694a 100644
--- a/content/content_renderer.gypi
+++ b/content/content_renderer.gypi
@@ -72,8 +72,6 @@
'renderer/media/video_capture_impl_manager.h',
'renderer/media/video_capture_message_filter.cc',
'renderer/media/video_capture_message_filter.h',
- 'renderer/media/video_capture_message_filter_creator.cc',
- 'renderer/media/video_capture_message_filter_creator.h',
'renderer/navigation_state.cc',
'renderer/navigation_state.h',
'renderer/notification_provider.cc',
diff --git a/content/renderer/media/video_capture_impl_manager.cc b/content/renderer/media/video_capture_impl_manager.cc
index 62b3915..558d28d 100644
--- a/content/renderer/media/video_capture_impl_manager.cc
+++ b/content/renderer/media/video_capture_impl_manager.cc
@@ -4,74 +4,67 @@
#include "content/renderer/media/video_capture_impl_manager.h"
-#include "base/memory/singleton.h"
-#include "content/renderer/media/video_capture_message_filter_creator.h"
-#include "media/base/message_loop_factory_impl.h"
-
-VideoCaptureImplManager::VideoCaptureImplManager() {
- ml_factory_.reset(new media::MessageLoopFactoryImpl());
- ml_proxy_ = ml_factory_->GetMessageLoopProxy("VC manager");
+#include "base/stl_util-inl.h"
+#include "content/renderer/media/video_capture_impl.h"
+#include "content/renderer/media/video_capture_message_filter.h"
+
+VideoCaptureImplManager::VideoCaptureImplManager()
+ : thread_("VC manager") {
+ thread_.Start();
+ message_loop_proxy_ = thread_.message_loop_proxy();
+ filter_ = new VideoCaptureMessageFilter();
}
-VideoCaptureImplManager::~VideoCaptureImplManager() {}
+VideoCaptureImplManager::~VideoCaptureImplManager() {
+ STLDeleteContainerPairSecondPointers(devices_.begin(), devices_.end());
+ thread_.Stop();
+}
-// 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()) {
+ base::AutoLock auto_lock(lock_);
+ Devices::iterator it = devices_.find(id);
+ if (it == devices_.end()) {
VideoCaptureImpl* vc =
- new VideoCaptureImpl(id, manager->ml_proxy_,
- VideoCaptureMessageFilterCreator::SharedFilter());
- manager->devices_[id] = Device(vc, handler);
+ new VideoCaptureImpl(id, message_loop_proxy_, filter_);
+ devices_[id] = new Device(vc, handler);
vc->Init();
return vc;
}
- manager->devices_[id].clients.push_front(handler);
- return it->second.vc;
+ 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())
+ 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);
+ size_t size = it->second->clients.size();
+ it->second->clients.remove(handler);
- if (size == it->second.clients.size() || size > 1)
+ 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();
+ devices_[id]->vc->DeInit(NewRunnableMethod(this,
+ &VideoCaptureImplManager::FreeDevice, devices_[id]->vc));
+ delete devices_[id];
+ devices_.erase(id);
}
void VideoCaptureImplManager::FreeDevice(VideoCaptureImpl* vc) {
delete vc;
}
-VideoCaptureImplManager::Device::Device() : vc(NULL) {}
-
VideoCaptureImplManager::Device::Device(
VideoCaptureImpl* device,
media::VideoCapture::EventHandler* handler)
@@ -80,4 +73,3 @@ VideoCaptureImplManager::Device::Device(
}
VideoCaptureImplManager::Device::~Device() {}
-
diff --git a/content/renderer/media/video_capture_impl_manager.h b/content/renderer/media/video_capture_impl_manager.h
index c562740..28c0e42 100644
--- a/content/renderer/media/video_capture_impl_manager.h
+++ b/content/renderer/media/video_capture_impl_manager.h
@@ -13,37 +13,39 @@
#include <list>
#include <map>
+#include "base/threading/thread.h"
#include "base/message_loop_proxy.h"
#include "base/synchronization/lock.h"
-#include "content/renderer/media/video_capture_impl.h"
-#include "content/renderer/media/video_capture_message_filter.h"
-#include "media/base/callback.h"
-#include "media/base/message_loop_factory.h"
#include "media/video/capture/video_capture.h"
-class VideoCaptureImplManager {
+class VideoCaptureImpl;
+class VideoCaptureMessageFilter;
+
+class VideoCaptureImplManager
+ : public base::RefCountedThreadSafe<VideoCaptureImplManager> {
public:
VideoCaptureImplManager();
- ~VideoCaptureImplManager();
+ virtual ~VideoCaptureImplManager();
// Called by video capture client |handler| to add device referenced
// by |id| to VideoCaptureImplManager's list of opened device list.
// A pointer to VideoCapture is returned to client so that client can
// operate on that pointer, such as StartCaptrue, StopCapture.
- static media::VideoCapture* AddDevice(
+ media::VideoCapture* AddDevice(
media::VideoCaptureSessionId id,
media::VideoCapture::EventHandler* handler);
// Called by video capture client |handler| to remove device referenced
// by |id| from VideoCaptureImplManager's list of opened device list.
- static void RemoveDevice(media::VideoCaptureSessionId id,
- media::VideoCapture::EventHandler* handler);
+ void RemoveDevice(media::VideoCaptureSessionId id,
+ media::VideoCapture::EventHandler* handler);
- static VideoCaptureImplManager* GetInstance();
+ VideoCaptureMessageFilter* video_capture_message_filter() const {
+ return filter_;
+ }
private:
struct Device {
- Device();
Device(VideoCaptureImpl* device,
media::VideoCapture::EventHandler* handler);
~Device();
@@ -54,15 +56,14 @@ class VideoCaptureImplManager {
void FreeDevice(VideoCaptureImpl* vc);
- typedef std::map<media::VideoCaptureSessionId, Device> Devices;
+ typedef std::map<media::VideoCaptureSessionId, Device*> Devices;
Devices devices_;
base::Lock lock_;
- scoped_refptr<base::MessageLoopProxy> ml_proxy_;
- scoped_ptr<media::MessageLoopFactory> ml_factory_;
+ scoped_refptr<VideoCaptureMessageFilter> filter_;
+ base::Thread thread_;
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager);
};
-DISABLE_RUNNABLE_METHOD_REFCOUNT(VideoCaptureImplManager);
-
#endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
diff --git a/content/renderer/media/video_capture_message_filter_creator.cc b/content/renderer/media/video_capture_message_filter_creator.cc
deleted file mode 100644
index b166f80..0000000
--- a/content/renderer/media/video_capture_message_filter_creator.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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_message_filter_creator.h"
-
-#include "content/renderer/media/video_capture_message_filter.h"
-
-VideoCaptureMessageFilterCreator::VideoCaptureMessageFilterCreator() {
- filter_ = new VideoCaptureMessageFilter();
-}
-
-VideoCaptureMessageFilterCreator::~VideoCaptureMessageFilterCreator() {
-}
-
-// static
-VideoCaptureMessageFilter* VideoCaptureMessageFilterCreator::SharedFilter() {
- return GetInstance()->filter_.get();
-}
-
-// static
-VideoCaptureMessageFilterCreator*
- VideoCaptureMessageFilterCreator::GetInstance() {
- return Singleton<VideoCaptureMessageFilterCreator>::get();
-}
-
diff --git a/content/renderer/media/video_capture_message_filter_creator.h b/content/renderer/media/video_capture_message_filter_creator.h
deleted file mode 100644
index 1424408..0000000
--- a/content/renderer/media/video_capture_message_filter_creator.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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.
-
-#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_MESSAGE_FILTER_CREATOR_H_
-#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_MESSAGE_FILTER_CREATOR_H_
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/singleton.h"
-
-class VideoCaptureMessageFilter;
-
-// 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:
- static VideoCaptureMessageFilter* SharedFilter();
- static VideoCaptureMessageFilterCreator* GetInstance();
-
- private:
- VideoCaptureMessageFilterCreator();
- ~VideoCaptureMessageFilterCreator();
- friend struct DefaultSingletonTraits<VideoCaptureMessageFilterCreator>;
-
- scoped_refptr<VideoCaptureMessageFilter> filter_;
-
- DISALLOW_COPY_AND_ASSIGN(VideoCaptureMessageFilterCreator);
-};
-
-#endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_MESSAGE_FILTER_CREATOR_H_
-
diff --git a/content/renderer/render_thread.cc b/content/renderer/render_thread.cc
index 89f95d1..4dcc99b 100644
--- a/content/renderer/render_thread.cc
+++ b/content/renderer/render_thread.cc
@@ -37,8 +37,8 @@
#include "content/renderer/gpu/gpu_channel_host.h"
#include "content/renderer/gpu/gpu_video_service_host.h"
#include "content/renderer/indexed_db_dispatcher.h"
+#include "content/renderer/media/video_capture_impl_manager.h"
#include "content/renderer/media/video_capture_message_filter.h"
-#include "content/renderer/media/video_capture_message_filter_creator.h"
#include "content/renderer/plugin_channel_host.h"
#include "content/renderer/render_process_impl.h"
#include "content/renderer/render_process_observer.h"
@@ -171,9 +171,8 @@ void RenderThread::Init() {
db_message_filter_ = new DBMessageFilter();
AddFilter(db_message_filter_.get());
- VideoCaptureMessageFilter* video_capture_message_filter =
- VideoCaptureMessageFilterCreator::SharedFilter();
- AddFilter(video_capture_message_filter);
+ vc_manager_ = new VideoCaptureImplManager();
+ AddFilter(vc_manager_->video_capture_message_filter());
content::GetContentClient()->renderer()->RenderThreadStarted();
@@ -189,13 +188,11 @@ RenderThread::~RenderThread() {
web_database_observer_impl_->WaitForAllDatabasesToClose();
// Shutdown in reverse of the initialization order.
+ RemoveFilter(vc_manager_->video_capture_message_filter());
+
RemoveFilter(db_message_filter_.get());
db_message_filter_ = NULL;
- VideoCaptureMessageFilter* video_capture_message_filter =
- VideoCaptureMessageFilterCreator::SharedFilter();
- RemoveFilter(video_capture_message_filter);
-
// Shutdown the file thread if it's running.
if (file_thread_.get())
file_thread_->Stop();
diff --git a/content/renderer/render_thread.h b/content/renderer/render_thread.h
index 853fffe..e73d1c1 100644
--- a/content/renderer/render_thread.h
+++ b/content/renderer/render_thread.h
@@ -32,6 +32,7 @@ class RenderProcessObserver;
class RendererNetPredictor;
class RendererWebKitClientImpl;
class SkBitmap;
+class VideoCaptureImplManager;
class WebDatabaseObserverImpl;
struct RendererPreferences;
@@ -164,6 +165,10 @@ class RenderThread : public RenderThreadBase,
return indexed_db_dispatcher_.get();
}
+ VideoCaptureImplManager* video_capture_impl_manager() const {
+ return vc_manager_.get();
+ }
+
bool plugin_refresh_allowed() const { return plugin_refresh_allowed_; }
double idle_notification_delay_in_s() const {
@@ -247,6 +252,9 @@ class RenderThread : public RenderThreadBase,
// Used on the renderer and IPC threads.
scoped_refptr<DBMessageFilter> db_message_filter_;
+ // Used on multiple threads.
+ scoped_refptr<VideoCaptureImplManager> vc_manager_;
+
// Used on multiple script execution context threads.
scoped_ptr<WebDatabaseObserverImpl> web_database_observer_impl_;