Chromium Code Reviews| Index: content/browser/renderer_host/media/video_capture_manager.cc |
| diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc |
| index b271583a3e13c18da5826d55de12a1f98e73f25b..2c46693a2e35b98161ac3cfdfeaaeae096550146 100644 |
| --- a/content/browser/renderer_host/media/video_capture_manager.cc |
| +++ b/content/browser/renderer_host/media/video_capture_manager.cc |
| @@ -150,6 +150,12 @@ void VideoCaptureManager::DoStartDeviceOnDeviceThread( |
| video_capture_device.reset(use_fake_device_ ? |
| media::FakeVideoCaptureDevice::Create(*found) : |
| media::VideoCaptureDevice::Create(*found)); |
| + |
| + // 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.
|
| + media::VideoCaptureCapabilities& formats = |
| + video_capture_capabilities_[entry->id]; |
| + formats.clear(); |
| + formats.push_back(capture_params); |
| } |
| break; |
| } |
| @@ -253,6 +259,23 @@ void VideoCaptureManager::StopCaptureForClient( |
| DestroyDeviceEntryIfNoClients(entry); |
| } |
| +void VideoCaptureManager::EnumerateDeviceCapabilities( |
| + const StreamDeviceInfo& device_info) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + DVLOG(1) << "VideoCaptureManager::EnumerateDeviceCapabilites for device: " |
| + << device_info.device.name; |
| + DCHECK(listener_); |
| + base::PostTaskAndReplyWithResult( |
| + device_loop_, |
| + FROM_HERE, |
| + base::Bind(&VideoCaptureManager::GetDeviceCapabilitiesOnDeviceThread, |
| + this, |
| + device_info), |
| + base::Bind(&VideoCaptureManager::OnDeviceCapabilitiesEnumerated, |
| + this, |
| + device_info)); |
| +} |
| + |
| void VideoCaptureManager::DoStopDeviceOnDeviceThread(DeviceEntry* entry) { |
| SCOPED_UMA_HISTOGRAM_TIMER("Media.VideoCaptureManager.StopDeviceTime"); |
| DCHECK(IsOnDeviceThread()); |
| @@ -291,6 +314,7 @@ void VideoCaptureManager::OnDevicesEnumerated( |
| // Listener has been removed. |
| return; |
| } |
| + 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.
|
| // Transform from VCD::Name to StreamDeviceInfo. |
| StreamDeviceInfoArray devices; |
| @@ -303,6 +327,20 @@ void VideoCaptureManager::OnDevicesEnumerated( |
| listener_->DevicesEnumerated(stream_type, devices); |
| } |
| +void VideoCaptureManager::OnDeviceCapabilitiesEnumerated( |
| + const StreamDeviceInfo& device_info, |
| + const media::VideoCaptureCapabilities& capabilities) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + if (!listener_) { |
| + // Listener has been removed. |
| + return; |
| + } |
| + 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.
|
| + << device_info.device.id; |
| + listener_->DeviceCapabilitiesEnumerated(device_info, capabilities); |
| +} |
| + |
| bool VideoCaptureManager::IsOnDeviceThread() const { |
| return device_loop_->BelongsToCurrentThread(); |
| } |
| @@ -322,8 +360,21 @@ VideoCaptureManager::GetAvailableDevicesOnDeviceThread( |
| // enumerate the devices again. |
| if (!use_fake_device_) { |
| media::VideoCaptureDevice::GetDeviceNames(&result); |
| + // 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.
|
| + media::VideoCaptureDevice::Names::iterator name_it; |
| + for (name_it = result.begin(); name_it != result.end(); ++name_it) { |
| + media::VideoCaptureDevice::GetDeviceSupportedFormats( |
| + *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.
|
| + } |
| } else { |
| media::FakeVideoCaptureDevice::GetDeviceNames(&result); |
| + // Add to the cache the devices' supported capture formats. |
| + media::VideoCaptureDevice::Names::iterator name_it; |
| + media::VideoCaptureCapabilities formats; |
| + for (name_it = result.begin(); name_it != result.end(); ++name_it) { |
| + media::FakeVideoCaptureDevice::GetDeviceSupportedFormats( |
| + *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.
|
| + } |
| } |
| // TODO(nick): The correctness of device start depends on this cache being |
| @@ -343,6 +394,19 @@ VideoCaptureManager::GetAvailableDevicesOnDeviceThread( |
| return result; |
| } |
| +media::VideoCaptureCapabilities |
| +VideoCaptureManager::GetDeviceCapabilitiesOnDeviceThread( |
| + const StreamDeviceInfo& device_info) const { |
| + DCHECK(IsOnDeviceThread()); |
| + |
| + // Find the device we are looking for and return its associated capabilities. |
| + std::map<std::string, media::VideoCaptureCapabilities>::const_iterator it = |
| + video_capture_capabilities_.find(device_info.device.id); |
| + 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.
|
| + return it->second; |
| + return media::VideoCaptureCapabilities(); |
| +} |
| + |
| VideoCaptureManager::DeviceEntry* |
| VideoCaptureManager::GetDeviceEntryForMediaStreamDevice( |
| const MediaStreamDevice& device_info) { |