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(); | 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 Loading... |
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 Loading... |
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 |
OLD | NEW |