Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index 0dec8b8822229cadc076436b04304c0209a1fbfb..e2e9d081cb98e0033c53e9fcc922378edc52c6a5 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; |
} |
+int 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 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 +914,30 @@ bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { |
return false; |
} |
+bool FFmpegDemuxer::IsMaxMemoryReached() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ const int kMaxMemoryForAudioStream = 12 * 1024 * 1024; |
+ const int kMaxMemoryForVideoStream = 150 * 1024 * 1024; |
+ StreamVector::iterator iter; |
+ for (iter = streams_.begin(); iter != streams_.end(); ++iter) { |
+ if (!(*iter)) |
+ continue; |
+ switch ((*iter)->type()) { |
+ case DemuxerStream::VIDEO: |
+ if ((*iter)->MemoryUsage() >= kMaxMemoryForVideoStream) |
+ return true; |
+ break; |
+ case DemuxerStream::AUDIO: |
+ if ((*iter)->MemoryUsage() >= kMaxMemoryForAudioStream) |
+ return true; |
+ break; |
+ default: |
acolwell GONE FROM CHROMIUM
2014/02/18 22:16:20
nit: Please don't use default here. Explicitly ind
damienv1
2014/02/18 23:38:03
I changed the code so that the contribution of eve
|
+ break; |
+ } |
+ } |
+ return false; |
+} |
+ |
void FFmpegDemuxer::StreamHasEnded() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
StreamVector::iterator iter; |