| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |