Index: content/renderer/media/video_capture_impl_manager.h |
diff --git a/content/renderer/media/video_capture_impl_manager.h b/content/renderer/media/video_capture_impl_manager.h |
index e9422015b026bda6d3d41abc4398fed0aee1a34a..24d31762deb9c16ca5346b080f9861a6aa28f3bc 100644 |
--- a/content/renderer/media/video_capture_impl_manager.h |
+++ b/content/renderer/media/video_capture_impl_manager.h |
@@ -2,77 +2,104 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-// VideoCaptureImplManager manages video capture devices in renderer process. |
-// The video capture clients use AddDevice() to get a pointer to |
-// video capture device. VideoCaputreImplManager supports multiple clients |
-// accessing same device. |
+// VideoCaptureImplManager owns VideoCaptureImpl objects. Clients who |
+// want access to a video capture device call UseDevice() to get a handle |
+// to VideoCaptureImpl. |
+// |
+// THREADING |
+// |
+// VideoCaptureImplManager lives only on the render thread. All methods |
+// must be called on this thread. |
+// |
+// The handle returned by UseDevice() is thread-safe. It ensures |
+// destruction is handled on the render thread. |
#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ |
#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ |
-#include <list> |
#include <map> |
+#include "base/callback.h" |
+#include "base/memory/linked_ptr.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/message_loop/message_loop_proxy.h" |
-#include "base/threading/thread.h" |
#include "base/synchronization/lock.h" |
+#include "base/threading/thread_checker.h" |
#include "content/common/content_export.h" |
#include "media/video/capture/video_capture.h" |
namespace content { |
class VideoCaptureImpl; |
+class VideoCaptureImplManager; |
class VideoCaptureMessageFilter; |
-class CONTENT_EXPORT VideoCaptureImplManager |
- : public base::RefCountedThreadSafe<VideoCaptureImplManager> { |
+// Thread-safe wrapper for a media::VideoCapture object. During |
+// destruction |destruction_cb| is called. This mechanism is used |
+// by VideoCaptureImplManager to ensure de-initialization and |
+// destruction of the media::VideoCapture object happens on the render |
+// thread. |
+class CONTENT_EXPORT VideoCaptureHandle : media::VideoCapture { |
public: |
- VideoCaptureImplManager(); |
+ virtual ~VideoCaptureHandle(); |
- // 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. |
- virtual media::VideoCapture* AddDevice( |
- media::VideoCaptureSessionId id, |
- media::VideoCapture::EventHandler* handler); |
+ // media::VideoCapture implementations. |
+ virtual void StartCapture( |
+ EventHandler* handler, |
+ const media::VideoCaptureParams& params) OVERRIDE; |
+ virtual void StopCapture(EventHandler* handler) OVERRIDE; |
+ virtual bool CaptureStarted() OVERRIDE; |
+ virtual int CaptureFrameRate() OVERRIDE; |
+ |
+ private: |
+ friend class VideoCaptureImplManager; |
+ |
+ VideoCaptureHandle(media::VideoCapture* impl, |
+ base::Closure destruction_cb); |
- // Called by video capture client |handler| to remove device referenced |
- // by |id| from VideoCaptureImplManager's list of opened device list. |
- virtual void RemoveDevice(media::VideoCaptureSessionId id, |
- media::VideoCapture::EventHandler* handler); |
+ media::VideoCapture* impl_; |
+ base::Closure destruction_cb_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(VideoCaptureHandle); |
+}; |
+ |
+class CONTENT_EXPORT VideoCaptureImplManager { |
+ public: |
+ VideoCaptureImplManager(); |
+ virtual ~VideoCaptureImplManager(); |
+ |
+ // Returns a video capture device referenced by |id|. |
+ scoped_ptr<VideoCaptureHandle> UseDevice(media::VideoCaptureSessionId id); |
// Make all existing VideoCaptureImpl instances stop/resume delivering |
// video frames to their clients, depends on flag |suspend|. |
- virtual void SuspendDevices(bool suspend); |
+ void SuspendDevices(bool suspend); |
VideoCaptureMessageFilter* video_capture_message_filter() const { |
return filter_.get(); |
} |
protected: |
- virtual ~VideoCaptureImplManager(); |
+ // Used in tests to inject a mock VideoCaptureImpl. |
+ virtual VideoCaptureImpl* CreateVideoCaptureImpl( |
+ media::VideoCaptureSessionId id, |
+ VideoCaptureMessageFilter* filter) const; |
private: |
- friend class base::RefCountedThreadSafe<VideoCaptureImplManager>; |
- |
- struct Device { |
- Device(VideoCaptureImpl* device, |
- media::VideoCapture::EventHandler* handler); |
- ~Device(); |
+ void UnrefDevice(media::VideoCaptureSessionId id); |
- VideoCaptureImpl* vc; |
- std::list<media::VideoCapture::EventHandler*> clients; |
- }; |
+ // The int is used to count clients of the corresponding VideoCaptureImpl. |
+ typedef std::map<media::VideoCaptureSessionId, |
+ std::pair<int, linked_ptr<VideoCaptureImpl> > > |
+ VideoCaptureDeviceMap; |
+ VideoCaptureDeviceMap devices_; |
- void FreeDevice(VideoCaptureImpl* vc); |
- |
- typedef std::map<media::VideoCaptureSessionId, Device*> Devices; |
- Devices devices_; |
- base::Lock lock_; |
scoped_refptr<VideoCaptureMessageFilter> filter_; |
- base::Thread thread_; |
- scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; |
+ |
+ // Following two members are bound to the render thread. |
+ base::WeakPtrFactory<VideoCaptureImplManager> weak_factory_; |
+ base::ThreadChecker thread_checker_; |
DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager); |
}; |