| Index: content/renderer/media/video_capture_impl.h
|
| diff --git a/content/renderer/media/video_capture_impl.h b/content/renderer/media/video_capture_impl.h
|
| index 55a2eef54234b94af23d9be79d2a469a2439e8ba..0e8fea73fac0dc16618891451fbdae61efb4f23c 100644
|
| --- a/content/renderer/media/video_capture_impl.h
|
| +++ b/content/renderer/media/video_capture_impl.h
|
| @@ -9,23 +9,21 @@
|
| // VideoCaptureImpl is also a delegate of VideoCaptureMessageFilter which relays
|
| // operation of a capture device to the browser process and receives responses
|
| // from browser process.
|
| -
|
| -// The media::VideoCapture and VideoCaptureMessageFilter::Delegate are
|
| -// asynchronous interfaces, which means callers can call those interfaces
|
| -// from any threads without worrying about thread safety.
|
| -// The |capture_message_loop_proxy_| is the working thread of VideoCaptureImpl.
|
| -// All non-const members are accessed only on that working thread.
|
| //
|
| -// Implementation note: tasks are posted bound to Unretained(this) to both the
|
| -// I/O and Capture threads and this is safe (even though the I/O thread is
|
| -// scoped to the renderer process and the capture_message_loop_proxy_ thread is
|
| -// scoped to the VideoCaptureImplManager) because VideoCaptureImplManager only
|
| -// triggers deletion of its VideoCaptureImpl's by calling DeInit which detours
|
| -// through the capture & I/O threads, so as long as nobody posts tasks after the
|
| -// DeInit() call is made, it is guaranteed none of these Unretained posted tasks
|
| -// will dangle after the delete goes through. The "as long as" is guaranteed by
|
| -// clients of VideoCaptureImplManager not using devices after they've
|
| -// RemoveDevice'd them.
|
| +// All public methods of VideoCaptureImpl can be called on any thread.
|
| +// Internally it runs on the IO thread. Clients of this class implement
|
| +// interface media::VideoCapture::EventHandler which is called only on the IO
|
| +// thread.
|
| +//
|
| +// Implementation note: tasks are posted bound to Unretained(this) to the I/O
|
| +// thread and this is safe (even though the I/O thread is scoped to the renderer
|
| +// process) because VideoCaptureImplManager only triggers deletion of its
|
| +// VideoCaptureImpl's by calling DeInit which detours through the I/O thread, so
|
| +// as long as nobody posts tasks after the DeInit() call is made, it is
|
| +// guaranteed none of these Unretained posted tasks will dangle after the delete
|
| +// goes through. The "as long as" is guaranteed by clients of
|
| +// VideoCaptureImplManager not using devices after they've released
|
| +// VideoCaptureHandle, which is a wrapper of this object.
|
|
|
| #ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
|
| #define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
|
| @@ -49,6 +47,19 @@ namespace content {
|
| class CONTENT_EXPORT VideoCaptureImpl
|
| : public media::VideoCapture, public VideoCaptureMessageFilter::Delegate {
|
| public:
|
| + VideoCaptureImpl(media::VideoCaptureSessionId session_id,
|
| + VideoCaptureMessageFilter* filter);
|
| + virtual ~VideoCaptureImpl();
|
| +
|
| + // Start listening to IPC messages.
|
| + void Init();
|
| +
|
| + // Stop listening to IPC messages. Call |done_cb| when done.
|
| + void DeInit(base::Closure done_cb);
|
| +
|
| + // Stop/resume delivering video frames to clients, based on flag |suspend|.
|
| + void SuspendCapture(bool suspend);
|
| +
|
| // media::VideoCapture interface.
|
| virtual void StartCapture(
|
| media::VideoCapture::EventHandler* handler,
|
| @@ -57,23 +68,9 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| virtual bool CaptureStarted() OVERRIDE;
|
| virtual int CaptureFrameRate() OVERRIDE;
|
|
|
| - // VideoCaptureMessageFilter::Delegate interface.
|
| - virtual void OnBufferCreated(base::SharedMemoryHandle handle,
|
| - int length,
|
| - int buffer_id) OVERRIDE;
|
| - virtual void OnBufferDestroyed(int buffer_id) OVERRIDE;
|
| - virtual void OnBufferReceived(int buffer_id,
|
| - base::TimeTicks timestamp,
|
| - const media::VideoCaptureFormat& format)
|
| - OVERRIDE;
|
| - virtual void OnStateChanged(VideoCaptureState state) OVERRIDE;
|
| - virtual void OnDelegateAdded(int32 device_id) OVERRIDE;
|
| -
|
| - // Stop/resume delivering video frames to clients, based on flag |suspend|.
|
| - virtual void SuspendCapture(bool suspend);
|
| + media::VideoCaptureSessionId session_id() const { return session_id_; }
|
|
|
| private:
|
| - friend class VideoCaptureImplManager;
|
| friend class VideoCaptureImplTest;
|
| friend class MockVideoCaptureImpl;
|
|
|
| @@ -81,38 +78,35 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| typedef std::map<media::VideoCapture::EventHandler*,
|
| media::VideoCaptureParams> ClientInfo;
|
|
|
| - VideoCaptureImpl(media::VideoCaptureSessionId session_id,
|
| - base::MessageLoopProxy* capture_message_loop_proxy,
|
| - VideoCaptureMessageFilter* filter);
|
| - virtual ~VideoCaptureImpl();
|
| -
|
| - void DoStartCaptureOnCaptureThread(
|
| + void InitOnIOThread();
|
| + void DeInitOnIOThread(base::Closure done_cb);
|
| + void SuspendCaptureOnIOThread(bool suspend);
|
| + void StartCaptureOnIOThread(
|
| media::VideoCapture::EventHandler* handler,
|
| const media::VideoCaptureParams& params);
|
| - void DoStopCaptureOnCaptureThread(media::VideoCapture::EventHandler* handler);
|
| - void DoBufferCreatedOnCaptureThread(base::SharedMemoryHandle handle,
|
| - int length,
|
| - int buffer_id);
|
| - void DoBufferDestroyedOnCaptureThread(int buffer_id);
|
| - void DoBufferReceivedOnCaptureThread(int buffer_id,
|
| - base::TimeTicks timestamp,
|
| - const media::VideoCaptureFormat& format);
|
| - void DoClientBufferFinishedOnCaptureThread(
|
| + void StopCaptureOnIOThread(media::VideoCapture::EventHandler* handler);
|
| +
|
| + // VideoCaptureMessageFilter::Delegate interface.
|
| + virtual void OnBufferCreated(base::SharedMemoryHandle handle,
|
| + int length,
|
| + int buffer_id) OVERRIDE;
|
| + virtual void OnBufferDestroyed(int buffer_id) OVERRIDE;
|
| + virtual void OnBufferReceived(
|
| int buffer_id,
|
| - const scoped_refptr<ClientBuffer>& buffer);
|
| - void DoStateChangedOnCaptureThread(VideoCaptureState state);
|
| - void DoDelegateAddedOnCaptureThread(int32 device_id);
|
| + base::TimeTicks timestamp,
|
| + const media::VideoCaptureFormat& format) OVERRIDE;
|
| + virtual void OnStateChanged(VideoCaptureState state) OVERRIDE;
|
| + virtual void OnDelegateAdded(int32 device_id) OVERRIDE;
|
|
|
| - void DoSuspendCaptureOnCaptureThread(bool suspend);
|
| + // Sends an IPC message to browser process when all clients are done with the
|
| + // buffer.
|
| + void OnClientBufferFinished(
|
| + int buffer_id,
|
| + const scoped_refptr<ClientBuffer>& buffer);
|
|
|
| - void Init();
|
| - void DeInit(base::Closure task);
|
| - void DoDeInitOnCaptureThread(base::Closure task);
|
| void StopDevice();
|
| void RestartCapture();
|
| void StartCaptureInternal();
|
| - void AddDelegateOnIOThread();
|
| - void RemoveDelegateOnIOThread(base::Closure task);
|
| virtual void Send(IPC::Message* message);
|
|
|
| // Helpers.
|
| @@ -120,7 +114,6 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| ClientInfo* clients);
|
|
|
| const scoped_refptr<VideoCaptureMessageFilter> message_filter_;
|
| - const scoped_refptr<base::MessageLoopProxy> capture_message_loop_proxy_;
|
| const scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
|
| int device_id_;
|
| const int session_id_;
|
| @@ -134,7 +127,7 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| ClientInfo clients_pending_on_restart_;
|
|
|
| // Member params_ represents the video format requested by the
|
| - // client to this class via DoStartCaptureOnCaptureThread.
|
| + // client to this class via StartCapture().
|
| media::VideoCaptureParams params_;
|
|
|
| // The device's video capture format sent from browser process side.
|
|
|