| 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 6f0b0ec4702dedd2e9e2f43caecee942542ec5e8..925e01e2102f3e01aca09a853ae598b67de6f3b8 100644
|
| --- a/content/browser/renderer_host/media/video_capture_manager.h
|
| +++ b/content/browser/renderer_host/media/video_capture_manager.h
|
| @@ -17,6 +17,7 @@
|
| #include <string>
|
|
|
| #include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_vector.h"
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/process/process_handle.h"
|
| #include "content/browser/renderer_host/media/media_stream_provider.h"
|
| @@ -59,7 +60,8 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider {
|
| // Called by VideoCaptureHost to locate a capture device for |capture_params|,
|
| // adding the Host as a client of the device's controller if successful. The
|
| // value of |capture_params.session_id| controls which device is selected;
|
| - // this value should be a session id previously returned by Open().
|
| + // this value should be a session id previously returned by Open(). The device
|
| + // capabilities are reduced to |capture_params|.
|
| //
|
| // If the device is not already started (i.e., no other client is currently
|
| // capturing from this device), this call will cause a VideoCaptureController
|
| @@ -82,9 +84,16 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider {
|
| VideoCaptureControllerID client_id,
|
| VideoCaptureControllerEventHandler* client_handler);
|
|
|
| + // Retrieve the available capture capabilities for a particular device. The
|
| + // capabilities are cached during device(s) enumeration and updated as clients
|
| + // open/close the device(s).
|
| + void GetDeviceCapabilities(int capture_session_id,
|
| + media::VideoCaptureCapabilities* capabilities);
|
| +
|
| private:
|
| virtual ~VideoCaptureManager();
|
| struct DeviceEntry;
|
| + struct DeviceInfo;
|
|
|
| // 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|
|
| @@ -94,8 +103,13 @@ 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 OnDeviceNamesEnumerated(
|
| + MediaStreamType stream_type,
|
| + const media::VideoCaptureDevice::Names& names_snapshot);
|
| + void OnDeviceNameAndCapabilitiesEnumerated(
|
| + MediaStreamType stream_type,
|
| + const media::VideoCaptureDevice::Names& names_snapshot,
|
| + ScopedVector<DeviceInfo> new_devices_info);
|
|
|
| // Find a DeviceEntry by its device ID and type, if it is already opened.
|
| DeviceEntry* GetDeviceEntryForMediaStreamDevice(
|
| @@ -115,11 +129,16 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider {
|
| media::VideoCaptureDevice::Names GetAvailableDevicesOnDeviceThread(
|
| MediaStreamType stream_type);
|
|
|
| + // Queries and returns the capabilities of all the devices in |device_names|.
|
| + ScopedVector<DeviceInfo> GetDevicesCapabilitiesOnDeviceThread(
|
| + const media::VideoCaptureDevice::Names& device_names);
|
| +
|
| // Create and Start a new VideoCaptureDevice, storing the result in
|
| // |entry->video_capture_device|. Ownership of |client| passes to
|
| // the device.
|
| void DoStartDeviceOnDeviceThread(
|
| DeviceEntry* entry,
|
| + const media::VideoCaptureDevice::Name* device_name,
|
| const media::VideoCaptureCapability& capture_params,
|
| scoped_ptr<media::VideoCaptureDevice::Client> client);
|
|
|
| @@ -127,6 +146,8 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider {
|
| // |entry->video_capture_device|.
|
| void DoStopDeviceOnDeviceThread(DeviceEntry* entry);
|
|
|
| + DeviceInfo* FindDeviceInfoById(const std::string& id);
|
| +
|
| // The message loop of media stream device thread, where VCD's live.
|
| scoped_refptr<base::MessageLoopProxy> device_loop_;
|
|
|
| @@ -171,11 +192,27 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider {
|
| // default. This is only used for the MEDIA_DEVICE_VIDEO_CAPTURE device type.
|
| bool use_fake_device_;
|
|
|
| - // 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_;
|
| + // This struct is a convenient wrap of a devices' name and associated video
|
| + // capture capabilities.
|
| + struct DeviceInfo {
|
| + DeviceInfo();
|
| + DeviceInfo(const media::VideoCaptureDevice::Name& name,
|
| + const media::VideoCaptureCapabilities& capabilities);
|
| + ~DeviceInfo();
|
| +
|
| + bool device_in_use_;
|
| + media::VideoCaptureCapability capability_in_use_;
|
| + media::VideoCaptureDevice::Name name_;
|
| + media::VideoCaptureCapabilities capabilities_;
|
| + };
|
| + // Local cache of the enumerated video capture devices' names and capture
|
| + // capabilities. The creation/update works as following: EnumeratedDevices()
|
| + // jumps to GetAvailableDevicesOnDeviceThread() and OnDeviceNamesEnumerated().
|
| + // From there, a posttask-reply GetDevicesCapabilitiesOnDeviceThread() and
|
| + // OnDeviceNameAndCapabilitiesEnumerated() is carried out. From the last one,
|
| + // the |listener_| OnDevicesEnumerated is called. The cache is only used in
|
| + // Browser::IO thread.
|
| + ScopedVector<DeviceInfo> devices_info_cache_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(VideoCaptureManager);
|
| };
|
|
|