// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // VideoCaptureImplManager manages video capture devices in renderer process. // The video capture clients use AddDevice() to get a pointer to // video capture device. VideoCaputreImplManager supports multiple clients // accessing same device. #ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ #define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ #include #include #include "base/message_loop/message_loop_proxy.h" #include "base/threading/thread.h" #include "base/synchronization/lock.h" #include "content/common/content_export.h" #include "media/video/capture/video_capture.h" namespace content { class VideoCaptureImpl; class VideoCaptureMessageFilter; class CONTENT_EXPORT VideoCaptureImplManager : public base::RefCountedThreadSafe { public: VideoCaptureImplManager(); // Called by video capture client |handler| to add device referenced // by |id| to VideoCaptureImplManager's list of opened device list. // A pointer to VideoCapture is returned to client so that client can // operate on that pointer, such as StartCaptrue, StopCapture. virtual media::VideoCapture* AddDevice( media::VideoCaptureSessionId id, media::VideoCapture::EventHandler* handler); // Called by video capture client |handler| to remove device referenced // by |id| from VideoCaptureImplManager's list of opened device list. virtual void RemoveDevice(media::VideoCaptureSessionId id, media::VideoCapture::EventHandler* handler); // Make all existing VideoCaptureImpl instances stop/resume delivering // video frames to their clients, depends on flag |suspend|. virtual void SuspendDevices(bool suspend); VideoCaptureMessageFilter* video_capture_message_filter() const { return filter_.get(); } protected: virtual ~VideoCaptureImplManager(); private: friend class base::RefCountedThreadSafe; struct Device { Device(VideoCaptureImpl* device, media::VideoCapture::EventHandler* handler); ~Device(); VideoCaptureImpl* vc; std::list clients; }; void FreeDevice(VideoCaptureImpl* vc); typedef std::map Devices; Devices devices_; base::Lock lock_; scoped_refptr filter_; base::Thread thread_; scoped_refptr message_loop_proxy_; DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager); }; } // namespace content #endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_