Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Side by Side Diff: media/renderers/renderer_impl.cc

Issue 2199913002: Notify demux stream clients when a stream is disabled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Pass stream enabled/disabled flag into StatusChangeCB Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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(
138 base::Bind(&RendererImpl::RestartStreamPlayback, weak_this_)); 138 base::Bind(&RendererImpl::RestartStreamPlayback, weak_this_));
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(
143 base::Bind(&RendererImpl::RestartStreamPlayback, weak_this_)); 143 base::Bind(&RendererImpl::RestartStreamPlayback, weak_this_));
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 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
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,
alokp 2016/08/04 19:02:36 I do not see this new argument being used. Am I mi
servolk 2016/08/04 20:31:47 Yes, it is unused for now. I've added it per Dale
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__;
alokp 2016/08/04 19:02:37 any particular reason for changing the logging lev
servolk 2016/08/04 20:31:48 No particular reason. It was more useful during th
249 DCHECK(task_runner_->BelongsToCurrentThread()); 254 DCHECK(task_runner_->BelongsToCurrentThread());
250 DVLOG(2) << __func__; 255 DCHECK(video_renderer_);
256 DCHECK_EQ(state_, STATE_PLAYING);
alokp 2016/08/04 19:02:36 nit: I usually prefer the expected values specifie
servolk 2016/08/04 20:31:47 I have no strong opinion about which order is bett
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__;
alokp 2016/08/04 19:02:36 ditto
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698