diff options
-rw-r--r-- | media/base/demuxer.h | 3 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 38 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.h | 9 |
3 files changed, 25 insertions, 25 deletions
diff --git a/media/base/demuxer.h b/media/base/demuxer.h index 2324c87..1f136a0 100644 --- a/media/base/demuxer.h +++ b/media/base/demuxer.h @@ -87,8 +87,7 @@ class MEDIA_EXPORT Demuxer : public DemuxerStreamProvider { // a null Time is returned. virtual base::Time GetTimelineOffset() const = 0; - // Returns the memory usage in bytes for the demuxer. May be called from any - // thread. + // Returns the memory usage in bytes for the demuxer. virtual int64_t GetMemoryUsage() const = 0; private: diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index f7a3f48..f041bb6 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -748,7 +748,6 @@ FFmpegDemuxer::FFmpegDemuxer( text_enabled_(false), duration_known_(false), encrypted_media_init_data_cb_(encrypted_media_init_data_cb), - stream_memory_usage_(0), weak_factory_(this) { DCHECK(task_runner_.get()); DCHECK(data_source_); @@ -925,8 +924,12 @@ void FFmpegDemuxer::AddTextStreams() { } int64_t FFmpegDemuxer::GetMemoryUsage() const { - base::AutoLock locker(stream_memory_usage_lock_); - return stream_memory_usage_; + int64_t allocation_size = 0; + for (const auto& stream : streams_) { + if (stream) + allocation_size += stream->MemoryUsage(); + } + return allocation_size; } // Helper for calculating the bitrate of the media based on information stored @@ -1379,15 +1382,10 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { return; } - // Max allowed memory usage, all streams combined. - const int64_t kDemuxerMemoryLimit = 150 * 1024 * 1024; - const bool is_max_memory_usage_reached = - UpdateMemoryUsage() > kDemuxerMemoryLimit; - // Consider the stream as ended if: // - either underlying ffmpeg returned an error // - or FFMpegDemuxer reached the maximum allowed memory usage. - if (result < 0 || is_max_memory_usage_reached) { + if (result < 0 || IsMaxMemoryUsageReached()) { // Update the duration based on the highest elapsed time across all streams // if it was previously unknown. if (!duration_known_) { @@ -1453,16 +1451,24 @@ bool FFmpegDemuxer::StreamsHaveAvailableCapacity() { return false; } -int64_t FFmpegDemuxer::UpdateMemoryUsage() { +bool FFmpegDemuxer::IsMaxMemoryUsageReached() const { DCHECK(task_runner_->BelongsToCurrentThread()); - base::AutoLock locker(stream_memory_usage_lock_); - stream_memory_usage_ = 0; - for (const auto& stream : streams_) { - if (stream) - stream_memory_usage_ += stream->MemoryUsage(); + // 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 stream_memory_usage_; + return false; } void FFmpegDemuxer::StreamHasEnded() { diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index 154ff05..c527b74 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h @@ -233,9 +233,8 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { // go over capacity depending on how the file is muxed. bool StreamsHaveAvailableCapacity(); - // Updates |stream_memory_usage_| to the memory usage in bytes of all - // FFmpegDemuxerStreams. Returns the current memory usage. - int64_t UpdateMemoryUsage(); + // Returns true if the maximum allowed memory usage has been reached. + bool IsMaxMemoryUsageReached() const; // Signal all FFmpegDemuxerStreams that the stream has ended. void StreamHasEnded(); @@ -324,10 +323,6 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { const EncryptedMediaInitDataCB encrypted_media_init_data_cb_; - // Last stream size as calculated by UpdateMemoryUsage(). - mutable base::Lock stream_memory_usage_lock_; - int64_t stream_memory_usage_; - // NOTE: Weak pointers must be invalidated before all other member variables. base::WeakPtrFactory<FFmpegDemuxer> weak_factory_; |