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
|
// Copyright (c) 2011 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
// VideCaptureMessageFilter which lives inside the render process.
//
// This class is owned by BrowserRenderProcessHost, 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_DeviceInfo |
// | |
// | < VideoCaptureMsg_StateChanged |
// | (kStarted) |
// | < VideoCaptureMsg_BufferReady |
// | ... |
// | < VideoCaptureMsg_BufferReady |
// | ... |
// | VideoCaptureHostMsg_BufferReady > |
// | VideoCaptureHostMsg_BufferReady > |
// | |
// | ... |
// | |
// | < VideoCaptureMsg_BufferReady |
// | VideoCaptureHostMsg_Stop > |
// | VideoCaptureHostMsg_BufferReady > |
// | < VideoCaptureMsg_StateChanged |
// | (kStopped) |
// 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 "content/browser/browser_message_filter.h"
#include "content/browser/renderer_host/media/video_capture_controller.h"
#include "content/common/content_export.h"
#include "ipc/ipc_message.h"
namespace content {
class ResourceContext;
} // namespace content
class CONTENT_EXPORT VideoCaptureHost
: public BrowserMessageFilter,
public VideoCaptureControllerEventHandler {
public:
explicit VideoCaptureHost(const content::ResourceContext* resource_context);
// 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 OnBufferReady(const VideoCaptureControllerID& id,
int buffer_id,
base::Time timestamp) OVERRIDE;
virtual void OnFrameInfo(const VideoCaptureControllerID& id,
int width,
int height,
int frame_per_second) OVERRIDE;
virtual void OnReadyToDelete(const VideoCaptureControllerID& id) OVERRIDE;
private:
friend class content::BrowserThread;
friend class DeleteTask<VideoCaptureHost>;
friend class MockVideoCaptureHost;
friend class VideoCaptureHostTest;
virtual ~VideoCaptureHost();
// IPC message: Start capture on the VideoCaptureDevice referenced by
// VideoCaptureParams::session_id. |device_id| is an id created by
// VideCaptureMessageFilter to identify a session
// between a VideCaptureMessageFilter and a VideoCaptureHost.
void OnStartCapture(int device_id,
const media::VideoCaptureParams& params);
void OnControllerAdded(
int device_id, const media::VideoCaptureParams& params,
VideoCaptureController* controller);
void DoControllerAddedOnIOThread(
int device_id, const media::VideoCaptureParams params,
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);
// Called on the IO thread when VideoCaptureController have
// reported that all DIBs have been returned.
void DoDeleteVideoCaptureController(const VideoCaptureControllerID& id);
// Send a newly created buffer to the VideoCaptureMessageFilter.
void DoSendNewBuffer(int device_id,
base::SharedMemoryHandle handle,
int length,
int buffer_id);
// Send a filled buffer to the VideoCaptureMessageFilter.
void DoSendFilledBuffer(int device_id,
int buffer_id,
base::Time timestamp);
// Send a information about frame resolution and frame rate
// to the VideoCaptureMessageFilter.
void DoSendFrameInfo(int device_id,
int width,
int height,
int frame_per_second);
// Handle error coming from VideoCaptureDevice.
void DoHandleError(int device_id);
// Helpers.
media_stream::VideoCaptureManager* GetVideoCaptureManager();
struct Entry;
typedef std::map<VideoCaptureControllerID, Entry*> EntryMap;
// A map of VideoCaptureControllerID to its state and VideoCaptureController.
EntryMap entries_;
// Used to get a pointer to VideoCaptureManager to start/stop capture devices.
const content::ResourceContext* resource_context_;
DISALLOW_COPY_AND_ASSIGN(VideoCaptureHost);
};
#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_HOST_H_
|