Upstream version 5.34.104.0
[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 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,
77                                  bool* message_was_ok) OVERRIDE;
78
79   // VideoCaptureControllerEventHandler implementation.
80   virtual void OnError(const VideoCaptureControllerID& id) OVERRIDE;
81   virtual void OnBufferCreated(const VideoCaptureControllerID& id,
82                                base::SharedMemoryHandle handle,
83                                int length,
84                                int buffer_id) OVERRIDE;
85   virtual void OnBufferDestroyed(const VideoCaptureControllerID& id,
86                                  int buffer_id) OVERRIDE;
87   virtual void OnBufferReady(const VideoCaptureControllerID& id,
88                              int buffer_id,
89                              base::TimeTicks timestamp,
90                              const media::VideoCaptureFormat& format) OVERRIDE;
91   virtual void OnEnded(const VideoCaptureControllerID& id) OVERRIDE;
92
93  private:
94   friend class BrowserThread;
95   friend class base::DeleteHelper<VideoCaptureHost>;
96   friend class MockVideoCaptureHost;
97   friend class VideoCaptureHostTest;
98
99   virtual ~VideoCaptureHost();
100
101   // IPC message: Start capture on the VideoCaptureDevice referenced by
102   // |session_id|. |device_id| is an id created by VideoCaptureMessageFilter
103   // to identify a session between a VideoCaptureMessageFilter and a
104   // VideoCaptureHost.
105   void OnStartCapture(int device_id,
106                       media::VideoCaptureSessionId session_id,
107                       const media::VideoCaptureParams& params);
108   void OnControllerAdded(
109       int device_id,
110       const base::WeakPtr<VideoCaptureController>& controller);
111   void DoControllerAddedOnIOThread(
112       int device_id,
113       const base::WeakPtr<VideoCaptureController>& controller);
114
115   // IPC message: Stop capture on device referenced by |device_id|.
116   void OnStopCapture(int device_id);
117
118   // IPC message: Pause capture on device referenced by |device_id|.
119   void OnPauseCapture(int device_id);
120
121   // IPC message: Receive an empty buffer from renderer. Send it to device
122   // referenced by |device_id|.
123   void OnReceiveEmptyBuffer(int device_id, int buffer_id);
124
125   // IPC message: Get supported formats referenced by |capture_session_id|.
126   // |device_id| is needed for message back-routing purposes.
127   void OnGetDeviceSupportedFormats(
128       int device_id,
129       media::VideoCaptureSessionId capture_session_id);
130
131   // IPC message: Get a device's currently in use format(s), referenced by
132   // |capture_session_id|. |device_id| is needed for message back-routing
133   // purposes.
134   void OnGetDeviceFormatsInUse(
135       int device_id,
136       media::VideoCaptureSessionId capture_session_id);
137
138   // Send a newly created buffer to the VideoCaptureMessageFilter.
139   void DoSendNewBufferOnIOThread(
140       const VideoCaptureControllerID& controller_id,
141       base::SharedMemoryHandle handle,
142       int length,
143       int buffer_id);
144
145   void DoSendFreeBufferOnIOThread(
146       const VideoCaptureControllerID& controller_id,
147       int buffer_id);
148
149   // Send a filled buffer to the VideoCaptureMessageFilter.
150   void DoSendFilledBufferOnIOThread(
151       const VideoCaptureControllerID& controller_id,
152       int buffer_id,
153       base::TimeTicks timestamp,
154       const media::VideoCaptureFormat& format);
155
156   // Handle error coming from VideoCaptureDevice.
157   void DoHandleErrorOnIOThread(const VideoCaptureControllerID& controller_id);
158
159   void DoEndedOnIOThread(const VideoCaptureControllerID& controller_id);
160
161   void DeleteVideoCaptureControllerOnIOThread(
162       const VideoCaptureControllerID& controller_id);
163
164   MediaStreamManager* media_stream_manager_;
165
166   typedef std::map<VideoCaptureControllerID,
167                    base::WeakPtr<VideoCaptureController> > EntryMap;
168
169   // A map of VideoCaptureControllerID to the VideoCaptureController to which it
170   // is connected. An entry in this map holds a null controller while it is in
171   // the process of starting.
172   EntryMap entries_;
173
174   DISALLOW_COPY_AND_ASSIGN(VideoCaptureHost);
175 };
176
177 }  // namespace content
178
179 #endif  // CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_HOST_H_