Chromium Code Reviews| 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 58ed04b6be5e8040f65fca8f6a3ca006a32ff19a..f8bc4b35bde24acd3a85178f2f5d86f8987a6834 100644 |
| --- a/content/browser/renderer_host/media/video_capture_manager.h |
| +++ b/content/browser/renderer_host/media/video_capture_manager.h |
| @@ -12,11 +12,13 @@ |
| #ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_MANAGER_H_ |
| #define CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_MANAGER_H_ |
| +#include <list> |
| #include <map> |
| #include <set> |
| #include <string> |
| #include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_vector.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/process/process_handle.h" |
| @@ -182,18 +184,34 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
| const media::VideoCaptureDeviceInfos& old_device_info_cache, |
| scoped_ptr<media::VideoCaptureDevice::Names> names_snapshot); |
| - // Creates and Starts a new VideoCaptureDevice, storing the result in |
| - // |entry->video_capture_device|. Ownership of |client| passes to |
| + // Starting a capture device can take 1-2 seconds. |
| + // To avoid multiple unnecessary start/stop commands to the OS, each start |
| + // request is queued in |device_start_queue_|. |
| + // QueueStartDevice creates a new entry in |device_start_queue_| and posts a |
| + // request to start the device on the device thread unless there is |
| + // another request pending start. |
| + void QueueStartDevice(media::VideoCaptureSessionId session_id, |
| + DeviceEntry* entry, |
| + const media::VideoCaptureParams& params); |
| + void OnDeviceStarted(DeviceEntry* device_entry, |
| + scoped_ptr<media::VideoCaptureDevice> device); |
| + void DoStopDevice(DeviceEntry* entry); |
| + void HandleQueuedStartRequest(); |
| + |
| + // Creates and Starts a new VideoCaptureDevice. The resulting |
| + // VideoCaptureDevice is returned to the IO-thread and stored in |
| + // a DeviceEntry in |devices_|. Ownership of |client| passes to |
| // the device. |
| - void DoStartDeviceOnDeviceThread( |
| + scoped_ptr<media::VideoCaptureDevice> DoStartDeviceOnDeviceThread( |
| media::VideoCaptureSessionId session_id, |
| - DeviceEntry* entry, |
| + const std::string& device_id, |
| + MediaStreamType stream_type, |
| const media::VideoCaptureParams& params, |
| scoped_ptr<media::VideoCaptureDevice::Client> client); |
| // Stops and destroys the VideoCaptureDevice held in |
| - // |entry->video_capture_device|. |
| - void DoStopDeviceOnDeviceThread(DeviceEntry* entry); |
| + // |device|. |
| + void DoStopDeviceOnDeviceThread(scoped_ptr<media::VideoCaptureDevice> device); |
| media::VideoCaptureDeviceInfo* FindDeviceInfoById( |
| const std::string& id, |
| @@ -226,9 +244,7 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
| // when they are not used any longer. |
| // |
| // The set of currently started VideoCaptureDevice and VideoCaptureController |
| - // objects is only accessed from IO thread, though the DeviceEntry instances |
| - // themselves may visit to the device thread for device creation and |
| - // destruction. |
| + // objects is only accessed from IO thread. |
| struct DeviceEntry { |
| DeviceEntry(MediaStreamType stream_type, |
| const std::string& id, |
| @@ -244,9 +260,24 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { |
| // The capture device. Only used from the device thread. |
| scoped_ptr<media::VideoCaptureDevice> video_capture_device; |
| }; |
| - typedef std::set<DeviceEntry*> DeviceEntries; |
| + typedef ScopedVector<DeviceEntry> DeviceEntries; |
|
tommi (sloooow) - chröme
2014/12/16 22:31:25
nit: empty line before this one
perkj_chrome
2014/12/17 10:14:10
Done.
|
| + // Currently opened devices. The device may or may not be started. |
| DeviceEntries devices_; |
| + // Struct used for queing request for starting a device. |
| + struct CaptureDeviceStartRequest { |
| + CaptureDeviceStartRequest( |
| + DeviceEntry* entry, |
| + media::VideoCaptureSessionId session_id, |
| + const media::VideoCaptureParams& params); |
| + |
| + DeviceEntry* entry; // Owned by |devices_| |
|
tommi (sloooow) - chröme
2014/12/16 22:31:25
do we use this pointer? (If it's only used for loo
perkj_chrome
2014/12/17 10:14:10
Well, its used in HandleQueuedStartRequest() but w
tommi (sloooow) - chröme
2014/12/17 14:46:12
What about making this pointer type a void* to mak
|
| + media::VideoCaptureSessionId session_id; |
| + media::VideoCaptureParams params; |
| + }; |
| + typedef std::list<CaptureDeviceStartRequest> DeviceStartQueue; |
|
tommi (sloooow) - chröme
2014/12/16 22:31:25
nit: empty line above
perkj_chrome
2014/12/17 10:14:10
Done.
perkj_chrome
2014/12/17 10:14:10
Done.
|
| + DeviceStartQueue device_start_queue_; |
| + |
| // Device creation factory injected on construction from MediaStreamManager or |
| // from the test harness. |
| scoped_ptr<media::VideoCaptureDeviceFactory> video_capture_device_factory_; |