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 <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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 if (base::StringToInt(threshold_ms_str, &threshold_ms) && threshold_ms > 0) { | 104 if (base::StringToInt(threshold_ms_str, &threshold_ms) && threshold_ms > 0) { |
| 105 video_underflow_threshold_ = | 105 video_underflow_threshold_ = |
| 106 base::TimeDelta::FromMilliseconds(threshold_ms); | 106 base::TimeDelta::FromMilliseconds(threshold_ms); |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 | 109 |
| 110 RendererImpl::~RendererImpl() { | 110 RendererImpl::~RendererImpl() { |
| 111 DVLOG(1) << __func__; | 111 DVLOG(1) << __func__; |
| 112 DCHECK(task_runner_->BelongsToCurrentThread()); | 112 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 113 | 113 |
| 114 state_ = STATE_SHUTDOWN; | |
|
xhwang
2017/01/04 18:29:09
Instead of adding a new state, does it make sense
servolk
2017/01/04 19:00:52
Yes, I guess we could try invalidating RendererImp
| |
| 115 | |
| 114 // Tear down in opposite order of construction as |video_renderer_| can still | 116 // Tear down in opposite order of construction as |video_renderer_| can still |
| 115 // need |time_source_| (which can be |audio_renderer_|) to be alive. | 117 // need |time_source_| (which can be |audio_renderer_|) to be alive. |
| 116 video_renderer_.reset(); | 118 video_renderer_.reset(); |
| 117 audio_renderer_.reset(); | 119 audio_renderer_.reset(); |
| 118 | 120 |
| 119 if (!init_cb_.is_null()) { | 121 if (!init_cb_.is_null()) { |
| 120 FinishInitialization(PIPELINE_ERROR_ABORT); | 122 FinishInitialization(PIPELINE_ERROR_ABORT); |
| 121 } else if (!flush_cb_.is_null()) { | 123 } else if (!flush_cb_.is_null()) { |
| 122 base::ResetAndReturn(&flush_cb_).Run(); | 124 base::ResetAndReturn(&flush_cb_).Run(); |
| 123 } | 125 } |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 time_source_->StopTicking(); | 241 time_source_->StopTicking(); |
| 240 } | 242 } |
| 241 audio_renderer_->Flush( | 243 audio_renderer_->Flush( |
| 242 base::Bind(&RendererImpl::RestartAudioRenderer, weak_this_, time)); | 244 base::Bind(&RendererImpl::RestartAudioRenderer, weak_this_, time)); |
| 243 } | 245 } |
| 244 } | 246 } |
| 245 | 247 |
| 246 void RendererImpl::RestartVideoRenderer(base::TimeDelta time) { | 248 void RendererImpl::RestartVideoRenderer(base::TimeDelta time) { |
| 247 DVLOG(3) << __func__; | 249 DVLOG(3) << __func__; |
| 248 DCHECK(task_runner_->BelongsToCurrentThread()); | 250 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 251 // We only need to actually restart video renderer if we are in the PLAYING | |
| 252 // state. In all other states we don't need to do anything, since either we | |
| 253 // are already shutting down, or the VideoRenderer::StartPlayingFrom will be | |
| 254 // called when RendererImpl transitions into PLAYING state. | |
| 255 if (state_ != STATE_PLAYING) | |
| 256 return; | |
| 249 DCHECK(video_renderer_); | 257 DCHECK(video_renderer_); |
| 250 DCHECK_EQ(state_, STATE_PLAYING); | |
| 251 video_ended_ = false; | 258 video_ended_ = false; |
| 252 video_renderer_->StartPlayingFrom(time); | 259 video_renderer_->StartPlayingFrom(time); |
| 253 } | 260 } |
| 254 | 261 |
| 255 void RendererImpl::RestartAudioRenderer(base::TimeDelta time) { | 262 void RendererImpl::RestartAudioRenderer(base::TimeDelta time) { |
| 256 DVLOG(3) << __func__; | 263 DVLOG(3) << __func__; |
| 257 DCHECK(task_runner_->BelongsToCurrentThread()); | 264 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 258 DCHECK_EQ(state_, STATE_PLAYING); | 265 // We only need to actually restart audio renderer if we are in the PLAYING |
| 266 // state. In all other states we don't need to do anything, since either we | |
| 267 // are already shutting down, or the AudioRenderer::StartPlayingFrom will be | |
| 268 // called when RendererImpl transitions into PLAYING state. | |
| 269 if (state_ != STATE_PLAYING) | |
| 270 return; | |
| 259 DCHECK(time_source_); | 271 DCHECK(time_source_); |
| 260 DCHECK(audio_renderer_); | 272 DCHECK(audio_renderer_); |
| 261 audio_ended_ = false; | 273 audio_ended_ = false; |
| 262 audio_renderer_->StartPlaying(); | 274 audio_renderer_->StartPlaying(); |
| 263 } | 275 } |
| 264 | 276 |
| 265 void RendererImpl::SetPlaybackRate(double playback_rate) { | 277 void RendererImpl::SetPlaybackRate(double playback_rate) { |
| 266 DVLOG(1) << __func__ << "(" << playback_rate << ")"; | 278 DVLOG(1) << __func__ << "(" << playback_rate << ")"; |
| 267 DCHECK(task_runner_->BelongsToCurrentThread()); | 279 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 268 | 280 |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 | 729 |
| 718 break; | 730 break; |
| 719 | 731 |
| 720 case STATE_FLUSHING: | 732 case STATE_FLUSHING: |
| 721 // It's OK to pause playback when flushing. | 733 // It's OK to pause playback when flushing. |
| 722 break; | 734 break; |
| 723 | 735 |
| 724 case STATE_UNINITIALIZED: | 736 case STATE_UNINITIALIZED: |
| 725 case STATE_INIT_PENDING_CDM: | 737 case STATE_INIT_PENDING_CDM: |
| 726 case STATE_INITIALIZING: | 738 case STATE_INITIALIZING: |
| 739 case STATE_SHUTDOWN: | |
| 727 NOTREACHED() << "Invalid state: " << state_; | 740 NOTREACHED() << "Invalid state: " << state_; |
| 728 break; | 741 break; |
| 729 | 742 |
| 730 case STATE_ERROR: | 743 case STATE_ERROR: |
| 731 // An error state may occur at any time. | 744 // An error state may occur at any time. |
| 732 break; | 745 break; |
| 733 } | 746 } |
| 734 | 747 |
| 735 if (time_ticking_) { | 748 if (time_ticking_) { |
| 736 time_ticking_ = false; | 749 time_ticking_ = false; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 834 DCHECK(task_runner_->BelongsToCurrentThread()); | 847 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 835 client_->OnVideoNaturalSizeChange(size); | 848 client_->OnVideoNaturalSizeChange(size); |
| 836 } | 849 } |
| 837 | 850 |
| 838 void RendererImpl::OnVideoOpacityChange(bool opaque) { | 851 void RendererImpl::OnVideoOpacityChange(bool opaque) { |
| 839 DCHECK(task_runner_->BelongsToCurrentThread()); | 852 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 840 client_->OnVideoOpacityChange(opaque); | 853 client_->OnVideoOpacityChange(opaque); |
| 841 } | 854 } |
| 842 | 855 |
| 843 } // namespace media | 856 } // namespace media |
| OLD | NEW |