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