| 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 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 return; | 284 return; |
| 285 | 285 |
| 286 time_source_->SetPlaybackRate(playback_rate); | 286 time_source_->SetPlaybackRate(playback_rate); |
| 287 | 287 |
| 288 const double old_rate = playback_rate_; | 288 const double old_rate = playback_rate_; |
| 289 playback_rate_ = playback_rate; | 289 playback_rate_ = playback_rate; |
| 290 if (!time_ticking_ || !video_renderer_) | 290 if (!time_ticking_ || !video_renderer_) |
| 291 return; | 291 return; |
| 292 | 292 |
| 293 if (old_rate == 0 && playback_rate > 0) | 293 if (old_rate == 0 && playback_rate > 0) |
| 294 video_renderer_->OnTimeStateChanged(true); | 294 video_renderer_->OnTimeProgressing(); |
| 295 else if (old_rate > 0 && playback_rate == 0) | 295 else if (old_rate > 0 && playback_rate == 0) |
| 296 video_renderer_->OnTimeStateChanged(false); | 296 video_renderer_->OnTimeStopped(); |
| 297 } | 297 } |
| 298 | 298 |
| 299 void RendererImpl::SetVolume(float volume) { | 299 void RendererImpl::SetVolume(float volume) { |
| 300 DVLOG(1) << __func__; | 300 DVLOG(1) << __func__; |
| 301 DCHECK(task_runner_->BelongsToCurrentThread()); | 301 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 302 | 302 |
| 303 if (audio_renderer_) | 303 if (audio_renderer_) |
| 304 audio_renderer_->SetVolume(volume); | 304 audio_renderer_->SetVolume(volume); |
| 305 } | 305 } |
| 306 | 306 |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 " resuming playback."; | 588 " resuming playback."; |
| 589 restarting_video_ = false; | 589 restarting_video_ = false; |
| 590 if (state_ == STATE_PLAYING && | 590 if (state_ == STATE_PLAYING && |
| 591 !deferred_video_underflow_cb_.IsCancelled()) { | 591 !deferred_video_underflow_cb_.IsCancelled()) { |
| 592 // If deferred_video_underflow_cb_ wasn't triggered, then audio should | 592 // If deferred_video_underflow_cb_ wasn't triggered, then audio should |
| 593 // still be playing, we only need to unpause the video stream. | 593 // still be playing, we only need to unpause the video stream. |
| 594 DVLOG(4) << "deferred_video_underflow_cb_.Cancel()"; | 594 DVLOG(4) << "deferred_video_underflow_cb_.Cancel()"; |
| 595 deferred_video_underflow_cb_.Cancel(); | 595 deferred_video_underflow_cb_.Cancel(); |
| 596 video_buffering_state_ = new_buffering_state; | 596 video_buffering_state_ = new_buffering_state; |
| 597 if (playback_rate_ > 0) | 597 if (playback_rate_ > 0) |
| 598 video_renderer_->OnTimeStateChanged(true); | 598 video_renderer_->OnTimeProgressing(); |
| 599 return true; | 599 return true; |
| 600 } | 600 } |
| 601 } | 601 } |
| 602 // We don't handle the BUFFERING_HAVE_NOTHING case explicitly here, since | 602 // We don't handle the BUFFERING_HAVE_NOTHING case explicitly here, since |
| 603 // the existing logic for deferring video underflow reporting in | 603 // the existing logic for deferring video underflow reporting in |
| 604 // OnBufferingStateChange is exactly what we need. So fall through to the | 604 // OnBufferingStateChange is exactly what we need. So fall through to the |
| 605 // regular video underflow handling path in OnBufferingStateChange. | 605 // regular video underflow handling path in OnBufferingStateChange. |
| 606 } | 606 } |
| 607 | 607 |
| 608 if (type == DemuxerStream::AUDIO && restarting_audio_) { | 608 if (type == DemuxerStream::AUDIO && restarting_audio_) { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 case STATE_ERROR: | 745 case STATE_ERROR: |
| 746 // An error state may occur at any time. | 746 // An error state may occur at any time. |
| 747 break; | 747 break; |
| 748 } | 748 } |
| 749 | 749 |
| 750 if (time_ticking_) { | 750 if (time_ticking_) { |
| 751 time_ticking_ = false; | 751 time_ticking_ = false; |
| 752 time_source_->StopTicking(); | 752 time_source_->StopTicking(); |
| 753 } | 753 } |
| 754 if (playback_rate_ > 0 && video_renderer_) | 754 if (playback_rate_ > 0 && video_renderer_) |
| 755 video_renderer_->OnTimeStateChanged(false); | 755 video_renderer_->OnTimeStopped(); |
| 756 } | 756 } |
| 757 | 757 |
| 758 void RendererImpl::StartPlayback() { | 758 void RendererImpl::StartPlayback() { |
| 759 DVLOG(1) << __func__; | 759 DVLOG(1) << __func__; |
| 760 DCHECK(task_runner_->BelongsToCurrentThread()); | 760 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 761 DCHECK_EQ(state_, STATE_PLAYING); | 761 DCHECK_EQ(state_, STATE_PLAYING); |
| 762 DCHECK(!time_ticking_); | 762 DCHECK(!time_ticking_); |
| 763 DCHECK(!WaitingForEnoughData()); | 763 DCHECK(!WaitingForEnoughData()); |
| 764 | 764 |
| 765 time_ticking_ = true; | 765 time_ticking_ = true; |
| 766 time_source_->StartTicking(); | 766 time_source_->StartTicking(); |
| 767 if (playback_rate_ > 0 && video_renderer_) | 767 if (playback_rate_ > 0 && video_renderer_) |
| 768 video_renderer_->OnTimeStateChanged(true); | 768 video_renderer_->OnTimeProgressing(); |
| 769 } | 769 } |
| 770 | 770 |
| 771 void RendererImpl::OnRendererEnded(DemuxerStream::Type type) { | 771 void RendererImpl::OnRendererEnded(DemuxerStream::Type type) { |
| 772 DVLOG(1) << __func__ << (type == DemuxerStream::AUDIO ? " audio" : " video"); | 772 DVLOG(1) << __func__ << (type == DemuxerStream::AUDIO ? " audio" : " video"); |
| 773 DCHECK(task_runner_->BelongsToCurrentThread()); | 773 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 774 DCHECK((type == DemuxerStream::AUDIO) || (type == DemuxerStream::VIDEO)); | 774 DCHECK((type == DemuxerStream::AUDIO) || (type == DemuxerStream::VIDEO)); |
| 775 | 775 |
| 776 if (state_ != STATE_PLAYING) | 776 if (state_ != STATE_PLAYING) |
| 777 return; | 777 return; |
| 778 | 778 |
| 779 if (type == DemuxerStream::AUDIO) { | 779 if (type == DemuxerStream::AUDIO) { |
| 780 DCHECK(!audio_ended_); | 780 DCHECK(!audio_ended_); |
| 781 audio_ended_ = true; | 781 audio_ended_ = true; |
| 782 } else { | 782 } else { |
| 783 DCHECK(!video_ended_); | 783 DCHECK(!video_ended_); |
| 784 video_ended_ = true; | 784 video_ended_ = true; |
| 785 DCHECK(video_renderer_); | 785 DCHECK(video_renderer_); |
| 786 video_renderer_->OnTimeStateChanged(false); | 786 video_renderer_->OnTimeStopped(); |
| 787 } | 787 } |
| 788 | 788 |
| 789 RunEndedCallbackIfNeeded(); | 789 RunEndedCallbackIfNeeded(); |
| 790 } | 790 } |
| 791 | 791 |
| 792 bool RendererImpl::PlaybackHasEnded() const { | 792 bool RendererImpl::PlaybackHasEnded() const { |
| 793 DCHECK(task_runner_->BelongsToCurrentThread()); | 793 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 794 | 794 |
| 795 if (audio_renderer_ && !audio_ended_) | 795 if (audio_renderer_ && !audio_ended_) |
| 796 return false; | 796 return false; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 DCHECK(task_runner_->BelongsToCurrentThread()); | 849 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 850 client_->OnVideoNaturalSizeChange(size); | 850 client_->OnVideoNaturalSizeChange(size); |
| 851 } | 851 } |
| 852 | 852 |
| 853 void RendererImpl::OnVideoOpacityChange(bool opaque) { | 853 void RendererImpl::OnVideoOpacityChange(bool opaque) { |
| 854 DCHECK(task_runner_->BelongsToCurrentThread()); | 854 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 855 client_->OnVideoOpacityChange(opaque); | 855 client_->OnVideoOpacityChange(opaque); |
| 856 } | 856 } |
| 857 | 857 |
| 858 } // namespace media | 858 } // namespace media |
| OLD | NEW |