Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index b34d8bc3cb784c81bdae8ca48c4c1ee5d77076b5..4df967a51986ccb1d0e3db17ad3cd131eb413266 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -592,6 +592,13 @@ void FFmpegDemuxerStream::FlushBuffers() { |
last_packet_duration_ = kNoTimestamp; |
} |
+void FFmpegDemuxerStream::Abort() { |
+ if (!read_cb_.is_null()) { |
+ base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kOk, |
+ DecoderBuffer::CreateEOSBuffer()); |
+ } |
+} |
+ |
void FFmpegDemuxerStream::Stop() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
buffer_queue_.Clear(); |
@@ -881,6 +888,27 @@ void FFmpegDemuxer::Initialize(DemuxerHost* host, |
status_cb)); |
} |
+void FFmpegDemuxer::AbortPendingReads() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
+ // This should only be called after the demuxer has been initialized. |
+ DCHECK(blocking_thread_.IsRunning()); |
+ DCHECK_GT(streams_.size(), 0u); |
+ |
+ // Abort all outstanding reads by returning EOS buffers (to avoid any errors |
+ // being triggered in the pipeline). |
+ for (auto* stream : streams_) { |
+ if (stream) |
+ stream->Abort(); |
+ } |
+ |
+ // Ordering is important here, we want to ignore any errors that occur during |
+ // the Abort() of the data source. Note: We don't abort the URLProtocol here |
+ // since that is a permanent action. |
+ weak_factory_.InvalidateWeakPtrs(); |
+ data_source_->Abort(); |
+} |
+ |
void FFmpegDemuxer::Stop() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |