Index: media/base/pipeline_impl.cc |
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc |
index 43fdf5eb951113bab49777c1f94e89b3dc55434e..08817780663251f95d48e6abc0afc65e12c65b0a 100644 |
--- a/media/base/pipeline_impl.cc |
+++ b/media/base/pipeline_impl.cc |
@@ -311,6 +311,9 @@ void PipelineImpl::RendererWrapper::Seek(base::TimeDelta time) { |
DCHECK(!pending_callbacks_); |
SerialRunner::Queue bound_fns; |
+ // Abort any reads the renderer may be blocked on. |
+ demuxer_->AbortPendingReads(); |
+ |
// Pause. |
if (text_renderer_) { |
bound_fns.Push(base::Bind(&TextRenderer::Pause, |
@@ -352,8 +355,7 @@ void PipelineImpl::RendererWrapper::Suspend() { |
SetState(kSuspending); |
- // Freeze playback and record the media time before flushing. (Flushing clears |
- // the value.) |
+ // Freeze playback and record the media time before destroying the renderer. |
shared_state_.renderer->SetPlaybackRate(0.0); |
{ |
base::AutoLock auto_lock(shared_state_lock_); |
@@ -361,6 +363,9 @@ void PipelineImpl::RendererWrapper::Suspend() { |
DCHECK(shared_state_.suspend_timestamp != kNoTimestamp); |
} |
+ // Abort any reads the renderer may be blocked on. |
+ demuxer_->AbortPendingReads(); |
+ |
// Queue the asynchronous actions required to stop playback. |
SerialRunner::Queue fns; |
@@ -369,14 +374,7 @@ void PipelineImpl::RendererWrapper::Suspend() { |
base::Unretained(text_renderer_.get()))); |
} |
- fns.Push(base::Bind(&Renderer::Flush, |
- base::Unretained(shared_state_.renderer.get()))); |
- |
- if (text_renderer_) { |
- fns.Push(base::Bind(&TextRenderer::Flush, |
- base::Unretained(text_renderer_.get()))); |
- } |
- |
+ // No need to flush the renderer since it's going to be destroyed. |
pending_callbacks_ = SerialRunner::Run( |
fns, base::Bind(&RendererWrapper::CompleteSuspend, weak_this_)); |
} |