media_stream_request.h revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
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
18namespace content {
19
20// Types of media streams.
21enum 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  //
30  // TODO(serygeu): Remove these values and use MEDIA_DESKTOP_VIDEO_CAPTURE and
31  // MEDIA_DESKTOP_AUDIO_CAPTURE.
32  MEDIA_TAB_AUDIO_CAPTURE,
33  MEDIA_TAB_VIDEO_CAPTURE,
34
35  // Desktop media sources.
36  MEDIA_DESKTOP_VIDEO_CAPTURE,
37
38  // Capture system audio (post-mix loopback stream).
39  //
40  // TODO(sergeyu): Replace with MEDIA_DESKTOP_AUDIO_CAPTURE.
41  MEDIA_SYSTEM_AUDIO_CAPTURE,
42
43  NUM_MEDIA_TYPES
44};
45
46// Types of media stream requests that can be made to the media controller.
47enum MediaStreamRequestType {
48  MEDIA_DEVICE_ACCESS = 0,
49  MEDIA_GENERATE_STREAM,
50  MEDIA_ENUMERATE_DEVICES,
51  MEDIA_OPEN_DEVICE
52};
53
54// Convenience predicates to determine whether the given type represents some
55// audio or some video device.
56CONTENT_EXPORT bool IsAudioMediaType(MediaStreamType type);
57CONTENT_EXPORT bool IsVideoMediaType(MediaStreamType type);
58
59// TODO(xians): Change the structs to classes.
60// Represents one device in a request for media stream(s).
61struct CONTENT_EXPORT MediaStreamDevice {
62  MediaStreamDevice();
63
64  MediaStreamDevice(
65      MediaStreamType type,
66      const std::string& id,
67      const std::string& name);
68
69  MediaStreamDevice(
70      MediaStreamType type,
71      const std::string& id,
72      const std::string& name,
73      int sample_rate,
74      int channel_layout);
75
76  ~MediaStreamDevice();
77
78  // The device's type.
79  MediaStreamType type;
80
81  // The device's unique ID.
82  std::string id;
83
84  // The device's "friendly" name. Not guaranteed to be unique.
85  std::string name;
86
87  // Preferred sample rate in samples per second for the device.
88  // Only utilized for audio devices. Will be set to 0 if the constructor
89  // with three parameters (intended for video) is used.
90  int sample_rate;
91
92  // Preferred channel configuration for the device.
93  // Only utilized for audio devices. Will be set to 0 if the constructor
94  // with three parameters (intended for video) is used.
95  // TODO(henrika): ideally, we would like to use media::ChannelLayout here
96  // but including media/base/channel_layout.h violates checkdeps rules.
97  int channel_layout;
98};
99
100typedef std::vector<MediaStreamDevice> MediaStreamDevices;
101
102typedef std::map<MediaStreamType, MediaStreamDevices> MediaStreamDeviceMap;
103
104// Represents a request for media streams (audio/video).
105// It looks like the last 4 parameters should use StreamOptions instead, but
106// StreamOption depends on media_stream_request.h because it needs
107// MediaStreamDevice.
108// TODO(vrk): Decouple MediaStreamDevice from this header file so that
109// media_stream_options.h no longer depends on this file.
110// TODO(vrk,justinlin,wjia): Figure out a way to share this code cleanly between
111// vanilla WebRTC, Tab Capture, and Pepper Video Capture. Right now there is
112// Tab-only stuff and Pepper-only stuff being passed around to all clients,
113// which is icky.
114struct CONTENT_EXPORT MediaStreamRequest {
115  MediaStreamRequest(
116      int render_process_id,
117      int render_view_id,
118      int page_request_id,
119      const std::string& tab_capture_device_id,
120      const GURL& security_origin,
121      MediaStreamRequestType request_type,
122      const std::string& requested_audio_device_id,
123      const std::string& requested_video_device_id,
124      MediaStreamType audio_type,
125      MediaStreamType video_type);
126
127  ~MediaStreamRequest();
128
129  // The render process id generating this request.
130  int render_process_id;
131
132  // The render view id generating this request.
133  int render_view_id;
134
135  // The unique id combined with render_process_id and render_view_id for
136  // identifying this request. This is used for cancelling request.
137  int page_request_id;
138
139  // Used by tab capture.
140  std::string tab_capture_device_id;
141
142  // The WebKit security origin for the current request (e.g. "html5rocks.com").
143  GURL security_origin;
144
145  // Stores the type of request that was made to the media controller. Right now
146  // this is only used to distinguish between WebRTC and Pepper requests, as the
147  // latter should not be subject to user approval but only to policy check.
148  // Pepper requests are signified by the |MEDIA_OPEN_DEVICE| value.
149  MediaStreamRequestType request_type;
150
151  // Stores the requested raw device id for physical audio or video devices.
152  std::string requested_audio_device_id;
153  std::string requested_video_device_id;
154
155  // Flag to indicate if the request contains audio.
156  MediaStreamType audio_type;
157
158  // Flag to indicate if the request contains video.
159  MediaStreamType video_type;
160};
161
162// Interface used by the content layer to notify chrome about changes in the
163// state of a media stream. Instances of this class are passed to content layer
164// when MediaStream access is approved using MediaResponseCallback.
165class MediaStreamUI {
166 public:
167  virtual ~MediaStreamUI() {}
168
169  // Called when MediaStream capturing is started. Chrome layer can call |stop|
170  // to stop the stream.
171  virtual void OnStarted(const base::Closure& stop) = 0;
172};
173
174// Callback used return results of media access requests.
175typedef base::Callback<void(
176    const MediaStreamDevices& devices,
177    scoped_ptr<MediaStreamUI> ui)> MediaResponseCallback;
178
179}  // namespace content
180
181#endif  // CONTENT_PUBLIC_COMMON_MEDIA_STREAM_REQUEST_H_
182