Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index 0dec8b8822229cadc076436b04304c0209a1fbfb..8a4b23e4dcdc5f66f252a89c10236cfac826690e 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -5,6 +5,7 @@ |
#include "media/filters/ffmpeg_demuxer.h" |
#include <algorithm> |
+#include <limits> |
#include <string> |
#include "base/base64.h" |
@@ -323,6 +324,10 @@ bool FFmpegDemuxerStream::HasAvailableCapacity() { |
return buffer_queue_.IsEmpty() || buffer_queue_.Duration() < kCapacity; |
} |
+int FFmpegDemuxerStream::MemoryUsage() const { |
+ return buffer_queue_.data_size(); |
+} |
+ |
TextKind FFmpegDemuxerStream::GetTextKind() const { |
DCHECK_EQ(type_, DemuxerStream::TEXT); |
@@ -800,7 +805,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 any stream reached its maximum memory usage. |
+ if (result < 0 || IsMaxMemoryReached()) { |
// Update the duration based on the highest elapsed time across all streams |
// if it was previously unknown. |
if (!duration_known_) { |
@@ -907,6 +915,23 @@ bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { |
return false; |
} |
+bool FFmpegDemuxer::IsMaxMemoryReached() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ // Max memory usage, all streams combined. |
+ const int kMemoryLimit = 150 * 1024 * 1024; |
+ int memory_usage = 0; |
+ StreamVector::iterator iter; |
+ for (StreamVector::iterator iter = streams_.begin(); |
+ iter != streams_.end(); ++iter) { |
+ if (!(*iter)) |
+ continue; |
+ DCHECK_LE((*iter)->MemoryUsage(), |
+ std::numeric_limits<int>::max() - memory_usage); |
+ memory_usage += (*iter)->MemoryUsage(); |
+ } |
+ return (memory_usage >= kMemoryLimit); |
+} |
+ |
void FFmpegDemuxer::StreamHasEnded() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
StreamVector::iterator iter; |