diff options
author | damienv@chromium.org <damienv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-20 16:13:24 +0000 |
---|---|---|
committer | damienv@chromium.org <damienv@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-20 16:13:24 +0000 |
commit | ac275751d8184ef56a7e27e2b4396da1b9d17efc (patch) | |
tree | b7e6583f50acfefd4cdb0bf97705518e90578fe3 /media/filters | |
parent | f4164dce2dfb7a2a253566dac47f2b1b498f1b3c (diff) | |
download | chromium_src-ac275751d8184ef56a7e27e2b4396da1b9d17efc.zip chromium_src-ac275751d8184ef56a7e27e2b4396da1b9d17efc.tar.gz chromium_src-ac275751d8184ef56a7e27e2b4396da1b9d17efc.tar.bz2 |
Cap the memory usage in FFMpegDemuxer.
Abort the playback if a specific stream triggers some high memory usage.
BUG=343304
Review URL: https://codereview.chromium.org/164233005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@252259 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/filters')
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 29 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.h | 6 |
2 files changed, 34 insertions, 1 deletions
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index 0dec8b8..6273b59 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -323,6 +323,10 @@ bool FFmpegDemuxerStream::HasAvailableCapacity() { return buffer_queue_.IsEmpty() || buffer_queue_.Duration() < kCapacity; } +size_t FFmpegDemuxerStream::MemoryUsage() const { + return buffer_queue_.data_size(); +} + TextKind FFmpegDemuxerStream::GetTextKind() const { DCHECK_EQ(type_, DemuxerStream::TEXT); @@ -800,7 +804,10 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { return; } - if (result < 0) { + // Consider the stream as ended if: + // - either underlying ffmpeg returned an error + // - or FFMpegDemuxer reached the maximum allowed memory usage. + if (result < 0 || IsMaxMemoryUsageReached()) { // Update the duration based on the highest elapsed time across all streams // if it was previously unknown. if (!duration_known_) { @@ -907,6 +914,26 @@ bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { return false; } +bool FFmpegDemuxer::IsMaxMemoryUsageReached() const { + DCHECK(task_runner_->BelongsToCurrentThread()); + + // Max allowed memory usage, all streams combined. + const size_t kDemuxerMemoryLimit = 150 * 1024 * 1024; + + size_t memory_left = kDemuxerMemoryLimit; + for (StreamVector::const_iterator iter = streams_.begin(); + iter != streams_.end(); ++iter) { + if (!(*iter)) + continue; + + size_t stream_memory_usage = (*iter)->MemoryUsage(); + if (stream_memory_usage > memory_left) + return true; + memory_left -= stream_memory_usage; + } + return false; +} + void FFmpegDemuxer::StreamHasEnded() { DCHECK(task_runner_->BelongsToCurrentThread()); StreamVector::iterator iter; diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index ea2b908..32cba81 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h @@ -94,6 +94,9 @@ class FFmpegDemuxerStream : public DemuxerStream { // Returns true if this stream has capacity for additional data. bool HasAvailableCapacity(); + // Returns the total buffer size FFMpegDemuxerStream is holding onto. + size_t MemoryUsage() const; + TextKind GetTextKind() const; // Returns the value associated with |key| in the metadata for the avstream. @@ -182,6 +185,9 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { // go over capacity depending on how the file is muxed. bool StreamsHaveAvailableCapacity(); + // Returns true if the maximum allowed memory usage has been reached. + bool IsMaxMemoryUsageReached() const; + // Signal all FFmpegDemuxerStreams that the stream has ended. void StreamHasEnded(); |