Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
|
Henrik Grunell
2014/09/02 06:47:53
Same here.
| |
| 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 #include "content/renderer/media/media_stream_impl.h" | 5 #include "content/renderer/media/user_media_client_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/hash.h" | 9 #include "base/hash.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "content/public/renderer/render_frame.h" | 15 #include "content/public/renderer/render_frame.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 50 optional->push_back(StreamOptions::Constraint( | 50 optional->push_back(StreamOptions::Constraint( |
| 51 optional_constraints[i].m_name.utf8(), | 51 optional_constraints[i].m_name.utf8(), |
| 52 optional_constraints[i].m_value.utf8())); | 52 optional_constraints[i].m_value.utf8())); |
| 53 } | 53 } |
| 54 } | 54 } |
| 55 | 55 |
| 56 static int g_next_request_id = 0; | 56 static int g_next_request_id = 0; |
| 57 | 57 |
| 58 } // namespace | 58 } // namespace |
| 59 | 59 |
| 60 struct MediaStreamImpl::MediaDevicesRequestInfo { | 60 struct UserMediaClientImpl::MediaDevicesRequestInfo { |
| 61 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, | 61 MediaDevicesRequestInfo(const blink::WebMediaDevicesRequest& request, |
| 62 int audio_input_request_id, | 62 int audio_input_request_id, |
| 63 int video_input_request_id, | 63 int video_input_request_id, |
| 64 int audio_output_request_id) | 64 int audio_output_request_id) |
| 65 : request(request), | 65 : request(request), |
| 66 audio_input_request_id(audio_input_request_id), | 66 audio_input_request_id(audio_input_request_id), |
| 67 video_input_request_id(video_input_request_id), | 67 video_input_request_id(video_input_request_id), |
| 68 audio_output_request_id(audio_output_request_id), | 68 audio_output_request_id(audio_output_request_id), |
| 69 has_audio_input_returned(false), | 69 has_audio_input_returned(false), |
| 70 has_video_input_returned(false), | 70 has_video_input_returned(false), |
| 71 has_audio_output_returned(false) {} | 71 has_audio_output_returned(false) {} |
| 72 | 72 |
| 73 blink::WebMediaDevicesRequest request; | 73 blink::WebMediaDevicesRequest request; |
| 74 int audio_input_request_id; | 74 int audio_input_request_id; |
| 75 int video_input_request_id; | 75 int video_input_request_id; |
| 76 int audio_output_request_id; | 76 int audio_output_request_id; |
| 77 bool has_audio_input_returned; | 77 bool has_audio_input_returned; |
| 78 bool has_video_input_returned; | 78 bool has_video_input_returned; |
| 79 bool has_audio_output_returned; | 79 bool has_audio_output_returned; |
| 80 StreamDeviceInfoArray audio_input_devices; | 80 StreamDeviceInfoArray audio_input_devices; |
| 81 StreamDeviceInfoArray video_input_devices; | 81 StreamDeviceInfoArray video_input_devices; |
| 82 StreamDeviceInfoArray audio_output_devices; | 82 StreamDeviceInfoArray audio_output_devices; |
| 83 }; | 83 }; |
| 84 | 84 |
| 85 MediaStreamImpl::MediaStreamImpl( | 85 UserMediaClientImpl::UserMediaClientImpl( |
| 86 RenderFrame* render_frame, | 86 RenderFrame* render_frame, |
| 87 PeerConnectionDependencyFactory* dependency_factory, | 87 PeerConnectionDependencyFactory* dependency_factory, |
| 88 scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher) | 88 scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher) |
| 89 : RenderFrameObserver(render_frame), | 89 : RenderFrameObserver(render_frame), |
| 90 dependency_factory_(dependency_factory), | 90 dependency_factory_(dependency_factory), |
| 91 media_stream_dispatcher_(media_stream_dispatcher.Pass()), | 91 media_stream_dispatcher_(media_stream_dispatcher.Pass()), |
| 92 weak_factory_(this) { | 92 weak_factory_(this) { |
| 93 DCHECK(dependency_factory_); | 93 DCHECK(dependency_factory_); |
| 94 DCHECK(media_stream_dispatcher_.get()); | 94 DCHECK(media_stream_dispatcher_.get()); |
| 95 } | 95 } |
| 96 | 96 |
| 97 MediaStreamImpl::~MediaStreamImpl() { | 97 UserMediaClientImpl::~UserMediaClientImpl() { |
| 98 // Force-close all outstanding user media requests and local sources here, | 98 // Force-close all outstanding user media requests and local sources here, |
| 99 // before the outstanding WeakPtrs are invalidated, to ensure a clean | 99 // before the outstanding WeakPtrs are invalidated, to ensure a clean |
| 100 // shutdown. | 100 // shutdown. |
| 101 FrameWillClose(); | 101 FrameWillClose(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 void MediaStreamImpl::requestUserMedia( | 104 void UserMediaClientImpl::requestUserMedia( |
| 105 const blink::WebUserMediaRequest& user_media_request) { | 105 const blink::WebUserMediaRequest& user_media_request) { |
| 106 // Save histogram data so we can see how much GetUserMedia is used. | 106 // Save histogram data so we can see how much GetUserMedia is used. |
| 107 // The histogram counts the number of calls to the JS API | 107 // The histogram counts the number of calls to the JS API |
| 108 // webGetUserMedia. | 108 // webGetUserMedia. |
| 109 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); | 109 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); |
| 110 DCHECK(CalledOnValidThread()); | 110 DCHECK(CalledOnValidThread()); |
| 111 | 111 |
| 112 if (RenderThreadImpl::current()) { | 112 if (RenderThreadImpl::current()) { |
| 113 RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia( | 113 RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia( |
| 114 user_media_request); | 114 user_media_request); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 &options.mandatory_video, | 147 &options.mandatory_video, |
| 148 &options.optional_video); | 148 &options.optional_video); |
| 149 } | 149 } |
| 150 | 150 |
| 151 security_origin = GURL(user_media_request.securityOrigin().toString()); | 151 security_origin = GURL(user_media_request.securityOrigin().toString()); |
| 152 DCHECK(render_frame()->GetWebFrame() == | 152 DCHECK(render_frame()->GetWebFrame() == |
| 153 static_cast<blink::WebFrame*>( | 153 static_cast<blink::WebFrame*>( |
| 154 user_media_request.ownerDocument().frame())); | 154 user_media_request.ownerDocument().frame())); |
| 155 } | 155 } |
| 156 | 156 |
| 157 DVLOG(1) << "MediaStreamImpl::requestUserMedia(" << request_id << ", [ " | 157 DVLOG(1) << "UserMediaClientImpl::requestUserMedia(" << request_id << ", [ " |
| 158 << "audio=" << (options.audio_requested) | 158 << "audio=" << (options.audio_requested) |
| 159 << " select associated sink: " | 159 << " select associated sink: " |
| 160 << enable_automatic_output_device_selection | 160 << enable_automatic_output_device_selection |
| 161 << ", video=" << (options.video_requested) << " ], " | 161 << ", video=" << (options.video_requested) << " ], " |
| 162 << security_origin.spec() << ")"; | 162 << security_origin.spec() << ")"; |
| 163 | 163 |
| 164 std::string audio_device_id; | 164 std::string audio_device_id; |
| 165 bool mandatory_audio; | 165 bool mandatory_audio; |
| 166 options.GetFirstAudioConstraintByName(kMediaStreamSourceInfoId, | 166 options.GetFirstAudioConstraintByName(kMediaStreamSourceInfoId, |
| 167 &audio_device_id, &mandatory_audio); | 167 &audio_device_id, &mandatory_audio); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 184 new UserMediaRequestInfo(request_id, user_media_request, | 184 new UserMediaRequestInfo(request_id, user_media_request, |
| 185 enable_automatic_output_device_selection)); | 185 enable_automatic_output_device_selection)); |
| 186 | 186 |
| 187 media_stream_dispatcher_->GenerateStream( | 187 media_stream_dispatcher_->GenerateStream( |
| 188 request_id, | 188 request_id, |
| 189 weak_factory_.GetWeakPtr(), | 189 weak_factory_.GetWeakPtr(), |
| 190 options, | 190 options, |
| 191 security_origin); | 191 security_origin); |
| 192 } | 192 } |
| 193 | 193 |
| 194 void MediaStreamImpl::cancelUserMediaRequest( | 194 void UserMediaClientImpl::cancelUserMediaRequest( |
| 195 const blink::WebUserMediaRequest& user_media_request) { | 195 const blink::WebUserMediaRequest& user_media_request) { |
| 196 DCHECK(CalledOnValidThread()); | 196 DCHECK(CalledOnValidThread()); |
| 197 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); | 197 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); |
| 198 if (request) { | 198 if (request) { |
| 199 // We can't abort the stream generation process. | 199 // We can't abort the stream generation process. |
| 200 // Instead, erase the request. Once the stream is generated we will stop the | 200 // Instead, erase the request. Once the stream is generated we will stop the |
| 201 // stream if the request does not exist. | 201 // stream if the request does not exist. |
| 202 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_EXPLICITLY_CANCELLED); | 202 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_EXPLICITLY_CANCELLED); |
| 203 DeleteUserMediaRequestInfo(request); | 203 DeleteUserMediaRequestInfo(request); |
| 204 } | 204 } |
| 205 } | 205 } |
| 206 | 206 |
| 207 void MediaStreamImpl::requestMediaDevices( | 207 void UserMediaClientImpl::requestMediaDevices( |
| 208 const blink::WebMediaDevicesRequest& media_devices_request) { | 208 const blink::WebMediaDevicesRequest& media_devices_request) { |
| 209 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); | 209 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); |
| 210 DCHECK(CalledOnValidThread()); | 210 DCHECK(CalledOnValidThread()); |
| 211 | 211 |
| 212 int audio_input_request_id = g_next_request_id++; | 212 int audio_input_request_id = g_next_request_id++; |
| 213 int video_input_request_id = g_next_request_id++; | 213 int video_input_request_id = g_next_request_id++; |
| 214 int audio_output_request_id = g_next_request_id++; | 214 int audio_output_request_id = g_next_request_id++; |
| 215 | 215 |
| 216 // |media_devices_request| can't be mocked, so in tests it will be empty (the | 216 // |media_devices_request| can't be mocked, so in tests it will be empty (the |
| 217 // underlying pointer is null). In order to use this function in a test we | 217 // underlying pointer is null). In order to use this function in a test we |
| 218 // need to check if it isNull. | 218 // need to check if it isNull. |
| 219 GURL security_origin; | 219 GURL security_origin; |
| 220 if (!media_devices_request.isNull()) | 220 if (!media_devices_request.isNull()) |
| 221 security_origin = GURL(media_devices_request.securityOrigin().toString()); | 221 security_origin = GURL(media_devices_request.securityOrigin().toString()); |
| 222 | 222 |
| 223 DVLOG(1) << "MediaStreamImpl::requestMediaDevices(" << audio_input_request_id | 223 DVLOG(1) << "UserMediaClientImpl::requestMediaDevices(" |
| 224 << audio_input_request_id | |
| 224 << ", " << video_input_request_id << ", " << audio_output_request_id | 225 << ", " << video_input_request_id << ", " << audio_output_request_id |
| 225 << ", " << security_origin.spec() << ")"; | 226 << ", " << security_origin.spec() << ")"; |
| 226 | 227 |
| 227 media_devices_requests_.push_back(new MediaDevicesRequestInfo( | 228 media_devices_requests_.push_back(new MediaDevicesRequestInfo( |
| 228 media_devices_request, | 229 media_devices_request, |
| 229 audio_input_request_id, | 230 audio_input_request_id, |
| 230 video_input_request_id, | 231 video_input_request_id, |
| 231 audio_output_request_id)); | 232 audio_output_request_id)); |
| 232 | 233 |
| 233 media_stream_dispatcher_->EnumerateDevices( | 234 media_stream_dispatcher_->EnumerateDevices( |
| 234 audio_input_request_id, | 235 audio_input_request_id, |
| 235 weak_factory_.GetWeakPtr(), | 236 weak_factory_.GetWeakPtr(), |
| 236 MEDIA_DEVICE_AUDIO_CAPTURE, | 237 MEDIA_DEVICE_AUDIO_CAPTURE, |
| 237 security_origin); | 238 security_origin); |
| 238 | 239 |
| 239 media_stream_dispatcher_->EnumerateDevices( | 240 media_stream_dispatcher_->EnumerateDevices( |
| 240 video_input_request_id, | 241 video_input_request_id, |
| 241 weak_factory_.GetWeakPtr(), | 242 weak_factory_.GetWeakPtr(), |
| 242 MEDIA_DEVICE_VIDEO_CAPTURE, | 243 MEDIA_DEVICE_VIDEO_CAPTURE, |
| 243 security_origin); | 244 security_origin); |
| 244 | 245 |
| 245 media_stream_dispatcher_->EnumerateDevices( | 246 media_stream_dispatcher_->EnumerateDevices( |
| 246 audio_output_request_id, | 247 audio_output_request_id, |
| 247 weak_factory_.GetWeakPtr(), | 248 weak_factory_.GetWeakPtr(), |
| 248 MEDIA_DEVICE_AUDIO_OUTPUT, | 249 MEDIA_DEVICE_AUDIO_OUTPUT, |
| 249 security_origin); | 250 security_origin); |
| 250 } | 251 } |
| 251 | 252 |
| 252 void MediaStreamImpl::cancelMediaDevicesRequest( | 253 void UserMediaClientImpl::cancelMediaDevicesRequest( |
| 253 const blink::WebMediaDevicesRequest& media_devices_request) { | 254 const blink::WebMediaDevicesRequest& media_devices_request) { |
| 254 DCHECK(CalledOnValidThread()); | 255 DCHECK(CalledOnValidThread()); |
| 255 MediaDevicesRequestInfo* request = | 256 MediaDevicesRequestInfo* request = |
| 256 FindMediaDevicesRequestInfo(media_devices_request); | 257 FindMediaDevicesRequestInfo(media_devices_request); |
| 257 if (!request) | 258 if (!request) |
| 258 return; | 259 return; |
| 259 CancelAndDeleteMediaDevicesRequest(request); | 260 CancelAndDeleteMediaDevicesRequest(request); |
| 260 } | 261 } |
| 261 | 262 |
| 262 // Callback from MediaStreamDispatcher. | 263 // Callback from MediaStreamDispatcher. |
| 263 // The requested stream have been generated by the MediaStreamDispatcher. | 264 // The requested stream have been generated by the MediaStreamDispatcher. |
| 264 void MediaStreamImpl::OnStreamGenerated( | 265 void UserMediaClientImpl::OnStreamGenerated( |
| 265 int request_id, | 266 int request_id, |
| 266 const std::string& label, | 267 const std::string& label, |
| 267 const StreamDeviceInfoArray& audio_array, | 268 const StreamDeviceInfoArray& audio_array, |
| 268 const StreamDeviceInfoArray& video_array) { | 269 const StreamDeviceInfoArray& video_array) { |
| 269 DCHECK(CalledOnValidThread()); | 270 DCHECK(CalledOnValidThread()); |
| 270 DVLOG(1) << "MediaStreamImpl::OnStreamGenerated stream:" << label; | 271 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerated stream:" << label; |
| 271 | 272 |
| 272 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 273 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 273 if (!request_info) { | 274 if (!request_info) { |
| 274 // This can happen if the request is canceled or the frame reloads while | 275 // This can happen if the request is canceled or the frame reloads while |
| 275 // MediaStreamDispatcher is processing the request. | 276 // MediaStreamDispatcher is processing the request. |
| 276 DVLOG(1) << "Request ID not found"; | 277 DVLOG(1) << "Request ID not found"; |
| 277 OnStreamGeneratedForCancelledRequest(audio_array, video_array); | 278 OnStreamGeneratedForCancelledRequest(audio_array, video_array); |
| 278 return; | 279 return; |
| 279 } | 280 } |
| 280 request_info->generated = true; | 281 request_info->generated = true; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 307 blink::WebMediaStream* web_stream = &(request_info->web_stream); | 308 blink::WebMediaStream* web_stream = &(request_info->web_stream); |
| 308 | 309 |
| 309 web_stream->initialize(webkit_id, audio_track_vector, | 310 web_stream->initialize(webkit_id, audio_track_vector, |
| 310 video_track_vector); | 311 video_track_vector); |
| 311 web_stream->setExtraData( | 312 web_stream->setExtraData( |
| 312 new MediaStream( | 313 new MediaStream( |
| 313 *web_stream)); | 314 *web_stream)); |
| 314 | 315 |
| 315 // Wait for the tracks to be started successfully or to fail. | 316 // Wait for the tracks to be started successfully or to fail. |
| 316 request_info->CallbackOnTracksStarted( | 317 request_info->CallbackOnTracksStarted( |
| 317 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, | 318 base::Bind(&UserMediaClientImpl::OnCreateNativeTracksCompleted, |
| 318 weak_factory_.GetWeakPtr())); | 319 weak_factory_.GetWeakPtr())); |
| 319 } | 320 } |
| 320 | 321 |
| 321 void MediaStreamImpl::OnStreamGeneratedForCancelledRequest( | 322 void UserMediaClientImpl::OnStreamGeneratedForCancelledRequest( |
| 322 const StreamDeviceInfoArray& audio_array, | 323 const StreamDeviceInfoArray& audio_array, |
| 323 const StreamDeviceInfoArray& video_array) { | 324 const StreamDeviceInfoArray& video_array) { |
| 324 // Only stop the device if the device is not used in another MediaStream. | 325 // Only stop the device if the device is not used in another MediaStream. |
| 325 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); | 326 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); |
| 326 device_it != audio_array.end(); ++device_it) { | 327 device_it != audio_array.end(); ++device_it) { |
| 327 if (!FindLocalSource(*device_it)) | 328 if (!FindLocalSource(*device_it)) |
| 328 media_stream_dispatcher_->StopStreamDevice(*device_it); | 329 media_stream_dispatcher_->StopStreamDevice(*device_it); |
| 329 } | 330 } |
| 330 | 331 |
| 331 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); | 332 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); |
| 332 device_it != video_array.end(); ++device_it) { | 333 device_it != video_array.end(); ++device_it) { |
| 333 if (!FindLocalSource(*device_it)) | 334 if (!FindLocalSource(*device_it)) |
| 334 media_stream_dispatcher_->StopStreamDevice(*device_it); | 335 media_stream_dispatcher_->StopStreamDevice(*device_it); |
| 335 } | 336 } |
| 336 } | 337 } |
| 337 | 338 |
| 338 // Callback from MediaStreamDispatcher. | 339 // Callback from MediaStreamDispatcher. |
| 339 // The requested stream failed to be generated. | 340 // The requested stream failed to be generated. |
| 340 void MediaStreamImpl::OnStreamGenerationFailed( | 341 void UserMediaClientImpl::OnStreamGenerationFailed( |
| 341 int request_id, | 342 int request_id, |
| 342 MediaStreamRequestResult result) { | 343 MediaStreamRequestResult result) { |
| 343 DCHECK(CalledOnValidThread()); | 344 DCHECK(CalledOnValidThread()); |
| 344 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" | 345 DVLOG(1) << "UserMediaClientImpl::OnStreamGenerationFailed(" |
| 345 << request_id << ")"; | 346 << request_id << ")"; |
| 346 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 347 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 347 if (!request_info) { | 348 if (!request_info) { |
| 348 // This can happen if the request is canceled or the frame reloads while | 349 // This can happen if the request is canceled or the frame reloads while |
| 349 // MediaStreamDispatcher is processing the request. | 350 // MediaStreamDispatcher is processing the request. |
| 350 DVLOG(1) << "Request ID not found"; | 351 DVLOG(1) << "Request ID not found"; |
| 351 return; | 352 return; |
| 352 } | 353 } |
| 353 | 354 |
| 354 GetUserMediaRequestFailed(&request_info->request, result); | 355 GetUserMediaRequestFailed(&request_info->request, result); |
| 355 DeleteUserMediaRequestInfo(request_info); | 356 DeleteUserMediaRequestInfo(request_info); |
| 356 } | 357 } |
| 357 | 358 |
| 358 // Callback from MediaStreamDispatcher. | 359 // Callback from MediaStreamDispatcher. |
| 359 // The browser process has stopped a device used by a MediaStream. | 360 // The browser process has stopped a device used by a MediaStream. |
| 360 void MediaStreamImpl::OnDeviceStopped( | 361 void UserMediaClientImpl::OnDeviceStopped( |
| 361 const std::string& label, | 362 const std::string& label, |
| 362 const StreamDeviceInfo& device_info) { | 363 const StreamDeviceInfo& device_info) { |
| 363 DCHECK(CalledOnValidThread()); | 364 DCHECK(CalledOnValidThread()); |
| 364 DVLOG(1) << "MediaStreamImpl::OnDeviceStopped(" | 365 DVLOG(1) << "UserMediaClientImpl::OnDeviceStopped(" |
| 365 << "{device_id = " << device_info.device.id << "})"; | 366 << "{device_id = " << device_info.device.id << "})"; |
| 366 | 367 |
| 367 const blink::WebMediaStreamSource* source_ptr = FindLocalSource(device_info); | 368 const blink::WebMediaStreamSource* source_ptr = FindLocalSource(device_info); |
| 368 if (!source_ptr) { | 369 if (!source_ptr) { |
| 369 // This happens if the same device is used in several guM requests or | 370 // This happens if the same device is used in several guM requests or |
| 370 // if a user happen stop a track from JS at the same time | 371 // if a user happen stop a track from JS at the same time |
| 371 // as the underlying media device is unplugged from the system. | 372 // as the underlying media device is unplugged from the system. |
| 372 return; | 373 return; |
| 373 } | 374 } |
| 374 // By creating |source| it is guaranteed that the blink::WebMediaStreamSource | 375 // By creating |source| it is guaranteed that the blink::WebMediaStreamSource |
| 375 // object is valid during the cleanup. | 376 // object is valid during the cleanup. |
| 376 blink::WebMediaStreamSource source(*source_ptr); | 377 blink::WebMediaStreamSource source(*source_ptr); |
| 377 StopLocalSource(source, false); | 378 StopLocalSource(source, false); |
| 378 | 379 |
| 379 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 380 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
| 380 device_it != local_sources_.end(); ++device_it) { | 381 device_it != local_sources_.end(); ++device_it) { |
| 381 if (device_it->id() == source.id()) { | 382 if (device_it->id() == source.id()) { |
| 382 local_sources_.erase(device_it); | 383 local_sources_.erase(device_it); |
| 383 break; | 384 break; |
| 384 } | 385 } |
| 385 } | 386 } |
| 386 } | 387 } |
| 387 | 388 |
| 388 void MediaStreamImpl::InitializeSourceObject( | 389 void UserMediaClientImpl::InitializeSourceObject( |
| 389 const StreamDeviceInfo& device, | 390 const StreamDeviceInfo& device, |
| 390 blink::WebMediaStreamSource::Type type, | 391 blink::WebMediaStreamSource::Type type, |
| 391 const blink::WebMediaConstraints& constraints, | 392 const blink::WebMediaConstraints& constraints, |
| 392 blink::WebMediaStreamSource* webkit_source) { | 393 blink::WebMediaStreamSource* webkit_source) { |
| 393 const blink::WebMediaStreamSource* existing_source = | 394 const blink::WebMediaStreamSource* existing_source = |
| 394 FindLocalSource(device); | 395 FindLocalSource(device); |
| 395 if (existing_source) { | 396 if (existing_source) { |
| 396 *webkit_source = *existing_source; | 397 *webkit_source = *existing_source; |
| 397 DVLOG(1) << "Source already exist. Reusing source with id " | 398 DVLOG(1) << "Source already exist. Reusing source with id " |
| 398 << webkit_source->id().utf8(); | 399 << webkit_source->id().utf8(); |
| 399 return; | 400 return; |
| 400 } | 401 } |
| 401 | 402 |
| 402 webkit_source->initialize( | 403 webkit_source->initialize( |
| 403 base::UTF8ToUTF16(device.device.id), | 404 base::UTF8ToUTF16(device.device.id), |
| 404 type, | 405 type, |
| 405 base::UTF8ToUTF16(device.device.name)); | 406 base::UTF8ToUTF16(device.device.name)); |
| 406 | 407 |
| 407 DVLOG(1) << "Initialize source object :" | 408 DVLOG(1) << "Initialize source object :" |
| 408 << "id = " << webkit_source->id().utf8() | 409 << "id = " << webkit_source->id().utf8() |
| 409 << ", name = " << webkit_source->name().utf8(); | 410 << ", name = " << webkit_source->name().utf8(); |
| 410 | 411 |
| 411 if (type == blink::WebMediaStreamSource::TypeVideo) { | 412 if (type == blink::WebMediaStreamSource::TypeVideo) { |
| 412 webkit_source->setExtraData( | 413 webkit_source->setExtraData( |
| 413 CreateVideoSource( | 414 CreateVideoSource( |
| 414 device, | 415 device, |
| 415 base::Bind(&MediaStreamImpl::OnLocalSourceStopped, | 416 base::Bind(&UserMediaClientImpl::OnLocalSourceStopped, |
| 416 weak_factory_.GetWeakPtr()))); | 417 weak_factory_.GetWeakPtr()))); |
| 417 } else { | 418 } else { |
| 418 DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio, type); | 419 DCHECK_EQ(blink::WebMediaStreamSource::TypeAudio, type); |
| 419 MediaStreamAudioSource* audio_source( | 420 MediaStreamAudioSource* audio_source( |
| 420 new MediaStreamAudioSource( | 421 new MediaStreamAudioSource( |
| 421 RenderFrameObserver::routing_id(), | 422 RenderFrameObserver::routing_id(), |
| 422 device, | 423 device, |
| 423 base::Bind(&MediaStreamImpl::OnLocalSourceStopped, | 424 base::Bind(&UserMediaClientImpl::OnLocalSourceStopped, |
| 424 weak_factory_.GetWeakPtr()), | 425 weak_factory_.GetWeakPtr()), |
| 425 dependency_factory_)); | 426 dependency_factory_)); |
| 426 webkit_source->setExtraData(audio_source); | 427 webkit_source->setExtraData(audio_source); |
| 427 } | 428 } |
| 428 local_sources_.push_back(*webkit_source); | 429 local_sources_.push_back(*webkit_source); |
| 429 } | 430 } |
| 430 | 431 |
| 431 MediaStreamVideoSource* MediaStreamImpl::CreateVideoSource( | 432 MediaStreamVideoSource* UserMediaClientImpl::CreateVideoSource( |
| 432 const StreamDeviceInfo& device, | 433 const StreamDeviceInfo& device, |
| 433 const MediaStreamSource::SourceStoppedCallback& stop_callback) { | 434 const MediaStreamSource::SourceStoppedCallback& stop_callback) { |
| 434 return new content::MediaStreamVideoCapturerSource( | 435 return new content::MediaStreamVideoCapturerSource( |
| 435 device, | 436 device, |
| 436 stop_callback, | 437 stop_callback, |
| 437 new VideoCapturerDelegate(device)); | 438 new VideoCapturerDelegate(device)); |
| 438 } | 439 } |
| 439 | 440 |
| 440 void MediaStreamImpl::CreateVideoTracks( | 441 void UserMediaClientImpl::CreateVideoTracks( |
| 441 const StreamDeviceInfoArray& devices, | 442 const StreamDeviceInfoArray& devices, |
| 442 const blink::WebMediaConstraints& constraints, | 443 const blink::WebMediaConstraints& constraints, |
| 443 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 444 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, |
| 444 UserMediaRequestInfo* request) { | 445 UserMediaRequestInfo* request) { |
| 445 DCHECK_EQ(devices.size(), webkit_tracks->size()); | 446 DCHECK_EQ(devices.size(), webkit_tracks->size()); |
| 446 | 447 |
| 447 for (size_t i = 0; i < devices.size(); ++i) { | 448 for (size_t i = 0; i < devices.size(); ++i) { |
| 448 blink::WebMediaStreamSource webkit_source; | 449 blink::WebMediaStreamSource webkit_source; |
| 449 InitializeSourceObject(devices[i], | 450 InitializeSourceObject(devices[i], |
| 450 blink::WebMediaStreamSource::TypeVideo, | 451 blink::WebMediaStreamSource::TypeVideo, |
| 451 constraints, | 452 constraints, |
| 452 &webkit_source); | 453 &webkit_source); |
| 453 (*webkit_tracks)[i] = | 454 (*webkit_tracks)[i] = |
| 454 request->CreateAndStartVideoTrack(webkit_source, constraints); | 455 request->CreateAndStartVideoTrack(webkit_source, constraints); |
| 455 } | 456 } |
| 456 } | 457 } |
| 457 | 458 |
| 458 void MediaStreamImpl::CreateAudioTracks( | 459 void UserMediaClientImpl::CreateAudioTracks( |
| 459 const StreamDeviceInfoArray& devices, | 460 const StreamDeviceInfoArray& devices, |
| 460 const blink::WebMediaConstraints& constraints, | 461 const blink::WebMediaConstraints& constraints, |
| 461 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 462 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, |
| 462 UserMediaRequestInfo* request) { | 463 UserMediaRequestInfo* request) { |
| 463 DCHECK_EQ(devices.size(), webkit_tracks->size()); | 464 DCHECK_EQ(devices.size(), webkit_tracks->size()); |
| 464 | 465 |
| 465 // Log the device names for this request. | 466 // Log the device names for this request. |
| 466 for (StreamDeviceInfoArray::const_iterator it = devices.begin(); | 467 for (StreamDeviceInfoArray::const_iterator it = devices.begin(); |
| 467 it != devices.end(); ++it) { | 468 it != devices.end(); ++it) { |
| 468 WebRtcLogMessage(base::StringPrintf( | 469 WebRtcLogMessage(base::StringPrintf( |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 488 blink::WebMediaStreamSource webkit_source; | 489 blink::WebMediaStreamSource webkit_source; |
| 489 InitializeSourceObject(overridden_audio_array[i], | 490 InitializeSourceObject(overridden_audio_array[i], |
| 490 blink::WebMediaStreamSource::TypeAudio, | 491 blink::WebMediaStreamSource::TypeAudio, |
| 491 constraints, | 492 constraints, |
| 492 &webkit_source); | 493 &webkit_source); |
| 493 (*webkit_tracks)[i].initialize(webkit_source); | 494 (*webkit_tracks)[i].initialize(webkit_source); |
| 494 request->StartAudioTrack((*webkit_tracks)[i], constraints); | 495 request->StartAudioTrack((*webkit_tracks)[i], constraints); |
| 495 } | 496 } |
| 496 } | 497 } |
| 497 | 498 |
| 498 void MediaStreamImpl::OnCreateNativeTracksCompleted( | 499 void UserMediaClientImpl::OnCreateNativeTracksCompleted( |
| 499 UserMediaRequestInfo* request, | 500 UserMediaRequestInfo* request, |
| 500 MediaStreamRequestResult result, | 501 MediaStreamRequestResult result, |
| 501 const blink::WebString& result_name) { | 502 const blink::WebString& result_name) { |
| 502 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" | 503 DVLOG(1) << "UserMediaClientImpl::OnCreateNativeTracksComplete(" |
| 503 << "{request_id = " << request->request_id << "} " | 504 << "{request_id = " << request->request_id << "} " |
| 504 << "{result = " << result << "})"; | 505 << "{result = " << result << "})"; |
| 505 if (result == content::MEDIA_DEVICE_OK) | 506 if (result == content::MEDIA_DEVICE_OK) |
| 506 GetUserMediaRequestSucceeded(request->web_stream, &request->request); | 507 GetUserMediaRequestSucceeded(request->web_stream, &request->request); |
| 507 else | 508 else |
| 508 GetUserMediaRequestTrackStartedFailed(&request->request, | 509 GetUserMediaRequestTrackStartedFailed(&request->request, |
| 509 result, | 510 result, |
| 510 result_name); | 511 result_name); |
| 511 | 512 |
| 512 DeleteUserMediaRequestInfo(request); | 513 DeleteUserMediaRequestInfo(request); |
| 513 } | 514 } |
| 514 | 515 |
| 515 void MediaStreamImpl::OnDevicesEnumerated( | 516 void UserMediaClientImpl::OnDevicesEnumerated( |
| 516 int request_id, | 517 int request_id, |
| 517 const StreamDeviceInfoArray& device_array) { | 518 const StreamDeviceInfoArray& device_array) { |
| 518 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; | 519 DVLOG(1) << "UserMediaClientImpl::OnDevicesEnumerated(" << request_id << ")"; |
| 519 | 520 |
| 520 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); | 521 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); |
| 521 DCHECK(request); | 522 DCHECK(request); |
| 522 | 523 |
| 523 if (request_id == request->audio_input_request_id) { | 524 if (request_id == request->audio_input_request_id) { |
| 524 request->has_audio_input_returned = true; | 525 request->has_audio_input_returned = true; |
| 525 DCHECK(request->audio_input_devices.empty()); | 526 DCHECK(request->audio_input_devices.empty()); |
| 526 request->audio_input_devices = device_array; | 527 request->audio_input_devices = device_array; |
| 527 } else if (request_id == request->video_input_request_id) { | 528 } else if (request_id == request->video_input_request_id) { |
| 528 request->has_video_input_returned = true; | 529 request->has_video_input_returned = true; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 blink::WebString::fromUTF8(device.id), | 582 blink::WebString::fromUTF8(device.id), |
| 582 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | 583 blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, |
| 583 blink::WebString::fromUTF8(device.name), | 584 blink::WebString::fromUTF8(device.name), |
| 584 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); | 585 blink::WebString::fromUTF8(base::UintToString(base::Hash(device.id)))); |
| 585 } | 586 } |
| 586 | 587 |
| 587 EnumerateDevicesSucceded(&request->request, devices); | 588 EnumerateDevicesSucceded(&request->request, devices); |
| 588 CancelAndDeleteMediaDevicesRequest(request); | 589 CancelAndDeleteMediaDevicesRequest(request); |
| 589 } | 590 } |
| 590 | 591 |
| 591 void MediaStreamImpl::OnDeviceOpened( | 592 void UserMediaClientImpl::OnDeviceOpened( |
| 592 int request_id, | 593 int request_id, |
| 593 const std::string& label, | 594 const std::string& label, |
| 594 const StreamDeviceInfo& video_device) { | 595 const StreamDeviceInfo& video_device) { |
| 595 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened(" | 596 DVLOG(1) << "UserMediaClientImpl::OnDeviceOpened(" |
| 596 << request_id << ", " << label << ")"; | 597 << request_id << ", " << label << ")"; |
| 597 NOTIMPLEMENTED(); | 598 NOTIMPLEMENTED(); |
| 598 } | 599 } |
| 599 | 600 |
| 600 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { | 601 void UserMediaClientImpl::OnDeviceOpenFailed(int request_id) { |
| 601 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" | 602 DVLOG(1) << "UserMediaClientImpl::VideoDeviceOpenFailed(" |
| 602 << request_id << ")"; | 603 << request_id << ")"; |
| 603 NOTIMPLEMENTED(); | 604 NOTIMPLEMENTED(); |
| 604 } | 605 } |
| 605 | 606 |
| 606 void MediaStreamImpl::GetUserMediaRequestSucceeded( | 607 void UserMediaClientImpl::GetUserMediaRequestSucceeded( |
| 607 const blink::WebMediaStream& stream, | 608 const blink::WebMediaStream& stream, |
| 608 blink::WebUserMediaRequest* request_info) { | 609 blink::WebUserMediaRequest* request_info) { |
| 609 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; | 610 DVLOG(1) << "UserMediaClientImpl::GetUserMediaRequestSucceeded"; |
| 610 LogUserMediaRequestResult(MEDIA_DEVICE_OK); | 611 LogUserMediaRequestResult(MEDIA_DEVICE_OK); |
| 611 request_info->requestSucceeded(stream); | 612 request_info->requestSucceeded(stream); |
| 612 } | 613 } |
| 613 | 614 |
| 614 void MediaStreamImpl::GetUserMediaRequestFailed( | 615 void UserMediaClientImpl::GetUserMediaRequestFailed( |
| 615 blink::WebUserMediaRequest* request_info, | 616 blink::WebUserMediaRequest* request_info, |
| 616 MediaStreamRequestResult result) { | 617 MediaStreamRequestResult result) { |
| 617 LogUserMediaRequestResult(result); | 618 LogUserMediaRequestResult(result); |
| 618 switch (result) { | 619 switch (result) { |
| 619 case MEDIA_DEVICE_OK: | 620 case MEDIA_DEVICE_OK: |
| 620 NOTREACHED(); | 621 NOTREACHED(); |
| 621 break; | 622 break; |
| 622 case MEDIA_DEVICE_PERMISSION_DENIED: | 623 case MEDIA_DEVICE_PERMISSION_DENIED: |
| 623 request_info->requestDenied(); | 624 request_info->requestDenied(); |
| 624 break; | 625 break; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 643 case MEDIA_DEVICE_CAPTURE_FAILURE: | 644 case MEDIA_DEVICE_CAPTURE_FAILURE: |
| 644 request_info->requestFailedUASpecific("DeviceCaptureError"); | 645 request_info->requestFailedUASpecific("DeviceCaptureError"); |
| 645 break; | 646 break; |
| 646 default: | 647 default: |
| 647 NOTREACHED(); | 648 NOTREACHED(); |
| 648 request_info->requestFailed(); | 649 request_info->requestFailed(); |
| 649 break; | 650 break; |
| 650 } | 651 } |
| 651 } | 652 } |
| 652 | 653 |
| 653 void MediaStreamImpl::GetUserMediaRequestTrackStartedFailed( | 654 void UserMediaClientImpl::GetUserMediaRequestTrackStartedFailed( |
| 654 blink::WebUserMediaRequest* request_info, | 655 blink::WebUserMediaRequest* request_info, |
| 655 MediaStreamRequestResult result, | 656 MediaStreamRequestResult result, |
| 656 const blink::WebString& result_name) { | 657 const blink::WebString& result_name) { |
| 657 switch (result) { | 658 switch (result) { |
| 658 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: | 659 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED: |
| 659 request_info->requestFailedConstraint(result_name); | 660 request_info->requestFailedConstraint(result_name); |
| 660 break; | 661 break; |
| 661 case MEDIA_DEVICE_TRACK_START_FAILURE: | 662 case MEDIA_DEVICE_TRACK_START_FAILURE: |
| 662 request_info->requestFailedUASpecific("TrackStartError"); | 663 request_info->requestFailedUASpecific("TrackStartError"); |
| 663 break; | 664 break; |
| 664 default: | 665 default: |
| 665 NOTREACHED(); | 666 NOTREACHED(); |
| 666 request_info->requestFailed(); | 667 request_info->requestFailed(); |
| 667 break; | 668 break; |
| 668 } | 669 } |
| 669 } | 670 } |
| 670 | 671 |
| 671 void MediaStreamImpl::EnumerateDevicesSucceded( | 672 void UserMediaClientImpl::EnumerateDevicesSucceded( |
| 672 blink::WebMediaDevicesRequest* request, | 673 blink::WebMediaDevicesRequest* request, |
| 673 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { | 674 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { |
| 674 request->requestSucceeded(devices); | 675 request->requestSucceeded(devices); |
| 675 } | 676 } |
| 676 | 677 |
| 677 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( | 678 const blink::WebMediaStreamSource* UserMediaClientImpl::FindLocalSource( |
| 678 const StreamDeviceInfo& device) const { | 679 const StreamDeviceInfo& device) const { |
| 679 for (LocalStreamSources::const_iterator it = local_sources_.begin(); | 680 for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
| 680 it != local_sources_.end(); ++it) { | 681 it != local_sources_.end(); ++it) { |
| 681 MediaStreamSource* const source = | 682 MediaStreamSource* const source = |
| 682 static_cast<MediaStreamSource*>(it->extraData()); | 683 static_cast<MediaStreamSource*>(it->extraData()); |
| 683 const StreamDeviceInfo& active_device = source->device_info(); | 684 const StreamDeviceInfo& active_device = source->device_info(); |
| 684 if (active_device.device.id == device.device.id && | 685 if (active_device.device.id == device.device.id && |
| 685 active_device.device.type == device.device.type && | 686 active_device.device.type == device.device.type && |
| 686 active_device.session_id == device.session_id) { | 687 active_device.session_id == device.session_id) { |
| 687 return &(*it); | 688 return &(*it); |
| 688 } | 689 } |
| 689 } | 690 } |
| 690 return NULL; | 691 return NULL; |
| 691 } | 692 } |
| 692 | 693 |
| 693 MediaStreamImpl::UserMediaRequestInfo* | 694 UserMediaClientImpl::UserMediaRequestInfo* |
| 694 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { | 695 UserMediaClientImpl::FindUserMediaRequestInfo(int request_id) { |
| 695 UserMediaRequests::iterator it = user_media_requests_.begin(); | 696 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 696 for (; it != user_media_requests_.end(); ++it) { | 697 for (; it != user_media_requests_.end(); ++it) { |
| 697 if ((*it)->request_id == request_id) | 698 if ((*it)->request_id == request_id) |
| 698 return (*it); | 699 return (*it); |
| 699 } | 700 } |
| 700 return NULL; | 701 return NULL; |
| 701 } | 702 } |
| 702 | 703 |
| 703 MediaStreamImpl::UserMediaRequestInfo* | 704 UserMediaClientImpl::UserMediaRequestInfo* |
| 704 MediaStreamImpl::FindUserMediaRequestInfo( | 705 UserMediaClientImpl::FindUserMediaRequestInfo( |
| 705 const blink::WebUserMediaRequest& request) { | 706 const blink::WebUserMediaRequest& request) { |
| 706 UserMediaRequests::iterator it = user_media_requests_.begin(); | 707 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 707 for (; it != user_media_requests_.end(); ++it) { | 708 for (; it != user_media_requests_.end(); ++it) { |
| 708 if ((*it)->request == request) | 709 if ((*it)->request == request) |
| 709 return (*it); | 710 return (*it); |
| 710 } | 711 } |
| 711 return NULL; | 712 return NULL; |
| 712 } | 713 } |
| 713 | 714 |
| 714 void MediaStreamImpl::DeleteUserMediaRequestInfo( | 715 void UserMediaClientImpl::DeleteUserMediaRequestInfo( |
| 715 UserMediaRequestInfo* request) { | 716 UserMediaRequestInfo* request) { |
| 716 UserMediaRequests::iterator it = user_media_requests_.begin(); | 717 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 717 for (; it != user_media_requests_.end(); ++it) { | 718 for (; it != user_media_requests_.end(); ++it) { |
| 718 if ((*it) == request) { | 719 if ((*it) == request) { |
| 719 user_media_requests_.erase(it); | 720 user_media_requests_.erase(it); |
| 720 return; | 721 return; |
| 721 } | 722 } |
| 722 } | 723 } |
| 723 NOTREACHED(); | 724 NOTREACHED(); |
| 724 } | 725 } |
| 725 | 726 |
| 726 void MediaStreamImpl::DeleteAllUserMediaRequests() { | 727 void UserMediaClientImpl::DeleteAllUserMediaRequests() { |
| 727 UserMediaRequests::iterator request_it = user_media_requests_.begin(); | 728 UserMediaRequests::iterator request_it = user_media_requests_.begin(); |
| 728 while (request_it != user_media_requests_.end()) { | 729 while (request_it != user_media_requests_.end()) { |
| 729 DVLOG(1) << "MediaStreamImpl@" << this << "::DeleteAllUserMediaRequests: " | 730 DVLOG(1) << "UserMediaClientImpl@" << this |
| 731 << "::DeleteAllUserMediaRequests: " | |
| 730 << "Cancel user media request " << (*request_it)->request_id; | 732 << "Cancel user media request " << (*request_it)->request_id; |
| 731 // If the request is not generated, it means that a request | 733 // If the request is not generated, it means that a request |
| 732 // has been sent to the MediaStreamDispatcher to generate a stream | 734 // has been sent to the MediaStreamDispatcher to generate a stream |
| 733 // but MediaStreamDispatcher has not yet responded and we need to cancel | 735 // but MediaStreamDispatcher has not yet responded and we need to cancel |
| 734 // the request. | 736 // the request. |
| 735 if (!(*request_it)->generated) { | 737 if (!(*request_it)->generated) { |
| 736 DCHECK(!(*request_it)->HasPendingSources()); | 738 DCHECK(!(*request_it)->HasPendingSources()); |
| 737 media_stream_dispatcher_->CancelGenerateStream( | 739 media_stream_dispatcher_->CancelGenerateStream( |
| 738 (*request_it)->request_id, weak_factory_.GetWeakPtr()); | 740 (*request_it)->request_id, weak_factory_.GetWeakPtr()); |
| 739 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_NOT_GENERATED); | 741 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_NOT_GENERATED); |
| 740 } else { | 742 } else { |
| 741 DCHECK((*request_it)->HasPendingSources()); | 743 DCHECK((*request_it)->HasPendingSources()); |
| 742 LogUserMediaRequestWithNoResult( | 744 LogUserMediaRequestWithNoResult( |
| 743 MEDIA_STREAM_REQUEST_PENDING_MEDIA_TRACKS); | 745 MEDIA_STREAM_REQUEST_PENDING_MEDIA_TRACKS); |
| 744 } | 746 } |
| 745 request_it = user_media_requests_.erase(request_it); | 747 request_it = user_media_requests_.erase(request_it); |
| 746 } | 748 } |
| 747 } | 749 } |
| 748 | 750 |
| 749 MediaStreamImpl::MediaDevicesRequestInfo* | 751 UserMediaClientImpl::MediaDevicesRequestInfo* |
| 750 MediaStreamImpl::FindMediaDevicesRequestInfo( | 752 UserMediaClientImpl::FindMediaDevicesRequestInfo( |
| 751 int request_id) { | 753 int request_id) { |
| 752 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 754 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| 753 for (; it != media_devices_requests_.end(); ++it) { | 755 for (; it != media_devices_requests_.end(); ++it) { |
| 754 if ((*it)->audio_input_request_id == request_id || | 756 if ((*it)->audio_input_request_id == request_id || |
| 755 (*it)->video_input_request_id == request_id || | 757 (*it)->video_input_request_id == request_id || |
| 756 (*it)->audio_output_request_id == request_id) { | 758 (*it)->audio_output_request_id == request_id) { |
| 757 return (*it); | 759 return (*it); |
| 758 } | 760 } |
| 759 } | 761 } |
| 760 return NULL; | 762 return NULL; |
| 761 } | 763 } |
| 762 | 764 |
| 763 MediaStreamImpl::MediaDevicesRequestInfo* | 765 UserMediaClientImpl::MediaDevicesRequestInfo* |
| 764 MediaStreamImpl::FindMediaDevicesRequestInfo( | 766 UserMediaClientImpl::FindMediaDevicesRequestInfo( |
| 765 const blink::WebMediaDevicesRequest& request) { | 767 const blink::WebMediaDevicesRequest& request) { |
| 766 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 768 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| 767 for (; it != media_devices_requests_.end(); ++it) { | 769 for (; it != media_devices_requests_.end(); ++it) { |
| 768 if ((*it)->request == request) | 770 if ((*it)->request == request) |
| 769 return (*it); | 771 return (*it); |
| 770 } | 772 } |
| 771 return NULL; | 773 return NULL; |
| 772 } | 774 } |
| 773 | 775 |
| 774 void MediaStreamImpl::CancelAndDeleteMediaDevicesRequest( | 776 void UserMediaClientImpl::CancelAndDeleteMediaDevicesRequest( |
| 775 MediaDevicesRequestInfo* request) { | 777 MediaDevicesRequestInfo* request) { |
| 776 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 778 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| 777 for (; it != media_devices_requests_.end(); ++it) { | 779 for (; it != media_devices_requests_.end(); ++it) { |
| 778 if ((*it) == request) { | 780 if ((*it) == request) { |
| 779 // Cancel device enumeration. | 781 // Cancel device enumeration. |
| 780 media_stream_dispatcher_->StopEnumerateDevices( | 782 media_stream_dispatcher_->StopEnumerateDevices( |
| 781 request->audio_input_request_id, weak_factory_.GetWeakPtr()); | 783 request->audio_input_request_id, weak_factory_.GetWeakPtr()); |
| 782 media_stream_dispatcher_->StopEnumerateDevices( | 784 media_stream_dispatcher_->StopEnumerateDevices( |
| 783 request->video_input_request_id, weak_factory_.GetWeakPtr()); | 785 request->video_input_request_id, weak_factory_.GetWeakPtr()); |
| 784 media_stream_dispatcher_->StopEnumerateDevices( | 786 media_stream_dispatcher_->StopEnumerateDevices( |
| 785 request->audio_output_request_id, weak_factory_.GetWeakPtr()); | 787 request->audio_output_request_id, weak_factory_.GetWeakPtr()); |
| 786 | 788 |
| 787 media_devices_requests_.erase(it); | 789 media_devices_requests_.erase(it); |
| 788 return; | 790 return; |
| 789 } | 791 } |
| 790 } | 792 } |
| 791 NOTREACHED(); | 793 NOTREACHED(); |
| 792 } | 794 } |
| 793 | 795 |
| 794 void MediaStreamImpl::FrameWillClose() { | 796 void UserMediaClientImpl::FrameWillClose() { |
| 795 // Cancel all outstanding UserMediaRequests. | 797 // Cancel all outstanding UserMediaRequests. |
| 796 DeleteAllUserMediaRequests(); | 798 DeleteAllUserMediaRequests(); |
| 797 | 799 |
| 798 // Loop through all current local sources and stop the sources. | 800 // Loop through all current local sources and stop the sources. |
| 799 LocalStreamSources::iterator sources_it = local_sources_.begin(); | 801 LocalStreamSources::iterator sources_it = local_sources_.begin(); |
| 800 while (sources_it != local_sources_.end()) { | 802 while (sources_it != local_sources_.end()) { |
| 801 StopLocalSource(*sources_it, true); | 803 StopLocalSource(*sources_it, true); |
| 802 sources_it = local_sources_.erase(sources_it); | 804 sources_it = local_sources_.erase(sources_it); |
| 803 } | 805 } |
| 804 } | 806 } |
| 805 | 807 |
| 806 void MediaStreamImpl::OnLocalSourceStopped( | 808 void UserMediaClientImpl::OnLocalSourceStopped( |
| 807 const blink::WebMediaStreamSource& source) { | 809 const blink::WebMediaStreamSource& source) { |
| 808 DCHECK(CalledOnValidThread()); | 810 DCHECK(CalledOnValidThread()); |
| 809 DVLOG(1) << "MediaStreamImpl::OnLocalSourceStopped"; | 811 DVLOG(1) << "UserMediaClientImpl::OnLocalSourceStopped"; |
| 810 | 812 |
| 811 bool device_found = false; | 813 bool device_found = false; |
| 812 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 814 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
| 813 device_it != local_sources_.end(); ++device_it) { | 815 device_it != local_sources_.end(); ++device_it) { |
| 814 if (device_it->id() == source.id()) { | 816 if (device_it->id() == source.id()) { |
| 815 device_found = true; | 817 device_found = true; |
| 816 local_sources_.erase(device_it); | 818 local_sources_.erase(device_it); |
| 817 break; | 819 break; |
| 818 } | 820 } |
| 819 } | 821 } |
| 820 CHECK(device_found); | 822 CHECK(device_found); |
| 821 | 823 |
| 822 MediaStreamSource* source_impl = | 824 MediaStreamSource* source_impl = |
| 823 static_cast<MediaStreamSource*>(source.extraData()); | 825 static_cast<MediaStreamSource*>(source.extraData()); |
| 824 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); | 826 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); |
| 825 } | 827 } |
| 826 | 828 |
| 827 void MediaStreamImpl::StopLocalSource( | 829 void UserMediaClientImpl::StopLocalSource( |
| 828 const blink::WebMediaStreamSource& source, | 830 const blink::WebMediaStreamSource& source, |
| 829 bool notify_dispatcher) { | 831 bool notify_dispatcher) { |
| 830 MediaStreamSource* source_impl = | 832 MediaStreamSource* source_impl = |
| 831 static_cast<MediaStreamSource*>(source.extraData()); | 833 static_cast<MediaStreamSource*>(source.extraData()); |
| 832 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" | 834 DVLOG(1) << "UserMediaClientImpl::StopLocalSource(" |
| 833 << "{device_id = " << source_impl->device_info().device.id << "})"; | 835 << "{device_id = " << source_impl->device_info().device.id << "})"; |
| 834 | 836 |
| 835 if (notify_dispatcher) | 837 if (notify_dispatcher) |
| 836 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); | 838 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); |
| 837 | 839 |
| 838 source_impl->ResetSourceStoppedCallback(); | 840 source_impl->ResetSourceStoppedCallback(); |
| 839 source_impl->StopSource(); | 841 source_impl->StopSource(); |
| 840 } | 842 } |
| 841 | 843 |
| 842 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( | 844 UserMediaClientImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
| 843 int request_id, | 845 int request_id, |
| 844 const blink::WebUserMediaRequest& request, | 846 const blink::WebUserMediaRequest& request, |
| 845 bool enable_automatic_output_device_selection) | 847 bool enable_automatic_output_device_selection) |
| 846 : request_id(request_id), | 848 : request_id(request_id), |
| 847 generated(false), | 849 generated(false), |
| 848 enable_automatic_output_device_selection( | 850 enable_automatic_output_device_selection( |
| 849 enable_automatic_output_device_selection), | 851 enable_automatic_output_device_selection), |
| 850 request(request), | 852 request(request), |
| 851 request_result_(MEDIA_DEVICE_OK), | 853 request_result_(MEDIA_DEVICE_OK), |
| 852 request_result_name_("") { | 854 request_result_name_("") { |
| 853 } | 855 } |
| 854 | 856 |
| 855 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { | 857 UserMediaClientImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
| 856 DVLOG(1) << "~UserMediaRequestInfo"; | 858 DVLOG(1) << "~UserMediaRequestInfo"; |
| 857 } | 859 } |
| 858 | 860 |
| 859 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( | 861 void UserMediaClientImpl::UserMediaRequestInfo::StartAudioTrack( |
| 860 const blink::WebMediaStreamTrack& track, | 862 const blink::WebMediaStreamTrack& track, |
| 861 const blink::WebMediaConstraints& constraints) { | 863 const blink::WebMediaConstraints& constraints) { |
| 862 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); | 864 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); |
| 863 MediaStreamAudioSource* native_source = | 865 MediaStreamAudioSource* native_source = |
| 864 static_cast <MediaStreamAudioSource*>(track.source().extraData()); | 866 static_cast <MediaStreamAudioSource*>(track.source().extraData()); |
| 865 DCHECK(native_source); | 867 DCHECK(native_source); |
| 866 | 868 |
| 867 sources_.push_back(track.source()); | 869 sources_.push_back(track.source()); |
| 868 sources_waiting_for_callback_.push_back(native_source); | 870 sources_waiting_for_callback_.push_back(native_source); |
| 869 native_source->AddTrack( | 871 native_source->AddTrack( |
| 870 track, constraints, base::Bind( | 872 track, constraints, base::Bind( |
| 871 &MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted, | 873 &UserMediaClientImpl::UserMediaRequestInfo::OnTrackStarted, |
| 872 AsWeakPtr())); | 874 AsWeakPtr())); |
| 873 } | 875 } |
| 874 | 876 |
| 875 blink::WebMediaStreamTrack | 877 blink::WebMediaStreamTrack |
| 876 MediaStreamImpl::UserMediaRequestInfo::CreateAndStartVideoTrack( | 878 UserMediaClientImpl::UserMediaRequestInfo::CreateAndStartVideoTrack( |
| 877 const blink::WebMediaStreamSource& source, | 879 const blink::WebMediaStreamSource& source, |
| 878 const blink::WebMediaConstraints& constraints) { | 880 const blink::WebMediaConstraints& constraints) { |
| 879 DCHECK(source.type() == blink::WebMediaStreamSource::TypeVideo); | 881 DCHECK(source.type() == blink::WebMediaStreamSource::TypeVideo); |
| 880 MediaStreamVideoSource* native_source = | 882 MediaStreamVideoSource* native_source = |
| 881 MediaStreamVideoSource::GetVideoSource(source); | 883 MediaStreamVideoSource::GetVideoSource(source); |
| 882 DCHECK(native_source); | 884 DCHECK(native_source); |
| 883 sources_.push_back(source); | 885 sources_.push_back(source); |
| 884 sources_waiting_for_callback_.push_back(native_source); | 886 sources_waiting_for_callback_.push_back(native_source); |
| 885 return MediaStreamVideoTrack::CreateVideoTrack( | 887 return MediaStreamVideoTrack::CreateVideoTrack( |
| 886 native_source, constraints, base::Bind( | 888 native_source, constraints, base::Bind( |
| 887 &MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted, | 889 &UserMediaClientImpl::UserMediaRequestInfo::OnTrackStarted, |
| 888 AsWeakPtr()), | 890 AsWeakPtr()), |
| 889 true); | 891 true); |
| 890 } | 892 } |
| 891 | 893 |
| 892 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( | 894 void UserMediaClientImpl::UserMediaRequestInfo::CallbackOnTracksStarted( |
| 893 const ResourcesReady& callback) { | 895 const ResourcesReady& callback) { |
| 894 DCHECK(ready_callback_.is_null()); | 896 DCHECK(ready_callback_.is_null()); |
| 895 ready_callback_ = callback; | 897 ready_callback_ = callback; |
| 896 CheckAllTracksStarted(); | 898 CheckAllTracksStarted(); |
| 897 } | 899 } |
| 898 | 900 |
| 899 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( | 901 void UserMediaClientImpl::UserMediaRequestInfo::OnTrackStarted( |
| 900 MediaStreamSource* source, | 902 MediaStreamSource* source, |
| 901 MediaStreamRequestResult result, | 903 MediaStreamRequestResult result, |
| 902 const blink::WebString& result_name) { | 904 const blink::WebString& result_name) { |
| 903 DVLOG(1) << "OnTrackStarted result " << result; | 905 DVLOG(1) << "OnTrackStarted result " << result; |
| 904 std::vector<MediaStreamSource*>::iterator it = | 906 std::vector<MediaStreamSource*>::iterator it = |
| 905 std::find(sources_waiting_for_callback_.begin(), | 907 std::find(sources_waiting_for_callback_.begin(), |
| 906 sources_waiting_for_callback_.end(), | 908 sources_waiting_for_callback_.end(), |
| 907 source); | 909 source); |
| 908 DCHECK(it != sources_waiting_for_callback_.end()); | 910 DCHECK(it != sources_waiting_for_callback_.end()); |
| 909 sources_waiting_for_callback_.erase(it); | 911 sources_waiting_for_callback_.erase(it); |
| 910 // All tracks must be started successfully. Otherwise the request is a | 912 // All tracks must be started successfully. Otherwise the request is a |
| 911 // failure. | 913 // failure. |
| 912 if (result != MEDIA_DEVICE_OK) { | 914 if (result != MEDIA_DEVICE_OK) { |
| 913 request_result_ = result; | 915 request_result_ = result; |
| 914 request_result_name_ = result_name; | 916 request_result_name_ = result_name; |
| 915 } | 917 } |
| 916 | 918 |
| 917 CheckAllTracksStarted(); | 919 CheckAllTracksStarted(); |
| 918 } | 920 } |
| 919 | 921 |
| 920 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { | 922 void UserMediaClientImpl::UserMediaRequestInfo::CheckAllTracksStarted() { |
| 921 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { | 923 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { |
| 922 ready_callback_.Run(this, request_result_, request_result_name_); | 924 ready_callback_.Run(this, request_result_, request_result_name_); |
| 923 } | 925 } |
| 924 } | 926 } |
| 925 | 927 |
| 926 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( | 928 bool UserMediaClientImpl::UserMediaRequestInfo::IsSourceUsed( |
| 927 const blink::WebMediaStreamSource& source) const { | 929 const blink::WebMediaStreamSource& source) const { |
| 928 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = | 930 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
| 929 sources_.begin(); | 931 sources_.begin(); |
| 930 source_it != sources_.end(); ++source_it) { | 932 source_it != sources_.end(); ++source_it) { |
| 931 if (source_it->id() == source.id()) | 933 if (source_it->id() == source.id()) |
| 932 return true; | 934 return true; |
| 933 } | 935 } |
| 934 return false; | 936 return false; |
| 935 } | 937 } |
| 936 | 938 |
| 937 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( | 939 void UserMediaClientImpl::UserMediaRequestInfo::RemoveSource( |
| 938 const blink::WebMediaStreamSource& source) { | 940 const blink::WebMediaStreamSource& source) { |
| 939 for (std::vector<blink::WebMediaStreamSource>::iterator it = | 941 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
| 940 sources_.begin(); | 942 sources_.begin(); |
| 941 it != sources_.end(); ++it) { | 943 it != sources_.end(); ++it) { |
| 942 if (source.id() == it->id()) { | 944 if (source.id() == it->id()) { |
| 943 sources_.erase(it); | 945 sources_.erase(it); |
| 944 return; | 946 return; |
| 945 } | 947 } |
| 946 } | 948 } |
| 947 } | 949 } |
| 948 | 950 |
| 949 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const { | 951 bool UserMediaClientImpl::UserMediaRequestInfo::HasPendingSources() const { |
| 950 return !sources_waiting_for_callback_.empty(); | 952 return !sources_waiting_for_callback_.empty(); |
| 951 } | 953 } |
| 952 | 954 |
| 953 } // namespace content | 955 } // namespace content |
| OLD | NEW |