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..8bf7ddc1609b50dbd89eb60ae31037100f800561 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(int serial_id, |
+ 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,15 +244,14 @@ 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, |
scoped_ptr<VideoCaptureController> controller); |
~DeviceEntry(); |
+ const int serial_id; |
const MediaStreamType stream_type; |
const std::string id; |
@@ -244,9 +261,39 @@ 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; |
+ // Currently opened devices. The device may or may not be started. |
DeviceEntries devices_; |
+ // Class used for queuing request for starting a device. |
+ class CaptureDeviceStartRequest { |
+ public: |
+ CaptureDeviceStartRequest( |
+ int serial_id, |
+ media::VideoCaptureSessionId session_id, |
+ const media::VideoCaptureParams& params); |
+ int serial_id() const { return serial_id_;} |
+ media::VideoCaptureSessionId session_id() const { return session_id_; } |
+ media::VideoCaptureParams params() const { return params_; } |
+ |
+ // Set to true if the device should be stopped before it has successfully |
+ // been started. |
+ bool abort_start() const { return abort_start_; } |
+ void set_abort_start() { abort_start_ = true; } |
+ |
+ private: |
+ const int serial_id_; |
+ const media::VideoCaptureSessionId session_id_; |
+ const media::VideoCaptureParams params_; |
+ // Set to true if the device should be stopped before it has successfully |
+ // been started. |
+ bool abort_start_; |
+ }; |
+ |
+ typedef std::list<CaptureDeviceStartRequest> DeviceStartQueue; |
+ 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_; |