| 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); | 
| }; | 
|  | 
|  |