Index: content/browser/renderer_host/media/video_capture_manager.h |
diff --git a/content/browser/renderer_host/media/video_capture_manager.h b/content/browser/renderer_host/media/video_capture_manager.h |
index 82c61537ddf4ae17c735ca8c04dc14b4c41ecf13..5f3630eb6795781f372f0d8858c65772fe43c0b6 100644 |
--- a/content/browser/renderer_host/media/video_capture_manager.h |
+++ b/content/browser/renderer_host/media/video_capture_manager.h |
@@ -83,10 +83,28 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
VideoCaptureControllerID client_id, |
VideoCaptureControllerEventHandler* client_handler); |
+ // Retrieves the available capture supported formats for a particular device. |
+ // The supported formats are cached during device(s) enumeration. |
+ void GetDeviceSupportedFormats(int capture_session_id, |
+ media::VideoCaptureFormats* supported_formats); |
+ |
private: |
virtual ~VideoCaptureManager(); |
struct DeviceEntry; |
+ // This data structure is a convenient wrap of a devices' name and associated |
+ // video capture supported formats. |
+ struct DeviceInfo { |
+ DeviceInfo(); |
+ DeviceInfo(const media::VideoCaptureDevice::Name& name, |
+ const media::VideoCaptureFormats& supported_formats); |
+ ~DeviceInfo(); |
+ |
+ media::VideoCaptureDevice::Name name; |
+ media::VideoCaptureFormats supported_formats; |
+ }; |
+ typedef std::vector<DeviceInfo> DeviceInfos; |
+ |
// Check to see if |entry| has no clients left on its controller. If so, |
// remove it from the list of devices, and delete it asynchronously. |entry| |
// may be freed by this function. |
@@ -95,8 +113,9 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
// Helpers to report an event to our Listener. |
void OnOpened(MediaStreamType type, int capture_session_id); |
void OnClosed(MediaStreamType type, int capture_session_id); |
- void OnDevicesEnumerated(MediaStreamType stream_type, |
- const media::VideoCaptureDevice::Names& names); |
+ void OnDevicesInfoEnumerated( |
+ MediaStreamType stream_type, |
+ const DeviceInfos& new_devices_info_cache); |
// Find a DeviceEntry by its device ID and type, if it is already opened. |
DeviceEntry* GetDeviceEntryForMediaStreamDevice( |
@@ -112,9 +131,13 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
bool IsOnDeviceThread() const; |
- // Queries and returns the available device IDs. |
- media::VideoCaptureDevice::Names GetAvailableDevicesOnDeviceThread( |
- MediaStreamType stream_type); |
+ // Queries the Names of the devices in the system; the formats supported by |
+ // the new devices are also queried, and consolidated with the copy of the |
+ // local device info cache passed. The consolidated list of devices and |
+ // supported formats is returned. |
+ DeviceInfos GetAvailableDevicesInfoOnDeviceThread( |
+ MediaStreamType stream_type, |
+ const DeviceInfos& old_device_info_cache); |
// Create and Start a new VideoCaptureDevice, storing the result in |
// |entry->video_capture_device|. Ownership of |client| passes to |
@@ -128,6 +151,9 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
// |entry->video_capture_device|. |
void DoStopDeviceOnDeviceThread(DeviceEntry* entry); |
+ DeviceInfo* FindDeviceInfoById(const std::string& id, |
+ DeviceInfos& device_vector); |
+ |
// The message loop of media stream device thread, where VCD's live. |
scoped_refptr<base::MessageLoopProxy> device_loop_; |
@@ -168,6 +194,15 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
typedef std::set<DeviceEntry*> DeviceEntries; |
DeviceEntries devices_; |
+ // Local cache of the enumerated video capture devices' names and capture |
+ // supported formats. A snapshot of the current devices and their capabilities |
+ // is composed in GetAvailableDevicesInfoOnDeviceThread() --coming |
+ // from EnumerateDevices()--, and this snapshot is used to update this list in |
+ // OnDevicesInfoEnumerated(). GetDeviceSupportedFormats() will |
+ // use this list if the device is not started, otherwise it will retrieve the |
+ // active device capture format from the VideoCaptureController associated. |
+ DeviceInfos devices_info_cache_; |
+ |
// For unit testing and for performance/quality tests, a test device can be |
// used instead of a real one. The device can be a simple fake device (a |
// rolling pacman), or a file that is played in a loop continuously. This only |
@@ -178,12 +213,6 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
Y4M_FILE |
} artificial_device_source_for_testing_; |
- // We cache the enumerated video capture devices in |
- // GetAvailableDevicesOnDeviceThread() and then later look up the requested ID |
- // when a device is created in DoStartDeviceOnDeviceThread(). Used only on the |
- // device thread. |
- media::VideoCaptureDevice::Names video_capture_devices_; |
- |
DISALLOW_COPY_AND_ASSIGN(VideoCaptureManager); |
}; |