video_capture_impl_manager.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c83ed049af2a2ed7ab94b8206fc0fec4da7e26dbDouglas Gregor// Use of this source code is governed by a BSD-style license that can be 3b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl// found in the LICENSE file. 4b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl 54c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// VideoCaptureImplManager owns VideoCaptureImpl objects. Clients who 64c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// want access to a video capture device call UseDevice() to get a handle 74c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// to VideoCaptureImpl. 83cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl// 93cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl// THREADING 104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// 114ec339f43c0cae2678334850c90926bea10999c7Douglas Gregor// VideoCaptureImplManager lives only on the render thread. All methods 12636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl// must be called on this thread. 13636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl// 14636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl// The handle returned by UseDevice() is thread-safe. It ensures 159afe1308ed19dffc281dca5cfbe521826754980fSebastian Redl// destruction is handled on the render thread. 16636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl 177f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 187f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 197f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl 204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include <map> 213cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl 223cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl#include "base/callback.h" 233cb069213c8502dbb7a67860d40122d869ed8fd6Sebastian Redl#include "base/memory/linked_ptr.h" 24b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl#include "base/memory/scoped_ptr.h" 254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include "base/memory/weak_ptr.h" 264c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include "base/message_loop/message_loop_proxy.h" 274c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include "base/synchronization/lock.h" 284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include "base/threading/thread_checker.h" 294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include "content/common/content_export.h" 304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl#include "media/video/capture/video_capture.h" 314c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlnamespace content { 33cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl 344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass VideoCaptureImpl; 354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass VideoCaptureImplManager; 364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass VideoCaptureMessageFilter; 374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 38fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl// Thread-safe wrapper for a media::VideoCapture object. During 39636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl// destruction |destruction_cb| is called. This mechanism is used 409afe1308ed19dffc281dca5cfbe521826754980fSebastian Redl// by VideoCaptureImplManager to ensure de-initialization and 417f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl// destruction of the media::VideoCapture object happens on the render 424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// thread. 434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CONTENT_EXPORT VideoCaptureHandle : media::VideoCapture { 44e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor public: 45e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor virtual ~VideoCaptureHandle(); 46e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 47e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // media::VideoCapture implementations. 48c83ed049af2a2ed7ab94b8206fc0fec4da7e26dbDouglas Gregor virtual void StartCapture( 494c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl EventHandler* handler, 504c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const media::VideoCaptureParams& params) OVERRIDE; 514c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl virtual void StopCapture(EventHandler* handler) OVERRIDE; 524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl virtual bool CaptureStarted() OVERRIDE; 534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl virtual int CaptureFrameRate() OVERRIDE; 54cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl virtual void GetDeviceSupportedFormats( 554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const DeviceFormatsCallback& callback) OVERRIDE; 564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl virtual void GetDeviceFormatsInUse( 574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const DeviceFormatsInUseCallback& callback) OVERRIDE; 584c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 594c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl private: 60c83ed049af2a2ed7ab94b8206fc0fec4da7e26dbDouglas Gregor friend class VideoCaptureImplManager; 614c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 62c83ed049af2a2ed7ab94b8206fc0fec4da7e26dbDouglas Gregor VideoCaptureHandle(media::VideoCapture* impl, 63cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl base::Closure destruction_cb); 64cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl 65cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl media::VideoCapture* impl_; 66fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl base::Closure destruction_cb_; 67b5a57a69e5fdac6dd9a92be717e279486c4a0128Sebastian Redl 687f6623914e779e41eb3d85f9a2dc3affea5de1e8Sebastian Redl DISALLOW_COPY_AND_ASSIGN(VideoCaptureHandle); 69636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl}; 70636a7c42d42800f69caadcdea433312fd642a4b3Sebastian Redl 719afe1308ed19dffc281dca5cfbe521826754980fSebastian Redlclass CONTENT_EXPORT VideoCaptureImplManager { 729afe1308ed19dffc281dca5cfbe521826754980fSebastian Redl public: 7300e68e2cc5ce37cb95beb801cae73c0d1e9dda37Sebastian Redl VideoCaptureImplManager(); 7400e68e2cc5ce37cb95beb801cae73c0d1e9dda37Sebastian Redl virtual ~VideoCaptureImplManager(); 754c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Returns a video capture device referenced by |id|. 774c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl scoped_ptr<VideoCaptureHandle> UseDevice(media::VideoCaptureSessionId id); 784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Make all existing VideoCaptureImpl instances stop/resume delivering 804c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // video frames to their clients, depends on flag |suspend|. 814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl void SuspendDevices(bool suspend); 824c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 83fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl VideoCaptureMessageFilter* video_capture_message_filter() const { 844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl return filter_.get(); 854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl protected: 884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Used in tests to inject a mock VideoCaptureImpl. 894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl virtual VideoCaptureImpl* CreateVideoCaptureImpl( 9028eb7e992b9a266abb300da25b6d3c1557cec361Chris Lattner media::VideoCaptureSessionId id, 914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl VideoCaptureMessageFilter* filter) const; 924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 93fb4ccd7152723ac6190eb379250cfe7516cfd1b8Sebastian Redl private: 944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl void UnrefDevice(media::VideoCaptureSessionId id); 95 96 // The int is used to count clients of the corresponding VideoCaptureImpl. 97 typedef std::map<media::VideoCaptureSessionId, 98 std::pair<int, linked_ptr<VideoCaptureImpl> > > 99 VideoCaptureDeviceMap; 100 VideoCaptureDeviceMap devices_; 101 102 scoped_refptr<VideoCaptureMessageFilter> filter_; 103 104 // Following two members are bound to the render thread. 105 base::WeakPtrFactory<VideoCaptureImplManager> weak_factory_; 106 base::ThreadChecker thread_checker_; 107 108 DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager); 109}; 110 111} // namespace content 112 113#endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 114