Chromium Code Reviews| 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; |