Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / video_capture_impl.h
index 24a28d8..278355a 100644 (file)
@@ -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,
@@ -56,24 +67,14 @@ class CONTENT_EXPORT VideoCaptureImpl
   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;
 
-  // 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::Time 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,39 +82,44 @@ 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(
+  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,
+                               int length,
+                               int buffer_id) OVERRIDE;
+  virtual void OnBufferDestroyed(int buffer_id) OVERRIDE;
+  virtual void OnBufferReceived(
       int buffer_id,
-      base::Time timestamp,
-      const media::VideoCaptureFormat& format);
-  void DoClientBufferFinishedOnCaptureThread(
+      base::TimeTicks timestamp,
+      const media::VideoCaptureFormat& format) OVERRIDE;
+  virtual void OnStateChanged(VideoCaptureState state) OVERRIDE;
+  virtual void OnDeviceSupportedFormatsEnumerated(
+      const media::VideoCaptureFormats& supported_formats) OVERRIDE;
+  virtual void OnDeviceFormatsInUseReceived(
+      const media::VideoCaptureFormats& formats_in_use) OVERRIDE;
+  virtual void OnDelegateAdded(int32 device_id) OVERRIDE;
+
+  // 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 DoStateChangedOnCaptureThread(VideoCaptureState state);
-  void DoDelegateAddedOnCaptureThread(int32 device_id);
-
-  void DoSuspendCaptureOnCaptureThread(bool suspend);
 
-  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.
@@ -121,34 +127,43 @@ 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_;
 
+  // Vector of callbacks to be notified of device format enumerations, used only
+  // on IO Thread.
+  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<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_;
-  // WeakPtrFactory pointing back to |this| object, for use with
-  // media::VideoFrames constructed in OnBufferReceived() from buffers cached
-  // in |client_buffers_|.
-  base::WeakPtrFactory<VideoCaptureImpl> client_buffer_weak_this_factory_;
 
   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 DoStartCaptureOnCaptureThread.
+  // client to this class via StartCapture().
   media::VideoCaptureParams params_;
 
   // The device's video capture format sent from browser process side.
   media::VideoCaptureFormat last_frame_format_;
 
+  // The device's first captured frame timestamp sent from browser process side.
+  base::TimeTicks first_frame_timestamp_;
+
   bool suspended_;
   VideoCaptureState state_;
 
+  // WeakPtrFactory pointing back to |this| object, for use with
+  // media::VideoFrames constructed in OnBufferReceived() from buffers cached
+  // in |client_buffers_|.
+  base::WeakPtrFactory<VideoCaptureImpl> weak_this_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(VideoCaptureImpl);
 };