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

Side by Side Diff: content/renderer/media/media_stream_impl.cc

Issue 218763007: Update MediaStreamTrack::Stop to latest draft. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed review comments and added tests. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #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_util.h" 10 #include "base/strings/string_util.h"
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 request_info); 335 request_info);
336 336
337 blink::WebString webkit_id = base::UTF8ToUTF16(label); 337 blink::WebString webkit_id = base::UTF8ToUTF16(label);
338 blink::WebMediaStream* web_stream = &(request_info->web_stream); 338 blink::WebMediaStream* web_stream = &(request_info->web_stream);
339 339
340 web_stream->initialize(webkit_id, audio_track_vector, 340 web_stream->initialize(webkit_id, audio_track_vector,
341 video_track_vector); 341 video_track_vector);
342 web_stream->setExtraData( 342 web_stream->setExtraData(
343 new MediaStream( 343 new MediaStream(
344 dependency_factory_, 344 dependency_factory_,
345 base::Bind(&MediaStreamImpl::OnLocalMediaStreamStop, AsWeakPtr()),
346 *web_stream)); 345 *web_stream));
347 346
348 // Wait for the tracks to be started successfully or to fail. 347 // Wait for the tracks to be started successfully or to fail.
349 request_info->CallbackOnTracksStarted( 348 request_info->CallbackOnTracksStarted(
350 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, AsWeakPtr())); 349 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, AsWeakPtr()));
351 } 350 }
352 351
353 // Callback from MediaStreamDispatcher. 352 // Callback from MediaStreamDispatcher.
354 // The requested stream failed to be generated. 353 // The requested stream failed to be generated.
355 void MediaStreamImpl::OnStreamGenerationFailed( 354 void MediaStreamImpl::OnStreamGenerationFailed(
356 int request_id, 355 int request_id,
357 content::MediaStreamRequestResult result) { 356 content::MediaStreamRequestResult result) {
358 DCHECK(CalledOnValidThread()); 357 DCHECK(CalledOnValidThread());
359 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" 358 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed("
360 << request_id << ")"; 359 << request_id << ")";
361 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); 360 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id);
362 if (!request_info) { 361 if (!request_info) {
363 // This can happen if the request is canceled or the frame reloads while 362 // This can happen if the request is canceled or the frame reloads while
364 // MediaStreamDispatcher is processing the request. 363 // MediaStreamDispatcher is processing the request.
365 DVLOG(1) << "Request ID not found"; 364 DVLOG(1) << "Request ID not found";
366 return; 365 return;
367 } 366 }
368 CompleteGetUserMediaRequest(request_info->web_stream, 367
369 &request_info->request, 368 GetUserMediaRequestFailed(&request_info->request, result);
370 result);
371 DeleteUserMediaRequestInfo(request_info); 369 DeleteUserMediaRequestInfo(request_info);
372 } 370 }
373 371
374 // Callback from MediaStreamDispatcher. 372 // Callback from MediaStreamDispatcher.
375 // The browser process has stopped a device used by a MediaStream. 373 // The browser process has stopped a device used by a MediaStream.
376 void MediaStreamImpl::OnDeviceStopped( 374 void MediaStreamImpl::OnDeviceStopped(
377 const std::string& label, 375 const std::string& label,
378 const StreamDeviceInfo& device_info) { 376 const StreamDeviceInfo& device_info) {
379 DCHECK(CalledOnValidThread()); 377 DCHECK(CalledOnValidThread());
380 DVLOG(1) << "MediaStreamImpl::OnDeviceStopped(" 378 DVLOG(1) << "MediaStreamImpl::OnDeviceStopped("
(...skipping 11 matching lines...) Expand all
392 blink::WebMediaStreamSource source(*source_ptr); 390 blink::WebMediaStreamSource source(*source_ptr);
393 StopLocalSource(source, false); 391 StopLocalSource(source, false);
394 392
395 for (LocalStreamSources::iterator device_it = local_sources_.begin(); 393 for (LocalStreamSources::iterator device_it = local_sources_.begin();
396 device_it != local_sources_.end(); ++device_it) { 394 device_it != local_sources_.end(); ++device_it) {
397 if (device_it->source.id() == source.id()) { 395 if (device_it->source.id() == source.id()) {
398 local_sources_.erase(device_it); 396 local_sources_.erase(device_it);
399 break; 397 break;
400 } 398 }
401 } 399 }
402
403 // Remove the reference to this source from all |user_media_requests_|.
404 // TODO(perkj): The below is not necessary once we don't need to support
405 // MediaStream::Stop().
406 UserMediaRequests::iterator it = user_media_requests_.begin();
407 while (it != user_media_requests_.end()) {
408 (*it)->RemoveSource(source);
409 if ((*it)->AreAllSourcesRemoved()) {
410 it = user_media_requests_.erase(it);
411 } else {
412 ++it;
413 }
414 }
415 } 400 }
416 401
417 void MediaStreamImpl::InitializeSourceObject( 402 void MediaStreamImpl::InitializeSourceObject(
418 const StreamDeviceInfo& device, 403 const StreamDeviceInfo& device,
419 blink::WebMediaStreamSource::Type type, 404 blink::WebMediaStreamSource::Type type,
420 const blink::WebMediaConstraints& constraints, 405 const blink::WebMediaConstraints& constraints,
421 blink::WebFrame* frame, 406 blink::WebFrame* frame,
422 blink::WebMediaStreamSource* webkit_source) { 407 blink::WebMediaStreamSource* webkit_source) {
423 const blink::WebMediaStreamSource* existing_source = 408 const blink::WebMediaStreamSource* existing_source =
424 FindLocalSource(device); 409 FindLocalSource(device);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 request->StartAudioTrack((*webkit_tracks)[i], constraints); 511 request->StartAudioTrack((*webkit_tracks)[i], constraints);
527 } 512 }
528 } 513 }
529 514
530 void MediaStreamImpl::OnCreateNativeTracksCompleted( 515 void MediaStreamImpl::OnCreateNativeTracksCompleted(
531 UserMediaRequestInfo* request, 516 UserMediaRequestInfo* request,
532 content::MediaStreamRequestResult result) { 517 content::MediaStreamRequestResult result) {
533 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" 518 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete("
534 << "{request_id = " << request->request_id << "} " 519 << "{request_id = " << request->request_id << "} "
535 << "{result = " << result << "})"; 520 << "{result = " << result << "})";
536 CompleteGetUserMediaRequest(request->web_stream, &request->request, 521 if (result == content::MEDIA_DEVICE_OK)
537 result); 522 GetUserMediaRequestSucceeded(request->web_stream, &request->request);
538 if (result != MEDIA_DEVICE_OK) { 523 else
539 // TODO(perkj): Once we don't support MediaStream::Stop the |request_info| 524 GetUserMediaRequestFailed(&request->request, result);
540 // can be deleted even if the request succeeds. 525
541 DeleteUserMediaRequestInfo(request); 526 DeleteUserMediaRequestInfo(request);
tommi (sloooow) - chröme 2014/04/03 08:53:16 Previously we didn't delete the request on success
perkj_chrome 2014/04/03 11:58:34 No- We kept it all the time since we needed to sup
542 StopUnreferencedSources(true);
543 }
544 } 527 }
545 528
546 void MediaStreamImpl::OnDevicesEnumerated( 529 void MediaStreamImpl::OnDevicesEnumerated(
547 int request_id, 530 int request_id,
548 const StreamDeviceInfoArray& device_array) { 531 const StreamDeviceInfoArray& device_array) {
549 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" 532 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated("
550 << request_id << ")"; 533 << request_id << ")";
551 NOTIMPLEMENTED(); 534 NOTIMPLEMENTED();
552 } 535 }
553 536
554 void MediaStreamImpl::OnDeviceOpened( 537 void MediaStreamImpl::OnDeviceOpened(
555 int request_id, 538 int request_id,
556 const std::string& label, 539 const std::string& label,
557 const StreamDeviceInfo& video_device) { 540 const StreamDeviceInfo& video_device) {
558 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened(" 541 DVLOG(1) << "MediaStreamImpl::OnDeviceOpened("
559 << request_id << ", " << label << ")"; 542 << request_id << ", " << label << ")";
560 NOTIMPLEMENTED(); 543 NOTIMPLEMENTED();
561 } 544 }
562 545
563 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) { 546 void MediaStreamImpl::OnDeviceOpenFailed(int request_id) {
564 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed(" 547 DVLOG(1) << "MediaStreamImpl::VideoDeviceOpenFailed("
565 << request_id << ")"; 548 << request_id << ")";
566 NOTIMPLEMENTED(); 549 NOTIMPLEMENTED();
567 } 550 }
568 551
569 void MediaStreamImpl::CompleteGetUserMediaRequest( 552 void MediaStreamImpl::GetUserMediaRequestSucceeded(
570 const blink::WebMediaStream& stream, 553 const blink::WebMediaStream& stream,
554 blink::WebUserMediaRequest* request_info) {
555 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded";
556 request_info->requestSucceeded(stream);
557 }
558
559 void MediaStreamImpl::GetUserMediaRequestFailed(
571 blink::WebUserMediaRequest* request_info, 560 blink::WebUserMediaRequest* request_info,
572 content::MediaStreamRequestResult result) { 561 content::MediaStreamRequestResult result) {
573
574 DVLOG(1) << "MediaStreamImpl::CompleteGetUserMediaRequest("
575 << "result=" << result;
576
577 switch (result) { 562 switch (result) {
578 case MEDIA_DEVICE_OK: 563 case MEDIA_DEVICE_OK:
579 request_info->requestSucceeded(stream); 564 NOTREACHED();
580 break; 565 break;
581 case MEDIA_DEVICE_PERMISSION_DENIED: 566 case MEDIA_DEVICE_PERMISSION_DENIED:
582 request_info->requestDenied(); 567 request_info->requestDenied();
583 break; 568 break;
584 case MEDIA_DEVICE_PERMISSION_DISMISSED: 569 case MEDIA_DEVICE_PERMISSION_DISMISSED:
585 request_info->requestFailedUASpecific("PermissionDismissedError"); 570 request_info->requestFailedUASpecific("PermissionDismissedError");
586 break; 571 break;
587 case MEDIA_DEVICE_INVALID_STATE: 572 case MEDIA_DEVICE_INVALID_STATE:
588 request_info->requestFailedUASpecific("InvalidStateError"); 573 request_info->requestFailedUASpecific("InvalidStateError");
589 break; 574 break;
(...skipping 30 matching lines...) Expand all
620 const StreamDeviceInfo& active_device = source->device_info(); 605 const StreamDeviceInfo& active_device = source->device_info();
621 if (active_device.device.id == device.device.id && 606 if (active_device.device.id == device.device.id &&
622 active_device.device.type == device.device.type && 607 active_device.device.type == device.device.type &&
623 active_device.session_id == device.session_id) { 608 active_device.session_id == device.session_id) {
624 return &it->source; 609 return &it->source;
625 } 610 }
626 } 611 }
627 return NULL; 612 return NULL;
628 } 613 }
629 614
630 bool MediaStreamImpl::IsSourceInRequests(
631 const blink::WebMediaStreamSource& source) const {
632 for (UserMediaRequests::const_iterator req_it = user_media_requests_.begin();
633 req_it != user_media_requests_.end(); ++req_it) {
634 if ((*req_it)->IsSourceUsed(source))
635 return true;
636 }
637 return false;
638 }
639
640 MediaStreamImpl::UserMediaRequestInfo* 615 MediaStreamImpl::UserMediaRequestInfo*
641 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) { 616 MediaStreamImpl::FindUserMediaRequestInfo(int request_id) {
642 UserMediaRequests::iterator it = user_media_requests_.begin(); 617 UserMediaRequests::iterator it = user_media_requests_.begin();
643 for (; it != user_media_requests_.end(); ++it) { 618 for (; it != user_media_requests_.end(); ++it) {
644 if ((*it)->request_id == request_id) 619 if ((*it)->request_id == request_id)
645 return (*it); 620 return (*it);
646 } 621 }
647 return NULL; 622 return NULL;
648 } 623 }
649 624
650 MediaStreamImpl::UserMediaRequestInfo* 625 MediaStreamImpl::UserMediaRequestInfo*
651 MediaStreamImpl::FindUserMediaRequestInfo( 626 MediaStreamImpl::FindUserMediaRequestInfo(
652 const blink::WebUserMediaRequest& request) { 627 const blink::WebUserMediaRequest& request) {
653 UserMediaRequests::iterator it = user_media_requests_.begin(); 628 UserMediaRequests::iterator it = user_media_requests_.begin();
654 for (; it != user_media_requests_.end(); ++it) { 629 for (; it != user_media_requests_.end(); ++it) {
655 if ((*it)->request == request) 630 if ((*it)->request == request)
656 return (*it); 631 return (*it);
657 } 632 }
658 return NULL; 633 return NULL;
659 } 634 }
660 635
661 MediaStreamImpl::UserMediaRequestInfo*
662 MediaStreamImpl::FindUserMediaRequestInfo(const std::string& label) {
663 UserMediaRequests::iterator it = user_media_requests_.begin();
664 for (; it != user_media_requests_.end(); ++it) {
665 if ((*it)->generated && (*it)->web_stream.id() == base::UTF8ToUTF16(label))
666 return (*it);
667 }
668 return NULL;
669 }
670
671 void MediaStreamImpl::DeleteUserMediaRequestInfo( 636 void MediaStreamImpl::DeleteUserMediaRequestInfo(
672 UserMediaRequestInfo* request) { 637 UserMediaRequestInfo* request) {
673 UserMediaRequests::iterator it = user_media_requests_.begin(); 638 UserMediaRequests::iterator it = user_media_requests_.begin();
674 for (; it != user_media_requests_.end(); ++it) { 639 for (; it != user_media_requests_.end(); ++it) {
675 if ((*it) == request) { 640 if ((*it) == request) {
676 user_media_requests_.erase(it); 641 user_media_requests_.erase(it);
677 return; 642 return;
678 } 643 }
679 } 644 }
680 NOTREACHED(); 645 NOTREACHED();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 while (sources_it != local_sources_.end()) { 678 while (sources_it != local_sources_.end()) {
714 if (sources_it->frame == frame) { 679 if (sources_it->frame == frame) {
715 StopLocalSource(sources_it->source, true); 680 StopLocalSource(sources_it->source, true);
716 sources_it = local_sources_.erase(sources_it); 681 sources_it = local_sources_.erase(sources_it);
717 } else { 682 } else {
718 ++sources_it; 683 ++sources_it;
719 } 684 }
720 } 685 }
721 } 686 }
722 687
723 void MediaStreamImpl::OnLocalMediaStreamStop(
724 const std::string& label) {
725 DVLOG(1) << "MediaStreamImpl::OnLocalMediaStreamStop(" << label << ")";
726
727 UserMediaRequestInfo* user_media_request = FindUserMediaRequestInfo(label);
728 if (user_media_request) {
729 DeleteUserMediaRequestInfo(user_media_request);
730 }
731 StopUnreferencedSources(true);
732 }
733
734 void MediaStreamImpl::OnLocalSourceStopped( 688 void MediaStreamImpl::OnLocalSourceStopped(
735 const blink::WebMediaStreamSource& source) { 689 const blink::WebMediaStreamSource& source) {
736 DCHECK(CalledOnValidThread()); 690 DCHECK(CalledOnValidThread());
691 DVLOG(1) << "MediaStreamImpl::OnLocalSourceStopped";
737 692
738 bool device_found = false; 693 bool device_found = false;
739 for (LocalStreamSources::iterator device_it = local_sources_.begin(); 694 for (LocalStreamSources::iterator device_it = local_sources_.begin();
740 device_it != local_sources_.end(); ++device_it) { 695 device_it != local_sources_.end(); ++device_it) {
741 if (device_it->source.id() == source.id()) { 696 if (device_it->source.id() == source.id()) {
742 device_found = true; 697 device_found = true;
743 local_sources_.erase(device_it); 698 local_sources_.erase(device_it);
744 break; 699 break;
745 } 700 }
746 } 701 }
747 CHECK(device_found); 702 CHECK(device_found);
748 703
749 // Remove the reference to this source from all |user_media_requests_|.
750 // TODO(perkj): The below is not necessary once we don't need to support
751 // MediaStream::Stop().
752 UserMediaRequests::iterator it = user_media_requests_.begin();
753 while (it != user_media_requests_.end()) {
754 (*it)->RemoveSource(source);
755 if ((*it)->AreAllSourcesRemoved()) {
756 it = user_media_requests_.erase(it);
757 } else {
758 ++it;
759 }
760 }
761
762 MediaStreamSource* source_impl = 704 MediaStreamSource* source_impl =
763 static_cast<MediaStreamSource*> (source.extraData()); 705 static_cast<MediaStreamSource*> (source.extraData());
764 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); 706 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info());
765 } 707 }
766 708
767 void MediaStreamImpl::StopLocalSource( 709 void MediaStreamImpl::StopLocalSource(
768 const blink::WebMediaStreamSource& source, 710 const blink::WebMediaStreamSource& source,
769 bool notify_dispatcher) { 711 bool notify_dispatcher) {
770 MediaStreamSource* source_impl = 712 MediaStreamSource* source_impl =
771 static_cast<MediaStreamSource*> (source.extraData()); 713 static_cast<MediaStreamSource*> (source.extraData());
772 DVLOG(1) << "MediaStreamImpl::StopLocalSource(" 714 DVLOG(1) << "MediaStreamImpl::StopLocalSource("
773 << "{device_id = " << source_impl->device_info().device.id << "})"; 715 << "{device_id = " << source_impl->device_info().device.id << "})";
774 716
775 if (notify_dispatcher) 717 if (notify_dispatcher)
776 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info()); 718 media_stream_dispatcher_->StopStreamDevice(source_impl->device_info());
777 719
778 source_impl->ResetSourceStoppedCallback(); 720 source_impl->ResetSourceStoppedCallback();
779 source_impl->StopSource(); 721 source_impl->StopSource();
780 } 722 }
781 723
782 void MediaStreamImpl::StopUnreferencedSources(bool notify_dispatcher) {
783 LocalStreamSources::iterator source_it = local_sources_.begin();
784 while (source_it != local_sources_.end()) {
785 if (!IsSourceInRequests(source_it->source)) {
786 StopLocalSource(source_it->source, notify_dispatcher);
787 source_it = local_sources_.erase(source_it);
788 } else {
789 ++source_it;
790 }
791 }
792 }
793
794 scoped_refptr<WebRtcAudioRenderer> MediaStreamImpl::CreateRemoteAudioRenderer( 724 scoped_refptr<WebRtcAudioRenderer> MediaStreamImpl::CreateRemoteAudioRenderer(
795 webrtc::MediaStreamInterface* stream, 725 webrtc::MediaStreamInterface* stream,
796 int render_frame_id) { 726 int render_frame_id) {
797 if (stream->GetAudioTracks().empty()) 727 if (stream->GetAudioTracks().empty())
798 return NULL; 728 return NULL;
799 729
800 DVLOG(1) << "MediaStreamImpl::CreateRemoteAudioRenderer label:" 730 DVLOG(1) << "MediaStreamImpl::CreateRemoteAudioRenderer label:"
801 << stream->label(); 731 << stream->label();
802 732
803 // TODO(tommi): Change the default value of session_id to be 733 // TODO(tommi): Change the default value of session_id to be
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 sources_.begin(); 881 sources_.begin();
952 it != sources_.end(); ++it) { 882 it != sources_.end(); ++it) {
953 if (source.id() == it->id()) { 883 if (source.id() == it->id()) {
954 sources_.erase(it); 884 sources_.erase(it);
955 return; 885 return;
956 } 886 }
957 } 887 }
958 } 888 }
959 889
960 } // namespace content 890 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698