- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / media / video_capture_host.h
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 media {
65 class VideoCaptureCapability;
66 }
67
68 namespace content {
69 class MediaStreamManager;
70
71 class CONTENT_EXPORT VideoCaptureHost
72     : public BrowserMessageFilter,
73       public VideoCaptureControllerEventHandler {
74  public:
75   explicit VideoCaptureHost(MediaStreamManager* media_stream_manager);
76
77   // BrowserMessageFilter implementation.
78   virtual void OnChannelClosing() OVERRIDE;
79   virtual void OnDestruct() const OVERRIDE;
80   virtual bool OnMessageReceived(const IPC::Message& message,
81                                  bool* message_was_ok) OVERRIDE;
82
83   // VideoCaptureControllerEventHandler implementation.
84   virtual void OnError(const VideoCaptureControllerID& id) OVERRIDE;
85   virtual void OnBufferCreated(const VideoCaptureControllerID& id,
86                                base::SharedMemoryHandle handle,
87                                int length,
88                                int buffer_id) OVERRIDE;
89   virtual void OnBufferDestroyed(const VideoCaptureControllerID& id,
90                                  int buffer_id) OVERRIDE;
91   virtual void OnBufferReady(
92       const VideoCaptureControllerID& id,
93       int buffer_id,
94       base::Time timestamp,
95       const media::VideoCaptureFormat& format) 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   // VideoCaptureParams::session_id. |device_id| is an id created by
108   // VideoCaptureMessageFilter to identify a session
109   // between a VideoCaptureMessageFilter and a VideoCaptureHost.
110   void OnStartCapture(int device_id,
111                       const media::VideoCaptureParams& params);
112   void OnControllerAdded(
113       int device_id, const media::VideoCaptureParams& params,
114       const base::WeakPtr<VideoCaptureController>& controller);
115   void DoControllerAddedOnIOThread(
116       int device_id, const media::VideoCaptureParams& params,
117       const base::WeakPtr<VideoCaptureController>& controller);
118
119   // IPC message: Stop capture on device referenced by |device_id|.
120   void OnStopCapture(int device_id);
121
122   // IPC message: Pause capture on device referenced by |device_id|.
123   void OnPauseCapture(int device_id);
124
125   // IPC message: Receive an empty buffer from renderer. Send it to device
126   // referenced by |device_id|.
127   void OnReceiveEmptyBuffer(int device_id, int buffer_id);
128
129   // Send a newly created buffer to the VideoCaptureMessageFilter.
130   void DoSendNewBufferOnIOThread(
131       const VideoCaptureControllerID& controller_id,
132       base::SharedMemoryHandle handle,
133       int length,
134       int buffer_id);
135
136   void DoSendFreeBufferOnIOThread(
137       const VideoCaptureControllerID& controller_id,
138       int buffer_id);
139
140   // Send a filled buffer to the VideoCaptureMessageFilter.
141   void DoSendFilledBufferOnIOThread(
142       const VideoCaptureControllerID& controller_id,
143       int buffer_id,
144       base::Time timestamp,
145       const media::VideoCaptureFormat& format);
146
147   // Handle error coming from VideoCaptureDevice.
148   void DoHandleErrorOnIOThread(const VideoCaptureControllerID& controller_id);
149
150   void DoEndedOnIOThread(const VideoCaptureControllerID& controller_id);
151
152   void DeleteVideoCaptureControllerOnIOThread(
153       const VideoCaptureControllerID& controller_id);
154
155   MediaStreamManager* media_stream_manager_;
156
157   typedef std::map<VideoCaptureControllerID,
158                    base::WeakPtr<VideoCaptureController> > EntryMap;
159
160   // A map of VideoCaptureControllerID to the VideoCaptureController to which it
161   // is connected. An entry in this map holds a null controller while it is in
162   // the process of starting.
163   EntryMap entries_;
164
165   DISALLOW_COPY_AND_ASSIGN(VideoCaptureHost);
166 };
167
168 }  // namespace content
169
170 #endif  // CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_HOST_H_