media_stream_video_source.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1// Copyright 2014 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#ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_VIDEO_SOURCE_H_
6#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_VIDEO_SOURCE_H_
7
8#include <string>
9#include <vector>
10
11#include "base/compiler_specific.h"
12#include "base/memory/weak_ptr.h"
13#include "base/message_loop/message_loop.h"
14#include "base/threading/non_thread_safe.h"
15#include "content/common/content_export.h"
16#include "content/common/media/video_capture.h"
17#include "content/public/renderer/media_stream_video_sink.h"
18#include "content/renderer/media/media_stream_source.h"
19#include "media/base/video_frame.h"
20#include "media/video/capture/video_capture_types.h"
21#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
22#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
23#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
24
25namespace content {
26
27class MediaStreamVideoTrack;
28class VideoTrackAdapter;
29
30// MediaStreamVideoSource is an interface used for sending video frames to a
31// MediaStreamVideoTrack.
32// http://dev.w3.org/2011/webrtc/editor/getusermedia.html
33// The purpose of this base class is to be able to implement different
34// MediaStreaVideoSources such as local video capture, video sources received
35// on a PeerConnection or a source created in NaCl.
36// All methods calls will be done from the main render thread.
37//
38// When  the first track is added to the source by calling AddTrack
39// the MediaStreamVideoSource implementation calls GetCurrentSupportedFormats.
40// the source implementation must call OnSupportedFormats.
41// MediaStreamVideoSource then match the constraints provided in AddTrack with
42// the formats and call StartSourceImpl. The source implementation must call
43// OnStartDone when the underlying source has been started or failed to start.
44class CONTENT_EXPORT MediaStreamVideoSource
45    : public MediaStreamSource,
46      NON_EXPORTED_BASE(public base::NonThreadSafe) {
47 public:
48  MediaStreamVideoSource();
49  virtual ~MediaStreamVideoSource();
50
51  // Returns the MediaStreamVideoSource object owned by |source|.
52  static MediaStreamVideoSource* GetVideoSource(
53      const blink::WebMediaStreamSource& source);
54
55  // Puts |track| in the registered tracks list.
56  void AddTrack(MediaStreamVideoTrack* track,
57                const VideoCaptureDeliverFrameCB& frame_callback,
58                const blink::WebMediaConstraints& constraints,
59                const ConstraintsCallback& callback);
60  void RemoveTrack(MediaStreamVideoTrack* track);
61
62  // Return true if |name| is a constraint supported by MediaStreamVideoSource.
63  static bool IsConstraintSupported(const std::string& name);
64
65  // Returns the MessageLoopProxy where video frames will be delivered on.
66  const scoped_refptr<base::MessageLoopProxy>& io_message_loop() const;
67
68  // Constraint keys used by a video source.
69  // Specified by draft-alvestrand-constraints-resolution-00b
70  static const char kMinAspectRatio[];  // minAspectRatio
71  static const char kMaxAspectRatio[];  // maxAspectRatio
72  static const char kMaxWidth[];  // maxWidth
73  static const char kMinWidth[];  // minWidthOnCaptureFormats
74  static const char kMaxHeight[];  // maxHeight
75  static const char kMinHeight[];  // minHeight
76  static const char kMaxFrameRate[];  // maxFrameRate
77  static const char kMinFrameRate[];  // minFrameRate
78
79  // Default resolution. If no constraints are specified and the delegate
80  // support it, this is the resolution that will be used.
81  static const int kDefaultWidth;
82  static const int kDefaultHeight;
83  static const int kDefaultFrameRate;
84
85 protected:
86  virtual void DoStopSource() OVERRIDE;
87
88  // Sets ready state and notifies the ready state to all registered tracks.
89  virtual void SetReadyState(blink::WebMediaStreamSource::ReadyState state);
90
91  // An implementation must fetch the formats that can currently be used by
92  // the source and call OnSupportedFormats when done.
93  // |max_requested_height| and |max_requested_width| is the max height and
94  // width set as a mandatory constraint if set when calling
95  // MediaStreamVideoSource::AddTrack. If max height and max width is not set
96  // |max_requested_height| and |max_requested_width| are 0.
97  virtual void GetCurrentSupportedFormats(
98      int max_requested_width,
99      int max_requested_height,
100      const VideoCaptureDeviceFormatsCB& callback) = 0;
101
102  // An implementation must start capture frames using the resolution in
103  // |params|. When the source has started or the source failed to start
104  // OnStartDone must be called. An implementation must call
105  // invoke |frame_callback| on the IO thread with the captured frames.
106  // TODO(perkj): pass a VideoCaptureFormats instead of VideoCaptureParams for
107  // subclasses to customize.
108  virtual void StartSourceImpl(
109      const media::VideoCaptureParams& params,
110      const VideoCaptureDeliverFrameCB& frame_callback) = 0;
111  void OnStartDone(bool success);
112
113  // An implementation must immediately stop capture video frames and must not
114  // call OnSupportedFormats after this method has been called. After this
115  // method has been called, MediaStreamVideoSource may be deleted.
116  virtual void StopSourceImpl() = 0;
117
118  enum State {
119    NEW,
120    RETRIEVING_CAPABILITIES,
121    STARTING,
122    STARTED,
123    ENDED
124  };
125  State state() const { return state_; }
126
127 private:
128  void OnSupportedFormats(const media::VideoCaptureFormats& formats);
129
130  // Finds the first constraints in |requested_constraints_| that can be
131  // fulfilled. |best_format| is set to the video resolution that can be
132  // fulfilled.
133  bool FindBestFormatWithConstraints(
134      const media::VideoCaptureFormats& formats,
135      media::VideoCaptureFormat* best_format);
136
137  // Trigger all cached callbacks from AddTrack. AddTrack is successful
138  // if the capture delegate has started and the constraints provided in
139  // AddTrack match the format that was used to start the device.
140  // Note that it must be ok to delete the MediaStreamVideoSource object
141  // in the context of the callback. If gUM fail, the implementation will
142  // simply drop the references to the blink source and track which will lead
143  // to that this object is deleted.
144  void FinalizeAddTrack();
145
146  State state_;
147
148  media::VideoCaptureFormat current_format_;
149
150  struct RequestedConstraints {
151    RequestedConstraints(MediaStreamVideoTrack* track,
152                         const VideoCaptureDeliverFrameCB& frame_callback,
153                         const blink::WebMediaConstraints& constraints,
154                         const ConstraintsCallback& callback);
155    ~RequestedConstraints();
156
157    MediaStreamVideoTrack* track;
158    VideoCaptureDeliverFrameCB frame_callback;
159    blink::WebMediaConstraints constraints;
160    ConstraintsCallback callback;
161  };
162  std::vector<RequestedConstraints> requested_constraints_;
163
164  media::VideoCaptureFormats supported_formats_;
165
166  // |track_adapter_| delivers video frames to the tracks on the IO-thread.
167  scoped_refptr<VideoTrackAdapter> track_adapter_;
168
169  // Tracks that currently are connected to this source.
170  std::vector<MediaStreamVideoTrack*> tracks_;
171
172  // NOTE: Weak pointers must be invalidated before all other member variables.
173  base::WeakPtrFactory<MediaStreamVideoSource> weak_factory_;
174
175  DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoSource);
176};
177
178}  // namespace content
179
180#endif  // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_VIDEO_SOURCE_H_
181