| 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" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 controllers_.erase(it++); | 40 controllers_.erase(it++); |
| 41 } | 41 } |
| 42 } | 42 } |
| 43 } | 43 } |
| 44 | 44 |
| 45 void VideoCaptureHost::OnDestruct() const { | 45 void VideoCaptureHost::OnDestruct() const { |
| 46 BrowserThread::DeleteOnIOThread::Destruct(this); | 46 BrowserThread::DeleteOnIOThread::Destruct(this); |
| 47 } | 47 } |
| 48 | 48 |
| 49 void VideoCaptureHost::OnError(VideoCaptureControllerID controller_id) { | 49 void VideoCaptureHost::OnError(VideoCaptureControllerID controller_id) { |
| 50 DVLOG(1) << "VideoCaptureHost::OnError"; | 50 DVLOG(1) << __func__; |
| 51 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 51 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 52 BrowserThread::PostTask( | 52 BrowserThread::PostTask( |
| 53 BrowserThread::IO, FROM_HERE, | 53 BrowserThread::IO, FROM_HERE, |
| 54 base::Bind(&VideoCaptureHost::DoError, this, controller_id)); | 54 base::Bind(&VideoCaptureHost::DoError, this, controller_id)); |
| 55 } | 55 } |
| 56 | 56 |
| 57 void VideoCaptureHost::OnBufferCreated(VideoCaptureControllerID controller_id, | 57 void VideoCaptureHost::OnBufferCreated(VideoCaptureControllerID controller_id, |
| 58 base::SharedMemoryHandle handle, | 58 base::SharedMemoryHandle handle, |
| 59 int length, | 59 int length, |
| 60 int buffer_id) { | 60 int buffer_id) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 Send(new VideoCaptureMsg_StateChanged(controller_id, | 135 Send(new VideoCaptureMsg_StateChanged(controller_id, |
| 136 VIDEO_CAPTURE_STATE_ENDED)); | 136 VIDEO_CAPTURE_STATE_ENDED)); |
| 137 DeleteVideoCaptureController(controller_id, false); | 137 DeleteVideoCaptureController(controller_id, false); |
| 138 } | 138 } |
| 139 | 139 |
| 140 /////////////////////////////////////////////////////////////////////////////// | 140 /////////////////////////////////////////////////////////////////////////////// |
| 141 // IPC Messages handler. | 141 // IPC Messages handler. |
| 142 bool VideoCaptureHost::OnMessageReceived(const IPC::Message& message) { | 142 bool VideoCaptureHost::OnMessageReceived(const IPC::Message& message) { |
| 143 bool handled = true; | 143 bool handled = true; |
| 144 IPC_BEGIN_MESSAGE_MAP(VideoCaptureHost, message) | 144 IPC_BEGIN_MESSAGE_MAP(VideoCaptureHost, message) |
| 145 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Start, OnStartCapture) | |
| 146 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Resume, OnResumeCapture) | |
| 147 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, | 145 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, |
| 148 OnRendererFinishedWithBuffer) | 146 OnRendererFinishedWithBuffer) |
| 149 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceSupportedFormats, | 147 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceSupportedFormats, |
| 150 OnGetDeviceSupportedFormats) | 148 OnGetDeviceSupportedFormats) |
| 151 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceFormatsInUse, | 149 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceFormatsInUse, |
| 152 OnGetDeviceFormatsInUse) | 150 OnGetDeviceFormatsInUse) |
| 153 IPC_MESSAGE_UNHANDLED(handled = false) | 151 IPC_MESSAGE_UNHANDLED(handled = false) |
| 154 IPC_END_MESSAGE_MAP() | 152 IPC_END_MESSAGE_MAP() |
| 155 | 153 |
| 156 return handled; | 154 return handled; |
| 157 } | 155 } |
| 158 | 156 |
| 159 void VideoCaptureHost::OnStartCapture(int device_id, | |
| 160 media::VideoCaptureSessionId session_id, | |
| 161 const media::VideoCaptureParams& params) { | |
| 162 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 163 DVLOG(1) << "VideoCaptureHost::OnStartCapture:" | |
| 164 << " session_id=" << session_id << ", device_id=" << device_id | |
| 165 << ", format=" | |
| 166 << media::VideoCaptureFormat::ToString(params.requested_format) | |
| 167 << "@" << params.requested_format.frame_rate << " (" | |
| 168 << (params.resolution_change_policy == | |
| 169 media::RESOLUTION_POLICY_FIXED_RESOLUTION | |
| 170 ? "fixed resolution" | |
| 171 : (params.resolution_change_policy == | |
| 172 media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO | |
| 173 ? "fixed aspect ratio" | |
| 174 : "variable resolution")) << ")"; | |
| 175 VideoCaptureControllerID controller_id(device_id); | |
| 176 if (controllers_.find(controller_id) != controllers_.end()) { | |
| 177 Send(new VideoCaptureMsg_StateChanged(device_id, | |
| 178 VIDEO_CAPTURE_STATE_ERROR)); | |
| 179 return; | |
| 180 } | |
| 181 | |
| 182 controllers_[controller_id] = base::WeakPtr<VideoCaptureController>(); | |
| 183 media_stream_manager_->video_capture_manager()->StartCaptureForClient( | |
| 184 session_id, | |
| 185 params, | |
| 186 PeerHandle(), | |
| 187 controller_id, | |
| 188 this, | |
| 189 base::Bind(&VideoCaptureHost::OnControllerAdded, this, device_id)); | |
| 190 } | |
| 191 | |
| 192 void VideoCaptureHost::OnResumeCapture( | |
| 193 int device_id, | |
| 194 media::VideoCaptureSessionId session_id, | |
| 195 const media::VideoCaptureParams& params) { | |
| 196 DVLOG(1) << __func__ << " " << device_id; | |
| 197 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 198 | |
| 199 VideoCaptureControllerID controller_id(device_id); | |
| 200 auto it = controllers_.find(controller_id); | |
| 201 if (it == controllers_.end() || !it->second) | |
| 202 return; | |
| 203 | |
| 204 media_stream_manager_->video_capture_manager()->ResumeCaptureForClient( | |
| 205 session_id, params, it->second.get(), controller_id, this); | |
| 206 Send(new VideoCaptureMsg_StateChanged(device_id, | |
| 207 VIDEO_CAPTURE_STATE_RESUMED)); | |
| 208 } | |
| 209 | |
| 210 void VideoCaptureHost::OnRendererFinishedWithBuffer( | 157 void VideoCaptureHost::OnRendererFinishedWithBuffer( |
| 211 int device_id, | 158 int device_id, |
| 212 int buffer_id, | 159 int buffer_id, |
| 213 const gpu::SyncToken& sync_token, | 160 const gpu::SyncToken& sync_token, |
| 214 double consumer_resource_utilization) { | 161 double consumer_resource_utilization) { |
| 215 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 162 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 216 | 163 |
| 217 VideoCaptureControllerID controller_id(device_id); | 164 VideoCaptureControllerID controller_id(device_id); |
| 218 auto it = controllers_.find(controller_id); | 165 auto it = controllers_.find(controller_id); |
| 219 if (it != controllers_.end()) { | 166 if (it != controllers_.end()) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 250 media::VideoCaptureFormats formats_in_use; | 197 media::VideoCaptureFormats formats_in_use; |
| 251 if (!media_stream_manager_->video_capture_manager()->GetDeviceFormatsInUse( | 198 if (!media_stream_manager_->video_capture_manager()->GetDeviceFormatsInUse( |
| 252 session_id, &formats_in_use)) { | 199 session_id, &formats_in_use)) { |
| 253 DVLOG(1) << "Could not retrieve device format(s) in use for device_id=" | 200 DVLOG(1) << "Could not retrieve device format(s) in use for device_id=" |
| 254 << device_id << " session_id=" << session_id; | 201 << device_id << " session_id=" << session_id; |
| 255 } | 202 } |
| 256 Send(new VideoCaptureMsg_DeviceFormatsInUseReceived(device_id, | 203 Send(new VideoCaptureMsg_DeviceFormatsInUseReceived(device_id, |
| 257 formats_in_use)); | 204 formats_in_use)); |
| 258 } | 205 } |
| 259 | 206 |
| 207 void VideoCaptureHost::Start(int32_t device_id, |
| 208 int32_t session_id, |
| 209 const media::VideoCaptureParams& params) { |
| 210 DVLOG(1) << __func__ << " session_id=" << session_id |
| 211 << ", device_id=" << device_id << ", format=" |
| 212 << media::VideoCaptureFormat::ToString(params.requested_format); |
| 213 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 214 const VideoCaptureControllerID controller_id(device_id); |
| 215 if (controllers_.find(controller_id) != controllers_.end()) { |
| 216 Send(new VideoCaptureMsg_StateChanged(device_id, |
| 217 VIDEO_CAPTURE_STATE_ERROR)); |
| 218 return; |
| 219 } |
| 220 |
| 221 controllers_[controller_id] = base::WeakPtr<VideoCaptureController>(); |
| 222 media_stream_manager_->video_capture_manager()->StartCaptureForClient( |
| 223 session_id, |
| 224 params, |
| 225 PeerHandle(), |
| 226 controller_id, |
| 227 this, |
| 228 base::Bind(&VideoCaptureHost::OnControllerAdded, this, device_id)); |
| 229 } |
| 230 |
| 260 void VideoCaptureHost::Stop(int32_t device_id) { | 231 void VideoCaptureHost::Stop(int32_t device_id) { |
| 261 DVLOG(1) << __func__ << " " << device_id; | 232 DVLOG(1) << __func__ << " " << device_id; |
| 262 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 233 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 263 | 234 |
| 264 VideoCaptureControllerID controller_id(device_id); | 235 VideoCaptureControllerID controller_id(device_id); |
| 265 | 236 |
| 266 Send(new VideoCaptureMsg_StateChanged(device_id, | 237 Send(new VideoCaptureMsg_StateChanged(device_id, |
| 267 VIDEO_CAPTURE_STATE_STOPPED)); | 238 VIDEO_CAPTURE_STATE_STOPPED)); |
| 268 DeleteVideoCaptureController(controller_id, false); | 239 DeleteVideoCaptureController(controller_id, false); |
| 269 } | 240 } |
| 270 | 241 |
| 271 void VideoCaptureHost::Pause(int32_t device_id) { | 242 void VideoCaptureHost::Pause(int32_t device_id) { |
| 272 DVLOG(1) << __func__ << " " << device_id; | 243 DVLOG(1) << __func__ << " " << device_id; |
| 273 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 244 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 274 | 245 |
| 275 VideoCaptureControllerID controller_id(device_id); | 246 VideoCaptureControllerID controller_id(device_id); |
| 276 auto it = controllers_.find(controller_id); | 247 auto it = controllers_.find(controller_id); |
| 277 if (it == controllers_.end() || !it->second) | 248 if (it == controllers_.end() || !it->second) |
| 278 return; | 249 return; |
| 279 | 250 |
| 280 media_stream_manager_->video_capture_manager()->PauseCaptureForClient( | 251 media_stream_manager_->video_capture_manager()->PauseCaptureForClient( |
| 281 it->second.get(), controller_id, this); | 252 it->second.get(), controller_id, this); |
| 282 Send(new VideoCaptureMsg_StateChanged(device_id, VIDEO_CAPTURE_STATE_PAUSED)); | 253 Send(new VideoCaptureMsg_StateChanged(device_id, VIDEO_CAPTURE_STATE_PAUSED)); |
| 283 } | 254 } |
| 284 | 255 |
| 256 void VideoCaptureHost::Resume(int32_t device_id, |
| 257 int32_t session_id, |
| 258 const media::VideoCaptureParams& params) { |
| 259 DVLOG(1) << __func__ << " " << device_id; |
| 260 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 261 |
| 262 VideoCaptureControllerID controller_id(device_id); |
| 263 auto it = controllers_.find(controller_id); |
| 264 if (it == controllers_.end() || !it->second) |
| 265 return; |
| 266 |
| 267 media_stream_manager_->video_capture_manager()->ResumeCaptureForClient( |
| 268 session_id, params, it->second.get(), controller_id, this); |
| 269 Send(new VideoCaptureMsg_StateChanged(device_id, |
| 270 VIDEO_CAPTURE_STATE_RESUMED)); |
| 271 } |
| 272 |
| 285 void VideoCaptureHost::RequestRefreshFrame(int32_t device_id) { | 273 void VideoCaptureHost::RequestRefreshFrame(int32_t device_id) { |
| 286 DVLOG(1) << __func__ << " " << device_id; | 274 DVLOG(1) << __func__ << " " << device_id; |
| 287 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 275 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 288 | 276 |
| 289 VideoCaptureControllerID controller_id(device_id); | 277 VideoCaptureControllerID controller_id(device_id); |
| 290 auto it = controllers_.find(controller_id); | 278 auto it = controllers_.find(controller_id); |
| 291 if (it == controllers_.end()) | 279 if (it == controllers_.end()) |
| 292 return; | 280 return; |
| 293 | 281 |
| 294 if (VideoCaptureController* controller = it->second.get()) { | 282 if (VideoCaptureController* controller = it->second.get()) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 return; | 319 return; |
| 332 | 320 |
| 333 if (it->second) { | 321 if (it->second) { |
| 334 media_stream_manager_->video_capture_manager()->StopCaptureForClient( | 322 media_stream_manager_->video_capture_manager()->StopCaptureForClient( |
| 335 it->second.get(), controller_id, this, on_error); | 323 it->second.get(), controller_id, this, on_error); |
| 336 } | 324 } |
| 337 controllers_.erase(it); | 325 controllers_.erase(it); |
| 338 } | 326 } |
| 339 | 327 |
| 340 } // namespace content | 328 } // namespace content |
| OLD | NEW |