Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(827)

Side by Side Diff: content/renderer/media/user_media_client_impl.h

Issue 2764043002: Serialize processing of getUserMedia() requests. (Closed)
Patch Set: Address tommi's comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | content/renderer/media/user_media_client_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ 5 #ifndef CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_
6 #define CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ 6 #define CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_
7 7
8 #include <list>
8 #include <memory> 9 #include <memory>
9 #include <string> 10 #include <string>
10 #include <vector> 11 #include <vector>
11 12
12 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
13 #include "base/macros.h" 14 #include "base/macros.h"
14 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
15 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
17 #include "base/optional.h"
16 #include "base/threading/non_thread_safe.h" 18 #include "base/threading/non_thread_safe.h"
17 #include "content/common/content_export.h" 19 #include "content/common/content_export.h"
18 #include "content/common/media/media_devices.h" 20 #include "content/common/media/media_devices.h"
19 #include "content/common/media/media_devices.mojom.h" 21 #include "content/common/media/media_devices.mojom.h"
20 #include "content/public/renderer/render_frame_observer.h" 22 #include "content/public/renderer/render_frame_observer.h"
21 #include "content/renderer/media/media_devices_event_dispatcher.h" 23 #include "content/renderer/media/media_devices_event_dispatcher.h"
22 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" 24 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
23 #include "content/renderer/media/media_stream_source.h" 25 #include "content/renderer/media/media_stream_source.h"
24 #include "services/service_manager/public/cpp/interface_provider.h" 26 #include "services/service_manager/public/cpp/interface_provider.h"
25 #include "third_party/WebKit/public/platform/WebMediaStream.h" 27 #include "third_party/WebKit/public/platform/WebMediaStream.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 const StreamDeviceInfo& device_info) override; 91 const StreamDeviceInfo& device_info) override;
90 void OnDeviceOpenFailed(int request_id) override; 92 void OnDeviceOpenFailed(int request_id) override;
91 93
92 // RenderFrameObserver override 94 // RenderFrameObserver override
93 void WillCommitProvisionalLoad() override; 95 void WillCommitProvisionalLoad() override;
94 96
95 void SetMediaDevicesDispatcherForTesting( 97 void SetMediaDevicesDispatcherForTesting(
96 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher); 98 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher);
97 99
98 protected: 100 protected:
99 // Called when |source| has been stopped from JavaScript.
100 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source);
101
102 // These methods are virtual for test purposes. A test can override them to 101 // These methods are virtual for test purposes. A test can override them to
103 // test requesting local media streams. The function notifies WebKit that the 102 // test requesting local media streams. The function notifies WebKit that the
104 // |request| have completed. 103 // |request| have completed.
105 virtual void GetUserMediaRequestSucceeded( 104 virtual void GetUserMediaRequestSucceeded(const blink::WebMediaStream& stream,
106 const blink::WebMediaStream& stream, 105 blink::WebUserMediaRequest request);
107 blink::WebUserMediaRequest request_info); 106 virtual void GetUserMediaRequestFailed(blink::WebUserMediaRequest request,
108 void DelayedGetUserMediaRequestSucceeded( 107 MediaStreamRequestResult result,
109 const blink::WebMediaStream& stream, 108 const blink::WebString& result_name);
110 blink::WebUserMediaRequest request_info);
111 virtual void GetUserMediaRequestFailed(
112 blink::WebUserMediaRequest request_info,
113 MediaStreamRequestResult result,
114 const blink::WebString& result_name);
115 void DelayedGetUserMediaRequestFailed(
116 blink::WebUserMediaRequest request_info,
117 MediaStreamRequestResult result,
118 const blink::WebString& result_name);
119 109
120 virtual void EnumerateDevicesSucceded( 110 virtual void EnumerateDevicesSucceded(
121 blink::WebMediaDevicesRequest* request, 111 blink::WebMediaDevicesRequest* request,
122 blink::WebVector<blink::WebMediaDeviceInfo>& devices); 112 blink::WebVector<blink::WebMediaDeviceInfo>& devices);
123 113
124 // Creates a MediaStreamAudioSource/MediaStreamVideoSource objects. 114 // Creates a MediaStreamAudioSource/MediaStreamVideoSource objects.
125 // These are virtual for test purposes. 115 // These are virtual for test purposes.
126 virtual MediaStreamAudioSource* CreateAudioSource( 116 virtual MediaStreamAudioSource* CreateAudioSource(
127 const StreamDeviceInfo& device, 117 const StreamDeviceInfo& device,
128 const blink::WebMediaConstraints& constraints, 118 const blink::WebMediaConstraints& constraints,
129 const MediaStreamSource::ConstraintsCallback& source_ready); 119 const MediaStreamSource::ConstraintsCallback& source_ready);
130 virtual MediaStreamVideoSource* CreateVideoSource( 120 virtual MediaStreamVideoSource* CreateVideoSource(
131 const StreamDeviceInfo& device, 121 const StreamDeviceInfo& device,
132 const MediaStreamSource::SourceStoppedCallback& stop_callback); 122 const MediaStreamSource::SourceStoppedCallback& stop_callback);
133 123
134 // Class for storing information about a WebKit request to create a 124 // Returns no value if there is no request being processed. Use only for
135 // MediaStream. 125 // testing.
136 class UserMediaRequestInfo 126 // TODO(guidou): Remove this method once spec-compliant constraints algorithm
137 : public base::SupportsWeakPtr<UserMediaRequestInfo> { 127 // for audio is implemented. http://crbug.com/657733
138 public: 128 base::Optional<bool> AutomaticOutputDeviceSelectionEnabledForCurrentRequest();
139 typedef base::Callback<void(UserMediaRequestInfo* request_info,
140 MediaStreamRequestResult result,
141 const blink::WebString& result_name)>
142 ResourcesReady;
143
144 UserMediaRequestInfo(int request_id,
145 const blink::WebUserMediaRequest& request,
146 bool enable_automatic_output_device_selection);
147 ~UserMediaRequestInfo();
148 int request_id;
149 // True if MediaStreamDispatcher has generated the stream, see
150 // OnStreamGenerated.
151 bool generated;
152 const bool enable_automatic_output_device_selection;
153 blink::WebMediaStream web_stream;
154 blink::WebUserMediaRequest request;
155
156 void StartAudioTrack(const blink::WebMediaStreamTrack& track,
157 bool is_pending);
158
159 blink::WebMediaStreamTrack CreateAndStartVideoTrack(
160 const blink::WebMediaStreamSource& source,
161 const blink::WebMediaConstraints& constraints);
162
163 // Triggers |callback| when all sources used in this request have either
164 // successfully started, or a source has failed to start.
165 void CallbackOnTracksStarted(const ResourcesReady& callback);
166
167 bool HasPendingSources() const;
168
169 // Called when a local audio source has finished (or failed) initializing.
170 void OnAudioSourceStarted(MediaStreamSource* source,
171 MediaStreamRequestResult result,
172 const blink::WebString& result_name);
173
174 private:
175 void OnTrackStarted(
176 MediaStreamSource* source,
177 MediaStreamRequestResult result,
178 const blink::WebString& result_name);
179
180 // Cheks if the sources for all tracks have been started and if so,
181 // invoke the |ready_callback_|. Note that the caller should expect
182 // that |this| might be deleted when the function returns.
183 void CheckAllTracksStarted();
184
185 ResourcesReady ready_callback_;
186 MediaStreamRequestResult request_result_;
187 blink::WebString request_result_name_;
188 // Sources used in this request.
189 std::vector<blink::WebMediaStreamSource> sources_;
190 std::vector<MediaStreamSource*> sources_waiting_for_callback_;
191 };
192 typedef std::vector<std::unique_ptr<UserMediaRequestInfo>> UserMediaRequests;
193
194 protected:
195 // These methods can be accessed in unit tests.
196 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id);
197 UserMediaRequestInfo* FindUserMediaRequestInfo(
198 const blink::WebUserMediaRequest& request);
199
200 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request);
201 129
202 private: 130 private:
131 class UserMediaRequestInfo;
203 typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources; 132 typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources;
204 133
134 void MaybeProcessNextRequestInfo();
135 bool IsCurrentRequestInfo(int request_id) const;
136 bool IsCurrentRequestInfo(const blink::WebUserMediaRequest& request) const;
137 bool DeleteRequestInfo(const blink::WebUserMediaRequest& request);
138 void DelayedGetUserMediaRequestSucceeded(const blink::WebMediaStream& stream,
139 blink::WebUserMediaRequest request);
140 void DelayedGetUserMediaRequestFailed(blink::WebUserMediaRequest request,
141 MediaStreamRequestResult result,
142 const blink::WebString& result_name);
143
205 // RenderFrameObserver implementation. 144 // RenderFrameObserver implementation.
206 void OnDestruct() override; 145 void OnDestruct() override;
207 146
147 // Called when |source| has been stopped from JavaScript.
148 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source);
149
208 // Creates a WebKit representation of stream sources based on 150 // Creates a WebKit representation of stream sources based on
209 // |devices| from the MediaStreamDispatcher. 151 // |devices| from the MediaStreamDispatcher.
210 blink::WebMediaStreamSource InitializeVideoSourceObject( 152 blink::WebMediaStreamSource InitializeVideoSourceObject(
211 const StreamDeviceInfo& device, 153 const StreamDeviceInfo& device,
212 const blink::WebMediaConstraints& constraints); 154 const blink::WebMediaConstraints& constraints);
213 155
214 blink::WebMediaStreamSource InitializeAudioSourceObject( 156 blink::WebMediaStreamSource InitializeAudioSourceObject(
215 const StreamDeviceInfo& device, 157 const StreamDeviceInfo& device,
216 const blink::WebMediaConstraints& constraints, 158 const blink::WebMediaConstraints& constraints,
217 bool* is_pending); 159 bool* is_pending);
218 160
219 void CreateVideoTracks( 161 void CreateVideoTracks(
220 const StreamDeviceInfoArray& devices, 162 const StreamDeviceInfoArray& devices,
221 const blink::WebMediaConstraints& constraints, 163 const blink::WebMediaConstraints& constraints,
222 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, 164 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks);
223 UserMediaRequestInfo* request);
224 165
225 void CreateAudioTracks( 166 void CreateAudioTracks(
226 const StreamDeviceInfoArray& devices, 167 const StreamDeviceInfoArray& devices,
227 const blink::WebMediaConstraints& constraints, 168 const blink::WebMediaConstraints& constraints,
228 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, 169 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks);
229 UserMediaRequestInfo* request);
230 170
231 // Callback function triggered when all native versions of the 171 // Callback function triggered when all native versions of the
232 // underlying media sources and tracks have been created and started. 172 // underlying media sources and tracks have been created and started.
233 void OnCreateNativeTracksCompleted(const std::string& label, 173 void OnCreateNativeTracksCompleted(const std::string& label,
234 UserMediaRequestInfo* request, 174 UserMediaRequestInfo* request,
235 MediaStreamRequestResult result, 175 MediaStreamRequestResult result,
236 const blink::WebString& result_name); 176 const blink::WebString& result_name);
237 177
238 void OnStreamGeneratedForCancelledRequest( 178 void OnStreamGeneratedForCancelledRequest(
239 const StreamDeviceInfoArray& audio_array, 179 const StreamDeviceInfoArray& audio_array,
240 const StreamDeviceInfoArray& video_array); 180 const StreamDeviceInfoArray& video_array);
241 181
242 static void OnAudioSourceStartedOnAudioThread( 182 static void OnAudioSourceStartedOnAudioThread(
243 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 183 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
244 base::WeakPtr<UserMediaClientImpl> weak_ptr, 184 base::WeakPtr<UserMediaClientImpl> weak_ptr,
245 MediaStreamSource* source, 185 MediaStreamSource* source,
246 MediaStreamRequestResult result, 186 MediaStreamRequestResult result,
247 const blink::WebString& result_name); 187 const blink::WebString& result_name);
248 188
249 void OnAudioSourceStarted(MediaStreamSource* source, 189 void OnAudioSourceStarted(MediaStreamSource* source,
250 MediaStreamRequestResult result, 190 MediaStreamRequestResult result,
251 const blink::WebString& result_name); 191 const blink::WebString& result_name);
252 192
253 void NotifyAllRequestsOfAudioSourceStarted( 193 void NotifyCurrentRequestInfoOfAudioSourceStarted(
254 MediaStreamSource* source, 194 MediaStreamSource* source,
255 MediaStreamRequestResult result, 195 MediaStreamRequestResult result,
256 const blink::WebString& result_name); 196 const blink::WebString& result_name);
257 197
258 using EnumerationResult = std::vector<MediaDeviceInfoArray>; 198 using EnumerationResult = std::vector<MediaDeviceInfoArray>;
259 void FinalizeEnumerateDevices(blink::WebMediaDevicesRequest request, 199 void FinalizeEnumerateDevices(blink::WebMediaDevicesRequest request,
260 const EnumerationResult& result); 200 const EnumerationResult& result);
261 201
262 void DeleteAllUserMediaRequests(); 202 void DeleteAllUserMediaRequests();
263 203
(...skipping 18 matching lines...) Expand all
282 222
283 // Returns true if we do find and remove the |source|. 223 // Returns true if we do find and remove the |source|.
284 // Otherwise returns false. 224 // Otherwise returns false.
285 bool RemoveLocalSource(const blink::WebMediaStreamSource& source); 225 bool RemoveLocalSource(const blink::WebMediaStreamSource& source);
286 226
287 void StopLocalSource(const blink::WebMediaStreamSource& source, 227 void StopLocalSource(const blink::WebMediaStreamSource& source,
288 bool notify_dispatcher); 228 bool notify_dispatcher);
289 229
290 const ::mojom::MediaDevicesDispatcherHostPtr& GetMediaDevicesDispatcher(); 230 const ::mojom::MediaDevicesDispatcherHostPtr& GetMediaDevicesDispatcher();
291 231
292 struct RequestSettings;
293
294 void SelectAudioInputDevice( 232 void SelectAudioInputDevice(
295 int request_id,
296 const blink::WebUserMediaRequest& user_media_request, 233 const blink::WebUserMediaRequest& user_media_request,
297 std::unique_ptr<StreamControls> controls,
298 const RequestSettings& request_settings,
299 const EnumerationResult& device_enumeration); 234 const EnumerationResult& device_enumeration);
300 235
301 void SetupVideoInput(int request_id, 236 void SetupVideoInput(const blink::WebUserMediaRequest& user_media_request);
302 const blink::WebUserMediaRequest& user_media_request,
303 std::unique_ptr<StreamControls> controls,
304 const RequestSettings& request_settings);
305 237
306 void SelectVideoDeviceSourceSettings( 238 void SelectVideoDeviceSourceSettings(
307 int request_id,
308 const blink::WebUserMediaRequest& user_media_request, 239 const blink::WebUserMediaRequest& user_media_request,
309 std::unique_ptr<StreamControls> controls,
310 const RequestSettings& request_settings,
311 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> 240 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr>
312 video_input_capabilities); 241 video_input_capabilities);
313 242
314 void FinalizeSelectVideoDeviceSourceSettings( 243 void FinalizeSelectVideoDeviceSourceSettings(
315 int request_id,
316 const blink::WebUserMediaRequest& user_media_request, 244 const blink::WebUserMediaRequest& user_media_request,
317 std::unique_ptr<StreamControls> controls,
318 const RequestSettings& request_settings,
319 const VideoDeviceCaptureSourceSelectionResult& selection_result); 245 const VideoDeviceCaptureSourceSelectionResult& selection_result);
320 246
321 void FinalizeSelectVideoContentSourceSettings( 247 void FinalizeSelectVideoContentSourceSettings(
322 int request_id,
323 const blink::WebUserMediaRequest& user_media_request, 248 const blink::WebUserMediaRequest& user_media_request,
324 std::unique_ptr<StreamControls> controls,
325 const RequestSettings& request_settings,
326 const VideoContentCaptureSourceSelectionResult& selection_result); 249 const VideoContentCaptureSourceSelectionResult& selection_result);
327 250
328 void FinalizeRequestUserMedia( 251 void GenerateStreamForCurrentRequestInfo();
329 int request_id,
330 const blink::WebUserMediaRequest& user_media_request,
331 std::unique_ptr<StreamControls> controls,
332 const RequestSettings& request_settings);
333 252
334 // Callback invoked by MediaDevicesEventDispatcher when a device-change 253 // Callback invoked by MediaDevicesEventDispatcher when a device-change
335 // notification arrives. 254 // notification arrives.
336 void DevicesChanged(MediaDeviceType device_type, 255 void DevicesChanged(MediaDeviceType device_type,
337 const MediaDeviceInfoArray& device_infos); 256 const MediaDeviceInfoArray& device_infos);
338 257
339 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread. 258 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread.
340 // It's valid for the lifetime of RenderThread. 259 // It's valid for the lifetime of RenderThread.
341 // TODO(xians): Remove this dependency once audio do not need it for local 260 // TODO(xians): Remove this dependency once audio do not need it for local
342 // audio. 261 // audio.
343 PeerConnectionDependencyFactory* const dependency_factory_; 262 PeerConnectionDependencyFactory* const dependency_factory_;
344 263
345 // UserMediaClientImpl owns MediaStreamDispatcher instead of RenderFrameImpl 264 // UserMediaClientImpl owns MediaStreamDispatcher instead of RenderFrameImpl
346 // (or RenderFrameObserver) to ensure tear-down occurs in the right order. 265 // (or RenderFrameObserver) to ensure tear-down occurs in the right order.
347 const std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher_; 266 const std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher_;
348 267
349 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher_; 268 ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher_;
350 269
351 LocalStreamSources local_sources_; 270 LocalStreamSources local_sources_;
352 LocalStreamSources pending_local_sources_; 271 LocalStreamSources pending_local_sources_;
353 272
354 UserMediaRequests user_media_requests_; 273 // UserMedia requests are processed sequentially. |current_request_info_|
274 // contains the request currently being processed, if any, and
275 // |pending_request_infos_| is a list of queued requests.
276 std::unique_ptr<UserMediaRequestInfo> current_request_info_;
277 std::list<std::unique_ptr<UserMediaRequestInfo>> pending_request_infos_;
278
355 MediaDevicesEventDispatcher::SubscriptionIdList 279 MediaDevicesEventDispatcher::SubscriptionIdList
356 device_change_subscription_ids_; 280 device_change_subscription_ids_;
357 281
358 blink::WebMediaDeviceChangeObserver media_device_change_observer_; 282 blink::WebMediaDeviceChangeObserver media_device_change_observer_;
359 283
360 const scoped_refptr<base::TaskRunner> worker_task_runner_; 284 const scoped_refptr<base::TaskRunner> worker_task_runner_;
361 285
362 // Note: This member must be the last to ensure all outstanding weak pointers 286 // Note: This member must be the last to ensure all outstanding weak pointers
363 // are invalidated first. 287 // are invalidated first.
364 base::WeakPtrFactory<UserMediaClientImpl> weak_factory_; 288 base::WeakPtrFactory<UserMediaClientImpl> weak_factory_;
365 289
366 DISALLOW_COPY_AND_ASSIGN(UserMediaClientImpl); 290 DISALLOW_COPY_AND_ASSIGN(UserMediaClientImpl);
367 }; 291 };
368 292
369 } // namespace content 293 } // namespace content
370 294
371 #endif // CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_ 295 #endif // CONTENT_RENDERER_MEDIA_USER_MEDIA_CLIENT_IMPL_H_
OLDNEW
« no previous file with comments | « no previous file | content/renderer/media/user_media_client_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698