| 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 66c393c7d81026f22a3e4b0ae2d93bfe54b79cd3..7988669b9def53d82a2c4f5852b8ccdc19953273 100644
|
| --- a/content/renderer/media/video_capture_impl.h
|
| +++ b/content/renderer/media/video_capture_impl.h
|
| @@ -10,12 +10,20 @@
|
| // operation of a capture device to the browser process and receives responses
|
| // from browser process.
|
| //
|
| -// VideoCaptureImpl is an IO thread only object. See the comments in
|
| -// video_capture_impl_manager.cc for the lifetime of this object.
|
| -// All methods must be called on the IO thread.
|
| +// 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.
|
| //
|
| -// This is an internal class used by VideoCaptureImplManager only. Do not access
|
| -// this directly.
|
| +// 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_
|
| @@ -24,10 +32,10 @@
|
| #include <map>
|
|
|
| #include "base/memory/weak_ptr.h"
|
| -#include "base/threading/thread_checker.h"
|
| #include "content/common/content_export.h"
|
| #include "content/common/media/video_capture.h"
|
| #include "content/renderer/media/video_capture_message_filter.h"
|
| +#include "media/video/capture/video_capture.h"
|
| #include "media/video/capture/video_capture_types.h"
|
|
|
| namespace base {
|
| @@ -38,52 +46,35 @@
|
| struct MailboxHolder;
|
| } // namespace gpu
|
|
|
| -namespace media {
|
| -class VideoFrame;
|
| -} // namespace media
|
| -
|
| namespace content {
|
|
|
| class CONTENT_EXPORT VideoCaptureImpl
|
| - : public VideoCaptureMessageFilter::Delegate {
|
| + : public media::VideoCapture, public VideoCaptureMessageFilter::Delegate {
|
| public:
|
| - virtual ~VideoCaptureImpl();
|
| -
|
| VideoCaptureImpl(media::VideoCaptureSessionId session_id,
|
| VideoCaptureMessageFilter* filter);
|
| + virtual ~VideoCaptureImpl();
|
|
|
| // Start listening to IPC messages.
|
| void Init();
|
|
|
| - // Stop listening to IPC messages.
|
| - void DeInit();
|
| + // 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);
|
|
|
| - // Start capturing using the provided parameters.
|
| - // |client_id| must be unique to this object in the render process. It is
|
| - // used later to stop receiving video frames.
|
| - // |state_update_cb| will be called when state changes.
|
| - // |deliver_frame_cb| will be called when a frame is ready.
|
| - void StartCapture(
|
| - int client_id,
|
| - const media::VideoCaptureParams& params,
|
| - const VideoCaptureStateUpdateCB& state_update_cb,
|
| - const VideoCaptureDeliverFrameCB& deliver_frame_cb);
|
| -
|
| - // Stop capturing. |client_id| is the identifier used to call StartCapture.
|
| - void StopCapture(int client_id);
|
| -
|
| - // Get capturing formats supported by this device.
|
| - // |callback| will be invoked with the results.
|
| - void GetDeviceSupportedFormats(
|
| - const VideoCaptureDeviceFormatsCB& callback);
|
| -
|
| - // Get capturing formats currently in use by this device.
|
| - // |callback| will be invoked with the results.
|
| - void GetDeviceFormatsInUse(
|
| - const VideoCaptureDeviceFormatsCB& callback);
|
| + // media::VideoCapture interface.
|
| + virtual void StartCapture(
|
| + media::VideoCapture::EventHandler* handler,
|
| + const media::VideoCaptureParams& params) OVERRIDE;
|
| + virtual void StopCapture(media::VideoCapture::EventHandler* handler) OVERRIDE;
|
| + virtual bool CaptureStarted() OVERRIDE;
|
| + virtual int CaptureFrameRate() OVERRIDE;
|
| + virtual void GetDeviceSupportedFormats(
|
| + const DeviceFormatsCallback& callback) OVERRIDE;
|
| + virtual void GetDeviceFormatsInUse(
|
| + const DeviceFormatsInUseCallback& callback) OVERRIDE;
|
|
|
| media::VideoCaptureSessionId session_id() const { return session_id_; }
|
|
|
| @@ -91,20 +82,21 @@
|
| friend class VideoCaptureImplTest;
|
| friend class MockVideoCaptureImpl;
|
|
|
| - // Carries a shared memory for transferring video frames from browser to
|
| - // renderer.
|
| class ClientBuffer;
|
| + typedef std::map<media::VideoCapture::EventHandler*,
|
| + media::VideoCaptureParams> ClientInfo;
|
|
|
| - // Contains information for a video capture client. Including parameters
|
| - // for capturing and callbacks to the client.
|
| - struct ClientInfo {
|
| - ClientInfo();
|
| - ~ClientInfo();
|
| - media::VideoCaptureParams params;
|
| - VideoCaptureStateUpdateCB state_update_cb;
|
| - VideoCaptureDeliverFrameCB deliver_frame_cb;
|
| - };
|
| - typedef std::map<int, ClientInfo> ClientInfoMap;
|
| + void InitOnIOThread();
|
| + void DeInitOnIOThread(base::Closure done_cb);
|
| + void SuspendCaptureOnIOThread(bool suspend);
|
| + void StartCaptureOnIOThread(
|
| + media::VideoCapture::EventHandler* handler,
|
| + const media::VideoCaptureParams& params);
|
| + void StopCaptureOnIOThread(media::VideoCapture::EventHandler* handler);
|
| + void GetDeviceSupportedFormatsOnIOThread(
|
| + const DeviceFormatsCallback& callback);
|
| + void GetDeviceFormatsInUseOnIOThread(
|
| + const DeviceFormatsInUseCallback& callback);
|
|
|
| // VideoCaptureMessageFilter::Delegate interface.
|
| virtual void OnBufferCreated(base::SharedMemoryHandle handle,
|
| @@ -138,26 +130,28 @@
|
| virtual void Send(IPC::Message* message);
|
|
|
| // Helpers.
|
| - bool RemoveClient(int client_id, ClientInfoMap* clients);
|
| + bool RemoveClient(media::VideoCapture::EventHandler* handler,
|
| + ClientInfo* clients);
|
|
|
| const scoped_refptr<VideoCaptureMessageFilter> message_filter_;
|
| + const scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
|
| int device_id_;
|
| const int session_id_;
|
|
|
| // Vector of callbacks to be notified of device format enumerations, used only
|
| // on IO Thread.
|
| - std::vector<VideoCaptureDeviceFormatsCB> device_formats_cb_queue_;
|
| + std::vector<DeviceFormatsCallback> device_formats_callback_queue_;
|
| // Vector of callbacks to be notified of a device's in use capture format(s),
|
| // used only on IO Thread.
|
| - std::vector<VideoCaptureDeviceFormatsCB> device_formats_in_use_cb_queue_;
|
| + std::vector<DeviceFormatsInUseCallback> device_formats_in_use_callback_queue_;
|
|
|
| // Buffers available for sending to the client.
|
| typedef std::map<int32, scoped_refptr<ClientBuffer> > ClientBufferMap;
|
| ClientBufferMap client_buffers_;
|
|
|
| - ClientInfoMap clients_;
|
| - ClientInfoMap clients_pending_on_filter_;
|
| - ClientInfoMap clients_pending_on_restart_;
|
| + ClientInfo clients_;
|
| + ClientInfo clients_pending_on_filter_;
|
| + ClientInfo clients_pending_on_restart_;
|
|
|
| // Member params_ represents the video format requested by the
|
| // client to this class via StartCapture().
|
| @@ -172,9 +166,6 @@
|
| bool suspended_;
|
| VideoCaptureState state_;
|
|
|
| - // |weak_factory_| and |thread_checker_| are bound to the IO thread.
|
| - base::ThreadChecker thread_checker_;
|
| -
|
| // WeakPtrFactory pointing back to |this| object, for use with
|
| // media::VideoFrames constructed in OnBufferReceived() from buffers cached
|
| // in |client_buffers_|.
|
|
|