| OLD | NEW |
| 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 #include "content/renderer/media/media_stream_impl.h" | 5 #include "content/renderer/media/media_stream_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" | 27 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" |
| 28 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 28 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
| 29 #include "third_party/WebKit/public/web/WebDocument.h" | 29 #include "third_party/WebKit/public/web/WebDocument.h" |
| 30 #include "third_party/WebKit/public/web/WebFrame.h" | 30 #include "third_party/WebKit/public/web/WebFrame.h" |
| 31 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" | 31 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" |
| 32 | 32 |
| 33 namespace content { | 33 namespace content { |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 std::string GetStreamConstraint( | 36 std::string GetStreamConstraint( |
| 37 const WebKit::WebMediaConstraints& constraints, const std::string& key, | 37 const blink::WebMediaConstraints& constraints, const std::string& key, |
| 38 bool is_mandatory) { | 38 bool is_mandatory) { |
| 39 if (constraints.isNull()) | 39 if (constraints.isNull()) |
| 40 return std::string(); | 40 return std::string(); |
| 41 | 41 |
| 42 WebKit::WebString value; | 42 blink::WebString value; |
| 43 if (is_mandatory) { | 43 if (is_mandatory) { |
| 44 constraints.getMandatoryConstraintValue(UTF8ToUTF16(key), value); | 44 constraints.getMandatoryConstraintValue(UTF8ToUTF16(key), value); |
| 45 } else { | 45 } else { |
| 46 constraints.getOptionalConstraintValue(UTF8ToUTF16(key), value); | 46 constraints.getOptionalConstraintValue(UTF8ToUTF16(key), value); |
| 47 } | 47 } |
| 48 return UTF16ToUTF8(value); | 48 return UTF16ToUTF8(value); |
| 49 } | 49 } |
| 50 | 50 |
| 51 void UpdateRequestOptions( | 51 void UpdateRequestOptions( |
| 52 const WebKit::WebUserMediaRequest& user_media_request, | 52 const blink::WebUserMediaRequest& user_media_request, |
| 53 StreamOptions* options) { | 53 StreamOptions* options) { |
| 54 if (options->audio_type != content::MEDIA_NO_SERVICE) { | 54 if (options->audio_type != content::MEDIA_NO_SERVICE) { |
| 55 std::string audio_stream_source = GetStreamConstraint( | 55 std::string audio_stream_source = GetStreamConstraint( |
| 56 user_media_request.audioConstraints(), kMediaStreamSource, true); | 56 user_media_request.audioConstraints(), kMediaStreamSource, true); |
| 57 if (audio_stream_source == kMediaStreamSourceTab) { | 57 if (audio_stream_source == kMediaStreamSourceTab) { |
| 58 options->audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; | 58 options->audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; |
| 59 options->audio_device_id = GetStreamConstraint( | 59 options->audio_device_id = GetStreamConstraint( |
| 60 user_media_request.audioConstraints(), | 60 user_media_request.audioConstraints(), |
| 61 kMediaStreamSourceId, true); | 61 kMediaStreamSourceId, true); |
| 62 } else if (audio_stream_source == kMediaStreamSourceSystem) { | 62 } else if (audio_stream_source == kMediaStreamSourceSystem) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 81 options->video_device_id = GetStreamConstraint( | 81 options->video_device_id = GetStreamConstraint( |
| 82 user_media_request.videoConstraints(), | 82 user_media_request.videoConstraints(), |
| 83 kMediaStreamSourceId, true); | 83 kMediaStreamSourceId, true); |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 static int g_next_request_id = 0; | 88 static int g_next_request_id = 0; |
| 89 | 89 |
| 90 webrtc::MediaStreamInterface* GetNativeMediaStream( | 90 webrtc::MediaStreamInterface* GetNativeMediaStream( |
| 91 const WebKit::WebMediaStream& web_stream) { | 91 const blink::WebMediaStream& web_stream) { |
| 92 content::MediaStreamExtraData* extra_data = | 92 content::MediaStreamExtraData* extra_data = |
| 93 static_cast<content::MediaStreamExtraData*>(web_stream.extraData()); | 93 static_cast<content::MediaStreamExtraData*>(web_stream.extraData()); |
| 94 if (!extra_data) | 94 if (!extra_data) |
| 95 return NULL; | 95 return NULL; |
| 96 return extra_data->stream().get(); | 96 return extra_data->stream().get(); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void GetDefaultOutputDeviceParams( | 99 void GetDefaultOutputDeviceParams( |
| 100 int* output_sample_rate, int* output_buffer_size) { | 100 int* output_sample_rate, int* output_buffer_size) { |
| 101 // Fetch the default audio output hardware config. | 101 // Fetch the default audio output hardware config. |
| 102 media::AudioHardwareConfig* hardware_config = | 102 media::AudioHardwareConfig* hardware_config = |
| 103 RenderThreadImpl::current()->GetAudioHardwareConfig(); | 103 RenderThreadImpl::current()->GetAudioHardwareConfig(); |
| 104 *output_sample_rate = hardware_config->GetOutputSampleRate(); | 104 *output_sample_rate = hardware_config->GetOutputSampleRate(); |
| 105 *output_buffer_size = hardware_config->GetOutputBufferSize(); | 105 *output_buffer_size = hardware_config->GetOutputBufferSize(); |
| 106 } | 106 } |
| 107 | 107 |
| 108 void RemoveSource(const WebKit::WebMediaStreamSource& source, | 108 void RemoveSource(const blink::WebMediaStreamSource& source, |
| 109 std::vector<WebKit::WebMediaStreamSource>* sources) { | 109 std::vector<blink::WebMediaStreamSource>* sources) { |
| 110 for (std::vector<WebKit::WebMediaStreamSource>::iterator it = | 110 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
| 111 sources->begin(); | 111 sources->begin(); |
| 112 it != sources->end(); ++it) { | 112 it != sources->end(); ++it) { |
| 113 if (source.id() == it->id()) { | 113 if (source.id() == it->id()) { |
| 114 sources->erase(it); | 114 sources->erase(it); |
| 115 return; | 115 return; |
| 116 } | 116 } |
| 117 } | 117 } |
| 118 } | 118 } |
| 119 | 119 |
| 120 } // namespace | 120 } // namespace |
| 121 | 121 |
| 122 MediaStreamImpl::MediaStreamImpl( | 122 MediaStreamImpl::MediaStreamImpl( |
| 123 RenderView* render_view, | 123 RenderView* render_view, |
| 124 MediaStreamDispatcher* media_stream_dispatcher, | 124 MediaStreamDispatcher* media_stream_dispatcher, |
| 125 MediaStreamDependencyFactory* dependency_factory) | 125 MediaStreamDependencyFactory* dependency_factory) |
| 126 : RenderViewObserver(render_view), | 126 : RenderViewObserver(render_view), |
| 127 dependency_factory_(dependency_factory), | 127 dependency_factory_(dependency_factory), |
| 128 media_stream_dispatcher_(media_stream_dispatcher) { | 128 media_stream_dispatcher_(media_stream_dispatcher) { |
| 129 } | 129 } |
| 130 | 130 |
| 131 MediaStreamImpl::~MediaStreamImpl() { | 131 MediaStreamImpl::~MediaStreamImpl() { |
| 132 } | 132 } |
| 133 | 133 |
| 134 void MediaStreamImpl::requestUserMedia( | 134 void MediaStreamImpl::requestUserMedia( |
| 135 const WebKit::WebUserMediaRequest& user_media_request) { | 135 const blink::WebUserMediaRequest& user_media_request) { |
| 136 // Save histogram data so we can see how much GetUserMedia is used. | 136 // Save histogram data so we can see how much GetUserMedia is used. |
| 137 // The histogram counts the number of calls to the JS API | 137 // The histogram counts the number of calls to the JS API |
| 138 // webGetUserMedia. | 138 // webGetUserMedia. |
| 139 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); | 139 UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); |
| 140 DCHECK(CalledOnValidThread()); | 140 DCHECK(CalledOnValidThread()); |
| 141 int request_id = g_next_request_id++; | 141 int request_id = g_next_request_id++; |
| 142 StreamOptions options(MEDIA_NO_SERVICE, MEDIA_NO_SERVICE); | 142 StreamOptions options(MEDIA_NO_SERVICE, MEDIA_NO_SERVICE); |
| 143 WebKit::WebFrame* frame = NULL; | 143 blink::WebFrame* frame = NULL; |
| 144 GURL security_origin; | 144 GURL security_origin; |
| 145 bool enable_automatic_output_device_selection = false; | 145 bool enable_automatic_output_device_selection = false; |
| 146 | 146 |
| 147 // |user_media_request| can't be mocked. So in order to test at all we check | 147 // |user_media_request| can't be mocked. So in order to test at all we check |
| 148 // if it isNull. | 148 // if it isNull. |
| 149 if (user_media_request.isNull()) { | 149 if (user_media_request.isNull()) { |
| 150 // We are in a test. | 150 // We are in a test. |
| 151 options.audio_type = MEDIA_DEVICE_AUDIO_CAPTURE; | 151 options.audio_type = MEDIA_DEVICE_AUDIO_CAPTURE; |
| 152 options.video_type = MEDIA_DEVICE_VIDEO_CAPTURE; | 152 options.video_type = MEDIA_DEVICE_VIDEO_CAPTURE; |
| 153 } else { | 153 } else { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 enable_automatic_output_device_selection)); | 193 enable_automatic_output_device_selection)); |
| 194 | 194 |
| 195 media_stream_dispatcher_->GenerateStream( | 195 media_stream_dispatcher_->GenerateStream( |
| 196 request_id, | 196 request_id, |
| 197 AsWeakPtr(), | 197 AsWeakPtr(), |
| 198 options, | 198 options, |
| 199 security_origin); | 199 security_origin); |
| 200 } | 200 } |
| 201 | 201 |
| 202 void MediaStreamImpl::cancelUserMediaRequest( | 202 void MediaStreamImpl::cancelUserMediaRequest( |
| 203 const WebKit::WebUserMediaRequest& user_media_request) { | 203 const blink::WebUserMediaRequest& user_media_request) { |
| 204 DCHECK(CalledOnValidThread()); | 204 DCHECK(CalledOnValidThread()); |
| 205 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); | 205 UserMediaRequestInfo* request = FindUserMediaRequestInfo(user_media_request); |
| 206 if (request) { | 206 if (request) { |
| 207 // We can't abort the stream generation process. | 207 // We can't abort the stream generation process. |
| 208 // Instead, erase the request. Once the stream is generated we will stop the | 208 // Instead, erase the request. Once the stream is generated we will stop the |
| 209 // stream if the request does not exist. | 209 // stream if the request does not exist. |
| 210 DeleteUserMediaRequestInfo(request); | 210 DeleteUserMediaRequestInfo(request); |
| 211 } | 211 } |
| 212 } | 212 } |
| 213 | 213 |
| 214 WebKit::WebMediaStream MediaStreamImpl::GetMediaStream( | 214 blink::WebMediaStream MediaStreamImpl::GetMediaStream( |
| 215 const GURL& url) { | 215 const GURL& url) { |
| 216 return WebKit::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url); | 216 return blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url); |
| 217 } | 217 } |
| 218 | 218 |
| 219 bool MediaStreamImpl::IsMediaStream(const GURL& url) { | 219 bool MediaStreamImpl::IsMediaStream(const GURL& url) { |
| 220 WebKit::WebMediaStream web_stream( | 220 blink::WebMediaStream web_stream( |
| 221 WebKit::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); | 221 blink::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); |
| 222 | 222 |
| 223 if (web_stream.isNull() || !web_stream.extraData()) | 223 if (web_stream.isNull() || !web_stream.extraData()) |
| 224 return false; // This is not a valid stream. | 224 return false; // This is not a valid stream. |
| 225 | 225 |
| 226 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); | 226 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); |
| 227 return (stream && | 227 return (stream && |
| 228 (!stream->GetVideoTracks().empty() || !stream->GetAudioTracks().empty())); | 228 (!stream->GetVideoTracks().empty() || !stream->GetAudioTracks().empty())); |
| 229 } | 229 } |
| 230 | 230 |
| 231 scoped_refptr<VideoFrameProvider> | 231 scoped_refptr<VideoFrameProvider> |
| 232 MediaStreamImpl::GetVideoFrameProvider( | 232 MediaStreamImpl::GetVideoFrameProvider( |
| 233 const GURL& url, | 233 const GURL& url, |
| 234 const base::Closure& error_cb, | 234 const base::Closure& error_cb, |
| 235 const VideoFrameProvider::RepaintCB& repaint_cb) { | 235 const VideoFrameProvider::RepaintCB& repaint_cb) { |
| 236 DCHECK(CalledOnValidThread()); | 236 DCHECK(CalledOnValidThread()); |
| 237 WebKit::WebMediaStream web_stream(GetMediaStream(url)); | 237 blink::WebMediaStream web_stream(GetMediaStream(url)); |
| 238 | 238 |
| 239 if (web_stream.isNull() || !web_stream.extraData()) | 239 if (web_stream.isNull() || !web_stream.extraData()) |
| 240 return NULL; // This is not a valid stream. | 240 return NULL; // This is not a valid stream. |
| 241 | 241 |
| 242 DVLOG(1) << "MediaStreamImpl::GetVideoFrameProvider stream:" | 242 DVLOG(1) << "MediaStreamImpl::GetVideoFrameProvider stream:" |
| 243 << UTF16ToUTF8(web_stream.id()); | 243 << UTF16ToUTF8(web_stream.id()); |
| 244 | 244 |
| 245 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); | 245 webrtc::MediaStreamInterface* stream = GetNativeMediaStream(web_stream); |
| 246 if (stream) | 246 if (stream) |
| 247 return CreateVideoFrameProvider(stream, error_cb, repaint_cb); | 247 return CreateVideoFrameProvider(stream, error_cb, repaint_cb); |
| 248 NOTREACHED(); | 248 NOTREACHED(); |
| 249 return NULL; | 249 return NULL; |
| 250 } | 250 } |
| 251 | 251 |
| 252 scoped_refptr<MediaStreamAudioRenderer> | 252 scoped_refptr<MediaStreamAudioRenderer> |
| 253 MediaStreamImpl::GetAudioRenderer(const GURL& url) { | 253 MediaStreamImpl::GetAudioRenderer(const GURL& url) { |
| 254 DCHECK(CalledOnValidThread()); | 254 DCHECK(CalledOnValidThread()); |
| 255 WebKit::WebMediaStream web_stream(GetMediaStream(url)); | 255 blink::WebMediaStream web_stream(GetMediaStream(url)); |
| 256 | 256 |
| 257 if (web_stream.isNull() || !web_stream.extraData()) | 257 if (web_stream.isNull() || !web_stream.extraData()) |
| 258 return NULL; // This is not a valid stream. | 258 return NULL; // This is not a valid stream. |
| 259 | 259 |
| 260 DVLOG(1) << "MediaStreamImpl::GetAudioRenderer stream:" | 260 DVLOG(1) << "MediaStreamImpl::GetAudioRenderer stream:" |
| 261 << UTF16ToUTF8(web_stream.id()); | 261 << UTF16ToUTF8(web_stream.id()); |
| 262 | 262 |
| 263 MediaStreamExtraData* extra_data = | 263 MediaStreamExtraData* extra_data = |
| 264 static_cast<MediaStreamExtraData*>(web_stream.extraData()); | 264 static_cast<MediaStreamExtraData*>(web_stream.extraData()); |
| 265 | 265 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 device_it != video_array.end(); ++device_it) { | 313 device_it != video_array.end(); ++device_it) { |
| 314 if (!FindLocalSource(*device_it)) | 314 if (!FindLocalSource(*device_it)) |
| 315 media_stream_dispatcher_->StopStreamDevice(*device_it); | 315 media_stream_dispatcher_->StopStreamDevice(*device_it); |
| 316 } | 316 } |
| 317 | 317 |
| 318 DVLOG(1) << "Request ID not found"; | 318 DVLOG(1) << "Request ID not found"; |
| 319 return; | 319 return; |
| 320 } | 320 } |
| 321 request_info->generated = true; | 321 request_info->generated = true; |
| 322 | 322 |
| 323 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_source_vector( | 323 blink::WebVector<blink::WebMediaStreamSource> audio_source_vector( |
| 324 audio_array.size()); | 324 audio_array.size()); |
| 325 | 325 |
| 326 StreamDeviceInfoArray overridden_audio_array = audio_array; | 326 StreamDeviceInfoArray overridden_audio_array = audio_array; |
| 327 if (!request_info->enable_automatic_output_device_selection) { | 327 if (!request_info->enable_automatic_output_device_selection) { |
| 328 // If the GetUserMedia request did not explicitly set the constraint | 328 // If the GetUserMedia request did not explicitly set the constraint |
| 329 // kMediaStreamRenderToAssociatedSink, the output device parameters must | 329 // kMediaStreamRenderToAssociatedSink, the output device parameters must |
| 330 // be removed. | 330 // be removed. |
| 331 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin(); | 331 for (StreamDeviceInfoArray::iterator it = overridden_audio_array.begin(); |
| 332 it != overridden_audio_array.end(); ++it) { | 332 it != overridden_audio_array.end(); ++it) { |
| 333 it->device.matched_output_device_id = ""; | 333 it->device.matched_output_device_id = ""; |
| 334 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters(); | 334 it->device.matched_output = MediaStreamDevice::AudioDeviceParameters(); |
| 335 } | 335 } |
| 336 } | 336 } |
| 337 CreateWebKitSourceVector(label, overridden_audio_array, | 337 CreateWebKitSourceVector(label, overridden_audio_array, |
| 338 WebKit::WebMediaStreamSource::TypeAudio, | 338 blink::WebMediaStreamSource::TypeAudio, |
| 339 request_info->frame, | 339 request_info->frame, |
| 340 audio_source_vector); | 340 audio_source_vector); |
| 341 | 341 |
| 342 WebKit::WebVector<WebKit::WebMediaStreamSource> video_source_vector( | 342 blink::WebVector<blink::WebMediaStreamSource> video_source_vector( |
| 343 video_array.size()); | 343 video_array.size()); |
| 344 CreateWebKitSourceVector(label, video_array, | 344 CreateWebKitSourceVector(label, video_array, |
| 345 WebKit::WebMediaStreamSource::TypeVideo, | 345 blink::WebMediaStreamSource::TypeVideo, |
| 346 request_info->frame, | 346 request_info->frame, |
| 347 video_source_vector); | 347 video_source_vector); |
| 348 WebKit::WebUserMediaRequest* request = &(request_info->request); | 348 blink::WebUserMediaRequest* request = &(request_info->request); |
| 349 WebKit::WebString webkit_id = UTF8ToUTF16(label); | 349 blink::WebString webkit_id = UTF8ToUTF16(label); |
| 350 WebKit::WebMediaStream* web_stream = &(request_info->web_stream); | 350 blink::WebMediaStream* web_stream = &(request_info->web_stream); |
| 351 | 351 |
| 352 WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_track_vector( | 352 blink::WebVector<blink::WebMediaStreamTrack> audio_track_vector( |
| 353 audio_array.size()); | 353 audio_array.size()); |
| 354 for (size_t i = 0; i < audio_track_vector.size(); ++i) { | 354 for (size_t i = 0; i < audio_track_vector.size(); ++i) { |
| 355 audio_track_vector[i].initialize(audio_source_vector[i]); | 355 audio_track_vector[i].initialize(audio_source_vector[i]); |
| 356 request_info->sources.push_back(audio_source_vector[i]); | 356 request_info->sources.push_back(audio_source_vector[i]); |
| 357 } | 357 } |
| 358 | 358 |
| 359 WebKit::WebVector<WebKit::WebMediaStreamTrack> video_track_vector( | 359 blink::WebVector<blink::WebMediaStreamTrack> video_track_vector( |
| 360 video_array.size()); | 360 video_array.size()); |
| 361 for (size_t i = 0; i < video_track_vector.size(); ++i) { | 361 for (size_t i = 0; i < video_track_vector.size(); ++i) { |
| 362 video_track_vector[i].initialize(video_source_vector[i]); | 362 video_track_vector[i].initialize(video_source_vector[i]); |
| 363 request_info->sources.push_back(video_source_vector[i]); | 363 request_info->sources.push_back(video_source_vector[i]); |
| 364 } | 364 } |
| 365 | 365 |
| 366 web_stream->initialize(webkit_id, audio_track_vector, | 366 web_stream->initialize(webkit_id, audio_track_vector, |
| 367 video_track_vector); | 367 video_track_vector); |
| 368 | 368 |
| 369 // WebUserMediaRequest don't have an implementation in unit tests. | 369 // WebUserMediaRequest don't have an implementation in unit tests. |
| 370 // Therefore we need to check for isNull here. | 370 // Therefore we need to check for isNull here. |
| 371 WebKit::WebMediaConstraints audio_constraints = request->isNull() ? | 371 blink::WebMediaConstraints audio_constraints = request->isNull() ? |
| 372 WebKit::WebMediaConstraints() : request->audioConstraints(); | 372 blink::WebMediaConstraints() : request->audioConstraints(); |
| 373 WebKit::WebMediaConstraints video_constraints = request->isNull() ? | 373 blink::WebMediaConstraints video_constraints = request->isNull() ? |
| 374 WebKit::WebMediaConstraints() : request->videoConstraints(); | 374 blink::WebMediaConstraints() : request->videoConstraints(); |
| 375 | 375 |
| 376 dependency_factory_->CreateNativeMediaSources( | 376 dependency_factory_->CreateNativeMediaSources( |
| 377 RenderViewObserver::routing_id(), | 377 RenderViewObserver::routing_id(), |
| 378 audio_constraints, video_constraints, web_stream, | 378 audio_constraints, video_constraints, web_stream, |
| 379 base::Bind(&MediaStreamImpl::OnCreateNativeSourcesComplete, AsWeakPtr())); | 379 base::Bind(&MediaStreamImpl::OnCreateNativeSourcesComplete, AsWeakPtr())); |
| 380 } | 380 } |
| 381 | 381 |
| 382 // Callback from MediaStreamDispatcher. | 382 // Callback from MediaStreamDispatcher. |
| 383 // The requested stream failed to be generated. | 383 // The requested stream failed to be generated. |
| 384 void MediaStreamImpl::OnStreamGenerationFailed(int request_id) { | 384 void MediaStreamImpl::OnStreamGenerationFailed(int request_id) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 407 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); | 407 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); |
| 408 if (user_media_request) { | 408 if (user_media_request) { |
| 409 DeleteUserMediaRequestInfo(user_media_request); | 409 DeleteUserMediaRequestInfo(user_media_request); |
| 410 } | 410 } |
| 411 StopUnreferencedSources(false); | 411 StopUnreferencedSources(false); |
| 412 } | 412 } |
| 413 | 413 |
| 414 void MediaStreamImpl::CreateWebKitSourceVector( | 414 void MediaStreamImpl::CreateWebKitSourceVector( |
| 415 const std::string& label, | 415 const std::string& label, |
| 416 const StreamDeviceInfoArray& devices, | 416 const StreamDeviceInfoArray& devices, |
| 417 WebKit::WebMediaStreamSource::Type type, | 417 blink::WebMediaStreamSource::Type type, |
| 418 WebKit::WebFrame* frame, | 418 blink::WebFrame* frame, |
| 419 WebKit::WebVector<WebKit::WebMediaStreamSource>& webkit_sources) { | 419 blink::WebVector<blink::WebMediaStreamSource>& webkit_sources) { |
| 420 CHECK_EQ(devices.size(), webkit_sources.size()); | 420 CHECK_EQ(devices.size(), webkit_sources.size()); |
| 421 for (size_t i = 0; i < devices.size(); ++i) { | 421 for (size_t i = 0; i < devices.size(); ++i) { |
| 422 const char* track_type = | 422 const char* track_type = |
| 423 (type == WebKit::WebMediaStreamSource::TypeAudio) ? "a" : "v"; | 423 (type == blink::WebMediaStreamSource::TypeAudio) ? "a" : "v"; |
| 424 std::string source_id = base::StringPrintf("%s%s%u", label.c_str(), | 424 std::string source_id = base::StringPrintf("%s%s%u", label.c_str(), |
| 425 track_type, | 425 track_type, |
| 426 static_cast<unsigned int>(i)); | 426 static_cast<unsigned int>(i)); |
| 427 | 427 |
| 428 const WebKit::WebMediaStreamSource* existing_source = | 428 const blink::WebMediaStreamSource* existing_source = |
| 429 FindLocalSource(devices[i]); | 429 FindLocalSource(devices[i]); |
| 430 if (existing_source) { | 430 if (existing_source) { |
| 431 webkit_sources[i] = *existing_source; | 431 webkit_sources[i] = *existing_source; |
| 432 DVLOG(1) << "Source already exist. Reusing source with id " | 432 DVLOG(1) << "Source already exist. Reusing source with id " |
| 433 << webkit_sources[i]. id().utf8(); | 433 << webkit_sources[i]. id().utf8(); |
| 434 continue; | 434 continue; |
| 435 } | 435 } |
| 436 webkit_sources[i].initialize( | 436 webkit_sources[i].initialize( |
| 437 UTF8ToUTF16(source_id), | 437 UTF8ToUTF16(source_id), |
| 438 type, | 438 type, |
| 439 UTF8ToUTF16(devices[i].device.name)); | 439 UTF8ToUTF16(devices[i].device.name)); |
| 440 MediaStreamSourceExtraData* source_extra_data( | 440 MediaStreamSourceExtraData* source_extra_data( |
| 441 new content::MediaStreamSourceExtraData( | 441 new content::MediaStreamSourceExtraData( |
| 442 devices[i], | 442 devices[i], |
| 443 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr()))); | 443 base::Bind(&MediaStreamImpl::OnLocalSourceStop, AsWeakPtr()))); |
| 444 // |source_extra_data| is owned by webkit_sources[i]. | 444 // |source_extra_data| is owned by webkit_sources[i]. |
| 445 webkit_sources[i].setExtraData(source_extra_data); | 445 webkit_sources[i].setExtraData(source_extra_data); |
| 446 webkit_sources[i].setDeviceId(UTF8ToUTF16( | 446 webkit_sources[i].setDeviceId(UTF8ToUTF16( |
| 447 base::IntToString(devices[i].session_id))); | 447 base::IntToString(devices[i].session_id))); |
| 448 local_sources_.push_back(LocalStreamSource(frame, webkit_sources[i])); | 448 local_sources_.push_back(LocalStreamSource(frame, webkit_sources[i])); |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 | 451 |
| 452 // Callback from MediaStreamDependencyFactory when the sources in |web_stream| | 452 // Callback from MediaStreamDependencyFactory when the sources in |web_stream| |
| 453 // have been generated. | 453 // have been generated. |
| 454 void MediaStreamImpl::OnCreateNativeSourcesComplete( | 454 void MediaStreamImpl::OnCreateNativeSourcesComplete( |
| 455 WebKit::WebMediaStream* web_stream, | 455 blink::WebMediaStream* web_stream, |
| 456 bool request_succeeded) { | 456 bool request_succeeded) { |
| 457 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(web_stream); | 457 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(web_stream); |
| 458 if (!request_info) { | 458 if (!request_info) { |
| 459 // This can happen if the request is canceled or the frame reloads while | 459 // This can happen if the request is canceled or the frame reloads while |
| 460 // MediaStreamDependencyFactory is creating the sources. | 460 // MediaStreamDependencyFactory is creating the sources. |
| 461 DVLOG(1) << "Request ID not found"; | 461 DVLOG(1) << "Request ID not found"; |
| 462 return; | 462 return; |
| 463 } | 463 } |
| 464 | 464 |
| 465 // Create a native representation of the stream. | 465 // Create a native representation of the stream. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 NOTIMPLEMENTED(); | 504 NOTIMPLEMENTED(); |
| 505 } | 505 } |
| 506 | 506 |
| 507 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { | 507 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { |
| 508 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" | 508 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" |
| 509 << request_id << ")"; | 509 << request_id << ")"; |
| 510 NOTIMPLEMENTED(); | 510 NOTIMPLEMENTED(); |
| 511 } | 511 } |
| 512 | 512 |
| 513 void MediaStreamImpl::CompleteGetUserMediaRequest( | 513 void MediaStreamImpl::CompleteGetUserMediaRequest( |
| 514 const WebKit::WebMediaStream& stream, | 514 const blink::WebMediaStream& stream, |
| 515 WebKit::WebUserMediaRequest* request_info, | 515 blink::WebUserMediaRequest* request_info, |
| 516 bool request_succeeded) { | 516 bool request_succeeded) { |
| 517 if (request_succeeded) { | 517 if (request_succeeded) { |
| 518 request_info->requestSucceeded(stream); | 518 request_info->requestSucceeded(stream); |
| 519 } else { | 519 } else { |
| 520 request_info->requestFailed(); | 520 request_info->requestFailed(); |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 | 523 |
| 524 const WebKit::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( | 524 const blink::WebMediaStreamSource* MediaStreamImpl::FindLocalSource( |
| 525 const StreamDeviceInfo& device) const { | 525 const StreamDeviceInfo& device) const { |
| 526 for (LocalStreamSources::const_iterator it = local_sources_.begin(); | 526 for (LocalStreamSources::const_iterator it = local_sources_.begin(); |
| 527 it != local_sources_.end(); ++it) { | 527 it != local_sources_.end(); ++it) { |
| 528 MediaStreamSourceExtraData* extra_data = | 528 MediaStreamSourceExtraData* extra_data = |
| 529 static_cast<MediaStreamSourceExtraData*>( | 529 static_cast<MediaStreamSourceExtraData*>( |
| 530 it->source.extraData()); | 530 it->source.extraData()); |
| 531 const StreamDeviceInfo& active_device = extra_data->device_info(); | 531 const StreamDeviceInfo& active_device = extra_data->device_info(); |
| 532 if (active_device.device.id == device.device.id && | 532 if (active_device.device.id == device.device.id && |
| 533 active_device.session_id == device.session_id) { | 533 active_device.session_id == device.session_id) { |
| 534 return &it->source; | 534 return &it->source; |
| 535 } | 535 } |
| 536 } | 536 } |
| 537 return NULL; | 537 return NULL; |
| 538 } | 538 } |
| 539 | 539 |
| 540 bool MediaStreamImpl::FindSourceInRequests( | 540 bool MediaStreamImpl::FindSourceInRequests( |
| 541 const WebKit::WebMediaStreamSource& source) const { | 541 const blink::WebMediaStreamSource& source) const { |
| 542 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); | 542 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin(); |
| 543 req_it != user_media_requests_.end(); ++req_it) { | 543 req_it != user_media_requests_.end(); ++req_it) { |
| 544 const std::vector<WebKit::WebMediaStreamSource>& sources = | 544 const std::vector<blink::WebMediaStreamSource>& sources = |
| 545 (*req_it)->sources; | 545 (*req_it)->sources; |
| 546 for (std::vector<WebKit::WebMediaStreamSource>::const_iterator source_it = | 546 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = |
| 547 sources.begin(); | 547 sources.begin(); |
| 548 source_it != sources.end(); ++source_it) { | 548 source_it != sources.end(); ++source_it) { |
| 549 if (source_it->id() == source.id()) { | 549 if (source_it->id() == source.id()) { |
| 550 return true; | 550 return true; |
| 551 } | 551 } |
| 552 } | 552 } |
| 553 } | 553 } |
| 554 return false; | 554 return false; |
| 555 } | 555 } |
| 556 | 556 |
| 557 MediaStreamImpl::UserMediaRequestInfo* | 557 MediaStreamImpl::UserMediaRequestInfo* |
| 558 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { | 558 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { |
| 559 UserMediaRequests::iterator it = user_media_requests_.begin(); | 559 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 560 for (; it != user_media_requests_.end(); ++it) { | 560 for (; it != user_media_requests_.end(); ++it) { |
| 561 if ((*it)->request_id == request_id) | 561 if ((*it)->request_id == request_id) |
| 562 return (*it); | 562 return (*it); |
| 563 } | 563 } |
| 564 return NULL; | 564 return NULL; |
| 565 } | 565 } |
| 566 | 566 |
| 567 MediaStreamImpl::UserMediaRequestInfo* | 567 MediaStreamImpl::UserMediaRequestInfo* |
| 568 MediaStreamImpl::FindUserMediaRequestInfo( | 568 MediaStreamImpl::FindUserMediaRequestInfo( |
| 569 const WebKit::WebUserMediaRequest& request) { | 569 const blink::WebUserMediaRequest& request) { |
| 570 UserMediaRequests::iterator it = user_media_requests_.begin(); | 570 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 571 for (; it != user_media_requests_.end(); ++it) { | 571 for (; it != user_media_requests_.end(); ++it) { |
| 572 if ((*it)->request == request) | 572 if ((*it)->request == request) |
| 573 return (*it); | 573 return (*it); |
| 574 } | 574 } |
| 575 return NULL; | 575 return NULL; |
| 576 } | 576 } |
| 577 | 577 |
| 578 MediaStreamImpl::UserMediaRequestInfo* | 578 MediaStreamImpl::UserMediaRequestInfo* |
| 579 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { | 579 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) { |
| 580 UserMediaRequests::iterator it = user_media_requests_.begin(); | 580 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 581 for (; it != user_media_requests_.end(); ++it) { | 581 for (; it != user_media_requests_.end(); ++it) { |
| 582 if ((*it)->generated && (*it)->web_stream.id() == UTF8ToUTF16(label)) | 582 if ((*it)->generated && (*it)->web_stream.id() == UTF8ToUTF16(label)) |
| 583 return (*it); | 583 return (*it); |
| 584 } | 584 } |
| 585 return NULL; | 585 return NULL; |
| 586 } | 586 } |
| 587 | 587 |
| 588 MediaStreamImpl::UserMediaRequestInfo* | 588 MediaStreamImpl::UserMediaRequestInfo* |
| 589 MediaStreamImpl::FindUserMediaRequestInfo( | 589 MediaStreamImpl::FindUserMediaRequestInfo( |
| 590 WebKit::WebMediaStream* web_stream) { | 590 blink::WebMediaStream* web_stream) { |
| 591 UserMediaRequests::iterator it = user_media_requests_.begin(); | 591 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 592 for (; it != user_media_requests_.end(); ++it) { | 592 for (; it != user_media_requests_.end(); ++it) { |
| 593 if (&((*it)->web_stream) == web_stream) | 593 if (&((*it)->web_stream) == web_stream) |
| 594 return (*it); | 594 return (*it); |
| 595 } | 595 } |
| 596 return NULL; | 596 return NULL; |
| 597 } | 597 } |
| 598 | 598 |
| 599 void MediaStreamImpl::DeleteUserMediaRequestInfo( | 599 void MediaStreamImpl::DeleteUserMediaRequestInfo( |
| 600 UserMediaRequestInfo* request) { | 600 UserMediaRequestInfo* request) { |
| 601 UserMediaRequests::iterator it = user_media_requests_.begin(); | 601 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 602 for (; it != user_media_requests_.end(); ++it) { | 602 for (; it != user_media_requests_.end(); ++it) { |
| 603 if ((*it) == request) { | 603 if ((*it) == request) { |
| 604 user_media_requests_.erase(it); | 604 user_media_requests_.erase(it); |
| 605 return; | 605 return; |
| 606 } | 606 } |
| 607 } | 607 } |
| 608 NOTREACHED(); | 608 NOTREACHED(); |
| 609 } | 609 } |
| 610 | 610 |
| 611 void MediaStreamImpl::FrameDetached(WebKit::WebFrame* frame) { | 611 void MediaStreamImpl::FrameDetached(blink::WebFrame* frame) { |
| 612 // Do same thing as FrameWillClose. | 612 // Do same thing as FrameWillClose. |
| 613 FrameWillClose(frame); | 613 FrameWillClose(frame); |
| 614 } | 614 } |
| 615 | 615 |
| 616 void MediaStreamImpl::FrameWillClose(WebKit::WebFrame* frame) { | 616 void MediaStreamImpl::FrameWillClose(blink::WebFrame* frame) { |
| 617 // Loop through all UserMediaRequests and find the requests that belong to the | 617 // Loop through all UserMediaRequests and find the requests that belong to the |
| 618 // frame that is being closed. | 618 // frame that is being closed. |
| 619 UserMediaRequests::iterator request_it = user_media_requests_.begin(); | 619 UserMediaRequests::iterator request_it = user_media_requests_.begin(); |
| 620 while (request_it != user_media_requests_.end()) { | 620 while (request_it != user_media_requests_.end()) { |
| 621 if ((*request_it)->frame == frame) { | 621 if ((*request_it)->frame == frame) { |
| 622 DVLOG(1) << "MediaStreamImpl::FrameWillClose: " | 622 DVLOG(1) << "MediaStreamImpl::FrameWillClose: " |
| 623 << "Cancel user media request " << (*request_it)->request_id; | 623 << "Cancel user media request " << (*request_it)->request_id; |
| 624 // If the request is not generated, it means that a request | 624 // If the request is not generated, it means that a request |
| 625 // has been sent to the MediaStreamDispatcher to generate a stream | 625 // has been sent to the MediaStreamDispatcher to generate a stream |
| 626 // but MediaStreamDispatcher has not yet responded and we need to cancel | 626 // but MediaStreamDispatcher has not yet responded and we need to cancel |
| (...skipping 26 matching lines...) Expand all Loading... |
| 653 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")"; | 653 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")"; |
| 654 | 654 |
| 655 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); | 655 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label); |
| 656 if (user_media_request) { | 656 if (user_media_request) { |
| 657 DeleteUserMediaRequestInfo(user_media_request); | 657 DeleteUserMediaRequestInfo(user_media_request); |
| 658 } | 658 } |
| 659 StopUnreferencedSources(true); | 659 StopUnreferencedSources(true); |
| 660 } | 660 } |
| 661 | 661 |
| 662 void MediaStreamImpl::OnLocalSourceStop( | 662 void MediaStreamImpl::OnLocalSourceStop( |
| 663 const WebKit::WebMediaStreamSource& source) { | 663 const blink::WebMediaStreamSource& source) { |
| 664 DCHECK(CalledOnValidThread()); | 664 DCHECK(CalledOnValidThread()); |
| 665 | 665 |
| 666 StopLocalSource(source, true); | 666 StopLocalSource(source, true); |
| 667 | 667 |
| 668 bool device_found = false; | 668 bool device_found = false; |
| 669 for (LocalStreamSources::iterator device_it = local_sources_.begin(); | 669 for (LocalStreamSources::iterator device_it = local_sources_.begin(); |
| 670 device_it != local_sources_.end(); ++device_it) { | 670 device_it != local_sources_.end(); ++device_it) { |
| 671 if (device_it->source.id() == source.id()) { | 671 if (device_it->source.id() == source.id()) { |
| 672 device_found = true; | 672 device_found = true; |
| 673 local_sources_.erase(device_it); | 673 local_sources_.erase(device_it); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 684 RemoveSource(source, &(*it)->sources); | 684 RemoveSource(source, &(*it)->sources); |
| 685 if ((*it)->sources.empty()) { | 685 if ((*it)->sources.empty()) { |
| 686 it = user_media_requests_.erase(it); | 686 it = user_media_requests_.erase(it); |
| 687 } else { | 687 } else { |
| 688 ++it; | 688 ++it; |
| 689 } | 689 } |
| 690 } | 690 } |
| 691 } | 691 } |
| 692 | 692 |
| 693 void MediaStreamImpl::StopLocalSource( | 693 void MediaStreamImpl::StopLocalSource( |
| 694 const WebKit::WebMediaStreamSource& source, | 694 const blink::WebMediaStreamSource& source, |
| 695 bool notify_dispatcher) { | 695 bool notify_dispatcher) { |
| 696 MediaStreamSourceExtraData* extra_data = | 696 MediaStreamSourceExtraData* extra_data = |
| 697 static_cast<MediaStreamSourceExtraData*> (source.extraData()); | 697 static_cast<MediaStreamSourceExtraData*> (source.extraData()); |
| 698 CHECK(extra_data); | 698 CHECK(extra_data); |
| 699 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" | 699 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" |
| 700 << "{device_id = " << extra_data->device_info().device.id << "})"; | 700 << "{device_id = " << extra_data->device_info().device.id << "})"; |
| 701 | 701 |
| 702 if (source.type() == WebKit::WebMediaStreamSource::TypeAudio) { | 702 if (source.type() == blink::WebMediaStreamSource::TypeAudio) { |
| 703 if (extra_data->GetAudioCapturer()) { | 703 if (extra_data->GetAudioCapturer()) { |
| 704 extra_data->GetAudioCapturer()->Stop(); | 704 extra_data->GetAudioCapturer()->Stop(); |
| 705 } | 705 } |
| 706 } | 706 } |
| 707 | 707 |
| 708 if (notify_dispatcher) | 708 if (notify_dispatcher) |
| 709 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info()); | 709 media_stream_dispatcher_->StopStreamDevice(extra_data->device_info()); |
| 710 | 710 |
| 711 WebKit::WebMediaStreamSource writable_source(source); | 711 blink::WebMediaStreamSource writable_source(source); |
| 712 writable_source.setReadyState( | 712 writable_source.setReadyState( |
| 713 WebKit::WebMediaStreamSource::ReadyStateEnded); | 713 blink::WebMediaStreamSource::ReadyStateEnded); |
| 714 writable_source.setExtraData(NULL); | 714 writable_source.setExtraData(NULL); |
| 715 } | 715 } |
| 716 | 716 |
| 717 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { | 717 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) { |
| 718 LocalStreamSources::iterator source_it = local_sources_.begin(); | 718 LocalStreamSources::iterator source_it = local_sources_.begin(); |
| 719 while (source_it != local_sources_.end()) { | 719 while (source_it != local_sources_.end()) { |
| 720 if (!FindSourceInRequests(source_it->source)) { | 720 if (!FindSourceInRequests(source_it->source)) { |
| 721 StopLocalSource(source_it->source, notify_dispatcher); | 721 StopLocalSource(source_it->source, notify_dispatcher); |
| 722 source_it = local_sources_.erase(source_it); | 722 source_it = local_sources_.erase(source_it); |
| 723 } else { | 723 } else { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 stream_stop_callback_ = stop_callback; | 848 stream_stop_callback_ = stop_callback; |
| 849 } | 849 } |
| 850 | 850 |
| 851 void MediaStreamExtraData::OnLocalStreamStop() { | 851 void MediaStreamExtraData::OnLocalStreamStop() { |
| 852 if (!stream_stop_callback_.is_null()) | 852 if (!stream_stop_callback_.is_null()) |
| 853 stream_stop_callback_.Run(stream_->label()); | 853 stream_stop_callback_.Run(stream_->label()); |
| 854 } | 854 } |
| 855 | 855 |
| 856 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( | 856 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
| 857 int request_id, | 857 int request_id, |
| 858 WebKit::WebFrame* frame, | 858 blink::WebFrame* frame, |
| 859 const WebKit::WebUserMediaRequest& request, | 859 const blink::WebUserMediaRequest& request, |
| 860 bool enable_automatic_output_device_selection) | 860 bool enable_automatic_output_device_selection) |
| 861 : request_id(request_id), | 861 : request_id(request_id), |
| 862 generated(false), | 862 generated(false), |
| 863 enable_automatic_output_device_selection( | 863 enable_automatic_output_device_selection( |
| 864 enable_automatic_output_device_selection), | 864 enable_automatic_output_device_selection), |
| 865 frame(frame), | 865 frame(frame), |
| 866 request(request) { | 866 request(request) { |
| 867 } | 867 } |
| 868 | 868 |
| 869 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { | 869 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
| 870 } | 870 } |
| 871 | 871 |
| 872 } // namespace content | 872 } // namespace content |
| OLD | NEW |