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 } |
| 932 |
913 } // namespace content | 933 } // namespace content |
OLD | NEW |