Chromium Code Reviews| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 RendererImpl::RendererImpl( | 28 RendererImpl::RendererImpl( |
| 29 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 29 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 30 scoped_ptr<AudioRenderer> audio_renderer, | 30 scoped_ptr<AudioRenderer> audio_renderer, |
| 31 scoped_ptr<VideoRenderer> video_renderer) | 31 scoped_ptr<VideoRenderer> video_renderer) |
| 32 : state_(STATE_UNINITIALIZED), | 32 : state_(STATE_UNINITIALIZED), |
| 33 task_runner_(task_runner), | 33 task_runner_(task_runner), |
| 34 audio_renderer_(audio_renderer.Pass()), | 34 audio_renderer_(audio_renderer.Pass()), |
| 35 video_renderer_(video_renderer.Pass()), | 35 video_renderer_(video_renderer.Pass()), |
| 36 time_source_(NULL), | 36 time_source_(NULL), |
| 37 time_ticking_(false), | 37 time_ticking_(false), |
| 38 playback_rate_(0), | |
| 38 audio_buffering_state_(BUFFERING_HAVE_NOTHING), | 39 audio_buffering_state_(BUFFERING_HAVE_NOTHING), |
| 39 video_buffering_state_(BUFFERING_HAVE_NOTHING), | 40 video_buffering_state_(BUFFERING_HAVE_NOTHING), |
| 40 audio_ended_(false), | 41 audio_ended_(false), |
| 41 video_ended_(false), | 42 video_ended_(false), |
| 42 cdm_context_(nullptr), | 43 cdm_context_(nullptr), |
| 43 underflow_disabled_for_testing_(false), | 44 underflow_disabled_for_testing_(false), |
| 44 clockless_video_playback_enabled_for_testing_(false), | 45 clockless_video_playback_enabled_for_testing_(false), |
| 45 video_underflow_threshold_( | 46 video_underflow_threshold_( |
| 46 base::TimeDelta::FromMilliseconds(kDefaultVideoUnderflowThresholdMs)), | 47 base::TimeDelta::FromMilliseconds(kDefaultVideoUnderflowThresholdMs)), |
| 47 weak_factory_(this) { | 48 weak_factory_(this) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 170 | 171 |
| 171 void RendererImpl::SetPlaybackRate(float playback_rate) { | 172 void RendererImpl::SetPlaybackRate(float playback_rate) { |
| 172 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")"; | 173 DVLOG(1) << __FUNCTION__ << "(" << playback_rate << ")"; |
| 173 DCHECK(task_runner_->BelongsToCurrentThread()); | 174 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 174 | 175 |
| 175 // Playback rate changes are only carried out while playing. | 176 // Playback rate changes are only carried out while playing. |
| 176 if (state_ != STATE_PLAYING) | 177 if (state_ != STATE_PLAYING) |
| 177 return; | 178 return; |
| 178 | 179 |
| 179 time_source_->SetPlaybackRate(playback_rate); | 180 time_source_->SetPlaybackRate(playback_rate); |
| 181 | |
| 182 const float old_rate = playback_rate_; | |
| 183 playback_rate_ = playback_rate; | |
| 184 if (!time_ticking_ || !video_renderer_) | |
| 185 return; | |
| 186 | |
| 187 if (old_rate == 0 && playback_rate > 0) | |
| 188 video_renderer_->OnTimeProgressing(); | |
| 189 else if (old_rate > 0 && playback_rate == 0) | |
| 190 video_renderer_->OnTimeStopped(); | |
|
xhwang
2015/04/07 06:13:08
This will definitely work. I just wonder whether w
DaleCurtis
2015/04/07 16:51:40
Yeah, I considered all of these except the last on
| |
| 180 } | 191 } |
| 181 | 192 |
| 182 void RendererImpl::SetVolume(float volume) { | 193 void RendererImpl::SetVolume(float volume) { |
| 183 DVLOG(1) << __FUNCTION__; | 194 DVLOG(1) << __FUNCTION__; |
| 184 DCHECK(task_runner_->BelongsToCurrentThread()); | 195 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 185 | 196 |
| 186 if (audio_renderer_) | 197 if (audio_renderer_) |
| 187 audio_renderer_->SetVolume(volume); | 198 audio_renderer_->SetVolume(volume); |
| 188 } | 199 } |
| 189 | 200 |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 NOTREACHED() << "Invalid state: " << state_; | 536 NOTREACHED() << "Invalid state: " << state_; |
| 526 break; | 537 break; |
| 527 | 538 |
| 528 case STATE_ERROR: | 539 case STATE_ERROR: |
| 529 // An error state may occur at any time. | 540 // An error state may occur at any time. |
| 530 break; | 541 break; |
| 531 } | 542 } |
| 532 | 543 |
| 533 time_ticking_ = false; | 544 time_ticking_ = false; |
| 534 time_source_->StopTicking(); | 545 time_source_->StopTicking(); |
| 546 if (playback_rate_ > 0 && video_renderer_) | |
| 547 video_renderer_->OnTimeStopped(); | |
| 535 } | 548 } |
| 536 | 549 |
| 537 void RendererImpl::StartPlayback() { | 550 void RendererImpl::StartPlayback() { |
| 538 DVLOG(1) << __FUNCTION__; | 551 DVLOG(1) << __FUNCTION__; |
| 539 DCHECK(task_runner_->BelongsToCurrentThread()); | 552 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 540 DCHECK_EQ(state_, STATE_PLAYING); | 553 DCHECK_EQ(state_, STATE_PLAYING); |
| 541 DCHECK(!time_ticking_); | 554 DCHECK(!time_ticking_); |
| 542 DCHECK(!WaitingForEnoughData()); | 555 DCHECK(!WaitingForEnoughData()); |
| 543 | 556 |
| 544 time_ticking_ = true; | 557 time_ticking_ = true; |
| 545 time_source_->StartTicking(); | 558 time_source_->StartTicking(); |
| 559 if (playback_rate_ > 0 && video_renderer_) | |
| 560 video_renderer_->OnTimeProgressing(); | |
| 546 } | 561 } |
| 547 | 562 |
| 548 void RendererImpl::OnAudioRendererEnded() { | 563 void RendererImpl::OnAudioRendererEnded() { |
| 549 DVLOG(1) << __FUNCTION__; | 564 DVLOG(1) << __FUNCTION__; |
| 550 DCHECK(task_runner_->BelongsToCurrentThread()); | 565 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 551 | 566 |
| 552 if (state_ != STATE_PLAYING) | 567 if (state_ != STATE_PLAYING) |
| 553 return; | 568 return; |
| 554 | 569 |
| 555 DCHECK(!audio_ended_); | 570 DCHECK(!audio_ended_); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 615 } | 630 } |
| 616 | 631 |
| 617 // After OnError() returns, the pipeline may destroy |this|. | 632 // After OnError() returns, the pipeline may destroy |this|. |
| 618 base::ResetAndReturn(&error_cb_).Run(error); | 633 base::ResetAndReturn(&error_cb_).Run(error); |
| 619 | 634 |
| 620 if (!flush_cb_.is_null()) | 635 if (!flush_cb_.is_null()) |
| 621 base::ResetAndReturn(&flush_cb_).Run(); | 636 base::ResetAndReturn(&flush_cb_).Run(); |
| 622 } | 637 } |
| 623 | 638 |
| 624 } // namespace media | 639 } // namespace media |
| OLD | NEW |