Home | History | Annotate | Download | only in media
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // VideoCaptureImpl represents a capture device in renderer process. It provides
      6 // interfaces for clients to Start/Stop capture. It also communicates to clients
      7 // when buffer is ready, state of capture device is changed.
      8 
      9 // VideoCaptureImpl is also a delegate of VideoCaptureMessageFilter which relays
     10 // operation of a capture device to the browser process and receives responses
     11 // from browser process.
     12 
     13 // The media::VideoCapture and VideoCaptureMessageFilter::Delegate are
     14 // asynchronous interfaces, which means callers can call those interfaces
     15 // from any threads without worrying about thread safety.
     16 // The |capture_message_loop_proxy_| is the working thread of VideoCaptureImpl.
     17 // All non-const members are accessed only on that working thread.
     18 //
     19 // Implementation note: tasks are posted bound to Unretained(this) to both the
     20 // I/O and Capture threads and this is safe (even though the I/O thread is
     21 // scoped to the renderer process and the capture_message_loop_proxy_ thread is
     22 // scoped to the VideoCaptureImplManager) because VideoCaptureImplManager only
     23 // triggers deletion of its VideoCaptureImpl's by calling DeInit which detours
     24 // through the capture & I/O threads, so as long as nobody posts tasks after the
     25 // DeInit() call is made, it is guaranteed none of these Unretained posted tasks
     26 // will dangle after the delete goes through.  The "as long as" is guaranteed by
     27 // clients of VideoCaptureImplManager not using devices after they've
     28 // RemoveDevice'd them.
     29 
     30 #ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
     31 #define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
     32 
     33 #include <list>
     34 #include <map>
     35 
     36 #include "base/memory/weak_ptr.h"
     37 #include "content/common/content_export.h"
     38 #include "content/common/media/video_capture.h"
     39 #include "content/renderer/media/video_capture_message_filter.h"
     40 #include "media/video/capture/video_capture.h"
     41 #include "media/video/capture/video_capture_types.h"
     42 
     43 namespace base {
     44 class MessageLoopProxy;
     45 }
     46 
     47 namespace content {
     48 
     49 class CONTENT_EXPORT VideoCaptureImpl
     50     : public media::VideoCapture, public VideoCaptureMessageFilter::Delegate {
     51  public:
     52   // media::VideoCapture interface.
     53   virtual void StartCapture(
     54       media::VideoCapture::EventHandler* handler,
     55       const media::VideoCaptureParams& params) OVERRIDE;
     56   virtual void StopCapture(media::VideoCapture::EventHandler* handler) OVERRIDE;
     57   virtual bool CaptureStarted() OVERRIDE;
     58   virtual int CaptureFrameRate() OVERRIDE;
     59 
     60   // VideoCaptureMessageFilter::Delegate interface.
     61   virtual void OnBufferCreated(base::SharedMemoryHandle handle,
     62                                int length,
     63                                int buffer_id) OVERRIDE;
     64   virtual void OnBufferDestroyed(int buffer_id) OVERRIDE;
     65   virtual void OnBufferReceived(
     66       int buffer_id,
     67       base::Time timestamp,
     68       const media::VideoCaptureFormat& format) OVERRIDE;
     69   virtual void OnStateChanged(VideoCaptureState state) OVERRIDE;
     70   virtual void OnDelegateAdded(int32 device_id) OVERRIDE;
     71 
     72   // Stop/resume delivering video frames to clients, based on flag |suspend|.
     73   virtual void SuspendCapture(bool suspend);
     74 
     75  private:
     76   friend class VideoCaptureImplManager;
     77   friend class VideoCaptureImplTest;
     78   friend class MockVideoCaptureImpl;
     79 
     80   class ClientBuffer;
     81   typedef std::map<media::VideoCapture::EventHandler*,
     82                    media::VideoCaptureParams> ClientInfo;
     83 
     84   VideoCaptureImpl(media::VideoCaptureSessionId session_id,
     85                    base::MessageLoopProxy* capture_message_loop_proxy,
     86                    VideoCaptureMessageFilter* filter);
     87   virtual ~VideoCaptureImpl();
     88 
     89   void DoStartCaptureOnCaptureThread(
     90       media::VideoCapture::EventHandler* handler,
     91       const media::VideoCaptureParams& params);
     92   void DoStopCaptureOnCaptureThread(media::VideoCapture::EventHandler* handler);
     93   void DoBufferCreatedOnCaptureThread(base::SharedMemoryHandle handle,
     94                                       int length,
     95                                       int buffer_id);
     96   void DoBufferDestroyedOnCaptureThread(int buffer_id);
     97   void DoBufferReceivedOnCaptureThread(
     98       int buffer_id,
     99       base::Time timestamp,
    100       const media::VideoCaptureFormat& format);
    101   void DoClientBufferFinishedOnCaptureThread(
    102       int buffer_id,
    103       const scoped_refptr<ClientBuffer>& buffer);
    104   void DoStateChangedOnCaptureThread(VideoCaptureState state);
    105   void DoDelegateAddedOnCaptureThread(int32 device_id);
    106 
    107   void DoSuspendCaptureOnCaptureThread(bool suspend);
    108 
    109   void Init();
    110   void DeInit(base::Closure task);
    111   void DoDeInitOnCaptureThread(base::Closure task);
    112   void StopDevice();
    113   void RestartCapture();
    114   void StartCaptureInternal();
    115   void AddDelegateOnIOThread();
    116   void RemoveDelegateOnIOThread(base::Closure task);
    117   virtual void Send(IPC::Message* message);
    118 
    119   // Helpers.
    120   bool RemoveClient(media::VideoCapture::EventHandler* handler,
    121                     ClientInfo* clients);
    122 
    123   const scoped_refptr<VideoCaptureMessageFilter> message_filter_;
    124   const scoped_refptr<base::MessageLoopProxy> capture_message_loop_proxy_;
    125   const scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
    126   int device_id_;
    127   const int session_id_;
    128 
    129   // Buffers available for sending to the client.
    130   typedef std::map<int32, scoped_refptr<ClientBuffer> > ClientBufferMap;
    131   ClientBufferMap client_buffers_;
    132 
    133   ClientInfo clients_;
    134   ClientInfo clients_pending_on_filter_;
    135   ClientInfo clients_pending_on_restart_;
    136 
    137   // Member params_ represents the video format requested by the
    138   // client to this class via DoStartCaptureOnCaptureThread.
    139   media::VideoCaptureParams params_;
    140 
    141   // The device's video capture format sent from browser process side.
    142   media::VideoCaptureFormat last_frame_format_;
    143 
    144   bool suspended_;
    145   VideoCaptureState state_;
    146 
    147   // WeakPtrFactory pointing back to |this| object, for use with
    148   // media::VideoFrames constructed in OnBufferReceived() from buffers cached
    149   // in |client_buffers_|.
    150   base::WeakPtrFactory<VideoCaptureImpl> weak_this_factory_;
    151 
    152   DISALLOW_COPY_AND_ASSIGN(VideoCaptureImpl);
    153 };
    154 
    155 }  // namespace content
    156 
    157 #endif  // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_
    158