Index: content/renderer/media/video_capture_impl_manager.h |
diff --git a/content/renderer/media/video_capture_impl_manager.h b/content/renderer/media/video_capture_impl_manager.h |
index 1b7c28b3fb7218017e03aa6b80eb3e57c062f4cc..005e70dd3e253aa0a58f5668c4c3a4509c8fa5c0 100644 |
--- a/content/renderer/media/video_capture_impl_manager.h |
+++ b/content/renderer/media/video_capture_impl_manager.h |
@@ -5,8 +5,8 @@ |
#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ |
#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ |
-#include <map> |
#include <memory> |
+#include <vector> |
#include "base/callback.h" |
#include "base/macros.h" |
@@ -77,6 +77,10 @@ class CONTENT_EXPORT VideoCaptureImplManager { |
// picture loss or quality issues). |
void RequestRefreshFrame(media::VideoCaptureSessionId id); |
+ // Requests frame delivery be suspended/resumed for a given capture session. |
+ void Suspend(media::VideoCaptureSessionId id); |
+ void Resume(media::VideoCaptureSessionId id); |
+ |
// Get supported formats supported by the device for the given session |
// ID. |callback| will be called on the IO thread. |
void GetDeviceSupportedFormats(media::VideoCaptureSessionId id, |
@@ -88,7 +92,9 @@ class CONTENT_EXPORT VideoCaptureImplManager { |
const VideoCaptureDeviceFormatsCB& callback); |
// Make all existing VideoCaptureImpl instances stop/resume delivering |
- // video frames to their clients, depends on flag |suspend|. |
+ // video frames to their clients, depends on flag |suspend|. This is called in |
+ // response to a RenderView-wide PageHidden/Shown() event. To suspend/resume |
+ // an individual session, please call Suspend(id) or Resume(id). |
void SuspendDevices(bool suspend); |
VideoCaptureMessageFilter* video_capture_message_filter() const { |
@@ -96,21 +102,19 @@ class CONTENT_EXPORT VideoCaptureImplManager { |
} |
protected: |
- virtual VideoCaptureImpl* CreateVideoCaptureImplForTesting( |
+ virtual std::unique_ptr<VideoCaptureImpl> CreateVideoCaptureImplForTesting( |
media::VideoCaptureSessionId id, |
VideoCaptureMessageFilter* filter) const; |
private: |
+ // Holds bookkeeping info for each VideoCaptureImpl shared by clients. |
+ struct DeviceEntry; |
+ |
void StopCapture(int client_id, media::VideoCaptureSessionId id); |
void UnrefDevice(media::VideoCaptureSessionId id); |
- // The int is used to count clients of the corresponding VideoCaptureImpl. |
- // VideoCaptureImpl objects are owned by this object. But they are |
- // destroyed on the IO thread. These are raw pointers because we destroy |
- // them manually. |
- typedef std::map<media::VideoCaptureSessionId, |
- std::pair<int, VideoCaptureImpl*>> VideoCaptureDeviceMap; |
- VideoCaptureDeviceMap devices_; |
+ // Devices currently in use. |
+ std::vector<DeviceEntry> devices_; |
// This is an internal ID for identifying clients of VideoCaptureImpl. |
// The ID is global for the render process. |
@@ -122,6 +126,11 @@ class CONTENT_EXPORT VideoCaptureImplManager { |
// right thread. |
const scoped_refptr<base::SingleThreadTaskRunner> render_main_task_runner_; |
+ // Set to true if SuspendDevices(true) was called. This, along with |
+ // DeviceEntry::is_individually_suspended, is used to determine whether to |
+ // take action when suspending/resuming each device. |
+ bool is_suspending_all_; |
+ |
// Bound to the render thread. |
// NOTE: Weak pointers must be invalidated before all other member variables. |
base::WeakPtrFactory<VideoCaptureImplManager> weak_factory_; |