OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/media/video_capture_host.h" | 5 #include "content/browser/renderer_host/media/video_capture_host.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "content/browser/browser_main_loop.h" | 11 #include "content/browser/browser_main_loop.h" |
12 #include "content/browser/renderer_host/media/media_stream_manager.h" | 12 #include "content/browser/renderer_host/media/media_stream_manager.h" |
13 #include "content/browser/renderer_host/media/video_capture_manager.h" | 13 #include "content/browser/renderer_host/media/video_capture_manager.h" |
14 #include "content/common/media/video_capture_messages.h" | 14 #include "content/common/media/video_capture_messages.h" |
15 | 15 |
16 namespace content { | 16 namespace content { |
17 | 17 |
18 VideoCaptureHost::VideoCaptureHost(MediaStreamManager* media_stream_manager) | 18 VideoCaptureHost::VideoCaptureHost(MediaStreamManager* media_stream_manager) |
19 : BrowserMessageFilter(VideoCaptureMsgStart), | 19 : BrowserMessageFilter(VideoCaptureMsgStart), |
20 BrowserAssociatedInterface(this, this), | |
21 media_stream_manager_(media_stream_manager) { | 20 media_stream_manager_(media_stream_manager) { |
22 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 21 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
23 } | 22 } |
24 | 23 |
25 VideoCaptureHost::~VideoCaptureHost() {} | 24 VideoCaptureHost::~VideoCaptureHost() {} |
26 | 25 |
27 void VideoCaptureHost::OnChannelClosing() { | 26 void VideoCaptureHost::OnChannelClosing() { |
28 // Since the IPC sender is gone, close all requested VideoCaptureDevices. | 27 // Since the IPC sender is gone, close all requested VideoCaptureDevices. |
29 for (auto it = controllers_.begin(); it != controllers_.end(); ) { | 28 for (EntryMap::iterator it = entries_.begin(); it != entries_.end(); ) { |
30 const base::WeakPtr<VideoCaptureController>& controller = it->second; | 29 const base::WeakPtr<VideoCaptureController>& controller = it->second; |
31 if (controller) { | 30 if (controller) { |
32 const VideoCaptureControllerID controller_id(it->first); | 31 const VideoCaptureControllerID controller_id(it->first); |
33 media_stream_manager_->video_capture_manager()->StopCaptureForClient( | 32 media_stream_manager_->video_capture_manager()->StopCaptureForClient( |
34 controller.get(), controller_id, this, false); | 33 controller.get(), controller_id, this, false); |
35 ++it; | 34 ++it; |
36 } else { | 35 } else { |
37 // Remove the entry for this controller_id so that when the controller | 36 // Remove the entry for this controller_id so that when the controller |
38 // is added, the controller will be notified to stop for this client | 37 // is added, the controller will be notified to stop for this client |
39 // in DoControllerAdded. | 38 // in DoControllerAdded. |
40 controllers_.erase(it++); | 39 entries_.erase(it++); |
41 } | 40 } |
42 } | 41 } |
43 } | 42 } |
44 | 43 |
45 void VideoCaptureHost::OnDestruct() const { | 44 void VideoCaptureHost::OnDestruct() const { |
46 BrowserThread::DeleteOnIOThread::Destruct(this); | 45 BrowserThread::DeleteOnIOThread::Destruct(this); |
47 } | 46 } |
48 | 47 |
| 48 /////////////////////////////////////////////////////////////////////////////// |
| 49 |
| 50 // Implements VideoCaptureControllerEventHandler. |
49 void VideoCaptureHost::OnError(VideoCaptureControllerID controller_id) { | 51 void VideoCaptureHost::OnError(VideoCaptureControllerID controller_id) { |
50 DVLOG(1) << "VideoCaptureHost::OnError"; | 52 DVLOG(1) << "VideoCaptureHost::OnError"; |
51 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 53 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
52 BrowserThread::PostTask( | 54 BrowserThread::PostTask( |
53 BrowserThread::IO, FROM_HERE, | 55 BrowserThread::IO, FROM_HERE, |
54 base::Bind(&VideoCaptureHost::DoError, this, controller_id)); | 56 base::Bind(&VideoCaptureHost::DoError, this, controller_id)); |
55 } | 57 } |
56 | 58 |
57 void VideoCaptureHost::OnBufferCreated(VideoCaptureControllerID controller_id, | 59 void VideoCaptureHost::OnBufferCreated(VideoCaptureControllerID controller_id, |
58 base::SharedMemoryHandle handle, | 60 base::SharedMemoryHandle handle, |
59 int length, | 61 int length, |
60 int buffer_id) { | 62 int buffer_id) { |
61 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 63 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
62 if (controllers_.find(controller_id) == controllers_.end()) | 64 if (entries_.find(controller_id) == entries_.end()) |
63 return; | 65 return; |
64 | 66 |
65 Send(new VideoCaptureMsg_NewBuffer(controller_id, handle, length, buffer_id)); | 67 Send(new VideoCaptureMsg_NewBuffer(controller_id, handle, length, buffer_id)); |
66 } | 68 } |
67 | 69 |
68 void VideoCaptureHost::OnBufferCreated2( | 70 void VideoCaptureHost::OnBufferCreated2( |
69 VideoCaptureControllerID controller_id, | 71 VideoCaptureControllerID controller_id, |
70 const std::vector<gfx::GpuMemoryBufferHandle>& handles, | 72 const std::vector<gfx::GpuMemoryBufferHandle>& handles, |
71 const gfx::Size& size, | 73 const gfx::Size& size, |
72 int buffer_id) { | 74 int buffer_id) { |
73 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 75 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
74 if (controllers_.find(controller_id) == controllers_.end()) | 76 if (entries_.find(controller_id) == entries_.end()) |
75 return; | 77 return; |
76 | 78 |
77 Send(new VideoCaptureMsg_NewBuffer2(controller_id, handles, size, buffer_id)); | 79 Send(new VideoCaptureMsg_NewBuffer2(controller_id, handles, size, buffer_id)); |
78 } | 80 } |
79 | 81 |
80 void VideoCaptureHost::OnBufferDestroyed(VideoCaptureControllerID controller_id, | 82 void VideoCaptureHost::OnBufferDestroyed(VideoCaptureControllerID controller_id, |
81 int buffer_id) { | 83 int buffer_id) { |
82 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 84 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
83 if (controllers_.find(controller_id) == controllers_.end()) | 85 if (entries_.find(controller_id) == entries_.end()) |
84 return; | 86 return; |
85 | 87 |
86 Send(new VideoCaptureMsg_FreeBuffer(controller_id, buffer_id)); | 88 Send(new VideoCaptureMsg_FreeBuffer(controller_id, buffer_id)); |
87 } | 89 } |
88 | 90 |
89 void VideoCaptureHost::OnBufferReady( | 91 void VideoCaptureHost::OnBufferReady( |
90 VideoCaptureControllerID controller_id, | 92 VideoCaptureControllerID controller_id, |
91 int buffer_id, | 93 int buffer_id, |
92 const scoped_refptr<media::VideoFrame>& video_frame) { | 94 const scoped_refptr<media::VideoFrame>& video_frame) { |
93 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 95 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
94 if (controllers_.find(controller_id) == controllers_.end()) | 96 if (entries_.find(controller_id) == entries_.end()) |
95 return; | 97 return; |
96 | 98 |
97 VideoCaptureMsg_BufferReady_Params params; | 99 VideoCaptureMsg_BufferReady_Params params; |
98 params.device_id = controller_id; | 100 params.device_id = controller_id; |
99 params.buffer_id = buffer_id; | 101 params.buffer_id = buffer_id; |
100 params.timestamp = video_frame->timestamp(); | 102 params.timestamp = video_frame->timestamp(); |
101 video_frame->metadata()->MergeInternalValuesInto(¶ms.metadata); | 103 video_frame->metadata()->MergeInternalValuesInto(¶ms.metadata); |
102 params.pixel_format = video_frame->format(); | 104 params.pixel_format = video_frame->format(); |
103 params.storage_type = video_frame->storage_type(); | 105 params.storage_type = video_frame->storage_type(); |
104 params.coded_size = video_frame->coded_size(); | 106 params.coded_size = video_frame->coded_size(); |
105 params.visible_rect = video_frame->visible_rect(); | 107 params.visible_rect = video_frame->visible_rect(); |
106 | 108 |
107 Send(new VideoCaptureMsg_BufferReady(params)); | 109 Send(new VideoCaptureMsg_BufferReady(params)); |
108 } | 110 } |
109 | 111 |
110 void VideoCaptureHost::OnEnded(VideoCaptureControllerID controller_id) { | 112 void VideoCaptureHost::OnEnded(VideoCaptureControllerID controller_id) { |
111 DVLOG(1) << "VideoCaptureHost::OnEnded"; | 113 DVLOG(1) << "VideoCaptureHost::OnEnded"; |
112 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 114 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
113 BrowserThread::PostTask( | 115 BrowserThread::PostTask( |
114 BrowserThread::IO, FROM_HERE, | 116 BrowserThread::IO, FROM_HERE, |
115 base::Bind(&VideoCaptureHost::DoEnded, this, controller_id)); | 117 base::Bind(&VideoCaptureHost::DoEnded, this, controller_id)); |
116 } | 118 } |
117 | 119 |
118 void VideoCaptureHost::DoError(VideoCaptureControllerID controller_id) { | 120 void VideoCaptureHost::DoError(VideoCaptureControllerID controller_id) { |
119 DVLOG(1) << "VideoCaptureHost::DoError"; | 121 DVLOG(1) << "VideoCaptureHost::DoError"; |
120 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 122 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
121 if (controllers_.find(controller_id) == controllers_.end()) | 123 if (entries_.find(controller_id) == entries_.end()) |
122 return; | 124 return; |
123 | 125 |
124 Send(new VideoCaptureMsg_StateChanged(controller_id, | 126 Send(new VideoCaptureMsg_StateChanged(controller_id, |
125 VIDEO_CAPTURE_STATE_ERROR)); | 127 VIDEO_CAPTURE_STATE_ERROR)); |
126 DeleteVideoCaptureController(controller_id, true); | 128 DeleteVideoCaptureController(controller_id, true); |
127 } | 129 } |
128 | 130 |
129 void VideoCaptureHost::DoEnded(VideoCaptureControllerID controller_id) { | 131 void VideoCaptureHost::DoEnded(VideoCaptureControllerID controller_id) { |
130 DVLOG(1) << "VideoCaptureHost::DoEnded"; | 132 DVLOG(1) << "VideoCaptureHost::DoEnded"; |
131 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 133 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
132 if (controllers_.find(controller_id) == controllers_.end()) | 134 if (entries_.find(controller_id) == entries_.end()) |
133 return; | 135 return; |
134 | 136 |
135 Send(new VideoCaptureMsg_StateChanged(controller_id, | 137 Send(new VideoCaptureMsg_StateChanged(controller_id, |
136 VIDEO_CAPTURE_STATE_ENDED)); | 138 VIDEO_CAPTURE_STATE_ENDED)); |
137 DeleteVideoCaptureController(controller_id, false); | 139 DeleteVideoCaptureController(controller_id, false); |
138 } | 140 } |
139 | 141 |
140 /////////////////////////////////////////////////////////////////////////////// | 142 /////////////////////////////////////////////////////////////////////////////// |
141 // IPC Messages handler. | 143 // IPC Messages handler. |
142 bool VideoCaptureHost::OnMessageReceived(const IPC::Message& message) { | 144 bool VideoCaptureHost::OnMessageReceived(const IPC::Message& message) { |
143 bool handled = true; | 145 bool handled = true; |
144 IPC_BEGIN_MESSAGE_MAP(VideoCaptureHost, message) | 146 IPC_BEGIN_MESSAGE_MAP(VideoCaptureHost, message) |
145 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Start, OnStartCapture) | 147 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Start, OnStartCapture) |
| 148 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Pause, OnPauseCapture) |
146 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Resume, OnResumeCapture) | 149 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Resume, OnResumeCapture) |
| 150 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_RequestRefreshFrame, |
| 151 OnRequestRefreshFrame) |
| 152 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Stop, OnStopCapture) |
147 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, | 153 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, |
148 OnRendererFinishedWithBuffer) | 154 OnRendererFinishedWithBuffer) |
149 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceSupportedFormats, | 155 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceSupportedFormats, |
150 OnGetDeviceSupportedFormats) | 156 OnGetDeviceSupportedFormats) |
151 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceFormatsInUse, | 157 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceFormatsInUse, |
152 OnGetDeviceFormatsInUse) | 158 OnGetDeviceFormatsInUse) |
153 IPC_MESSAGE_UNHANDLED(handled = false) | 159 IPC_MESSAGE_UNHANDLED(handled = false) |
154 IPC_END_MESSAGE_MAP() | 160 IPC_END_MESSAGE_MAP() |
155 | 161 |
156 return handled; | 162 return handled; |
157 } | 163 } |
158 | 164 |
159 void VideoCaptureHost::OnStartCapture(int device_id, | 165 void VideoCaptureHost::OnStartCapture(int device_id, |
160 media::VideoCaptureSessionId session_id, | 166 media::VideoCaptureSessionId session_id, |
161 const media::VideoCaptureParams& params) { | 167 const media::VideoCaptureParams& params) { |
162 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 168 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
163 DVLOG(1) << "VideoCaptureHost::OnStartCapture:" | 169 DVLOG(1) << "VideoCaptureHost::OnStartCapture:" |
164 << " session_id=" << session_id << ", device_id=" << device_id | 170 << " session_id=" << session_id << ", device_id=" << device_id |
165 << ", format=" | 171 << ", format=" |
166 << media::VideoCaptureFormat::ToString(params.requested_format) | 172 << media::VideoCaptureFormat::ToString(params.requested_format) |
167 << "@" << params.requested_format.frame_rate << " (" | 173 << "@" << params.requested_format.frame_rate << " (" |
168 << (params.resolution_change_policy == | 174 << (params.resolution_change_policy == |
169 media::RESOLUTION_POLICY_FIXED_RESOLUTION | 175 media::RESOLUTION_POLICY_FIXED_RESOLUTION |
170 ? "fixed resolution" | 176 ? "fixed resolution" |
171 : (params.resolution_change_policy == | 177 : (params.resolution_change_policy == |
172 media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO | 178 media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO |
173 ? "fixed aspect ratio" | 179 ? "fixed aspect ratio" |
174 : "variable resolution")) << ")"; | 180 : "variable resolution")) << ")"; |
175 VideoCaptureControllerID controller_id(device_id); | 181 VideoCaptureControllerID controller_id(device_id); |
176 if (controllers_.find(controller_id) != controllers_.end()) { | 182 if (entries_.find(controller_id) != entries_.end()) { |
177 Send(new VideoCaptureMsg_StateChanged(device_id, | 183 Send(new VideoCaptureMsg_StateChanged(device_id, |
178 VIDEO_CAPTURE_STATE_ERROR)); | 184 VIDEO_CAPTURE_STATE_ERROR)); |
179 return; | 185 return; |
180 } | 186 } |
181 | 187 |
182 controllers_[controller_id] = base::WeakPtr<VideoCaptureController>(); | 188 entries_[controller_id] = base::WeakPtr<VideoCaptureController>(); |
183 media_stream_manager_->video_capture_manager()->StartCaptureForClient( | 189 media_stream_manager_->video_capture_manager()->StartCaptureForClient( |
184 session_id, | 190 session_id, |
185 params, | 191 params, |
186 PeerHandle(), | 192 PeerHandle(), |
187 controller_id, | 193 controller_id, |
188 this, | 194 this, |
189 base::Bind(&VideoCaptureHost::OnControllerAdded, this, device_id)); | 195 base::Bind(&VideoCaptureHost::OnControllerAdded, this, device_id)); |
190 } | 196 } |
191 | 197 |
| 198 void VideoCaptureHost::OnControllerAdded( |
| 199 int device_id, |
| 200 const base::WeakPtr<VideoCaptureController>& controller) { |
| 201 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 202 VideoCaptureControllerID controller_id(device_id); |
| 203 EntryMap::iterator it = entries_.find(controller_id); |
| 204 if (it == entries_.end()) { |
| 205 if (controller) { |
| 206 media_stream_manager_->video_capture_manager()->StopCaptureForClient( |
| 207 controller.get(), controller_id, this, false); |
| 208 } |
| 209 return; |
| 210 } |
| 211 |
| 212 if (!controller) { |
| 213 Send(new VideoCaptureMsg_StateChanged(device_id, |
| 214 VIDEO_CAPTURE_STATE_ERROR)); |
| 215 entries_.erase(controller_id); |
| 216 return; |
| 217 } |
| 218 |
| 219 DCHECK(!it->second); |
| 220 it->second = controller; |
| 221 } |
| 222 |
| 223 void VideoCaptureHost::OnStopCapture(int device_id) { |
| 224 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 225 DVLOG(1) << "VideoCaptureHost::OnStopCapture, device_id " << device_id; |
| 226 |
| 227 VideoCaptureControllerID controller_id(device_id); |
| 228 |
| 229 Send(new VideoCaptureMsg_StateChanged(device_id, |
| 230 VIDEO_CAPTURE_STATE_STOPPED)); |
| 231 DeleteVideoCaptureController(controller_id, false); |
| 232 } |
| 233 |
| 234 void VideoCaptureHost::OnPauseCapture(int device_id) { |
| 235 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 236 DVLOG(1) << "VideoCaptureHost::OnPauseCapture, device_id " << device_id; |
| 237 |
| 238 VideoCaptureControllerID controller_id(device_id); |
| 239 EntryMap::iterator it = entries_.find(controller_id); |
| 240 if (it == entries_.end() || !it->second) |
| 241 return; |
| 242 |
| 243 media_stream_manager_->video_capture_manager()->PauseCaptureForClient( |
| 244 it->second.get(), controller_id, this); |
| 245 Send(new VideoCaptureMsg_StateChanged(device_id, VIDEO_CAPTURE_STATE_PAUSED)); |
| 246 } |
| 247 |
192 void VideoCaptureHost::OnResumeCapture( | 248 void VideoCaptureHost::OnResumeCapture( |
193 int device_id, | 249 int device_id, |
194 media::VideoCaptureSessionId session_id, | 250 media::VideoCaptureSessionId session_id, |
195 const media::VideoCaptureParams& params) { | 251 const media::VideoCaptureParams& params) { |
196 DVLOG(1) << __func__ << " " << device_id; | |
197 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 252 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 253 DVLOG(1) << "VideoCaptureHost::OnResumeCapture, device_id " << device_id; |
198 | 254 |
199 VideoCaptureControllerID controller_id(device_id); | 255 VideoCaptureControllerID controller_id(device_id); |
200 auto it = controllers_.find(controller_id); | 256 EntryMap::iterator it = entries_.find(controller_id); |
201 if (it == controllers_.end() || !it->second) | 257 if (it == entries_.end() || !it->second) |
202 return; | 258 return; |
203 | 259 |
204 media_stream_manager_->video_capture_manager()->ResumeCaptureForClient( | 260 media_stream_manager_->video_capture_manager()->ResumeCaptureForClient( |
205 session_id, params, it->second.get(), controller_id, this); | 261 session_id, params, it->second.get(), controller_id, this); |
206 Send(new VideoCaptureMsg_StateChanged(device_id, | 262 Send(new VideoCaptureMsg_StateChanged(device_id, |
207 VIDEO_CAPTURE_STATE_RESUMED)); | 263 VIDEO_CAPTURE_STATE_RESUMED)); |
208 } | 264 } |
209 | 265 |
| 266 void VideoCaptureHost::OnRequestRefreshFrame(int device_id) { |
| 267 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 268 DVLOG(1) << "VideoCaptureHost::OnRequestRefreshFrame, device_id " |
| 269 << device_id; |
| 270 |
| 271 VideoCaptureControllerID controller_id(device_id); |
| 272 EntryMap::iterator it = entries_.find(controller_id); |
| 273 if (it == entries_.end()) |
| 274 return; |
| 275 |
| 276 if (VideoCaptureController* controller = it->second.get()) { |
| 277 media_stream_manager_->video_capture_manager() |
| 278 ->RequestRefreshFrameForClient(controller); |
| 279 } |
| 280 } |
| 281 |
210 void VideoCaptureHost::OnRendererFinishedWithBuffer( | 282 void VideoCaptureHost::OnRendererFinishedWithBuffer( |
211 int device_id, | 283 int device_id, |
212 int buffer_id, | 284 int buffer_id, |
213 const gpu::SyncToken& sync_token, | 285 const gpu::SyncToken& sync_token, |
214 double consumer_resource_utilization) { | 286 double consumer_resource_utilization) { |
215 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 287 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
216 | 288 |
217 VideoCaptureControllerID controller_id(device_id); | 289 VideoCaptureControllerID controller_id(device_id); |
218 auto it = controllers_.find(controller_id); | 290 EntryMap::iterator it = entries_.find(controller_id); |
219 if (it != controllers_.end()) { | 291 if (it != entries_.end()) { |
220 const base::WeakPtr<VideoCaptureController>& controller = it->second; | 292 const base::WeakPtr<VideoCaptureController>& controller = it->second; |
221 if (controller) { | 293 if (controller) { |
222 controller->ReturnBuffer(controller_id, this, buffer_id, sync_token, | 294 controller->ReturnBuffer(controller_id, this, buffer_id, sync_token, |
223 consumer_resource_utilization); | 295 consumer_resource_utilization); |
224 } | 296 } |
225 } | 297 } |
226 } | 298 } |
227 | 299 |
228 void VideoCaptureHost::OnGetDeviceSupportedFormats( | 300 void VideoCaptureHost::OnGetDeviceSupportedFormats( |
229 int device_id, | 301 int device_id, |
230 media::VideoCaptureSessionId session_id) { | 302 media::VideoCaptureSessionId capture_session_id) { |
231 DVLOG(1) << __func__ << " " << device_id; | |
232 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 303 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 304 DVLOG(1) << "VideoCaptureHost::OnGetDeviceFormats, capture_session_id " |
| 305 << capture_session_id; |
233 media::VideoCaptureFormats device_supported_formats; | 306 media::VideoCaptureFormats device_supported_formats; |
234 if (!media_stream_manager_->video_capture_manager() | 307 if (!media_stream_manager_->video_capture_manager() |
235 ->GetDeviceSupportedFormats(session_id, | 308 ->GetDeviceSupportedFormats(capture_session_id, |
236 &device_supported_formats)) { | 309 &device_supported_formats)) { |
237 DLOG(WARNING) | 310 DLOG(WARNING) |
238 << "Could not retrieve device supported formats for device_id=" | 311 << "Could not retrieve device supported formats for device_id=" |
239 << device_id << " session_id=" << session_id; | 312 << device_id << " capture_session_id=" << capture_session_id; |
240 } | 313 } |
241 Send(new VideoCaptureMsg_DeviceSupportedFormatsEnumerated( | 314 Send(new VideoCaptureMsg_DeviceSupportedFormatsEnumerated( |
242 device_id, device_supported_formats)); | 315 device_id, device_supported_formats)); |
243 } | 316 } |
244 | 317 |
245 void VideoCaptureHost::OnGetDeviceFormatsInUse( | 318 void VideoCaptureHost::OnGetDeviceFormatsInUse( |
246 int device_id, | 319 int device_id, |
247 media::VideoCaptureSessionId session_id) { | 320 media::VideoCaptureSessionId capture_session_id) { |
248 DVLOG(1) << __func__ << " " << device_id; | |
249 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 321 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 322 DVLOG(1) << "VideoCaptureHost::OnGetDeviceFormatsInUse, capture_session_id " |
| 323 << capture_session_id; |
250 media::VideoCaptureFormats formats_in_use; | 324 media::VideoCaptureFormats formats_in_use; |
251 if (!media_stream_manager_->video_capture_manager()->GetDeviceFormatsInUse( | 325 if (!media_stream_manager_->video_capture_manager()->GetDeviceFormatsInUse( |
252 session_id, &formats_in_use)) { | 326 capture_session_id, &formats_in_use)) { |
253 DVLOG(1) << "Could not retrieve device format(s) in use for device_id=" | 327 DVLOG(1) << "Could not retrieve device format(s) in use for device_id=" |
254 << device_id << " session_id=" << session_id; | 328 << device_id << " capture_session_id=" << capture_session_id; |
255 } | 329 } |
256 Send(new VideoCaptureMsg_DeviceFormatsInUseReceived(device_id, | 330 Send(new VideoCaptureMsg_DeviceFormatsInUseReceived(device_id, |
257 formats_in_use)); | 331 formats_in_use)); |
258 } | 332 } |
259 | 333 |
260 void VideoCaptureHost::StopCapture(int32_t device_id) { | |
261 DVLOG(1) << __func__ << " " << device_id; | |
262 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
263 | |
264 VideoCaptureControllerID controller_id(device_id); | |
265 | |
266 Send(new VideoCaptureMsg_StateChanged(device_id, | |
267 VIDEO_CAPTURE_STATE_STOPPED)); | |
268 DeleteVideoCaptureController(controller_id, false); | |
269 } | |
270 | |
271 void VideoCaptureHost::PauseCapture(int32_t device_id) { | |
272 DVLOG(1) << __func__ << " " << device_id; | |
273 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
274 | |
275 VideoCaptureControllerID controller_id(device_id); | |
276 auto it = controllers_.find(controller_id); | |
277 if (it == controllers_.end() || !it->second) | |
278 return; | |
279 | |
280 media_stream_manager_->video_capture_manager()->PauseCaptureForClient( | |
281 it->second.get(), controller_id, this); | |
282 Send(new VideoCaptureMsg_StateChanged(device_id, VIDEO_CAPTURE_STATE_PAUSED)); | |
283 } | |
284 | |
285 void VideoCaptureHost::RequestRefreshFrame(int32_t device_id) { | |
286 DVLOG(1) << __func__ << " " << device_id; | |
287 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
288 | |
289 VideoCaptureControllerID controller_id(device_id); | |
290 auto it = controllers_.find(controller_id); | |
291 if (it == controllers_.end()) | |
292 return; | |
293 | |
294 if (VideoCaptureController* controller = it->second.get()) { | |
295 media_stream_manager_->video_capture_manager() | |
296 ->RequestRefreshFrameForClient(controller); | |
297 } | |
298 } | |
299 | |
300 void VideoCaptureHost::OnControllerAdded( | |
301 int device_id, | |
302 const base::WeakPtr<VideoCaptureController>& controller) { | |
303 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
304 VideoCaptureControllerID controller_id(device_id); | |
305 auto it = controllers_.find(controller_id); | |
306 if (it == controllers_.end()) { | |
307 if (controller) { | |
308 media_stream_manager_->video_capture_manager()->StopCaptureForClient( | |
309 controller.get(), controller_id, this, false); | |
310 } | |
311 return; | |
312 } | |
313 | |
314 if (!controller) { | |
315 Send(new VideoCaptureMsg_StateChanged(device_id, | |
316 VIDEO_CAPTURE_STATE_ERROR)); | |
317 controllers_.erase(controller_id); | |
318 return; | |
319 } | |
320 | |
321 DCHECK(!it->second); | |
322 it->second = controller; | |
323 } | |
324 | |
325 void VideoCaptureHost::DeleteVideoCaptureController( | 334 void VideoCaptureHost::DeleteVideoCaptureController( |
326 VideoCaptureControllerID controller_id, bool on_error) { | 335 VideoCaptureControllerID controller_id, bool on_error) { |
327 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 336 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
328 | 337 |
329 auto it = controllers_.find(controller_id); | 338 EntryMap::iterator it = entries_.find(controller_id); |
330 if (it == controllers_.end()) | 339 if (it == entries_.end()) |
331 return; | 340 return; |
332 | 341 |
333 if (it->second) { | 342 if (it->second) { |
334 media_stream_manager_->video_capture_manager()->StopCaptureForClient( | 343 media_stream_manager_->video_capture_manager()->StopCaptureForClient( |
335 it->second.get(), controller_id, this, on_error); | 344 it->second.get(), controller_id, this, on_error); |
336 } | 345 } |
337 controllers_.erase(it); | 346 entries_.erase(it); |
338 } | 347 } |
339 | 348 |
340 } // namespace content | 349 } // namespace content |
OLD | NEW |