| Index: trunk/src/content/renderer/media/video_capture_impl_manager.h
|
| ===================================================================
|
| --- trunk/src/content/renderer/media/video_capture_impl_manager.h (revision 244357)
|
| +++ trunk/src/content/renderer/media/video_capture_impl_manager.h (working copy)
|
| @@ -2,105 +2,78 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// 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.
|
| +// 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.
|
|
|
| #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;
|
|
|
| -// 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 {
|
| +class CONTENT_EXPORT VideoCaptureImplManager
|
| + : public base::RefCountedThreadSafe<VideoCaptureImplManager> {
|
| public:
|
| - virtual ~VideoCaptureHandle();
|
| + VideoCaptureImplManager();
|
|
|
| - // 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;
|
| + // 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);
|
|
|
| - private:
|
| - friend class VideoCaptureImplManager;
|
| + // 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);
|
|
|
| - VideoCaptureHandle(media::VideoCapture* impl,
|
| - base::Closure destruction_cb);
|
| -
|
| - 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|.
|
| - void SuspendDevices(bool suspend);
|
| + virtual void SuspendDevices(bool suspend);
|
|
|
| VideoCaptureMessageFilter* video_capture_message_filter() const {
|
| return filter_.get();
|
| }
|
|
|
| protected:
|
| - // Used in tests to inject a mock VideoCaptureImpl.
|
| - virtual VideoCaptureImpl* CreateVideoCaptureImpl(
|
| - media::VideoCaptureSessionId id,
|
| - VideoCaptureMessageFilter* filter) const;
|
| + virtual ~VideoCaptureImplManager();
|
|
|
| private:
|
| - void UnrefDevice(media::VideoCaptureSessionId id);
|
| + friend class base::RefCountedThreadSafe<VideoCaptureImplManager>;
|
|
|
| - // 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_;
|
| + struct Device {
|
| + Device(VideoCaptureImpl* device,
|
| + media::VideoCapture::EventHandler* handler);
|
| + ~Device();
|
|
|
| + VideoCaptureImpl* vc;
|
| + std::list<media::VideoCapture::EventHandler*> clients;
|
| + };
|
| +
|
| + 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);
|
| };
|
|
|
|
|