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 e13e1573ccda9a1f71fc329db1415a1dfc71bb65..7ddfe507b9b924a1bd2920fb311539d87a6d2af3 100644 |
--- a/content/browser/renderer_host/media/video_capture_manager.cc |
+++ b/content/browser/renderer_host/media/video_capture_manager.cc |
@@ -330,8 +330,8 @@ void VideoCaptureManager::Close(int capture_session_id) { |
return; |
} |
- DeviceEntry* const existing_device = GetDeviceEntryForMediaStreamDevice( |
- session_it->second); |
+ DeviceEntry* const existing_device = |
+ GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id); |
if (existing_device) { |
// Remove any client that is still using the session. This is safe to call |
// even if there are no clients using the session. |
@@ -363,7 +363,12 @@ void VideoCaptureManager::QueueStartDevice( |
void VideoCaptureManager::DoStopDevice(DeviceEntry* entry) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(std::find(devices_.begin(), devices_.end(), entry) != devices_.end()); |
+ // TODO(mcasas): use a helper function https://crbug.com/624854. |
+ DCHECK( |
+ std::find_if(devices_.begin(), devices_.end(), |
+ [entry](const std::unique_ptr<DeviceEntry>& device_entry) { |
+ return device_entry.get() == entry; |
+ }) != devices_.end()); |
// Find the matching start request. |
for (DeviceStartQueue::reverse_iterator request = |
@@ -403,13 +408,8 @@ void VideoCaptureManager::HandleQueuedStartRequest() { |
return; |
const int serial_id = request->serial_id(); |
- DeviceEntries::iterator entry_it = std::find_if( |
- devices_.begin(), devices_.end(), |
- [serial_id] (const DeviceEntry* e) { |
- return e->serial_id == serial_id; |
- }); |
- DCHECK(entry_it != devices_.end()); |
- DeviceEntry* entry = (*entry_it); |
+ DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id); |
+ DCHECK(entry); |
#if defined(OS_MACOSX) |
if (NeedToInitializeCaptureDeviceApi(entry->stream_type)) { |
@@ -430,8 +430,7 @@ void VideoCaptureManager::HandleQueuedStartRequest() { |
// We look up the device id from the renderer in our local enumeration |
// since the renderer does not have all the information that might be |
// held in the browser-side VideoCaptureDevice::Name structure. |
- const media::VideoCaptureDeviceInfo* found = |
- FindDeviceInfoById(entry->id, devices_info_cache_); |
+ const media::VideoCaptureDeviceInfo* found = GetDeviceInfoById(entry->id); |
if (found) { |
entry->video_capture_controller()->DoLogOnIOThread(base::StringPrintf( |
"Starting device: id: %s, name: %s, api: %s", |
@@ -506,13 +505,8 @@ void VideoCaptureManager::OnDeviceStarted( |
device_ptr->StopAndDeAllocate(); |
} |
} else { |
- DeviceEntries::iterator entry_it = std::find_if( |
- devices_.begin(), devices_.end(), |
- [serial_id] (const DeviceEntry* e) { |
- return e->serial_id == serial_id; |
- }); |
- DCHECK(entry_it != devices_.end()); |
- DeviceEntry* entry = *entry_it; |
+ DeviceEntry* const entry = GetDeviceEntryBySerialId(serial_id); |
+ DCHECK(entry); |
DCHECK(!entry->video_capture_device()); |
entry->SetVideoCaptureDevice(std::move(device)); |
@@ -649,7 +643,7 @@ void VideoCaptureManager::StopCaptureForClient( |
DCHECK(controller); |
DCHECK(client_handler); |
- DeviceEntry* entry = GetDeviceEntryForController(controller); |
+ DeviceEntry* entry = GetDeviceEntryByController(controller); |
if (!entry) { |
NOTREACHED(); |
return; |
@@ -693,11 +687,9 @@ void VideoCaptureManager::PauseCaptureForClient( |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(controller); |
DCHECK(client_handler); |
- DeviceEntry* entry = GetDeviceEntryForController(controller); |
- if (!entry) { |
- NOTREACHED(); |
- DVLOG(1) << "Got Null entry while pausing capture"; |
- } |
+ DeviceEntry* entry = GetDeviceEntryByController(controller); |
+ if (!entry) |
+ NOTREACHED() << "Got Null entry while pausing capture"; |
// Do not pause Content Video Capture devices, e.g. Tab or Screen capture. |
if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE) |
@@ -716,11 +708,9 @@ void VideoCaptureManager::ResumeCaptureForClient( |
DCHECK(controller); |
DCHECK(client_handler); |
- DeviceEntry* entry = GetDeviceEntryForController(controller); |
- if (!entry) { |
- NOTREACHED(); |
- DVLOG(1) << "Got Null entry while resuming capture"; |
- } |
+ DeviceEntry* entry = GetDeviceEntryByController(controller); |
+ if (!entry) |
+ NOTREACHED() << "Got Null entry while resuming capture"; |
// Do not resume Content Video Capture devices, e.g. Tab or Screen capture. |
if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE) |
@@ -733,7 +723,7 @@ void VideoCaptureManager::RequestRefreshFrameForClient( |
VideoCaptureController* controller) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (DeviceEntry* entry = GetDeviceEntryForController(controller)) { |
+ if (DeviceEntry* entry = GetDeviceEntryByController(controller)) { |
if (media::VideoCaptureDevice* device = entry->video_capture_device()) { |
device_task_runner_->PostTask( |
FROM_HERE, |
@@ -760,7 +750,7 @@ bool VideoCaptureManager::GetDeviceSupportedFormats( |
// Return all available formats of the device, regardless its started state. |
media::VideoCaptureDeviceInfo* existing_device = |
- FindDeviceInfoById(it->second.id, devices_info_cache_); |
+ GetDeviceInfoById(it->second.id); |
if (existing_device) |
*supported_formats = existing_device->supported_formats; |
return true; |
@@ -779,7 +769,7 @@ bool VideoCaptureManager::GetDeviceFormatsInUse( |
// Return the currently in-use format(s) of the device, if it's started. |
DeviceEntry* device_in_use = |
- GetDeviceEntryForMediaStreamDevice(it->second); |
+ GetDeviceEntryByTypeAndId(it->second.type, it->second.id); |
if (device_in_use) { |
// Currently only one format-in-use is supported at the VCC level. |
formats_in_use->push_back( |
@@ -801,12 +791,11 @@ void VideoCaptureManager::SetDesktopCaptureWindowId( |
void VideoCaptureManager::MaybePostDesktopCaptureWindowId( |
media::VideoCaptureSessionId session_id) { |
SessionMap::iterator session_it = sessions_.find(session_id); |
- if (session_it == sessions_.end()) { |
+ if (session_it == sessions_.end()) |
return; |
- } |
DeviceEntry* const existing_device = |
- GetDeviceEntryForMediaStreamDevice(session_it->second); |
+ GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id); |
if (!existing_device) { |
DVLOG(2) << "Failed to find an existing screen capture device."; |
return; |
@@ -846,7 +835,7 @@ void VideoCaptureManager::GetPhotoCapabilities( |
media::ScopedResultCallback< |
VideoCaptureDevice::GetPhotoCapabilitiesCallback> callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- VideoCaptureDevice* device = GetVideoCaptureDeviceFromSessionId(session_id); |
+ VideoCaptureDevice* device = GetVideoCaptureDeviceBySessionId(session_id); |
if (!device) |
return; |
// Unretained(device) is safe to use here because |device| would be null if it |
@@ -862,7 +851,7 @@ void VideoCaptureManager::TakePhoto( |
media::ScopedResultCallback<VideoCaptureDevice::TakePhotoCallback> |
callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- VideoCaptureDevice* device = GetVideoCaptureDeviceFromSessionId(session_id); |
+ VideoCaptureDevice* device = GetVideoCaptureDeviceBySessionId(session_id); |
if (!device) |
return; |
// Unretained(device) is safe to use here because |device| would be null if it |
@@ -968,61 +957,85 @@ void VideoCaptureManager::ConsolidateDevicesInfoOnDeviceThread( |
on_devices_enumerated_callback.Run(new_devices_info_cache); |
} |
-VideoCaptureManager::DeviceEntry* |
-VideoCaptureManager::GetDeviceEntryForMediaStreamDevice( |
- const MediaStreamDevice& device_info) { |
+void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ // Removal of the last client stops the device. |
+ if (!entry->video_capture_controller()->HasActiveClient() && |
+ !entry->video_capture_controller()->HasPausedClient()) { |
+ DVLOG(1) << "VideoCaptureManager stopping device (type = " |
+ << entry->stream_type << ", id = " << entry->id << ")"; |
- for (DeviceEntry* device : devices_) { |
- if (device_info.type == device->stream_type && device_info.id == device->id) |
- return device; |
+ // The DeviceEntry is removed from |devices_| immediately. The controller is |
+ // deleted immediately, and the device is freed asynchronously. After this |
+ // point, subsequent requests to open this same device ID will create a new |
+ // DeviceEntry, VideoCaptureController, and VideoCaptureDevice. |
+ DoStopDevice(entry); |
+ // TODO(mcasas): use a helper function https://crbug.com/624854. |
+ DeviceEntries::iterator device_it = |
+ std::find_if(devices_.begin(), devices_.end(), |
+ [entry](const std::unique_ptr<DeviceEntry>& device_entry) { |
+ return device_entry.get() == entry; |
+ }); |
+ devices_.erase(device_it); |
} |
- return nullptr; |
} |
media::VideoCaptureDevice* |
-VideoCaptureManager::GetVideoCaptureDeviceFromSessionId(int session_id) { |
+VideoCaptureManager::GetVideoCaptureDeviceBySessionId(int session_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
SessionMap::const_iterator session_it = sessions_.find(session_id); |
if (session_it == sessions_.end()) |
return nullptr; |
DeviceEntry* const device_info = |
- GetDeviceEntryForMediaStreamDevice(session_it->second); |
- if (!device_info) |
- return nullptr; |
- return device_info->video_capture_device(); |
+ GetDeviceEntryByTypeAndId(session_it->second.type, session_it->second.id); |
+ return device_info ? device_info->video_capture_device() : nullptr; |
} |
VideoCaptureManager::DeviceEntry* |
-VideoCaptureManager::GetDeviceEntryForController( |
+VideoCaptureManager::GetDeviceEntryByTypeAndId( |
+ MediaStreamType type, |
+ const std::string& device_id) const { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
+ for (const std::unique_ptr<DeviceEntry>& device : devices_) { |
+ if (type == device->stream_type && device_id == device->id) |
+ return device.get(); |
+ } |
+ return nullptr; |
+} |
+ |
+VideoCaptureManager::DeviceEntry* |
+VideoCaptureManager::GetDeviceEntryByController( |
const VideoCaptureController* controller) const { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
// Look up |controller| in |devices_|. |
- for (DeviceEntry* device : devices_) { |
+ for (const std::unique_ptr<DeviceEntry>& device : devices_) { |
if (device->video_capture_controller() == controller) |
- return device; |
+ return device.get(); |
} |
return nullptr; |
} |
-void VideoCaptureManager::DestroyDeviceEntryIfNoClients(DeviceEntry* entry) { |
+VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetDeviceEntryBySerialId( |
+ int serial_id) const { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- // Removal of the last client stops the device. |
- if (!entry->video_capture_controller()->HasActiveClient() && |
- !entry->video_capture_controller()->HasPausedClient()) { |
- DVLOG(1) << "VideoCaptureManager stopping device (type = " |
- << entry->stream_type << ", id = " << entry->id << ")"; |
- // The DeviceEntry is removed from |devices_| immediately. The controller is |
- // deleted immediately, and the device is freed asynchronously. After this |
- // point, subsequent requests to open this same device ID will create a new |
- // DeviceEntry, VideoCaptureController, and VideoCaptureDevice. |
- DoStopDevice(entry); |
- DeviceEntries::iterator device_it = std::find(devices_.begin(), |
- devices_.end(), |
- entry); |
- devices_.erase(device_it); |
+ for (const std::unique_ptr<DeviceEntry>& device : devices_) { |
+ if (device->serial_id == serial_id) |
+ return device.get(); |
} |
+ return nullptr; |
+} |
+ |
+media::VideoCaptureDeviceInfo* VideoCaptureManager::GetDeviceInfoById( |
+ const std::string& id) { |
+ for (auto& it : devices_info_cache_) { |
+ if (it.name.id() == id) |
+ return ⁢ |
+ } |
+ return nullptr; |
} |
VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry( |
@@ -1038,7 +1051,7 @@ VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry( |
// Check if another session has already opened this device. If so, just |
// use that opened device. |
DeviceEntry* const existing_device = |
- GetDeviceEntryForMediaStreamDevice(device_info); |
+ GetDeviceEntryByTypeAndId(device_info.type, device_info.id); |
if (existing_device) { |
DCHECK_EQ(device_info.type, existing_device->stream_type); |
return existing_device; |
@@ -1051,20 +1064,10 @@ VideoCaptureManager::DeviceEntry* VideoCaptureManager::GetOrCreateDeviceEntry( |
DeviceEntry* new_device = |
new DeviceEntry(device_info.type, device_info.id, |
std::move(video_capture_controller), params); |
- devices_.push_back(new_device); |
+ devices_.emplace_back(new_device); |
return new_device; |
} |
-media::VideoCaptureDeviceInfo* VideoCaptureManager::FindDeviceInfoById( |
- const std::string& id, |
- media::VideoCaptureDeviceInfos& device_vector) { |
- for (auto& it : device_vector) { |
- if (it.name.id() == id) |
- return &(it); |
- } |
- return nullptr; |
-} |
- |
void VideoCaptureManager::SetDesktopCaptureWindowIdOnDeviceThread( |
media::VideoCaptureDevice* device, |
gfx::NativeViewId window_id) { |
@@ -1128,7 +1131,7 @@ void VideoCaptureManager::ReleaseDevices() { |
if (entry->stream_type != MEDIA_DEVICE_VIDEO_CAPTURE) |
continue; |
- DoStopDevice(entry); |
+ DoStopDevice(entry.get()); |
} |
} |
@@ -1154,7 +1157,7 @@ void VideoCaptureManager::ResumeDevices() { |
if (!device_in_queue) { |
// Session ID is only valid for Screen capture. So we can fake it to |
// resume video capture devices here. |
- QueueStartDevice(kFakeSessionId, entry, entry->parameters); |
+ QueueStartDevice(kFakeSessionId, entry.get(), entry->parameters); |
} |
} |
} |