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 // VideoCaptureHost serves video capture related messages from
      6 // VideoCaptureMessageFilter which lives inside the render process.
      7 //
      8 // This class is owned by RenderProcessHostImpl, and instantiated on UI
      9 // thread, but all other operations and method calls happen on IO thread.
     10 //
     11 // Here's an example of a typical IPC dialog for video capture:
     12 //
     13 //   Renderer                             VideoCaptureHost
     14 //      |                                        |
     15 //      |  VideoCaptureHostMsg_Start >           |
     16 //      | < VideoCaptureMsg_StateChanged         |
     17 //      |        (VIDEO_CAPTURE_STATE_STARTED)   |
     18 //      | < VideoCaptureMsg_NewBuffer(1)         |
     19 //      | < VideoCaptureMsg_NewBuffer(2)         |
     20 //      | < VideoCaptureMsg_NewBuffer(3)         |
     21 //      |                                        |
     22 //      | < VideoCaptureMsg_BufferReady(1)       |
     23 //      | < VideoCaptureMsg_BufferReady(2)       |
     24 //      | VideoCaptureHostMsg_BufferReady(1) >   |
     25 //      | < VideoCaptureMsg_BufferReady(3)       |
     26 //      | VideoCaptureHostMsg_BufferReady(2) >   |
     27 //      | < VideoCaptureMsg_BufferReady(1)       |
     28 //      | VideoCaptureHostMsg_BufferReady(3) >   |
     29 //      | < VideoCaptureMsg_BufferReady(2)       |
     30 //      | VideoCaptureHostMsg_BufferReady(1) >   |
     31 //      |             ...                        |
     32 //      | < VideoCaptureMsg_BufferReady(3)       |
     33 //      |                                        |
     34 //      |             ... (resolution change)    |
     35 //      | < VideoCaptureMsg_FreeBuffer(1)        |  Buffers are re-allocated
     36 //      | < VideoCaptureMsg_NewBuffer(4)         |  at a larger size, as
     37 //      | < VideoCaptureMsg_BufferReady(4)       |  needed.
     38 //      | VideoCaptureHostMsg_BufferReady(2) >   |
     39 //      | < VideoCaptureMsg_FreeBuffer(2)        |
     40 //      | < VideoCaptureMsg_NewBuffer(5)         |
     41 //      | < VideoCaptureMsg_BufferReady(5)       |
     42 //      |             ...                        |
     43 //      |                                        |
     44 //      | < VideoCaptureMsg_BufferReady          |
     45 //      | VideoCaptureHostMsg_Stop >             |
     46 //      | VideoCaptureHostMsg_BufferReady >      |
     47 //      | < VideoCaptureMsg_StateChanged         |
     48 //      |         (VIDEO_CAPTURE_STATE_STOPPED)  |
     49 //      v                                        v
     50 
     51 #ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_HOST_H_
     52 #define CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_HOST_H_
     53 
     54 #include <map>
     55 
     56 #include "base/memory/ref_counted.h"
     57 #include "base/memory/weak_ptr.h"
     58 #include "base/sequenced_task_runner_helpers.h"
     59 #include "content/browser/renderer_host/media/video_capture_controller.h"
     60 #include "content/common/content_export.h"
     61 #include "content/public/browser/browser_message_filter.h"
     62 #include "ipc/ipc_message.h"
     63 
     64 namespace content {
     65 class MediaStreamManager;
     66 
     67 class CONTENT_EXPORT VideoCaptureHost
     68     : public BrowserMessageFilter,
     69       public VideoCaptureControllerEventHandler {
     70  public:
     71   explicit VideoCaptureHost(MediaStreamManager* media_stream_manager);
     72 
     73   // BrowserMessageFilter implementation.
     74   virtual void OnChannelClosing() OVERRIDE;
     75   virtual void OnDestruct() const OVERRIDE;
     76   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     77 
     78   // VideoCaptureControllerEventHandler implementation.
     79   virtual void OnError(const VideoCaptureControllerID& id) OVERRIDE;
     80   virtual void OnBufferCreated(const VideoCaptureControllerID& id,
     81                                base::SharedMemoryHandle handle,
     82                                int length,
     83                                int buffer_id) OVERRIDE;
     84   virtual void OnBufferDestroyed(const VideoCaptureControllerID& id,
     85                                  int buffer_id) OVERRIDE;
     86   virtual void OnBufferReady(const VideoCaptureControllerID& id,
     87                              int buffer_id,
     88                              const media::VideoCaptureFormat& format,
     89                              const gfx::Rect& visible_rect,
     90                              base::TimeTicks timestamp) OVERRIDE;
     91   virtual void OnMailboxBufferReady(const VideoCaptureControllerID& id,
     92                                     int buffer_id,
     93                                     const gpu::MailboxHolder& mailbox_holder,
     94                                     const media::VideoCaptureFormat& format,
     95                                     base::TimeTicks timestamp) OVERRIDE;
     96   virtual void OnEnded(const VideoCaptureControllerID& id) OVERRIDE;
     97 
     98  private:
     99   friend class BrowserThread;
    100   friend class base::DeleteHelper<VideoCaptureHost>;
    101   friend class MockVideoCaptureHost;
    102   friend class VideoCaptureHostTest;
    103 
    104   virtual ~VideoCaptureHost();
    105 
    106   // IPC message: Start capture on the VideoCaptureDevice referenced by
    107   // |session_id|. |device_id| is an id created by VideoCaptureMessageFilter
    108   // to identify a session between a VideoCaptureMessageFilter and a
    109   // VideoCaptureHost.
    110   void OnStartCapture(int device_id,
    111                       media::VideoCaptureSessionId session_id,
    112                       const media::VideoCaptureParams& params);
    113   void OnControllerAdded(
    114       int device_id,
    115       const base::WeakPtr<VideoCaptureController>& controller);
    116   void DoControllerAddedOnIOThread(
    117       int device_id,
    118       const base::WeakPtr<VideoCaptureController>& controller);
    119 
    120   // IPC message: Stop capture on device referenced by |device_id|.
    121   void OnStopCapture(int device_id);
    122 
    123   // IPC message: Pause capture on device referenced by |device_id|.
    124   void OnPauseCapture(int device_id);
    125 
    126   void OnResumeCapture(int device_id,
    127                        media::VideoCaptureSessionId session_id,
    128                        const media::VideoCaptureParams& params);
    129 
    130   // IPC message: Receive an empty buffer from renderer. Send it to device
    131   // referenced by |device_id|.
    132   void OnReceiveEmptyBuffer(int device_id, int buffer_id, uint32 sync_point);
    133 
    134   // IPC message: Get supported formats referenced by |capture_session_id|.
    135   // |device_id| is needed for message back-routing purposes.
    136   void OnGetDeviceSupportedFormats(
    137       int device_id,
    138       media::VideoCaptureSessionId capture_session_id);
    139 
    140   // IPC message: Get a device's currently in use format(s), referenced by
    141   // |capture_session_id|. |device_id| is needed for message back-routing
    142   // purposes.
    143   void OnGetDeviceFormatsInUse(
    144       int device_id,
    145       media::VideoCaptureSessionId capture_session_id);
    146 
    147   // Sends a newly created buffer to the VideoCaptureMessageFilter.
    148   void DoSendNewBufferOnIOThread(
    149       const VideoCaptureControllerID& controller_id,
    150       base::SharedMemoryHandle handle,
    151       int length,
    152       int buffer_id);
    153 
    154   void DoSendFreeBufferOnIOThread(
    155       const VideoCaptureControllerID& controller_id,
    156       int buffer_id);
    157 
    158   // Sends a filled buffer to the VideoCaptureMessageFilter.
    159   void DoSendFilledBufferOnIOThread(
    160       const VideoCaptureControllerID& controller_id,
    161       int buffer_id,
    162       const media::VideoCaptureFormat& format,
    163       const gfx::Rect& visible_rect,
    164       base::TimeTicks timestamp);
    165 
    166   // Sends a filled texture mailbox buffer to the VideoCaptureMessageFilter.
    167   void DoSendFilledMailboxBufferOnIOThread(
    168       const VideoCaptureControllerID& controller_id,
    169       int buffer_id,
    170       const gpu::MailboxHolder& mailbox_holder,
    171       const media::VideoCaptureFormat& format,
    172       base::TimeTicks timestamp);
    173 
    174   // Handles error coming from VideoCaptureDevice.
    175   void DoHandleErrorOnIOThread(const VideoCaptureControllerID& controller_id);
    176 
    177   void DoEndedOnIOThread(const VideoCaptureControllerID& controller_id);
    178 
    179   // Deletes the controller and notifies the VideoCaptureManager. |on_error| is
    180   // true if this is triggered by VideoCaptureControllerEventHandler::OnError.
    181   void DeleteVideoCaptureControllerOnIOThread(
    182       const VideoCaptureControllerID& controller_id, bool on_error);
    183 
    184   MediaStreamManager* media_stream_manager_;
    185 
    186   typedef std::map<VideoCaptureControllerID,
    187                    base::WeakPtr<VideoCaptureController> > EntryMap;
    188 
    189   // A map of VideoCaptureControllerID to the VideoCaptureController to which it
    190   // is connected. An entry in this map holds a null controller while it is in
    191   // the process of starting.
    192   EntryMap entries_;
    193 
    194   DISALLOW_COPY_AND_ASSIGN(VideoCaptureHost);
    195 };
    196 
    197 }  // namespace content
    198 
    199 #endif  // CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_HOST_H_
    200