| Index: media/filters/source_buffer_stream.cc
|
| diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc
|
| index 18a08b7501f4b640514ffffdc2845b03437aaacb..6257f2bf2bb1be5da58a52ea48d30e4818b91999 100644
|
| --- a/media/filters/source_buffer_stream.cc
|
| +++ b/media/filters/source_buffer_stream.cc
|
| @@ -355,8 +355,6 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) {
|
|
|
| SetSelectedRangeIfNeeded(next_buffer_timestamp);
|
|
|
| - GarbageCollectIfNeeded();
|
| -
|
| DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName()
|
| << ": done. ranges_=" << RangesToString(ranges_);
|
| DCHECK(IsRangeListSorted(ranges_));
|
| @@ -592,7 +590,7 @@ void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) {
|
| }
|
| }
|
|
|
| -void SourceBufferStream::GarbageCollectIfNeeded() {
|
| +bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time) {
|
| // Compute size of |ranges_|.
|
| int ranges_size = 0;
|
| for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr)
|
| @@ -600,7 +598,7 @@ void SourceBufferStream::GarbageCollectIfNeeded() {
|
|
|
| // Return if we're under or at the memory limit.
|
| if (ranges_size <= memory_limit_)
|
| - return;
|
| + return true;
|
|
|
| int bytes_to_free = ranges_size - memory_limit_;
|
|
|
| @@ -614,15 +612,16 @@ void SourceBufferStream::GarbageCollectIfNeeded() {
|
|
|
| // Begin deleting from the front.
|
| if (bytes_to_free - bytes_freed > 0)
|
| - bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false);
|
| + bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, media_time, false);
|
|
|
| - // Begin deleting from the back.
|
| if (bytes_to_free - bytes_freed > 0)
|
| - bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, true);
|
| + bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, media_time, true);
|
|
|
| DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC"
|
| << " bytes_freed=" << bytes_freed
|
| << " ranges_=" << RangesToString(ranges_);
|
| +
|
| + return bytes_freed >= bytes_to_free;
|
| }
|
|
|
| int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) {
|
| @@ -685,6 +684,7 @@ int SourceBufferStream::GetRemovalRange(
|
| }
|
|
|
| int SourceBufferStream::FreeBuffers(int total_bytes_to_free,
|
| + DecodeTimestamp media_time,
|
| bool reverse_direction) {
|
| TRACE_EVENT2("media", "SourceBufferStream::FreeBuffers",
|
| "total bytes to free", total_bytes_to_free,
|
| @@ -716,6 +716,10 @@ int SourceBufferStream::FreeBuffers(int total_bytes_to_free,
|
| DCHECK_EQ(current_range, selected_range_);
|
| break;
|
| }
|
| + if (media_time != kNoDecodeTimestamp() &&
|
| + !current_range->FirstGOPEarlierThanMediaTime(media_time)) {
|
| + break;
|
| + }
|
| bytes_deleted = current_range->DeleteGOPFromFront(&buffers);
|
| }
|
|
|
| @@ -724,6 +728,7 @@ int SourceBufferStream::FreeBuffers(int total_bytes_to_free,
|
| if (end_timestamp == last_appended_buffer_timestamp_) {
|
| DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp());
|
| DCHECK(!new_range_for_append);
|
| +
|
| // Create a new range containing these buffers.
|
| new_range_for_append = new SourceBufferRange(
|
| TypeToGapPolicy(GetType()),
|
| @@ -743,6 +748,11 @@ int SourceBufferStream::FreeBuffers(int total_bytes_to_free,
|
| delete current_range;
|
| reverse_direction ? ranges_.pop_back() : ranges_.pop_front();
|
| }
|
| +
|
| + if (reverse_direction && new_range_for_append) {
|
| + // We don't want to delete any further, or we'll be creating gaps
|
| + break;
|
| + }
|
| }
|
|
|
| // Insert |new_range_for_append| into |ranges_|, if applicable.
|
|
|