| 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 7988669b9def53d82a2c4f5852b8ccdc19953273..66c393c7d81026f22a3e4b0ae2d93bfe54b79cd3 100644
|
| --- a/content/renderer/media/video_capture_impl.h
|
| +++ b/content/renderer/media/video_capture_impl.h
|
| @@ -10,20 +10,12 @@
|
| // operation of a capture device to the browser process and receives responses
|
| // from browser process.
|
| //
|
| -// 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.
|
| +// 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.
|
| //
|
| -// 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.
|
| +// This is an internal class used by VideoCaptureImplManager only. Do not access
|
| +// this directly.
|
|
|
| #ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
|
| #define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
|
| @@ -32,10 +24,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 {
|
| @@ -46,35 +38,52 @@ namespace gpu {
|
| struct MailboxHolder;
|
| } // namespace gpu
|
|
|
| +namespace media {
|
| +class VideoFrame;
|
| +} // namespace media
|
| +
|
| namespace content {
|
|
|
| class CONTENT_EXPORT VideoCaptureImpl
|
| - : public media::VideoCapture, public VideoCaptureMessageFilter::Delegate {
|
| + : 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. Call |done_cb| when done.
|
| - void DeInit(base::Closure done_cb);
|
| + // Stop listening to IPC messages.
|
| + void DeInit();
|
|
|
| // 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,
|
| - 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;
|
| + // 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::VideoCaptureSessionId session_id() const { return session_id_; }
|
|
|
| @@ -82,21 +91,20 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| 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;
|
| -
|
| - 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);
|
| +
|
| + // 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;
|
|
|
| // VideoCaptureMessageFilter::Delegate interface.
|
| virtual void OnBufferCreated(base::SharedMemoryHandle handle,
|
| @@ -130,28 +138,26 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| virtual void Send(IPC::Message* message);
|
|
|
| // Helpers.
|
| - bool RemoveClient(media::VideoCapture::EventHandler* handler,
|
| - ClientInfo* clients);
|
| + bool RemoveClient(int client_id, ClientInfoMap* 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<DeviceFormatsCallback> device_formats_callback_queue_;
|
| + std::vector<VideoCaptureDeviceFormatsCB> device_formats_cb_queue_;
|
| // Vector of callbacks to be notified of a device's in use capture format(s),
|
| // used only on IO Thread.
|
| - std::vector<DeviceFormatsInUseCallback> device_formats_in_use_callback_queue_;
|
| + std::vector<VideoCaptureDeviceFormatsCB> device_formats_in_use_cb_queue_;
|
|
|
| // Buffers available for sending to the client.
|
| typedef std::map<int32, scoped_refptr<ClientBuffer> > ClientBufferMap;
|
| ClientBufferMap client_buffers_;
|
|
|
| - ClientInfo clients_;
|
| - ClientInfo clients_pending_on_filter_;
|
| - ClientInfo clients_pending_on_restart_;
|
| + ClientInfoMap clients_;
|
| + ClientInfoMap clients_pending_on_filter_;
|
| + ClientInfoMap clients_pending_on_restart_;
|
|
|
| // Member params_ represents the video format requested by the
|
| // client to this class via StartCapture().
|
| @@ -166,6 +172,9 @@ class CONTENT_EXPORT VideoCaptureImpl
|
| 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_|.
|
|
|