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

Side by Side Diff: media/renderers/renderer_impl.cc

Issue 2800523003: Properly handle track status changes in FLUSHED state (Closed)
Patch Set: rebase Created 3 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
« no previous file with comments | « no previous file | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "media/renderers/renderer_impl.h" 5 #include "media/renderers/renderer_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } 538 }
539 539
540 void RendererImpl::OnStreamStatusChanged(DemuxerStream* stream, 540 void RendererImpl::OnStreamStatusChanged(DemuxerStream* stream,
541 bool enabled, 541 bool enabled,
542 base::TimeDelta time) { 542 base::TimeDelta time) {
543 DCHECK(task_runner_->BelongsToCurrentThread()); 543 DCHECK(task_runner_->BelongsToCurrentThread());
544 DCHECK(stream); 544 DCHECK(stream);
545 bool video = (stream->type() == DemuxerStream::VIDEO); 545 bool video = (stream->type() == DemuxerStream::VIDEO);
546 DVLOG(1) << __func__ << (video ? " video" : " audio") << " stream=" << stream 546 DVLOG(1) << __func__ << (video ? " video" : " audio") << " stream=" << stream
547 << " enabled=" << enabled << " time=" << time.InSecondsF(); 547 << " enabled=" << enabled << " time=" << time.InSecondsF();
548 if ((state_ != STATE_PLAYING && state_ != STATE_FLUSHING) || 548
549 if ((state_ != STATE_PLAYING && state_ != STATE_FLUSHING &&
550 state_ != STATE_FLUSHED) ||
549 (audio_ended_ && video_ended_)) 551 (audio_ended_ && video_ended_))
550 return; 552 return;
551 if (restarting_audio_ || restarting_video_ || flush_cb_) { 553
554 if (restarting_audio_ || restarting_video_ || state_ == STATE_FLUSHING) {
552 DVLOG(3) << __func__ << ": postponed stream " << stream 555 DVLOG(3) << __func__ << ": postponed stream " << stream
553 << " status change handling."; 556 << " status change handling.";
554 pending_actions_.push_back(base::Bind(&RendererImpl::OnStreamStatusChanged, 557 pending_actions_.push_back(base::Bind(&RendererImpl::OnStreamStatusChanged,
555 weak_this_, stream, enabled, time)); 558 weak_this_, stream, enabled, time));
556 return; 559 return;
557 } 560 }
561
562 DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED);
558 if (stream->type() == DemuxerStream::VIDEO) { 563 if (stream->type() == DemuxerStream::VIDEO) {
559 DCHECK(video_renderer_); 564 DCHECK(video_renderer_);
560 restarting_video_ = true; 565 restarting_video_ = true;
561 video_renderer_->Flush( 566 base::Closure handle_track_status_cb =
562 base::Bind(stream == current_video_stream_ 567 base::Bind(stream == current_video_stream_
563 ? &RendererImpl::RestartVideoRenderer 568 ? &RendererImpl::RestartVideoRenderer
564 : &RendererImpl::ReinitializeVideoRenderer, 569 : &RendererImpl::ReinitializeVideoRenderer,
565 weak_this_, stream, time)); 570 weak_this_, stream, time);
571 if (state_ == STATE_FLUSHED)
572 handle_track_status_cb.Run();
573 else
574 video_renderer_->Flush(handle_track_status_cb);
566 } else if (stream->type() == DemuxerStream::AUDIO) { 575 } else if (stream->type() == DemuxerStream::AUDIO) {
567 DCHECK(audio_renderer_); 576 DCHECK(audio_renderer_);
568 DCHECK(time_source_); 577 DCHECK(time_source_);
569 restarting_audio_ = true; 578 restarting_audio_ = true;
579 base::Closure handle_track_status_cb =
580 base::Bind(stream == current_audio_stream_
581 ? &RendererImpl::RestartAudioRenderer
582 : &RendererImpl::ReinitializeAudioRenderer,
583 weak_this_, stream, time);
584 if (state_ == STATE_FLUSHED) {
585 handle_track_status_cb.Run();
586 return;
587 }
570 // Stop ticking (transition into paused state) in audio renderer before 588 // Stop ticking (transition into paused state) in audio renderer before
571 // calling Flush, since after Flush we are going to restart playback by 589 // calling Flush, since after Flush we are going to restart playback by
572 // calling audio renderer StartPlaying which would fail in playing state. 590 // calling audio renderer StartPlaying which would fail in playing state.
573 if (time_ticking_) { 591 if (time_ticking_) {
574 time_ticking_ = false; 592 time_ticking_ = false;
575 time_source_->StopTicking(); 593 time_source_->StopTicking();
576 } 594 }
577 audio_renderer_->Flush( 595 audio_renderer_->Flush(handle_track_status_cb);
578 base::Bind(stream == current_audio_stream_
579 ? &RendererImpl::RestartAudioRenderer
580 : &RendererImpl::ReinitializeAudioRenderer,
581 weak_this_, stream, time));
582 } 596 }
583 } 597 }
584 598
585 void RendererImpl::ReinitializeAudioRenderer(DemuxerStream* stream, 599 void RendererImpl::ReinitializeAudioRenderer(DemuxerStream* stream,
586 base::TimeDelta time) { 600 base::TimeDelta time) {
587 DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF(); 601 DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
588 DCHECK(task_runner_->BelongsToCurrentThread()); 602 DCHECK(task_runner_->BelongsToCurrentThread());
589 DCHECK_NE(stream, current_audio_stream_); 603 DCHECK_NE(stream, current_audio_stream_);
590 604
591 current_audio_stream_ = stream; 605 current_audio_stream_ = stream;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 OnError(status); 647 OnError(status);
634 return; 648 return;
635 } 649 }
636 RestartVideoRenderer(stream, time); 650 RestartVideoRenderer(stream, time);
637 } 651 }
638 652
639 void RendererImpl::RestartAudioRenderer(DemuxerStream* stream, 653 void RendererImpl::RestartAudioRenderer(DemuxerStream* stream,
640 base::TimeDelta time) { 654 base::TimeDelta time) {
641 DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF(); 655 DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
642 DCHECK(task_runner_->BelongsToCurrentThread()); 656 DCHECK(task_runner_->BelongsToCurrentThread());
643 DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHING); 657 DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED);
644 DCHECK(time_source_); 658 DCHECK(time_source_);
645 DCHECK(audio_renderer_); 659 DCHECK(audio_renderer_);
646 DCHECK_EQ(stream, current_audio_stream_); 660 DCHECK_EQ(stream, current_audio_stream_);
647 661
648 audio_ended_ = false; 662 audio_ended_ = false;
649 audio_renderer_->StartPlaying(); 663 if (state_ == STATE_PLAYING)
664 audio_renderer_->StartPlaying();
665 else
666 OnStreamRestartCompleted();
650 } 667 }
651 668
652 void RendererImpl::RestartVideoRenderer(DemuxerStream* stream, 669 void RendererImpl::RestartVideoRenderer(DemuxerStream* stream,
653 base::TimeDelta time) { 670 base::TimeDelta time) {
654 DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF(); 671 DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
655 DCHECK(task_runner_->BelongsToCurrentThread()); 672 DCHECK(task_runner_->BelongsToCurrentThread());
656 DCHECK(video_renderer_); 673 DCHECK(video_renderer_);
657 DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHING); 674 DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED);
658 DCHECK_EQ(stream, current_video_stream_); 675 DCHECK_EQ(stream, current_video_stream_);
659 676
660 video_ended_ = false; 677 video_ended_ = false;
661 video_renderer_->StartPlayingFrom(time); 678 if (state_ == STATE_PLAYING)
679 video_renderer_->StartPlayingFrom(time);
680 else
681 OnStreamRestartCompleted();
662 } 682 }
663 683
664 void RendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) { 684 void RendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) {
665 DCHECK(task_runner_->BelongsToCurrentThread()); 685 DCHECK(task_runner_->BelongsToCurrentThread());
666 client_->OnStatisticsUpdate(stats); 686 client_->OnStatisticsUpdate(stats);
667 } 687 }
668 688
669 bool RendererImpl::HandleRestartedStreamBufferingChanges( 689 bool RendererImpl::HandleRestartedStreamBufferingChanges(
670 DemuxerStream::Type type, 690 DemuxerStream::Type type,
671 BufferingState new_buffering_state) { 691 BufferingState new_buffering_state) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 FROM_HERE, 748 FROM_HERE,
729 base::Bind(&RendererImpl::OnStreamRestartCompleted, weak_this_)); 749 base::Bind(&RendererImpl::OnStreamRestartCompleted, weak_this_));
730 } 750 }
731 } 751 }
732 return false; 752 return false;
733 } 753 }
734 754
735 void RendererImpl::OnStreamRestartCompleted() { 755 void RendererImpl::OnStreamRestartCompleted() {
736 DVLOG(3) << __func__ << " restarting_audio_=" << restarting_audio_ 756 DVLOG(3) << __func__ << " restarting_audio_=" << restarting_audio_
737 << " restarting_video_=" << restarting_video_; 757 << " restarting_video_=" << restarting_video_;
758 DCHECK(task_runner_->BelongsToCurrentThread());
738 DCHECK(restarting_audio_ || restarting_video_); 759 DCHECK(restarting_audio_ || restarting_video_);
739 restarting_audio_ = false; 760 restarting_audio_ = false;
740 restarting_video_ = false; 761 restarting_video_ = false;
741 if (!pending_actions_.empty()) { 762 if (!pending_actions_.empty()) {
742 base::Closure closure = pending_actions_.front(); 763 base::Closure closure = pending_actions_.front();
743 pending_actions_.pop_front(); 764 pending_actions_.pop_front();
744 closure.Run(); 765 closure.Run();
745 } 766 }
746 } 767 }
747 768
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 DCHECK(task_runner_->BelongsToCurrentThread()); 979 DCHECK(task_runner_->BelongsToCurrentThread());
959 client_->OnVideoNaturalSizeChange(size); 980 client_->OnVideoNaturalSizeChange(size);
960 } 981 }
961 982
962 void RendererImpl::OnVideoOpacityChange(bool opaque) { 983 void RendererImpl::OnVideoOpacityChange(bool opaque) {
963 DCHECK(task_runner_->BelongsToCurrentThread()); 984 DCHECK(task_runner_->BelongsToCurrentThread());
964 client_->OnVideoOpacityChange(opaque); 985 client_->OnVideoOpacityChange(opaque);
965 } 986 }
966 987
967 } // namespace media 988 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698