| Index: media/filters/source_buffer_stream.cc
|
| diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc
|
| index fe3dbfea4fca61cd406a420363b5ea62b194e62b..fafe2e66976c3ea2473d0edbb66dccd4230ca771 100644
|
| --- a/media/filters/source_buffer_stream.cc
|
| +++ b/media/filters/source_buffer_stream.cc
|
| @@ -693,37 +693,40 @@ void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) {
|
| }
|
|
|
| bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time,
|
| - size_t newDataSize) {
|
| + size_t eviction_size,
|
| + size_t* bytes_released) {
|
| DCHECK(media_time != kNoDecodeTimestamp());
|
| - // Garbage collection should only happen before/during appending new data,
|
| - // which should not happen in end-of-stream state.
|
| - DCHECK(!end_of_stream_);
|
| +
|
| + if (bytes_released)
|
| + *bytes_released = 0;
|
| +
|
| // Compute size of |ranges_|.
|
| size_t ranges_size = GetBufferedSize();
|
|
|
| // Sanity and overflow checks
|
| - if ((newDataSize > memory_limit_) ||
|
| - (ranges_size + newDataSize < ranges_size)) {
|
| + if ((eviction_size > memory_limit_) ||
|
| + (ranges_size + eviction_size < ranges_size)) {
|
| LIMITED_MEDIA_LOG(DEBUG, media_log_, num_garbage_collect_algorithm_logs_,
|
| kMaxGarbageCollectAlgorithmWarningLogs)
|
| - << GetStreamTypeName() << " stream: "
|
| - << "new append of newDataSize=" << newDataSize
|
| + << GetStreamTypeName() << " stream: " << __func__
|
| + << " eviction_size=" << eviction_size
|
| << " bytes exceeds memory_limit_=" << memory_limit_
|
| << ", currently buffered ranges_size=" << ranges_size;
|
| return false;
|
| }
|
|
|
| // Return if we're under or at the memory limit.
|
| - if (ranges_size + newDataSize <= memory_limit_)
|
| + if (ranges_size + eviction_size <= memory_limit_)
|
| return true;
|
|
|
| - size_t bytes_to_free = ranges_size + newDataSize - memory_limit_;
|
| + size_t bytes_to_free = ranges_size + eviction_size - memory_limit_;
|
|
|
| DVLOG(2) << __func__ << " " << GetStreamTypeName()
|
| << ": Before GC media_time=" << media_time.InSecondsF()
|
| << " ranges_=" << RangesToString(ranges_)
|
| << " seek_pending_=" << seek_pending_
|
| - << " ranges_size=" << ranges_size << " newDataSize=" << newDataSize
|
| + << " ranges_size=" << ranges_size
|
| + << " eviction_size=" << eviction_size
|
| << " memory_limit_=" << memory_limit_
|
| << " last_appended_buffer_timestamp_="
|
| << last_appended_buffer_timestamp_.InSecondsF();
|
| @@ -836,6 +839,9 @@ bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time,
|
| << " bytes_freed=" << bytes_freed
|
| << " ranges_=" << RangesToString(ranges_);
|
|
|
| + if (bytes_released)
|
| + *bytes_released = bytes_freed;
|
| +
|
| return bytes_freed >= bytes_to_free;
|
| }
|
|
|
|
|