1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // VideoCaptureImplManager manages video capture devices in renderer process. 6 // The video capture clients use AddDevice() to get a pointer to 7 // video capture device. VideoCaputreImplManager supports multiple clients 8 // accessing same device. 9 10 #ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 11 #define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 12 13 #include <list> 14 #include <map> 15 16 #include "base/message_loop/message_loop_proxy.h" 17 #include "base/threading/thread.h" 18 #include "base/synchronization/lock.h" 19 #include "content/common/content_export.h" 20 #include "media/video/capture/video_capture.h" 21 22 namespace content { 23 24 class VideoCaptureImpl; 25 class VideoCaptureMessageFilter; 26 27 class CONTENT_EXPORT VideoCaptureImplManager 28 : public base::RefCountedThreadSafe<VideoCaptureImplManager> { 29 public: 30 VideoCaptureImplManager(); 31 32 // Called by video capture client |handler| to add device referenced 33 // by |id| to VideoCaptureImplManager's list of opened device list. 34 // A pointer to VideoCapture is returned to client so that client can 35 // operate on that pointer, such as StartCaptrue, StopCapture. 36 virtual media::VideoCapture* AddDevice( 37 media::VideoCaptureSessionId id, 38 media::VideoCapture::EventHandler* handler); 39 40 // Called by video capture client |handler| to remove device referenced 41 // by |id| from VideoCaptureImplManager's list of opened device list. 42 virtual void RemoveDevice(media::VideoCaptureSessionId id, 43 media::VideoCapture::EventHandler* handler); 44 45 // Make all existing VideoCaptureImpl instances stop/resume delivering 46 // video frames to their clients, depends on flag |suspend|. 47 virtual void SuspendDevices(bool suspend); 48 49 VideoCaptureMessageFilter* video_capture_message_filter() const { 50 return filter_.get(); 51 } 52 53 protected: 54 virtual ~VideoCaptureImplManager(); 55 56 private: 57 friend class base::RefCountedThreadSafe<VideoCaptureImplManager>; 58 59 struct Device { 60 Device(VideoCaptureImpl* device, 61 media::VideoCapture::EventHandler* handler); 62 ~Device(); 63 64 VideoCaptureImpl* vc; 65 std::list<media::VideoCapture::EventHandler*> clients; 66 }; 67 68 void FreeDevice(VideoCaptureImpl* vc); 69 70 typedef std::map<media::VideoCaptureSessionId, Device*> Devices; 71 Devices devices_; 72 base::Lock lock_; 73 scoped_refptr<VideoCaptureMessageFilter> filter_; 74 base::Thread thread_; 75 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 76 77 DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager); 78 }; 79 80 } // namespace content 81 82 #endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 83