Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: media/filters/source_buffer_stream.cc

Issue 789983003: Implement evictFrames() to support MSE's coded frame eviction algorithm. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/source_buffer_stream.h" 5 #include "media/filters/source_buffer_stream.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 // are appended to the range covered by |track_buffer_|. 341 // are appended to the range covered by |track_buffer_|.
342 if (!track_buffer_.empty()) { 342 if (!track_buffer_.empty()) {
343 DecodeTimestamp keyframe_timestamp = 343 DecodeTimestamp keyframe_timestamp =
344 FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp()); 344 FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp());
345 if (keyframe_timestamp != kNoDecodeTimestamp()) 345 if (keyframe_timestamp != kNoDecodeTimestamp())
346 PruneTrackBuffer(keyframe_timestamp); 346 PruneTrackBuffer(keyframe_timestamp);
347 } 347 }
348 348
349 SetSelectedRangeIfNeeded(next_buffer_timestamp); 349 SetSelectedRangeIfNeeded(next_buffer_timestamp);
350 350
351 GarbageCollectIfNeeded(); 351 if (!GarbageCollectIfNeeded()) {
352 LOG(WARNING) << "Buffer capacity exceeded after append";
353 }
352 354
353 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() 355 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName()
354 << ": done. ranges_=" << RangesToString(ranges_); 356 << ": done. ranges_=" << RangesToString(ranges_);
355 DCHECK(IsRangeListSorted(ranges_)); 357 DCHECK(IsRangeListSorted(ranges_));
356 DCHECK(OnlySelectedRangeIsSeeked()); 358 DCHECK(OnlySelectedRangeIsSeeked());
357 return true; 359 return true;
358 } 360 }
359 361
360 void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, 362 void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end,
361 base::TimeDelta duration) { 363 base::TimeDelta duration) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 } 578 }
577 } 579 }
578 580
579 void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) { 581 void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) {
580 for (BufferQueue::const_iterator itr = buffers.begin(); 582 for (BufferQueue::const_iterator itr = buffers.begin();
581 itr != buffers.end(); ++itr) { 583 itr != buffers.end(); ++itr) {
582 (*itr)->SetConfigId(append_config_index_); 584 (*itr)->SetConfigId(append_config_index_);
583 } 585 }
584 } 586 }
585 587
586 void SourceBufferStream::GarbageCollectIfNeeded() { 588 bool SourceBufferStream::GarbageCollectIfNeeded() {
587 // Compute size of |ranges_|. 589 // Compute size of |ranges_|.
588 int ranges_size = 0; 590 int ranges_size = 0;
589 for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) 591 for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr)
590 ranges_size += (*itr)->size_in_bytes(); 592 ranges_size += (*itr)->size_in_bytes();
591 593
592 // Return if we're under or at the memory limit. 594 // Return if we're under or at the memory limit.
593 if (ranges_size <= memory_limit_) 595 if (ranges_size <= memory_limit_)
594 return; 596 return true;
595 597
596 int bytes_to_free = ranges_size - memory_limit_; 598 int bytes_to_free = ranges_size - memory_limit_;
597 599
598 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": Before GC" 600 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": Before GC"
599 << " ranges_size=" << ranges_size 601 << " ranges_size=" << ranges_size
600 << " ranges_=" << RangesToString(ranges_) 602 << " ranges_=" << RangesToString(ranges_)
601 << " memory_limit_=" << memory_limit_; 603 << " memory_limit_=" << memory_limit_;
602 604
603 // Begin deleting after the last appended buffer. 605 // Begin deleting after the last appended buffer.
604 int bytes_freed = FreeBuffersAfterLastAppended(bytes_to_free); 606 int bytes_freed = FreeBuffersAfterLastAppended(bytes_to_free);
605 607
606 // Begin deleting from the front. 608 // Begin deleting from the front.
607 if (bytes_to_free - bytes_freed > 0) 609 if (bytes_to_free - bytes_freed > 0)
608 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false); 610 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false);
609 611
610 // Begin deleting from the back. 612 // Begin deleting from the back.
611 if (bytes_to_free - bytes_freed > 0) 613 if (bytes_to_free - bytes_freed > 0)
612 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, true); 614 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, true);
613 615
614 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC" 616 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC"
615 << " bytes_freed=" << bytes_freed 617 << " bytes_freed=" << bytes_freed
616 << " ranges_=" << RangesToString(ranges_); 618 << " ranges_=" << RangesToString(ranges_);
619
620 return (bytes_to_free - bytes_freed <= 0);
617 } 621 }
618 622
619 int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) { 623 int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) {
620 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); 624 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
621 if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() || 625 if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() ||
622 next_buffer_timestamp == kNoDecodeTimestamp() || 626 next_buffer_timestamp == kNoDecodeTimestamp() ||
623 last_appended_buffer_timestamp_ >= next_buffer_timestamp) { 627 last_appended_buffer_timestamp_ >= next_buffer_timestamp) {
624 return 0; 628 return 0;
625 } 629 }
626 630
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 return false; 1566 return false;
1563 1567
1564 DCHECK_NE(have_splice_buffers, have_preroll_buffer); 1568 DCHECK_NE(have_splice_buffers, have_preroll_buffer);
1565 splice_buffers_index_ = 0; 1569 splice_buffers_index_ = 0;
1566 pending_buffer_.swap(*out_buffer); 1570 pending_buffer_.swap(*out_buffer);
1567 pending_buffers_complete_ = false; 1571 pending_buffers_complete_ = false;
1568 return true; 1572 return true;
1569 } 1573 }
1570 1574
1571 } // namespace media 1575 } // namespace media
OLDNEW
« media/filters/chunk_demuxer.cc ('K') | « media/filters/source_buffer_stream.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698