OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/pipeline_impl.h" | 5 #include "media/base/pipeline_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
304 base::TimeDelta seek_timestamp = std::max(time, demuxer_->GetStartTime()); | 304 base::TimeDelta seek_timestamp = std::max(time, demuxer_->GetStartTime()); |
305 | 305 |
306 SetState(kSeeking); | 306 SetState(kSeeking); |
307 renderer_ended_ = false; | 307 renderer_ended_ = false; |
308 text_renderer_ended_ = false; | 308 text_renderer_ended_ = false; |
309 | 309 |
310 // Queue asynchronous actions required to start. | 310 // Queue asynchronous actions required to start. |
311 DCHECK(!pending_callbacks_); | 311 DCHECK(!pending_callbacks_); |
312 SerialRunner::Queue bound_fns; | 312 SerialRunner::Queue bound_fns; |
313 | 313 |
314 // Abort any reads the renderer may be blocked on. | |
315 demuxer_->AbortPendingReads(); | |
wolenetz
2016/08/25 18:56:14
Would this be better integrated with how the MSE p
DaleCurtis
2016/08/29 21:14:58
Good point. I think we just need to add AbortPendi
wolenetz
2016/08/30 18:52:12
Acknowledged.
| |
316 | |
314 // Pause. | 317 // Pause. |
315 if (text_renderer_) { | 318 if (text_renderer_) { |
316 bound_fns.Push(base::Bind(&TextRenderer::Pause, | 319 bound_fns.Push(base::Bind(&TextRenderer::Pause, |
317 base::Unretained(text_renderer_.get()))); | 320 base::Unretained(text_renderer_.get()))); |
318 } | 321 } |
319 | 322 |
320 // Flush. | 323 // Flush. |
321 DCHECK(shared_state_.renderer); | 324 DCHECK(shared_state_.renderer); |
322 bound_fns.Push(base::Bind(&Renderer::Flush, | 325 bound_fns.Push(base::Bind(&Renderer::Flush, |
323 base::Unretained(shared_state_.renderer.get()))); | 326 base::Unretained(shared_state_.renderer.get()))); |
(...skipping 21 matching lines...) Expand all Loading... | |
345 DCHECK(state_ == kStopping || state_ == kStopped) | 348 DCHECK(state_ == kStopping || state_ == kStopped) |
346 << "Receive suspend in unexpected state: " << state_; | 349 << "Receive suspend in unexpected state: " << state_; |
347 OnPipelineError(PIPELINE_ERROR_INVALID_STATE); | 350 OnPipelineError(PIPELINE_ERROR_INVALID_STATE); |
348 return; | 351 return; |
349 } | 352 } |
350 DCHECK(shared_state_.renderer); | 353 DCHECK(shared_state_.renderer); |
351 DCHECK(!pending_callbacks_.get()); | 354 DCHECK(!pending_callbacks_.get()); |
352 | 355 |
353 SetState(kSuspending); | 356 SetState(kSuspending); |
354 | 357 |
355 // Freeze playback and record the media time before flushing. (Flushing clears | 358 // Freeze playback and record the media time before destroying the renderer. |
356 // the value.) | |
357 shared_state_.renderer->SetPlaybackRate(0.0); | 359 shared_state_.renderer->SetPlaybackRate(0.0); |
358 { | 360 { |
359 base::AutoLock auto_lock(shared_state_lock_); | 361 base::AutoLock auto_lock(shared_state_lock_); |
360 shared_state_.suspend_timestamp = shared_state_.renderer->GetMediaTime(); | 362 shared_state_.suspend_timestamp = shared_state_.renderer->GetMediaTime(); |
361 DCHECK(shared_state_.suspend_timestamp != kNoTimestamp); | 363 DCHECK(shared_state_.suspend_timestamp != kNoTimestamp); |
362 } | 364 } |
363 | 365 |
366 // Abort any reads the renderer may be blocked on. | |
367 demuxer_->AbortPendingReads(); | |
368 | |
364 // Queue the asynchronous actions required to stop playback. | 369 // Queue the asynchronous actions required to stop playback. |
365 SerialRunner::Queue fns; | 370 SerialRunner::Queue fns; |
366 | 371 |
367 if (text_renderer_) { | 372 if (text_renderer_) { |
368 fns.Push(base::Bind(&TextRenderer::Pause, | 373 fns.Push(base::Bind(&TextRenderer::Pause, |
369 base::Unretained(text_renderer_.get()))); | 374 base::Unretained(text_renderer_.get()))); |
370 } | 375 } |
371 | 376 |
372 fns.Push(base::Bind(&Renderer::Flush, | 377 // No need to flush the renderer since it's going to be destroyed. |
373 base::Unretained(shared_state_.renderer.get()))); | |
374 | |
375 if (text_renderer_) { | |
376 fns.Push(base::Bind(&TextRenderer::Flush, | |
377 base::Unretained(text_renderer_.get()))); | |
378 } | |
379 | |
380 pending_callbacks_ = SerialRunner::Run( | 378 pending_callbacks_ = SerialRunner::Run( |
381 fns, base::Bind(&RendererWrapper::CompleteSuspend, weak_this_)); | 379 fns, base::Bind(&RendererWrapper::CompleteSuspend, weak_this_)); |
382 } | 380 } |
383 | 381 |
384 void PipelineImpl::RendererWrapper::Resume(std::unique_ptr<Renderer> renderer, | 382 void PipelineImpl::RendererWrapper::Resume(std::unique_ptr<Renderer> renderer, |
385 base::TimeDelta timestamp) { | 383 base::TimeDelta timestamp) { |
386 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 384 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
387 | 385 |
388 // Suppress resuming if we're not suspended. | 386 // Suppress resuming if we're not suspended. |
389 if (state_ != kSuspended) { | 387 if (state_ != kSuspended) { |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1235 void PipelineImpl::OnSuspendDone() { | 1233 void PipelineImpl::OnSuspendDone() { |
1236 DVLOG(3) << __func__; | 1234 DVLOG(3) << __func__; |
1237 DCHECK(thread_checker_.CalledOnValidThread()); | 1235 DCHECK(thread_checker_.CalledOnValidThread()); |
1238 DCHECK(IsRunning()); | 1236 DCHECK(IsRunning()); |
1239 | 1237 |
1240 DCHECK(!suspend_cb_.is_null()); | 1238 DCHECK(!suspend_cb_.is_null()); |
1241 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); | 1239 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); |
1242 } | 1240 } |
1243 | 1241 |
1244 } // namespace media | 1242 } // namespace media |
OLD | NEW |