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 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 198 if (old_rate == 0 && playback_rate > 0) | 198 if (old_rate == 0 && playback_rate > 0) |
| 199 video_renderer_->OnTimeStateChanged(true); | 199 video_renderer_->OnTimeStateChanged(true); |
| 200 else if (old_rate > 0 && playback_rate == 0) | 200 else if (old_rate > 0 && playback_rate == 0) |
| 201 video_renderer_->OnTimeStateChanged(false); | 201 video_renderer_->OnTimeStateChanged(false); |
| 202 } | 202 } |
| 203 | 203 |
| 204 void RendererImpl::SetVolume(float volume) { | 204 void RendererImpl::SetVolume(float volume) { |
| 205 DVLOG(1) << __FUNCTION__; | 205 DVLOG(1) << __FUNCTION__; |
| 206 DCHECK(task_runner_->BelongsToCurrentThread()); | 206 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 207 | 207 |
| 208 if (audio_renderer_) | 208 audio_volume_ = volume; |
| 209 audio_renderer_->SetVolume(volume); | 209 if (!audio_renderer_) |
| 210 return; | |
| 211 | |
| 212 if (audio_muted_) { | |
| 213 DVLOG(1) << "SetVolume ignored since audio is muted"; | |
|
wolenetz
2016/04/14 20:43:39
nit: s/muted/muted because audio stream is enabled
servolk
2016/04/15 02:23:25
Done.
| |
| 214 return; | |
| 215 } | |
| 216 | |
| 217 audio_renderer_->SetVolume(volume); | |
| 210 } | 218 } |
| 211 | 219 |
| 212 base::TimeDelta RendererImpl::GetMediaTime() { | 220 base::TimeDelta RendererImpl::GetMediaTime() { |
| 213 // No BelongsToCurrentThread() checking because this can be called from other | 221 // No BelongsToCurrentThread() checking because this can be called from other |
| 214 // threads. | 222 // threads. |
| 215 return time_source_->CurrentMediaTime(); | 223 return time_source_->CurrentMediaTime(); |
| 216 } | 224 } |
| 217 | 225 |
| 218 bool RendererImpl::HasAudio() { | 226 bool RendererImpl::HasAudio() { |
| 219 DCHECK(task_runner_->BelongsToCurrentThread()); | 227 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 220 return audio_renderer_ != NULL; | 228 return audio_renderer_ != NULL; |
| 221 } | 229 } |
| 222 | 230 |
| 223 bool RendererImpl::HasVideo() { | 231 bool RendererImpl::HasVideo() { |
| 224 DCHECK(task_runner_->BelongsToCurrentThread()); | 232 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 225 return video_renderer_ != NULL; | 233 return video_renderer_ != NULL; |
| 226 } | 234 } |
| 227 | 235 |
| 236 void RendererImpl::OnEnabledAudioStreamsChanged( | |
| 237 const std::vector<const DemuxerStream*>& enabledAudioStreams) { | |
| 238 DCHECK(task_runner_->BelongsToCurrentThread()); | |
| 239 DemuxerStream* audio_stream = | |
| 240 demuxer_stream_provider_->GetStream(DemuxerStream::AUDIO); | |
| 241 | |
| 242 bool audio_stream_enabled = false; | |
| 243 for (const DemuxerStream* demuxer_stream : enabledAudioStreams) { | |
| 244 DCHECK_EQ(demuxer_stream->type(), DemuxerStream::AUDIO); | |
|
wolenetz
2016/04/14 20:43:39
aside: this DCHECK (and similar for video, below)
servolk
2016/04/15 02:23:25
Acknowledged.
| |
| 245 if (demuxer_stream == audio_stream) | |
| 246 audio_stream_enabled = true; | |
|
wolenetz
2016/04/14 20:43:39
I'm not entirely clear how this could ever not be
servolk
2016/04/15 02:23:25
Right, for now this check is always going to succe
wolenetz
2016/04/15 22:47:18
Ack, though it's still not DCHECK + set. Please up
servolk
2016/04/15 23:26:31
Done.
| |
| 247 } | |
| 248 | |
| 249 // TODO(servolk): Need to find a way to completely disable audio (i.e. stop | |
|
wolenetz
2016/04/14 20:43:39
nit: TODO+wolenetz
servolk
2016/04/15 02:23:25
Done.
| |
| 250 // audio decoder and switch video to wall clock) when audio stream is | |
| 251 // disabled, but for now just set volume to 0. crbug.com/599709 | |
| 252 if (audio_renderer_) { | |
| 253 if (audio_stream_enabled) { | |
|
wolenetz
2016/04/14 20:43:39
nit: can a track be enabled while it's already ena
servolk
2016/04/15 02:23:25
It should never happen, since blink sends this not
wolenetz
2016/04/15 22:47:18
Ack, though now (patch set 35) only one of the two
servolk
2016/04/15 23:26:31
Yes, I believe this is the best course of action f
wolenetz
2016/04/15 23:52:17
Acknowledged. That makes sense. Thanks for explain
| |
| 254 DVLOG(3) << __FUNCTION__ << " enabled audio. SetVolume=" << audio_volume_; | |
| 255 audio_muted_ = false; | |
| 256 audio_renderer_->SetVolume(audio_volume_); | |
| 257 } else { | |
| 258 DVLOG(3) << __FUNCTION__ << " disabled audio. SetVolume=0"; | |
| 259 audio_muted_ = true; | |
| 260 audio_renderer_->SetVolume(0); | |
| 261 } | |
| 262 } | |
| 263 } | |
| 264 | |
| 265 void RendererImpl::OnSelectedVideoStreamChanged( | |
| 266 const DemuxerStream* selectedVideoStream) { | |
| 267 DCHECK(task_runner_->BelongsToCurrentThread()); | |
| 268 DemuxerStream* video_stream = | |
| 269 demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); | |
| 270 if (selectedVideoStream) { | |
| 271 DVLOG(3) << __FUNCTION__ << " selectedVideoStream=" << selectedVideoStream; | |
| 272 DCHECK_EQ(selectedVideoStream->type(), DemuxerStream::VIDEO); | |
| 273 CHECK_EQ(selectedVideoStream, video_stream); | |
| 274 // TODO(servolk): Need to find a way to stop video decoding/rendering when | |
|
wolenetz
2016/04/14 20:43:39
nit: move this TODO to the else clause, and please
servolk
2016/04/15 02:23:25
Done.
| |
| 275 // the video stream is deselected. crbug.com/599709 | |
| 276 } else { | |
| 277 DVLOG(3) << __FUNCTION__ << " selectedVideoStream=none"; | |
| 278 } | |
| 279 } | |
| 280 | |
| 228 void RendererImpl::DisableUnderflowForTesting() { | 281 void RendererImpl::DisableUnderflowForTesting() { |
| 229 DVLOG(1) << __FUNCTION__; | 282 DVLOG(1) << __FUNCTION__; |
| 230 DCHECK(task_runner_->BelongsToCurrentThread()); | 283 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 231 DCHECK_EQ(state_, STATE_UNINITIALIZED); | 284 DCHECK_EQ(state_, STATE_UNINITIALIZED); |
| 232 | 285 |
| 233 underflow_disabled_for_testing_ = true; | 286 underflow_disabled_for_testing_ = true; |
| 234 } | 287 } |
| 235 | 288 |
| 236 void RendererImpl::EnableClocklessVideoPlaybackForTesting() { | 289 void RendererImpl::EnableClocklessVideoPlaybackForTesting() { |
| 237 DVLOG(1) << __FUNCTION__; | 290 DVLOG(1) << __FUNCTION__; |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 660 } | 713 } |
| 661 | 714 |
| 662 // After OnError() returns, the pipeline may destroy |this|. | 715 // After OnError() returns, the pipeline may destroy |this|. |
| 663 base::ResetAndReturn(&error_cb_).Run(error); | 716 base::ResetAndReturn(&error_cb_).Run(error); |
| 664 | 717 |
| 665 if (!flush_cb_.is_null()) | 718 if (!flush_cb_.is_null()) |
| 666 base::ResetAndReturn(&flush_cb_).Run(); | 719 base::ResetAndReturn(&flush_cb_).Run(); |
| 667 } | 720 } |
| 668 | 721 |
| 669 } // namespace media | 722 } // namespace media |
| OLD | NEW |