Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: content/browser/renderer_host/media/video_capture_manager.cc

Issue 29423003: Added video capture capabilities retrieval and caching to VideoCaptureManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed mechanics of Caps enumeration to be asynchronous and 2 threaded. UT adapted. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_manager.h" 5 #include "content/browser/renderer_host/media/video_capture_manager.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 case MEDIA_DEVICE_VIDEO_CAPTURE: { 143 case MEDIA_DEVICE_VIDEO_CAPTURE: {
144 // We look up the device id from the renderer in our local enumeration 144 // We look up the device id from the renderer in our local enumeration
145 // since the renderer does not have all the information that might be 145 // since the renderer does not have all the information that might be
146 // held in the browser-side VideoCaptureDevice::Name structure. 146 // held in the browser-side VideoCaptureDevice::Name structure.
147 media::VideoCaptureDevice::Name* found = 147 media::VideoCaptureDevice::Name* found =
148 video_capture_devices_.FindById(entry->id); 148 video_capture_devices_.FindById(entry->id);
149 if (found) { 149 if (found) {
150 video_capture_device.reset(use_fake_device_ ? 150 video_capture_device.reset(use_fake_device_ ?
151 media::FakeVideoCaptureDevice::Create(*found) : 151 media::FakeVideoCaptureDevice::Create(*found) :
152 media::VideoCaptureDevice::Create(*found)); 152 media::VideoCaptureDevice::Create(*found));
153
154 // Filter capture capabilities: remove all except the current one.
tommi (sloooow) - chröme 2013/10/25 14:15:34 why? (usually that's more important to document th
mcasas 2013/10/28 12:50:08 Done.
155 media::VideoCaptureCapabilities& formats =
156 video_capture_capabilities_[entry->id];
157 formats.clear();
158 formats.push_back(capture_params);
153 } 159 }
154 break; 160 break;
155 } 161 }
156 case MEDIA_TAB_VIDEO_CAPTURE: { 162 case MEDIA_TAB_VIDEO_CAPTURE: {
157 video_capture_device.reset( 163 video_capture_device.reset(
158 WebContentsVideoCaptureDevice::Create(entry->id)); 164 WebContentsVideoCaptureDevice::Create(entry->id));
159 break; 165 break;
160 } 166 }
161 case MEDIA_DESKTOP_VIDEO_CAPTURE: { 167 case MEDIA_DESKTOP_VIDEO_CAPTURE: {
162 #if defined(ENABLE_SCREEN_CAPTURE) 168 #if defined(ENABLE_SCREEN_CAPTURE)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 252
247 // Detach client from controller. 253 // Detach client from controller.
248 int session_id = controller->RemoveClient(client_id, client_handler); 254 int session_id = controller->RemoveClient(client_id, client_handler);
249 DVLOG(1) << "VideoCaptureManager::StopCaptureForClient, session_id = " 255 DVLOG(1) << "VideoCaptureManager::StopCaptureForClient, session_id = "
250 << session_id; 256 << session_id;
251 257
252 // If controller has no more clients, delete controller and device. 258 // If controller has no more clients, delete controller and device.
253 DestroyDeviceEntryIfNoClients(entry); 259 DestroyDeviceEntryIfNoClients(entry);
254 } 260 }
255 261
262 void VideoCaptureManager::EnumerateDeviceCapabilities(
263 const StreamDeviceInfo& device_info) {
264 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
265 DVLOG(1) << "VideoCaptureManager::EnumerateDeviceCapabilites for device: "
266 << device_info.device.name;
267 DCHECK(listener_);
268 base::PostTaskAndReplyWithResult(
269 device_loop_,
270 FROM_HERE,
271 base::Bind(&VideoCaptureManager::GetDeviceCapabilitiesOnDeviceThread,
272 this,
273 device_info),
274 base::Bind(&VideoCaptureManager::OnDeviceCapabilitiesEnumerated,
275 this,
276 device_info));
277 }
278
256 void VideoCaptureManager::DoStopDeviceOnDeviceThread(DeviceEntry* entry) { 279 void VideoCaptureManager::DoStopDeviceOnDeviceThread(DeviceEntry* entry) {
257 SCOPED_UMA_HISTOGRAM_TIMER("Media.VideoCaptureManager.StopDeviceTime"); 280 SCOPED_UMA_HISTOGRAM_TIMER("Media.VideoCaptureManager.StopDeviceTime");
258 DCHECK(IsOnDeviceThread()); 281 DCHECK(IsOnDeviceThread());
259 if (entry->video_capture_device) { 282 if (entry->video_capture_device) {
260 entry->video_capture_device->StopAndDeAllocate(); 283 entry->video_capture_device->StopAndDeAllocate();
261 } 284 }
262 entry->video_capture_device.reset(); 285 entry->video_capture_device.reset();
263 } 286 }
264 287
265 void VideoCaptureManager::OnOpened(MediaStreamType stream_type, 288 void VideoCaptureManager::OnOpened(MediaStreamType stream_type,
(...skipping 18 matching lines...) Expand all
284 307
285 void VideoCaptureManager::OnDevicesEnumerated( 308 void VideoCaptureManager::OnDevicesEnumerated(
286 MediaStreamType stream_type, 309 MediaStreamType stream_type,
287 const media::VideoCaptureDevice::Names& device_names) { 310 const media::VideoCaptureDevice::Names& device_names) {
288 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 311 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
289 312
290 if (!listener_) { 313 if (!listener_) {
291 // Listener has been removed. 314 // Listener has been removed.
292 return; 315 return;
293 } 316 }
317 DVLOG(1) << "OnDevicesEnumerated";
tommi (sloooow) - chröme 2013/10/25 14:15:34 nit: above the listener check
mcasas 2013/10/28 12:50:08 Done.
294 318
295 // Transform from VCD::Name to StreamDeviceInfo. 319 // Transform from VCD::Name to StreamDeviceInfo.
296 StreamDeviceInfoArray devices; 320 StreamDeviceInfoArray devices;
297 for (media::VideoCaptureDevice::Names::const_iterator it = 321 for (media::VideoCaptureDevice::Names::const_iterator it =
298 device_names.begin(); it != device_names.end(); ++it) { 322 device_names.begin(); it != device_names.end(); ++it) {
299 devices.push_back(StreamDeviceInfo( 323 devices.push_back(StreamDeviceInfo(
300 stream_type, it->GetNameAndModel(), it->id())); 324 stream_type, it->GetNameAndModel(), it->id()));
301 } 325 }
302 326
303 listener_->DevicesEnumerated(stream_type, devices); 327 listener_->DevicesEnumerated(stream_type, devices);
304 } 328 }
305 329
330 void VideoCaptureManager::OnDeviceCapabilitiesEnumerated(
331 const StreamDeviceInfo& device_info,
332 const media::VideoCaptureCapabilities& capabilities) {
333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
334
335 if (!listener_) {
336 // Listener has been removed.
337 return;
338 }
339 DVLOG(1) << "OnDeviceCapabilitiesEnumerated device: "
tommi (sloooow) - chröme 2013/10/25 14:15:34 nit: move this DLOG above the listener_ check so t
mcasas 2013/10/28 12:50:08 Done.
340 << device_info.device.id;
341 listener_->DeviceCapabilitiesEnumerated(device_info, capabilities);
342 }
343
306 bool VideoCaptureManager::IsOnDeviceThread() const { 344 bool VideoCaptureManager::IsOnDeviceThread() const {
307 return device_loop_->BelongsToCurrentThread(); 345 return device_loop_->BelongsToCurrentThread();
308 } 346 }
309 347
310 media::VideoCaptureDevice::Names 348 media::VideoCaptureDevice::Names
311 VideoCaptureManager::GetAvailableDevicesOnDeviceThread( 349 VideoCaptureManager::GetAvailableDevicesOnDeviceThread(
312 MediaStreamType stream_type) { 350 MediaStreamType stream_type) {
313 SCOPED_UMA_HISTOGRAM_TIMER( 351 SCOPED_UMA_HISTOGRAM_TIMER(
314 "Media.VideoCaptureManager.GetAvailableDevicesTime"); 352 "Media.VideoCaptureManager.GetAvailableDevicesTime");
315 DCHECK(IsOnDeviceThread()); 353 DCHECK(IsOnDeviceThread());
316 media::VideoCaptureDevice::Names result; 354 media::VideoCaptureDevice::Names result;
317 355
318 switch (stream_type) { 356 switch (stream_type) {
319 case MEDIA_DEVICE_VIDEO_CAPTURE: 357 case MEDIA_DEVICE_VIDEO_CAPTURE:
320 // Cache the latest enumeration of video capture devices. 358 // Cache the latest enumeration of video capture devices.
321 // We'll refer to this list again in OnOpen to avoid having to 359 // We'll refer to this list again in OnOpen to avoid having to
322 // enumerate the devices again. 360 // enumerate the devices again.
323 if (!use_fake_device_) { 361 if (!use_fake_device_) {
324 media::VideoCaptureDevice::GetDeviceNames(&result); 362 media::VideoCaptureDevice::GetDeviceNames(&result);
363 // Add to the cache the devices' supported capture formats.
tommi (sloooow) - chröme 2013/10/25 14:15:34 nit: sentence structure - it feels more natural to
mcasas 2013/10/28 12:50:08 Done.
364 media::VideoCaptureDevice::Names::iterator name_it;
365 for (name_it = result.begin(); name_it != result.end(); ++name_it) {
366 media::VideoCaptureDevice::GetDeviceSupportedFormats(
367 *name_it, &video_capture_capabilities_[name_it->id()] );
tommi (sloooow) - chröme 2013/10/25 14:15:34 before sending a pointer to the entry in the map,
mcasas 2013/10/28 12:50:08 I guess this doesn't apply since the map is gone.
368 }
325 } else { 369 } else {
326 media::FakeVideoCaptureDevice::GetDeviceNames(&result); 370 media::FakeVideoCaptureDevice::GetDeviceNames(&result);
371 // Add to the cache the devices' supported capture formats.
372 media::VideoCaptureDevice::Names::iterator name_it;
373 media::VideoCaptureCapabilities formats;
374 for (name_it = result.begin(); name_it != result.end(); ++name_it) {
375 media::FakeVideoCaptureDevice::GetDeviceSupportedFormats(
376 *name_it, &video_capture_capabilities_[name_it->id()] );
tommi (sloooow) - chröme 2013/10/25 14:15:34 same here
mcasas 2013/10/28 12:50:08 dixit.
377 }
327 } 378 }
328 379
329 // TODO(nick): The correctness of device start depends on this cache being 380 // TODO(nick): The correctness of device start depends on this cache being
330 // maintained, but it seems a little odd to keep a cache here. Can we 381 // maintained, but it seems a little odd to keep a cache here. Can we
331 // eliminate it? 382 // eliminate it?
332 video_capture_devices_ = result; 383 video_capture_devices_ = result;
333 break; 384 break;
334 385
335 case MEDIA_DESKTOP_VIDEO_CAPTURE: 386 case MEDIA_DESKTOP_VIDEO_CAPTURE:
336 // Do nothing. 387 // Do nothing.
337 break; 388 break;
338 389
339 default: 390 default:
340 NOTREACHED(); 391 NOTREACHED();
341 break; 392 break;
342 } 393 }
343 return result; 394 return result;
344 } 395 }
345 396
397 media::VideoCaptureCapabilities
398 VideoCaptureManager::GetDeviceCapabilitiesOnDeviceThread(
399 const StreamDeviceInfo& device_info) const {
400 DCHECK(IsOnDeviceThread());
401
402 // Find the device we are looking for and return its associated capabilities.
403 std::map<std::string, media::VideoCaptureCapabilities>::const_iterator it =
404 video_capture_capabilities_.find(device_info.device.id);
405 if ( it != video_capture_capabilities_.end())
tommi (sloooow) - chröme 2013/10/25 14:15:34 fix spaces
mcasas 2013/10/28 12:50:08 Done.
406 return it->second;
407 return media::VideoCaptureCapabilities();
408 }
409
346 VideoCaptureManager::DeviceEntry* 410 VideoCaptureManager::DeviceEntry*
347 VideoCaptureManager::GetDeviceEntryForMediaStreamDevice( 411 VideoCaptureManager::GetDeviceEntryForMediaStreamDevice(
348 const MediaStreamDevice& device_info) { 412 const MediaStreamDevice& device_info) {
349 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
350 414
351 for (DeviceEntries::iterator it = devices_.begin(); 415 for (DeviceEntries::iterator it = devices_.begin();
352 it != devices_.end(); ++it) { 416 it != devices_.end(); ++it) {
353 DeviceEntry* device = *it; 417 DeviceEntry* device = *it;
354 if (device_info.type == device->stream_type && 418 if (device_info.type == device->stream_type &&
355 device_info.id == device->id) { 419 device_info.id == device->id) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 scoped_ptr<VideoCaptureController> video_capture_controller( 479 scoped_ptr<VideoCaptureController> video_capture_controller(
416 new VideoCaptureController()); 480 new VideoCaptureController());
417 DeviceEntry* new_device = new DeviceEntry(device_info.type, 481 DeviceEntry* new_device = new DeviceEntry(device_info.type,
418 device_info.id, 482 device_info.id,
419 video_capture_controller.Pass()); 483 video_capture_controller.Pass());
420 devices_.insert(new_device); 484 devices_.insert(new_device);
421 return new_device; 485 return new_device;
422 } 486 }
423 487
424 } // namespace content 488 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698