blob: 6005611a77b5c17bd009133186de6b8eb33a6f28 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_
6#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/memory/scoped_vector.h"
16#include "base/memory/weak_ptr.h"
17#include "base/threading/non_thread_safe.h"
18#include "content/common/content_export.h"
19#include "content/public/renderer/render_view_observer.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010020#include "content/renderer/media/media_stream_client.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000021#include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010022#include "third_party/WebKit/public/platform/WebMediaStream.h"
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +010023#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
24#include "third_party/WebKit/public/platform/WebVector.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010025#include "third_party/WebKit/public/web/WebUserMediaClient.h"
26#include "third_party/WebKit/public/web/WebUserMediaRequest.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000027#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000028
29namespace content {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010030class MediaStreamAudioRenderer;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000031class MediaStreamDependencyFactory;
32class MediaStreamDispatcher;
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +010033class MediaStreamSourceExtraData;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000034class WebRtcAudioRenderer;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000035class WebRtcLocalAudioRenderer;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000036
37// MediaStreamImpl is a delegate for the Media Stream API messages used by
38// WebKit. It ties together WebKit, native PeerConnection in libjingle and
39// MediaStreamManager (via MediaStreamDispatcher and MediaStreamDispatcherHost)
40// in the browser process. It must be created, called and destroyed on the
41// render thread.
42// MediaStreamImpl have weak pointers to a MediaStreamDispatcher.
43class CONTENT_EXPORT MediaStreamImpl
44 : public RenderViewObserver,
45 NON_EXPORTED_BASE(public WebKit::WebUserMediaClient),
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010046 NON_EXPORTED_BASE(public MediaStreamClient),
Torne (Richard Coles)58218062012-11-14 11:43:16 +000047 public MediaStreamDispatcherEventHandler,
48 public base::SupportsWeakPtr<MediaStreamImpl>,
49 NON_EXPORTED_BASE(public base::NonThreadSafe) {
50 public:
51 MediaStreamImpl(
52 RenderView* render_view,
53 MediaStreamDispatcher* media_stream_dispatcher,
Torne (Richard Coles)58218062012-11-14 11:43:16 +000054 MediaStreamDependencyFactory* dependency_factory);
55 virtual ~MediaStreamImpl();
56
Torne (Richard Coles)58218062012-11-14 11:43:16 +000057 // WebKit::WebUserMediaClient implementation
58 virtual void requestUserMedia(
Ben Murdocheb525c52013-07-10 11:40:50 +010059 const WebKit::WebUserMediaRequest& user_media_request) OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000060 virtual void cancelUserMediaRequest(
61 const WebKit::WebUserMediaRequest& user_media_request) OVERRIDE;
62
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010063 // MediaStreamClient implementation.
Torne (Richard Coles)58218062012-11-14 11:43:16 +000064 virtual bool IsMediaStream(const GURL& url) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010065 virtual scoped_refptr<VideoFrameProvider> GetVideoFrameProvider(
Torne (Richard Coles)58218062012-11-14 11:43:16 +000066 const GURL& url,
67 const base::Closure& error_cb,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010068 const VideoFrameProvider::RepaintCB& repaint_cb) OVERRIDE;
69 virtual scoped_refptr<MediaStreamAudioRenderer>
Torne (Richard Coles)58218062012-11-14 11:43:16 +000070 GetAudioRenderer(const GURL& url) OVERRIDE;
71
72 // MediaStreamDispatcherEventHandler implementation.
73 virtual void OnStreamGenerated(
74 int request_id,
75 const std::string& label,
76 const StreamDeviceInfoArray& audio_array,
77 const StreamDeviceInfoArray& video_array) OVERRIDE;
78 virtual void OnStreamGenerationFailed(int request_id) OVERRIDE;
Ben Murdochba5b9a62013-08-12 14:20:17 +010079 virtual void OnStopGeneratedStream(const std::string& label) OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000080 virtual void OnDevicesEnumerated(
81 int request_id,
82 const StreamDeviceInfoArray& device_array) OVERRIDE;
83 virtual void OnDevicesEnumerationFailed(int request_id) OVERRIDE;
84 virtual void OnDeviceOpened(
85 int request_id,
86 const std::string& label,
87 const StreamDeviceInfo& device_info) OVERRIDE;
88 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE;
89
90 // RenderViewObserver OVERRIDE
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010091 virtual void FrameDetached(WebKit::WebFrame* frame) OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000092 virtual void FrameWillClose(WebKit::WebFrame* frame) OVERRIDE;
93
94 protected:
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +010095 void OnLocalSourceStop(const WebKit::WebMediaStreamSource& source);
96
Torne (Richard Coles)58218062012-11-14 11:43:16 +000097 void OnLocalMediaStreamStop(const std::string& label);
98
99 // Callback function triggered when all native (libjingle) versions of the
100 // underlying media sources have been created and started.
Ben Murdochbbcdd452013-07-25 10:06:34 +0100101 // |web_stream| is a raw pointer to the web_stream in
102 // UserMediaRequests::web_stream for which the underlying sources have been
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000103 // created.
104 void OnCreateNativeSourcesComplete(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100105 WebKit::WebMediaStream* web_stream,
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000106 bool request_succeeded);
107
108 // This function is virtual for test purposes. A test can override this to
109 // test requesting local media streams. The function notifies WebKit that the
110 // |request| have completed and generated the MediaStream |stream|.
111 virtual void CompleteGetUserMediaRequest(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000112 const WebKit::WebMediaStream& stream,
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000113 WebKit::WebUserMediaRequest* request_info,
114 bool request_succeeded);
115
116 // Returns the WebKit representation of a MediaStream given an URL.
117 // This is virtual for test purposes.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000118 virtual WebKit::WebMediaStream GetMediaStream(const GURL& url);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000119
120 private:
121 // Structure for storing information about a WebKit request to create a
122 // MediaStream.
123 struct UserMediaRequestInfo {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000124 UserMediaRequestInfo(int request_id,
125 WebKit::WebFrame* frame,
Torne (Richard Coles)58537e22013-09-12 12:10:22 +0100126 const WebKit::WebUserMediaRequest& request,
127 bool enable_automatic_output_device_selection);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100128 ~UserMediaRequestInfo();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000129 int request_id;
130 // True if MediaStreamDispatcher has generated the stream, see
131 // OnStreamGenerated.
132 bool generated;
Torne (Richard Coles)58537e22013-09-12 12:10:22 +0100133 const bool enable_automatic_output_device_selection;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000134 WebKit::WebFrame* frame; // WebFrame that requested the MediaStream.
Ben Murdochbbcdd452013-07-25 10:06:34 +0100135 WebKit::WebMediaStream web_stream;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000136 WebKit::WebUserMediaRequest request;
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +0100137 std::vector<WebKit::WebMediaStreamSource> sources;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000138 };
139 typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests;
140
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +0100141 struct LocalStreamSource {
142 LocalStreamSource(WebKit::WebFrame* frame,
143 const WebKit::WebMediaStreamSource& source)
144 : frame(frame), source(source) {
145 }
146 // |frame| is the WebFrame that requested |source|. NULL in unit tests.
147 // TODO(perkj): Change so that |frame| is not NULL in unit tests.
148 WebKit::WebFrame* frame;
149 WebKit::WebMediaStreamSource source;
150 };
151 typedef std::vector<LocalStreamSource> LocalStreamSources;
152
153 // Creates a WebKit representation of stream sources based on
154 // |devices| from the MediaStreamDispatcher.
155 void CreateWebKitSourceVector(
156 const std::string& label,
157 const StreamDeviceInfoArray& devices,
158 WebKit::WebMediaStreamSource::Type type,
159 WebKit::WebFrame* frame,
160 WebKit::WebVector<WebKit::WebMediaStreamSource>& webkit_sources);
161
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000162 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id);
163 UserMediaRequestInfo* FindUserMediaRequestInfo(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100164 WebKit::WebMediaStream* web_stream);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000165 UserMediaRequestInfo* FindUserMediaRequestInfo(
166 const WebKit::WebUserMediaRequest& request);
167 UserMediaRequestInfo* FindUserMediaRequestInfo(const std::string& label);
168 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request);
169
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +0100170 // Returns the source that use a device with |device.session_id|
171 // and |device.device.id|. NULL if such source doesn't exist.
172 const WebKit::WebMediaStreamSource* FindLocalSource(
173 const StreamDeviceInfo& device) const;
174
175 // Returns true if |source| exists in |user_media_requests_|
176 bool FindSourceInRequests(const WebKit::WebMediaStreamSource& source) const;
177
178 void StopLocalSource(const WebKit::WebMediaStreamSource& source,
179 bool notify_dispatcher);
180 // Stops all local sources that don't exist in exist in
181 // |user_media_requests_|.
182 void StopUnreferencedSources(bool notify_dispatcher);
183
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100184 scoped_refptr<VideoFrameProvider>
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000185 CreateVideoFrameProvider(
186 webrtc::MediaStreamInterface* stream,
187 const base::Closure& error_cb,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100188 const VideoFrameProvider::RepaintCB& repaint_cb);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000189 scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000190 webrtc::MediaStreamInterface* stream);
191 scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer(
192 webrtc::MediaStreamInterface* stream);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000193
Torne (Richard Coles)58537e22013-09-12 12:10:22 +0100194 // Returns a valid session id if a single capture device is currently open
195 // (and then the matching session_id), otherwise -1.
196 // This is used to pass on a session id to a webrtc audio renderer (either
197 // local or remote), so that audio will be rendered to a matching output
198 // device, should one exist.
199 // Note that if there are more than one open capture devices the function
200 // will not be able to pick an appropriate device and return false.
201 bool GetAuthorizedDeviceInfoForAudioRenderer(
202 int* session_id, int* output_sample_rate, int* output_buffer_size);
203
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000204 // Weak ref to a MediaStreamDependencyFactory, owned by the RenderThread.
205 // It's valid for the lifetime of RenderThread.
206 MediaStreamDependencyFactory* dependency_factory_;
207
208 // media_stream_dispatcher_ is a weak reference, owned by RenderView. It's
209 // valid for the lifetime of RenderView.
210 MediaStreamDispatcher* media_stream_dispatcher_;
211
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000212 UserMediaRequests user_media_requests_;
213
Torne (Richard Coles)8bcbed82013-10-22 16:41:35 +0100214 LocalStreamSources local_sources_;
215
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000216 DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl);
217};
218
219} // namespace content
220
221#endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_