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_; |