video_capture_impl_manager.h revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// VideoCaptureImplManager owns VideoCaptureImpl objects. Clients who
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// want access to a video capture device call UseDevice() to get a handle
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to VideoCaptureImpl.
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// THREADING
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// VideoCaptureImplManager lives only on the render thread. All methods
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// must be called on this thread.
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The handle returned by UseDevice() is thread-safe. It ensures
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction is handled on the render thread.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/linked_ptr.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/thread_checker.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/video/capture/video_capture.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoCaptureImpl;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VideoCaptureImplManager;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoCaptureMessageFilter;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Thread-safe wrapper for a media::VideoCapture object. During
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction |destruction_cb| is called. This mechanism is used
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by VideoCaptureImplManager to ensure de-initialization and
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction of the media::VideoCapture object happens on the render
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// thread.
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT VideoCaptureHandle : media::VideoCapture {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~VideoCaptureHandle();
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // media::VideoCapture implementations.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void StartCapture(
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EventHandler* handler,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const media::VideoCaptureParams& params) OVERRIDE;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void StopCapture(EventHandler* handler) OVERRIDE;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool CaptureStarted() OVERRIDE;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual int CaptureFrameRate() OVERRIDE;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void GetDeviceSupportedFormats(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const DeviceFormatsCallback& callback) OVERRIDE;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void GetDeviceFormatsInUse(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const DeviceFormatsInUseCallback& callback) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class VideoCaptureImplManager;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VideoCaptureHandle(media::VideoCapture* impl,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Closure destruction_cb);
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  media::VideoCapture* impl_;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Closure destruction_cb_;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoCaptureHandle);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT VideoCaptureImplManager {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VideoCaptureImplManager();
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~VideoCaptureImplManager();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns a video capture device referenced by |id|.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<VideoCaptureHandle> UseDevice(media::VideoCaptureSessionId id);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Make all existing VideoCaptureImpl instances stop/resume delivering
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // video frames to their clients, depends on flag |suspend|.
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SuspendDevices(bool suspend);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoCaptureMessageFilter* video_capture_message_filter() const {
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return filter_.get();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Used in tests to inject a mock VideoCaptureImpl.
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual VideoCaptureImpl* CreateVideoCaptureImpl(
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      media::VideoCaptureSessionId id,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      VideoCaptureMessageFilter* filter) const;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void UnrefDevice(media::VideoCaptureSessionId id);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The int is used to count clients of the corresponding VideoCaptureImpl.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<media::VideoCaptureSessionId,
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   std::pair<int, linked_ptr<VideoCaptureImpl> > >
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      VideoCaptureDeviceMap;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VideoCaptureDeviceMap devices_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<VideoCaptureMessageFilter> filter_;
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Bound to the render thread.
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ThreadChecker thread_checker_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Bound to the render thread.
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtrFactory<VideoCaptureImplManager> weak_factory_;
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
117