Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index b34d8bc3cb784c81bdae8ca48c4c1ee5d77076b5..1033bbc5a999bdfaeecec45cfffcd0134b175f1a 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -592,6 +592,11 @@ void FFmpegDemuxerStream::FlushBuffers() { |
last_packet_duration_ = kNoTimestamp; |
} |
+void FFmpegDemuxerStream::Abort() { |
+ if (!read_cb_.is_null()) |
+ base::ResetAndReturn(&read_cb_).Run(DemuxerStream::kAborted, nullptr); |
+} |
+ |
void FFmpegDemuxerStream::Stop() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
buffer_queue_.Clear(); |
@@ -881,6 +886,23 @@ 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(); |
+ } |
+ |
+ data_source_->Abort(); |
+} |
+ |
void FFmpegDemuxer::Stop() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |