• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CONTENT_PUBLIC_COMMON_MEDIA_STREAM_REQUEST_H_
6 #define CONTENT_PUBLIC_COMMON_MEDIA_STREAM_REQUEST_H_
7 
8 #include <map>
9 #include <string>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 #include "base/callback_forward.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "content/common/content_export.h"
16 #include "url/gurl.h"
17 
18 namespace content {
19 
20 // Types of media streams.
21 enum MediaStreamType {
22   MEDIA_NO_SERVICE = 0,
23 
24   // A device provided by the operating system (e.g., webcam input).
25   MEDIA_DEVICE_AUDIO_CAPTURE,
26   MEDIA_DEVICE_VIDEO_CAPTURE,
27 
28   // Mirroring of a browser tab.
29   MEDIA_TAB_AUDIO_CAPTURE,
30   MEDIA_TAB_VIDEO_CAPTURE,
31 
32   // Desktop media sources.
33   MEDIA_DESKTOP_VIDEO_CAPTURE,
34 
35   // Capture system audio (post-mix loopback stream).
36   //
37   // TODO(sergeyu): Replace with MEDIA_DESKTOP_AUDIO_CAPTURE.
38   MEDIA_LOOPBACK_AUDIO_CAPTURE,
39 
40   NUM_MEDIA_TYPES
41 };
42 
43 // Types of media stream requests that can be made to the media controller.
44 enum MediaStreamRequestType {
45   MEDIA_DEVICE_ACCESS = 0,
46   MEDIA_GENERATE_STREAM,
47   MEDIA_ENUMERATE_DEVICES,
48   MEDIA_OPEN_DEVICE
49 };
50 
51 // Facing mode for video capture.
52 enum VideoFacingMode {
53   MEDIA_VIDEO_FACING_NONE = 0,
54   MEDIA_VIDEO_FACING_USER,
55   MEDIA_VIDEO_FACING_ENVIRONMENT,
56   MEDIA_VIDEO_FACING_LEFT,
57   MEDIA_VIDEO_FACING_RIGHT,
58 
59   NUM_MEDIA_VIDEO_FACING_MODE
60 };
61 
62 // Convenience predicates to determine whether the given type represents some
63 // audio or some video device.
64 CONTENT_EXPORT bool IsAudioMediaType(MediaStreamType type);
65 CONTENT_EXPORT bool IsVideoMediaType(MediaStreamType type);
66 
67 // TODO(xians): Change the structs to classes.
68 // Represents one device in a request for media stream(s).
69 struct CONTENT_EXPORT MediaStreamDevice {
70   MediaStreamDevice();
71 
72   MediaStreamDevice(
73       MediaStreamType type,
74       const std::string& id,
75       const std::string& name);
76 
77   MediaStreamDevice(
78       MediaStreamType type,
79       const std::string& id,
80       const std::string& name,
81       int sample_rate,
82       int channel_layout,
83       int frames_per_buffer);
84 
85   ~MediaStreamDevice();
86 
87   bool IsEqual(const MediaStreamDevice& second) const;
88 
89   // The device's type.
90   MediaStreamType type;
91 
92   // The device's unique ID.
93   std::string id;
94 
95   // The facing mode for video capture device.
96   VideoFacingMode video_facing;
97 
98   // The device id of a matched output device if any (otherwise empty).
99   // Only applicable to audio devices.
100   std::string matched_output_device_id;
101 
102   // The device's "friendly" name. Not guaranteed to be unique.
103   std::string name;
104 
105   // Contains properties that match directly with those with the same name
106   // in media::AudioParameters.
107   struct AudioDeviceParameters {
AudioDeviceParametersMediaStreamDevice::AudioDeviceParameters108     AudioDeviceParameters()
109         : sample_rate(), channel_layout(), frames_per_buffer(), effects() {
110     }
111 
AudioDeviceParametersMediaStreamDevice::AudioDeviceParameters112     AudioDeviceParameters(int sample_rate, int channel_layout,
113         int frames_per_buffer)
114         : sample_rate(sample_rate),
115           channel_layout(channel_layout),
116           frames_per_buffer(frames_per_buffer),
117           effects() {
118     }
119 
120     // Preferred sample rate in samples per second for the device.
121     int sample_rate;
122 
123     // Preferred channel configuration for the device.
124     // TODO(henrika): ideally, we would like to use media::ChannelLayout here
125     // but including media/base/channel_layout.h violates checkdeps rules.
126     int channel_layout;
127 
128     // Preferred number of frames per buffer for the device.  This is filled
129     // in on the browser side and can be used by the renderer to match the
130     // expected browser side settings and avoid unnecessary buffering.
131     // See media::AudioParameters for more.
132     int frames_per_buffer;
133 
134     // See media::AudioParameters::PlatformEffectsMask.
135     int effects;
136   };
137 
138   // These below two member variables are valid only when the type of device is
139   // audio (i.e. IsAudioMediaType returns true).
140 
141   // Contains the device properties of the capture device.
142   AudioDeviceParameters input;
143 
144   // If the capture device has an associated output device (e.g. headphones),
145   // this will contain the properties for the output device.  If no such device
146   // exists (e.g. webcam w/mic), then the value of this member will be all
147   // zeros.
148   AudioDeviceParameters matched_output;
149 };
150 
151 typedef std::vector<MediaStreamDevice> MediaStreamDevices;
152 
153 typedef std::map<MediaStreamType, MediaStreamDevices> MediaStreamDeviceMap;
154 
155 // Represents a request for media streams (audio/video).
156 // TODO(vrk): Decouple MediaStreamDevice from this header file so that
157 // media_stream_options.h no longer depends on this file.
158 // TODO(vrk,justinlin,wjia): Figure out a way to share this code cleanly between
159 // vanilla WebRTC, Tab Capture, and Pepper Video Capture. Right now there is
160 // Tab-only stuff and Pepper-only stuff being passed around to all clients,
161 // which is icky.
162 struct CONTENT_EXPORT MediaStreamRequest {
163   MediaStreamRequest(
164       int render_process_id,
165       int render_view_id,
166       int page_request_id,
167       const GURL& security_origin,
168       MediaStreamRequestType request_type,
169       const std::string& requested_audio_device_id,
170       const std::string& requested_video_device_id,
171       MediaStreamType audio_type,
172       MediaStreamType video_type);
173 
174   ~MediaStreamRequest();
175 
176   // This is the render process id for the renderer associated with generating
177   // frames for a MediaStream. Any indicators associated with a capture will be
178   // displayed for this renderer.
179   int render_process_id;
180 
181   // This is the render view id for the renderer associated with generating
182   // frames for a MediaStream. Any indicators associated with a capture will be
183   // displayed for this renderer.
184   int render_view_id;
185 
186   // The unique id combined with render_process_id and render_view_id for
187   // identifying this request. This is used for cancelling request.
188   int page_request_id;
189 
190   // Used by tab capture.
191   std::string tab_capture_device_id;
192 
193   // The WebKit security origin for the current request (e.g. "html5rocks.com").
194   GURL security_origin;
195 
196   // Stores the type of request that was made to the media controller. Right now
197   // this is only used to distinguish between WebRTC and Pepper requests, as the
198   // latter should not be subject to user approval but only to policy check.
199   // Pepper requests are signified by the |MEDIA_OPEN_DEVICE| value.
200   MediaStreamRequestType request_type;
201 
202   // Stores the requested raw device id for physical audio or video devices.
203   std::string requested_audio_device_id;
204   std::string requested_video_device_id;
205 
206   // Flag to indicate if the request contains audio.
207   MediaStreamType audio_type;
208 
209   // Flag to indicate if the request contains video.
210   MediaStreamType video_type;
211 };
212 
213 // Interface used by the content layer to notify chrome about changes in the
214 // state of a media stream. Instances of this class are passed to content layer
215 // when MediaStream access is approved using MediaResponseCallback.
216 class MediaStreamUI {
217  public:
~MediaStreamUI()218   virtual ~MediaStreamUI() {}
219 
220   // Called when MediaStream capturing is started. Chrome layer can call |stop|
221   // to stop the stream.
222   virtual void OnStarted(const base::Closure& stop) = 0;
223 };
224 
225 // Callback used return results of media access requests.
226 typedef base::Callback<void(
227     const MediaStreamDevices& devices,
228     scoped_ptr<MediaStreamUI> ui)> MediaResponseCallback;
229 
230 }  // namespace content
231 
232 #endif  // CONTENT_PUBLIC_COMMON_MEDIA_STREAM_REQUEST_H_
233