| 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 DCHECK(demuxer_stream_provider->GetStream(DemuxerStream::AUDIO) || | 127 DCHECK(demuxer_stream_provider->GetStream(DemuxerStream::AUDIO) || |
| 128 demuxer_stream_provider->GetStream(DemuxerStream::VIDEO)); | 128 demuxer_stream_provider->GetStream(DemuxerStream::VIDEO)); |
| 129 | 129 |
| 130 client_ = client; | 130 client_ = client; |
| 131 demuxer_stream_provider_ = demuxer_stream_provider; | 131 demuxer_stream_provider_ = demuxer_stream_provider; |
| 132 init_cb_ = init_cb; | 132 init_cb_ = init_cb; |
| 133 | 133 |
| 134 DemuxerStream* audio_stream = | 134 DemuxerStream* audio_stream = |
| 135 demuxer_stream_provider->GetStream(DemuxerStream::AUDIO); | 135 demuxer_stream_provider->GetStream(DemuxerStream::AUDIO); |
| 136 if (audio_stream) | 136 if (audio_stream) |
| 137 audio_stream->SetStreamRestartedCB( | 137 audio_stream->SetStreamStatusChangeCB(base::Bind( |
| 138 base::Bind(&RendererImpl::RestartStreamPlayback, weak_this_)); | 138 &RendererImpl::RestartStreamPlayback, weak_this_, audio_stream)); |
| 139 DemuxerStream* video_stream = | 139 DemuxerStream* video_stream = |
| 140 demuxer_stream_provider->GetStream(DemuxerStream::VIDEO); | 140 demuxer_stream_provider->GetStream(DemuxerStream::VIDEO); |
| 141 if (video_stream) | 141 if (video_stream) |
| 142 video_stream->SetStreamRestartedCB( | 142 video_stream->SetStreamStatusChangeCB(base::Bind( |
| 143 base::Bind(&RendererImpl::RestartStreamPlayback, weak_this_)); | 143 &RendererImpl::RestartStreamPlayback, weak_this_, video_stream)); |
| 144 | 144 |
| 145 if (HasEncryptedStream() && !cdm_context_) { | 145 if (HasEncryptedStream() && !cdm_context_) { |
| 146 state_ = STATE_INIT_PENDING_CDM; | 146 state_ = STATE_INIT_PENDING_CDM; |
| 147 return; | 147 return; |
| 148 } | 148 } |
| 149 | 149 |
| 150 state_ = STATE_INITIALIZING; | 150 state_ = STATE_INITIALIZING; |
| 151 InitializeAudioRenderer(); | 151 InitializeAudioRenderer(); |
| 152 } | 152 } |
| 153 | 153 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 | 208 |
| 209 time_source_->SetMediaTime(time); | 209 time_source_->SetMediaTime(time); |
| 210 | 210 |
| 211 if (audio_renderer_) | 211 if (audio_renderer_) |
| 212 audio_renderer_->StartPlaying(); | 212 audio_renderer_->StartPlaying(); |
| 213 if (video_renderer_) | 213 if (video_renderer_) |
| 214 video_renderer_->StartPlayingFrom(time); | 214 video_renderer_->StartPlayingFrom(time); |
| 215 } | 215 } |
| 216 | 216 |
| 217 void RendererImpl::RestartStreamPlayback(DemuxerStream* stream, | 217 void RendererImpl::RestartStreamPlayback(DemuxerStream* stream, |
| 218 bool enabled, |
| 218 base::TimeDelta time) { | 219 base::TimeDelta time) { |
| 219 DVLOG(1) << __func__ << " stream=" << stream << " time=" << time.InSecondsF(); | |
| 220 DCHECK(task_runner_->BelongsToCurrentThread()); | 220 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 221 DCHECK(stream); |
| 222 bool video = (stream->type() == DemuxerStream::VIDEO); |
| 223 DVLOG(1) << __func__ << (video ? " video" : " audio") << " stream=" << stream |
| 224 << " enabled=" << stream->enabled() << " time=" << time.InSecondsF(); |
| 221 if (state_ != STATE_PLAYING) | 225 if (state_ != STATE_PLAYING) |
| 222 return; | 226 return; |
| 223 if (stream->type() == DemuxerStream::VIDEO) { | 227 if (stream->type() == DemuxerStream::VIDEO) { |
| 224 DCHECK(video_renderer_); | 228 DCHECK(video_renderer_); |
| 225 if (restarting_video_) | 229 if (restarting_video_) |
| 226 return; | 230 return; |
| 227 restarting_video_ = true; | 231 restarting_video_ = true; |
| 228 video_renderer_->Flush( | 232 video_renderer_->Flush( |
| 229 base::Bind(&RendererImpl::RestartVideoRenderer, weak_this_, time)); | 233 base::Bind(&RendererImpl::RestartVideoRenderer, weak_this_, time)); |
| 230 } else if (stream->type() == DemuxerStream::AUDIO) { | 234 } else if (stream->type() == DemuxerStream::AUDIO) { |
| 231 DCHECK(audio_renderer_); | 235 DCHECK(audio_renderer_); |
| 232 DCHECK(time_source_); | 236 DCHECK(time_source_); |
| 233 if (restarting_audio_) | 237 if (restarting_audio_) |
| 234 return; | 238 return; |
| 235 restarting_audio_ = true; | 239 restarting_audio_ = true; |
| 236 // Stop ticking (transition into paused state) in audio renderer before | 240 // Stop ticking (transition into paused state) in audio renderer before |
| 237 // calling Flush, since after Flush we are going to restart playback by | 241 // calling Flush, since after Flush we are going to restart playback by |
| 238 // calling audio renderer StartPlaying which would fail in playing state. | 242 // calling audio renderer StartPlaying which would fail in playing state. |
| 239 if (time_ticking_) { | 243 if (time_ticking_) { |
| 240 time_ticking_ = false; | 244 time_ticking_ = false; |
| 241 time_source_->StopTicking(); | 245 time_source_->StopTicking(); |
| 242 } | 246 } |
| 243 audio_renderer_->Flush( | 247 audio_renderer_->Flush( |
| 244 base::Bind(&RendererImpl::RestartAudioRenderer, weak_this_, time)); | 248 base::Bind(&RendererImpl::RestartAudioRenderer, weak_this_, time)); |
| 245 } | 249 } |
| 246 } | 250 } |
| 247 | 251 |
| 248 void RendererImpl::RestartVideoRenderer(base::TimeDelta time) { | 252 void RendererImpl::RestartVideoRenderer(base::TimeDelta time) { |
| 253 DVLOG(3) << __func__; |
| 249 DCHECK(task_runner_->BelongsToCurrentThread()); | 254 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 250 DVLOG(2) << __func__; | 255 DCHECK(video_renderer_); |
| 256 DCHECK_EQ(state_, STATE_PLAYING); |
| 251 video_ended_ = false; | 257 video_ended_ = false; |
| 252 if (state_ == STATE_PLAYING) { | 258 video_renderer_->StartPlayingFrom(time); |
| 253 DCHECK(video_renderer_); | |
| 254 video_renderer_->StartPlayingFrom(time); | |
| 255 } | |
| 256 } | 259 } |
| 257 | 260 |
| 258 void RendererImpl::RestartAudioRenderer(base::TimeDelta time) { | 261 void RendererImpl::RestartAudioRenderer(base::TimeDelta time) { |
| 262 DVLOG(3) << __func__; |
| 259 DCHECK(task_runner_->BelongsToCurrentThread()); | 263 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 260 DVLOG(2) << __func__; | 264 DCHECK_EQ(state_, STATE_PLAYING); |
| 265 DCHECK(time_source_); |
| 266 DCHECK(audio_renderer_); |
| 261 audio_ended_ = false; | 267 audio_ended_ = false; |
| 262 if (state_ == STATE_PLAYING) { | 268 audio_renderer_->StartPlaying(); |
| 263 DCHECK(time_source_); | |
| 264 DCHECK(audio_renderer_); | |
| 265 audio_renderer_->StartPlaying(); | |
| 266 } | |
| 267 } | 269 } |
| 268 | 270 |
| 269 void RendererImpl::SetPlaybackRate(double playback_rate) { | 271 void RendererImpl::SetPlaybackRate(double playback_rate) { |
| 270 DVLOG(1) << __func__ << "(" << playback_rate << ")"; | 272 DVLOG(1) << __func__ << "(" << playback_rate << ")"; |
| 271 DCHECK(task_runner_->BelongsToCurrentThread()); | 273 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 272 | 274 |
| 273 // Playback rate changes are only carried out while playing. | 275 // Playback rate changes are only carried out while playing. |
| 274 if (state_ != STATE_PLAYING) | 276 if (state_ != STATE_PLAYING) |
| 275 return; | 277 return; |
| 276 | 278 |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 DCHECK(task_runner_->BelongsToCurrentThread()); | 842 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 841 client_->OnVideoNaturalSizeChange(size); | 843 client_->OnVideoNaturalSizeChange(size); |
| 842 } | 844 } |
| 843 | 845 |
| 844 void RendererImpl::OnVideoOpacityChange(bool opaque) { | 846 void RendererImpl::OnVideoOpacityChange(bool opaque) { |
| 845 DCHECK(task_runner_->BelongsToCurrentThread()); | 847 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 846 client_->OnVideoOpacityChange(opaque); | 848 client_->OnVideoOpacityChange(opaque); |
| 847 } | 849 } |
| 848 | 850 |
| 849 } // namespace media | 851 } // namespace media |
| OLD | NEW |