Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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(); | |
| 352 | |
| 353 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() | 351 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
| 354 << ": done. ranges_=" << RangesToString(ranges_); | 352 << ": done. ranges_=" << RangesToString(ranges_); |
| 355 DCHECK(IsRangeListSorted(ranges_)); | 353 DCHECK(IsRangeListSorted(ranges_)); |
| 356 DCHECK(OnlySelectedRangeIsSeeked()); | 354 DCHECK(OnlySelectedRangeIsSeeked()); |
| 357 return true; | 355 return true; |
| 358 } | 356 } |
| 359 | 357 |
| 360 void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, | 358 void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, |
| 361 base::TimeDelta duration) { | 359 base::TimeDelta duration) { |
| 362 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() | 360 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 576 } | 574 } |
| 577 } | 575 } |
| 578 | 576 |
| 579 void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) { | 577 void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) { |
| 580 for (BufferQueue::const_iterator itr = buffers.begin(); | 578 for (BufferQueue::const_iterator itr = buffers.begin(); |
| 581 itr != buffers.end(); ++itr) { | 579 itr != buffers.end(); ++itr) { |
| 582 (*itr)->SetConfigId(append_config_index_); | 580 (*itr)->SetConfigId(append_config_index_); |
| 583 } | 581 } |
| 584 } | 582 } |
| 585 | 583 |
| 586 void SourceBufferStream::GarbageCollectIfNeeded() { | 584 bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time) { |
| 587 // Compute size of |ranges_|. | 585 // Compute size of |ranges_|. |
| 588 int ranges_size = 0; | 586 int ranges_size = 0; |
| 589 for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) | 587 for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) |
| 590 ranges_size += (*itr)->size_in_bytes(); | 588 ranges_size += (*itr)->size_in_bytes(); |
| 591 | 589 |
| 592 // Return if we're under or at the memory limit. | 590 // Return if we're under or at the memory limit. |
| 593 if (ranges_size <= memory_limit_) | 591 if (ranges_size <= memory_limit_) |
| 594 return; | 592 return true; |
| 595 | 593 |
| 596 int bytes_to_free = ranges_size - memory_limit_; | 594 int bytes_to_free = ranges_size - memory_limit_; |
| 597 | 595 |
| 598 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": Before GC" | 596 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": Before GC" |
| 599 << " ranges_size=" << ranges_size | 597 << " ranges_size=" << ranges_size |
| 600 << " ranges_=" << RangesToString(ranges_) | 598 << " ranges_=" << RangesToString(ranges_) |
| 601 << " memory_limit_=" << memory_limit_; | 599 << " memory_limit_=" << memory_limit_; |
| 602 | 600 |
| 603 // Begin deleting after the last appended buffer. | 601 // Begin deleting after the last appended buffer. |
| 604 int bytes_freed = FreeBuffersAfterLastAppended(bytes_to_free); | 602 int bytes_freed = FreeBuffersAfterLastAppended(bytes_to_free); |
| 605 | 603 |
| 606 // Begin deleting from the front. | 604 // Begin deleting from the front. |
| 607 if (bytes_to_free - bytes_freed > 0) | 605 if (bytes_to_free - bytes_freed > 0) |
| 608 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false); | 606 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, media_time, false); |
| 609 | |
| 610 // Begin deleting from the back. | |
| 611 if (bytes_to_free - bytes_freed > 0) | |
| 612 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, true); | |
|
servolk
2014/12/12 01:01:53
So now we are never gonna to try freeing buffers f
kjoswiak
2014/12/12 01:22:05
The call to FreeBuffersAfterLastAppended on line 6
| |
| 613 | 607 |
| 614 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC" | 608 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC" |
| 615 << " bytes_freed=" << bytes_freed | 609 << " bytes_freed=" << bytes_freed |
| 616 << " ranges_=" << RangesToString(ranges_); | 610 << " ranges_=" << RangesToString(ranges_); |
| 611 | |
| 612 return (bytes_to_free - bytes_freed <= 0); | |
|
servolk
2014/12/12 01:01:53
Why not just "return bytes_freed >= bytes_to_free"
kjoswiak
2014/12/12 01:22:05
Done.
| |
| 617 } | 613 } |
| 618 | 614 |
| 619 int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) { | 615 int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) { |
| 620 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); | 616 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); |
| 621 if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() || | 617 if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() || |
| 622 next_buffer_timestamp == kNoDecodeTimestamp() || | 618 next_buffer_timestamp == kNoDecodeTimestamp() || |
| 623 last_appended_buffer_timestamp_ >= next_buffer_timestamp) { | 619 last_appended_buffer_timestamp_ >= next_buffer_timestamp) { |
| 624 return 0; | 620 return 0; |
| 625 } | 621 } |
| 626 | 622 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 669 | 665 |
| 670 int bytes_removed = range->GetRemovalGOP( | 666 int bytes_removed = range->GetRemovalGOP( |
| 671 start_timestamp, end_timestamp, bytes_to_free, removal_end_timestamp); | 667 start_timestamp, end_timestamp, bytes_to_free, removal_end_timestamp); |
| 672 bytes_to_free -= bytes_removed; | 668 bytes_to_free -= bytes_removed; |
| 673 bytes_freed += bytes_removed; | 669 bytes_freed += bytes_removed; |
| 674 } | 670 } |
| 675 return bytes_freed; | 671 return bytes_freed; |
| 676 } | 672 } |
| 677 | 673 |
| 678 int SourceBufferStream::FreeBuffers(int total_bytes_to_free, | 674 int SourceBufferStream::FreeBuffers(int total_bytes_to_free, |
| 675 DecodeTimestamp media_time, | |
| 679 bool reverse_direction) { | 676 bool reverse_direction) { |
| 680 TRACE_EVENT2("media", "SourceBufferStream::FreeBuffers", | 677 TRACE_EVENT2("media", "SourceBufferStream::FreeBuffers", |
| 681 "total bytes to free", total_bytes_to_free, | 678 "total bytes to free", total_bytes_to_free, |
| 682 "reverse direction", reverse_direction); | 679 "reverse direction", reverse_direction); |
| 683 | 680 |
| 684 DCHECK_GT(total_bytes_to_free, 0); | 681 DCHECK_GT(total_bytes_to_free, 0); |
| 685 int bytes_to_free = total_bytes_to_free; | 682 int bytes_to_free = total_bytes_to_free; |
| 686 int bytes_freed = 0; | 683 int bytes_freed = 0; |
| 687 | 684 |
| 688 // This range will save the last GOP appended to |range_for_next_append_| | 685 // This range will save the last GOP appended to |range_for_next_append_| |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 700 DCHECK_EQ(current_range, selected_range_); | 697 DCHECK_EQ(current_range, selected_range_); |
| 701 break; | 698 break; |
| 702 } | 699 } |
| 703 bytes_deleted = current_range->DeleteGOPFromBack(&buffers); | 700 bytes_deleted = current_range->DeleteGOPFromBack(&buffers); |
| 704 } else { | 701 } else { |
| 705 current_range = ranges_.front(); | 702 current_range = ranges_.front(); |
| 706 if (current_range->FirstGOPContainsNextBufferPosition()) { | 703 if (current_range->FirstGOPContainsNextBufferPosition()) { |
| 707 DCHECK_EQ(current_range, selected_range_); | 704 DCHECK_EQ(current_range, selected_range_); |
| 708 break; | 705 break; |
| 709 } | 706 } |
| 707 if (media_time != kNoDecodeTimestamp() && | |
| 708 !current_range->FirstGOPEarlierThanMediaTime(media_time)) { | |
| 709 break; | |
| 710 } | |
| 710 bytes_deleted = current_range->DeleteGOPFromFront(&buffers); | 711 bytes_deleted = current_range->DeleteGOPFromFront(&buffers); |
| 711 } | 712 } |
| 712 | 713 |
| 713 // Check to see if we've just deleted the GOP that was last appended. | 714 // Check to see if we've just deleted the GOP that was last appended. |
| 714 DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp(); | 715 DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp(); |
| 715 if (end_timestamp == last_appended_buffer_timestamp_) { | 716 if (end_timestamp == last_appended_buffer_timestamp_) { |
| 716 DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp()); | 717 DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp()); |
| 717 DCHECK(!new_range_for_append); | 718 DCHECK(!new_range_for_append); |
| 718 // Create a new range containing these buffers. | 719 // Create a new range containing these buffers. |
| 719 new_range_for_append = new SourceBufferRange( | 720 new_range_for_append = new SourceBufferRange( |
| (...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1562 return false; | 1563 return false; |
| 1563 | 1564 |
| 1564 DCHECK_NE(have_splice_buffers, have_preroll_buffer); | 1565 DCHECK_NE(have_splice_buffers, have_preroll_buffer); |
| 1565 splice_buffers_index_ = 0; | 1566 splice_buffers_index_ = 0; |
| 1566 pending_buffer_.swap(*out_buffer); | 1567 pending_buffer_.swap(*out_buffer); |
| 1567 pending_buffers_complete_ = false; | 1568 pending_buffers_complete_ = false; |
| 1568 return true; | 1569 return true; |
| 1569 } | 1570 } |
| 1570 | 1571 |
| 1571 } // namespace media | 1572 } // namespace media |
| OLD | NEW |