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. |
| 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/hash.h" | 9 #include "base/hash.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 } | 192 } |
| 193 | 193 |
| 194 void MediaStreamImpl::cancelUserMediaRequest( | 194 void MediaStreamImpl::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 DeleteUserMediaRequestInfo(request); | 203 DeleteUserMediaRequestInfo(request); |
| 203 } | 204 } |
| 204 } | 205 } |
| 205 | 206 |
| 206 void MediaStreamImpl::requestMediaDevices( | 207 void MediaStreamImpl::requestMediaDevices( |
| 207 const blink::WebMediaDevicesRequest& media_devices_request) { | 208 const blink::WebMediaDevicesRequest& media_devices_request) { |
| 208 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); | 209 UpdateWebRTCMethodCount(WEBKIT_GET_MEDIA_DEVICES); |
| 209 DCHECK(CalledOnValidThread()); | 210 DCHECK(CalledOnValidThread()); |
| 210 | 211 |
| 211 int audio_input_request_id = g_next_request_id++; | 212 int audio_input_request_id = g_next_request_id++; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 const std::string& label, | 269 const std::string& label, |
| 269 const StreamDeviceInfoArray& audio_array, | 270 const StreamDeviceInfoArray& audio_array, |
| 270 const StreamDeviceInfoArray& video_array) { | 271 const StreamDeviceInfoArray& video_array) { |
| 271 DCHECK(CalledOnValidThread()); | 272 DCHECK(CalledOnValidThread()); |
| 272 DVLOG(1) << "MediaStreamImpl::OnStreamGenerated stream:" << label; | 273 DVLOG(1) << "MediaStreamImpl::OnStreamGenerated stream:" << label; |
| 273 | 274 |
| 274 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 275 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 275 if (!request_info) { | 276 if (!request_info) { |
| 276 // This can happen if the request is canceled or the frame reloads while | 277 // This can happen if the request is canceled or the frame reloads while |
| 277 // MediaStreamDispatcher is processing the request. | 278 // MediaStreamDispatcher is processing the request. |
| 278 // Only stop the device if the device is not used in another MediaStream. | |
| 279 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); | |
| 280 device_it != audio_array.end(); ++device_it) { | |
| 281 if (!FindLocalSource(*device_it)) | |
| 282 media_stream_dispatcher_->StopStreamDevice(*device_it); | |
| 283 } | |
| 284 | |
| 285 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); | |
| 286 device_it != video_array.end(); ++device_it) { | |
| 287 if (!FindLocalSource(*device_it)) | |
| 288 media_stream_dispatcher_->StopStreamDevice(*device_it); | |
| 289 } | |
| 290 | |
| 291 DVLOG(1) << "Request ID not found"; | 279 DVLOG(1) << "Request ID not found"; |
| 280 OnStreamGeneratedForCancelledRequest(audio_array, video_array); | |
| 292 return; | 281 return; |
| 293 } | 282 } |
| 294 request_info->generated = true; | 283 request_info->generated = true; |
| 295 | 284 |
| 296 // WebUserMediaRequest don't have an implementation in unit tests. | 285 // WebUserMediaRequest don't have an implementation in unit tests. |
| 297 // Therefore we need to check for isNull here and initialize the | 286 // Therefore we need to check for isNull here and initialize the |
| 298 // constraints. | 287 // constraints. |
| 299 blink::WebUserMediaRequest* request = &(request_info->request); | 288 blink::WebUserMediaRequest* request = &(request_info->request); |
| 300 blink::WebMediaConstraints audio_constraints; | 289 blink::WebMediaConstraints audio_constraints; |
| 301 blink::WebMediaConstraints video_constraints; | 290 blink::WebMediaConstraints video_constraints; |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 325 web_stream->setExtraData( | 314 web_stream->setExtraData( |
| 326 new MediaStream( | 315 new MediaStream( |
| 327 *web_stream)); | 316 *web_stream)); |
| 328 | 317 |
| 329 // Wait for the tracks to be started successfully or to fail. | 318 // Wait for the tracks to be started successfully or to fail. |
| 330 request_info->CallbackOnTracksStarted( | 319 request_info->CallbackOnTracksStarted( |
| 331 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, | 320 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, |
| 332 weak_factory_.GetWeakPtr())); | 321 weak_factory_.GetWeakPtr())); |
| 333 } | 322 } |
| 334 | 323 |
| 324 void MediaStreamImpl::OnStreamGeneratedForCancelledRequest( | |
| 325 const StreamDeviceInfoArray& audio_array, | |
| 326 const StreamDeviceInfoArray& video_array) { | |
| 327 // Only stop the device if the device is not used in another MediaStream. | |
| 328 for (StreamDeviceInfoArray::const_iterator device_it = audio_array.begin(); | |
| 329 device_it != audio_array.end(); ++device_it) { | |
| 330 if (!FindLocalSource(*device_it)) | |
| 331 media_stream_dispatcher_->StopStreamDevice(*device_it); | |
| 332 } | |
| 333 | |
| 334 for (StreamDeviceInfoArray::const_iterator device_it = video_array.begin(); | |
| 335 device_it != video_array.end(); ++device_it) { | |
| 336 if (!FindLocalSource(*device_it)) | |
| 337 media_stream_dispatcher_->StopStreamDevice(*device_it); | |
| 338 } | |
| 339 } | |
| 340 | |
| 335 // Callback from MediaStreamDispatcher. | 341 // Callback from MediaStreamDispatcher. |
| 336 // The requested stream failed to be generated. | 342 // The requested stream failed to be generated. |
| 337 void MediaStreamImpl::OnStreamGenerationFailed( | 343 void MediaStreamImpl::OnStreamGenerationFailed( |
| 338 int request_id, | 344 int request_id, |
| 339 content::MediaStreamRequestResult result) { | 345 content::MediaStreamRequestResult result) { |
| 340 DCHECK(CalledOnValidThread()); | 346 DCHECK(CalledOnValidThread()); |
| 341 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" | 347 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" |
| 342 << request_id << ")"; | 348 << request_id << ")"; |
| 343 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); | 349 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); |
| 344 if (!request_info) { | 350 if (!request_info) { |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 694 UserMediaRequests::iterator it = user_media_requests_.begin(); | 700 UserMediaRequests::iterator it = user_media_requests_.begin(); |
| 695 for (; it != user_media_requests_.end(); ++it) { | 701 for (; it != user_media_requests_.end(); ++it) { |
| 696 if ((*it) == request) { | 702 if ((*it) == request) { |
| 697 user_media_requests_.erase(it); | 703 user_media_requests_.erase(it); |
| 698 return; | 704 return; |
| 699 } | 705 } |
| 700 } | 706 } |
| 701 NOTREACHED(); | 707 NOTREACHED(); |
| 702 } | 708 } |
| 703 | 709 |
| 710 void MediaStreamImpl::DeleteAllUserMediaRequests() { | |
| 711 UserMediaRequests::iterator request_it = user_media_requests_.begin(); | |
| 712 while (request_it != user_media_requests_.end()) { | |
| 713 DVLOG(1) << "MediaStreamImpl@" << this << "::DeleteAllUserMediaRequests: " | |
| 714 << "Cancel user media request " << (*request_it)->request_id; | |
| 715 // If the request is not generated, it means that a request | |
| 716 // has been sent to the MediaStreamDispatcher to generate a stream | |
| 717 // but MediaStreamDispatcher has not yet responded and we need to cancel | |
| 718 // the request. | |
| 719 if (!(*request_it)->generated) { | |
| 720 DCHECK(!(*request_it)->HasPendingSources()); | |
| 721 media_stream_dispatcher_->CancelGenerateStream( | |
| 722 (*request_it)->request_id, weak_factory_.GetWeakPtr()); | |
| 723 LogUserMediaRequestWithNoResult(MEDIA_STREAM_REQUEST_NOT_GENERATED); | |
| 724 } else { | |
| 725 DCHECK((*request_it)->HasPendingSources()); | |
| 726 LogUserMediaRequestWithNoResult( | |
| 727 MEDIA_STREAM_REQUEST_PENDING_MEDIA_TRACKS); | |
| 728 } | |
| 729 request_it = user_media_requests_.erase(request_it); | |
| 730 } | |
| 731 } | |
| 732 | |
| 704 MediaStreamImpl::MediaDevicesRequestInfo* | 733 MediaStreamImpl::MediaDevicesRequestInfo* |
| 705 MediaStreamImpl::FindMediaDevicesRequestInfo( | 734 MediaStreamImpl::FindMediaDevicesRequestInfo( |
| 706 int request_id) { | 735 int request_id) { |
| 707 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); | 736 MediaDevicesRequests::iterator it = media_devices_requests_.begin(); |
| 708 for (; it != media_devices_requests_.end(); ++it) { | 737 for (; it != media_devices_requests_.end(); ++it) { |
| 709 if ((*it)->audio_input_request_id == request_id || | 738 if ((*it)->audio_input_request_id == request_id || |
| 710 (*it)->video_input_request_id == request_id || | 739 (*it)->video_input_request_id == request_id || |
| 711 (*it)->audio_output_request_id == request_id) { | 740 (*it)->audio_output_request_id == request_id) { |
| 712 return (*it); | 741 return (*it); |
| 713 } | 742 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 741 | 770 |
| 742 media_devices_requests_.erase(it); | 771 media_devices_requests_.erase(it); |
| 743 return; | 772 return; |
| 744 } | 773 } |
| 745 } | 774 } |
| 746 NOTREACHED(); | 775 NOTREACHED(); |
| 747 } | 776 } |
| 748 | 777 |
| 749 void MediaStreamImpl::FrameWillClose() { | 778 void MediaStreamImpl::FrameWillClose() { |
| 750 // Cancel all outstanding UserMediaRequests. | 779 // Cancel all outstanding UserMediaRequests. |
| 751 UserMediaRequests::iterator request_it = user_media_requests_.begin(); | 780 DeleteAllUserMediaRequests(); |
| 752 while (request_it != user_media_requests_.end()) { | |
| 753 DVLOG(1) << "MediaStreamImpl@" << this << "::FrameWillClose: " | |
| 754 << "Cancel user media request " << (*request_it)->request_id; | |
| 755 // If the request is not generated, it means that a request | |
| 756 // has been sent to the MediaStreamDispatcher to generate a stream | |
| 757 // but MediaStreamDispatcher has not yet responded and we need to cancel | |
| 758 // the request. | |
| 759 if (!(*request_it)->generated) { | |
| 760 media_stream_dispatcher_->CancelGenerateStream( | |
| 761 (*request_it)->request_id, weak_factory_.GetWeakPtr()); | |
| 762 } | |
| 763 request_it = user_media_requests_.erase(request_it); | |
| 764 } | |
| 765 | 781 |
| 766 // Loop through all current local sources and stop the sources. | 782 // Loop through all current local sources and stop the sources. |
| 767 LocalStreamSources::iterator sources_it = local_sources_.begin(); | 783 LocalStreamSources::iterator sources_it = local_sources_.begin(); |
| 768 while (sources_it != local_sources_.end()) { | 784 while (sources_it != local_sources_.end()) { |
| 769 StopLocalSource(*sources_it, true); | 785 StopLocalSource(*sources_it, true); |
| 770 sources_it = local_sources_.erase(sources_it); | 786 sources_it = local_sources_.erase(sources_it); |
| 771 } | 787 } |
| 772 } | 788 } |
| 773 | 789 |
| 774 void MediaStreamImpl::OnLocalSourceStopped( | 790 void MediaStreamImpl::OnLocalSourceStopped( |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 903 for (std::vector<blink::WebMediaStreamSource>::iterator it = | 919 for (std::vector<blink::WebMediaStreamSource>::iterator it = |
| 904 sources_.begin(); | 920 sources_.begin(); |
| 905 it != sources_.end(); ++it) { | 921 it != sources_.end(); ++it) { |
| 906 if (source.id() == it->id()) { | 922 if (source.id() == it->id()) { |
| 907 sources_.erase(it); | 923 sources_.erase(it); |
| 908 return; | 924 return; |
| 909 } | 925 } |
| 910 } | 926 } |
| 911 } | 927 } |
| 912 | 928 |
| 929 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const { | |
| 930 return !sources_waiting_for_callback_.empty(); | |
| 931 } | |
|
vrk (LEFT CHROMIUM)
2014/08/06 17:28:36
nit: extra blank line between } and } // namespac
andresp-chromium
2014/08/06 18:00:22
Done.
| |
| 913 } // namespace content | 932 } // namespace content |
| OLD | NEW |