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 |