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