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// TODO(hclam): This class should be renamed to VideoCaptureService.
6
7// This class provides access to a video capture device in the browser
8// process through IPC. The main function is to deliver video frames
9// to a client.
10//
11// THREADING
12//
13// VideoCaptureImplManager lives only on the render thread. All methods
14// must be called on this thread.
15//
16// VideoFrames are delivered on the IO thread. Callbacks provided by
17// a client are also called on the IO thread.
18
19#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
20#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
21
22#include <map>
23
24#include "base/callback.h"
25#include "base/memory/linked_ptr.h"
26#include "base/memory/ref_counted.h"
27#include "base/memory/scoped_ptr.h"
28#include "base/memory/weak_ptr.h"
29#include "base/message_loop/message_loop_proxy.h"
30#include "base/synchronization/lock.h"
31#include "base/threading/thread_checker.h"
32#include "content/common/content_export.h"
33#include "content/common/media/video_capture.h"
34#include "content/public/renderer/media_stream_video_sink.h"
35#include "media/video/capture/video_capture_types.h"
36
37namespace content {
38
39class VideoCaptureImpl;
40class VideoCaptureMessageFilter;
41
42class CONTENT_EXPORT VideoCaptureImplManager {
43 public:
44  VideoCaptureImplManager();
45  virtual ~VideoCaptureImplManager();
46
47  // Open a device associated with the session ID.
48  // This method must be called before any methods with the same ID
49  // is used.
50  // Returns a callback that should be used to release the acquired
51  // resources.
52  base::Closure UseDevice(media::VideoCaptureSessionId id);
53
54  // Start receiving video frames for the given session ID.
55  //
56  // |state_update_cb| will be called on the IO thread when capturing
57  // state changes.
58  // States will be one of the following four:
59  // * VIDEO_CAPTURE_STATE_STARTED
60  // * VIDEO_CAPTURE_STATE_STOPPED
61  // * VIDEO_CAPTURE_STATE_PAUSED
62  // * VIDEO_CAPTURE_STATE_ERROR
63  //
64  // |deliver_frame_cb| will be called on the IO thread when a video
65  // frame is ready.
66  //
67  // Returns a callback that is used to stop capturing. Note that stopping
68  // video capture is not synchronous. Client should handle the case where
69  // callbacks are called after capturing is instructed to stop, typically
70  // by binding the passed callbacks on a WeakPtr.
71  base::Closure StartCapture(
72      media::VideoCaptureSessionId id,
73      const media::VideoCaptureParams& params,
74      const VideoCaptureStateUpdateCB& state_update_cb,
75      const VideoCaptureDeliverFrameCB& deliver_frame_cb);
76
77  // Get supported formats supported by the device for the given session
78  // ID. |callback| will be called on the IO thread.
79  void GetDeviceSupportedFormats(
80      media::VideoCaptureSessionId id,
81      const VideoCaptureDeviceFormatsCB& callback);
82
83  // Get supported formats currently in use for the given session ID.
84  // |callback| will be called on the IO thread.
85  void GetDeviceFormatsInUse(
86      media::VideoCaptureSessionId id,
87      const VideoCaptureDeviceFormatsCB& callback);
88
89  // Make all existing VideoCaptureImpl instances stop/resume delivering
90  // video frames to their clients, depends on flag |suspend|.
91  void SuspendDevices(bool suspend);
92
93  VideoCaptureMessageFilter* video_capture_message_filter() const {
94    return filter_.get();
95  }
96
97 protected:
98  virtual VideoCaptureImpl* CreateVideoCaptureImplForTesting(
99      media::VideoCaptureSessionId id,
100      VideoCaptureMessageFilter* filter) const;
101
102 private:
103  void StopCapture(int client_id, media::VideoCaptureSessionId id);
104  void UnrefDevice(media::VideoCaptureSessionId id);
105
106  // The int is used to count clients of the corresponding VideoCaptureImpl.
107  // VideoCaptureImpl objects are owned by this object. But they are
108  // destroyed on the IO thread. These are raw pointers because we destroy
109  // them manually.
110  typedef std::map<media::VideoCaptureSessionId,
111                   std::pair<int, VideoCaptureImpl*> >
112      VideoCaptureDeviceMap;
113  VideoCaptureDeviceMap devices_;
114
115  // This is an internal ID for identifying clients of VideoCaptureImpl.
116  // The ID is global for the render process.
117  int next_client_id_;
118
119  scoped_refptr<VideoCaptureMessageFilter> filter_;
120
121  // Bound to the render thread.
122  base::ThreadChecker thread_checker_;
123
124  // Bound to the render thread.
125  // NOTE: Weak pointers must be invalidated before all other member variables.
126  base::WeakPtrFactory<VideoCaptureImplManager> weak_factory_;
127
128  DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager);
129};
130
131}  // namespace content
132
133#endif  // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
134