diff options
author | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-10 22:33:31 +0000 |
---|---|---|
committer | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-10 22:33:31 +0000 |
commit | 2895fb81910d04939864384ee70c57b165e36e06 (patch) | |
tree | 0e11b379a63201130a6b252eec1c6b2e20e98b15 /media | |
parent | 08ce852f1eb651bbcef0eda5c500c5335d48ac44 (diff) | |
download | chromium_src-2895fb81910d04939864384ee70c57b165e36e06.zip chromium_src-2895fb81910d04939864384ee70c57b165e36e06.tar.gz chromium_src-2895fb81910d04939864384ee70c57b165e36e06.tar.bz2 |
Revert 145965 - Make sure previous seek points in SourceBufferStream are ignored during overlaps
BUG=136463
TEST=media_unittests,seek-sourceabort-crash.html
Review URL: https://chromiumcodereview.appspot.com/10766021
TBR=vrk@google.com
Review URL: https://chromiumcodereview.appspot.com/10690124
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@145968 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/source_buffer_stream.cc | 59 | ||||
-rw-r--r-- | media/filters/source_buffer_stream.h | 8 | ||||
-rw-r--r-- | media/filters/source_buffer_stream_unittest.cc | 136 |
3 files changed, 13 insertions, 190 deletions
diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc index 1d295d4..2b1911a 100644 --- a/media/filters/source_buffer_stream.cc +++ b/media/filters/source_buffer_stream.cc @@ -95,9 +95,6 @@ class SourceBufferRange { // has the next buffer yet. bool HasNextBufferPosition() const; - // Resets this range to an "unseeked" state. - void ResetNextBufferPosition(); - // Returns the timestamp of the next buffer that will be returned from // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown. base::TimeDelta GetNextTimestamp() const; @@ -326,7 +323,7 @@ bool SourceBufferStream::Append( // beginning of the range. // TODO(vrk): This should be done by ChunkDemuxer. (crbug.com/132815) if (!seek_pending_ && !selected_range_) { - SetSelectedRange(*range_for_new_buffers); + selected_range_ = *range_for_new_buffers; selected_range_->Seek(buffers.front()->GetDecodeTimestamp()); } @@ -341,7 +338,7 @@ bool SourceBufferStream::Append( // returned in the next call to GetNextBuffer(). if (deleted_next_buffer) { DCHECK(!seek_pending_); - SetSelectedRange(*range_for_new_buffers); + selected_range_ = *range_for_new_buffers; if (!deleted_buffers.empty()) { // Seek the range to the keyframe at or after |next_buffer_timestamp|. selected_range_->SeekAheadTo(next_buffer_timestamp); @@ -356,7 +353,6 @@ bool SourceBufferStream::Append( } DCHECK(IsRangeListSorted(ranges_)); - DCHECK(OnlySelectedRangeIsSeeked()); return true; } @@ -377,15 +373,6 @@ bool SourceBufferStream::IsMonotonicallyIncreasing( return true; } -bool SourceBufferStream::OnlySelectedRangeIsSeeked() const { - for (RangeList::const_iterator itr = ranges_.begin(); - itr != ranges_.end(); ++itr) { - if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_) - return false; - } - return !selected_range_ || selected_range_->HasNextBufferPosition(); -} - void SourceBufferStream::UpdateMaxInterbufferDistance( const BufferQueue& buffers) { DCHECK(!buffers.empty()); @@ -437,17 +424,10 @@ void SourceBufferStream::InsertIntoExistingRange( // Delete the buffers that are overlapped by |new_buffers|, then append // |new_buffers| to the end of the range. - BufferQueue saved_buffers; - bool deleted_next_buffer_from_range = - range_for_new_buffers->TruncateAt(new_buffers.front(), &saved_buffers); - range_for_new_buffers->AppendToEnd(new_buffers); - - if (selected_range_ != range_for_new_buffers) - return; - DCHECK(!*deleted_next_buffer); - *deleted_buffers = saved_buffers; - *deleted_next_buffer = deleted_next_buffer_from_range; + *deleted_next_buffer = + range_for_new_buffers->TruncateAt(new_buffers.front(), deleted_buffers); + range_for_new_buffers->AppendToEnd(new_buffers); // If this was a middle overlap resulting in a new range, and the next buffer // position has been transferred to the newly created range, update the @@ -455,7 +435,7 @@ void SourceBufferStream::InsertIntoExistingRange( if (new_next_range && new_next_range->HasNextBufferPosition()) { DCHECK(!range_for_new_buffers->HasNextBufferPosition()); DCHECK(!*deleted_next_buffer); - SetSelectedRange(new_next_range); + selected_range_ = new_next_range; } } @@ -472,10 +452,10 @@ void SourceBufferStream::ResolveCompleteOverlaps( while (next_range_itr != ranges_.end() && range_with_new_buffers->CompletelyOverlaps(**next_range_itr)) { if (*next_range_itr == selected_range_) { + selected_range_ = NULL; DCHECK(!*deleted_next_buffer); - *deleted_next_buffer = selected_range_->DeleteAll(deleted_buffers); + *deleted_next_buffer = (*next_range_itr)->DeleteAll(deleted_buffers); DCHECK(*deleted_next_buffer); - SetSelectedRange(NULL); } delete *next_range_itr; next_range_itr = ranges_.erase(next_range_itr); @@ -519,13 +499,12 @@ void SourceBufferStream::ResolveEndOverlap( // |new_next_range|, make |new_next_range| the |selected_range_|. if (new_next_range && new_next_range->HasNextBufferPosition()) { DCHECK(!overlapped_range->HasNextBufferPosition()); - SetSelectedRange(new_next_range); + selected_range_ = new_next_range; return; } // Save the buffers in |overlapped_range|. DCHECK(!*deleted_next_buffer); - DCHECK_EQ(overlapped_range.get(), selected_range_); *deleted_next_buffer = overlapped_range->DeleteAll(deleted_buffers); DCHECK(*deleted_next_buffer); } @@ -575,7 +554,7 @@ void SourceBufferStream::UpdateTrackBuffer(const BufferQueue& deleted_buffers) { if ((*next_range_itr)->HasNextBuffer() && selected_range_->IsNextInSequence( track_buffer_.back(), (*next_range_itr)->GetNextTimestamp())) { - SetSelectedRange(*next_range_itr); + selected_range_ = *next_range_itr; } } } @@ -594,7 +573,7 @@ void SourceBufferStream::MergeWithAdjacentRangeIfNecessary( // Update |selected_range_| pointer if |range| has become selected after // merges. if (transfer_current_position) - SetSelectedRange(range_with_new_buffers); + selected_range_ = range_with_new_buffers; delete *next_range_itr; ranges_.erase(next_range_itr); @@ -602,7 +581,7 @@ void SourceBufferStream::MergeWithAdjacentRangeIfNecessary( } void SourceBufferStream::Seek(base::TimeDelta timestamp) { - SetSelectedRange(NULL); + selected_range_ = NULL; track_buffer_.clear(); seek_buffer_timestamp_ = timestamp; @@ -617,7 +596,7 @@ void SourceBufferStream::Seek(base::TimeDelta timestamp) { if (itr == ranges_.end()) return; - SetSelectedRange(*itr); + selected_range_ = *itr; selected_range_->Seek(timestamp); seek_pending_ = false; end_of_stream_ = false; @@ -690,12 +669,6 @@ SourceBufferStream::GetSelectedRangeItr() { return itr; } -void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) { - if (selected_range_) - selected_range_->ResetNextBufferPosition(); - selected_range_ = range; -} - Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const { Ranges<base::TimeDelta> ranges; for (RangeList::const_iterator itr = ranges_.begin(); @@ -932,12 +905,6 @@ bool SourceBufferRange::HasNextBufferPosition() const { return next_buffer_index_ >= 0 || waiting_for_keyframe_; } -void SourceBufferRange::ResetNextBufferPosition() { - next_buffer_index_ = -1; - waiting_for_keyframe_ = false; - next_keyframe_timestamp_ = kNoTimestamp(); -} - void SourceBufferRange::AppendToEnd(const SourceBufferRange& range, bool transfer_current_position) { DCHECK(CanAppendToEnd(range)); diff --git a/media/filters/source_buffer_stream.h b/media/filters/source_buffer_stream.h index e1b56e5..3f4a211 100644 --- a/media/filters/source_buffer_stream.h +++ b/media/filters/source_buffer_stream.h @@ -155,18 +155,10 @@ class MEDIA_EXPORT SourceBufferStream { // |selected_range_| lives. RangeList::iterator GetSelectedRangeItr(); - // Sets the |selected_range_| to |range| and resets the next buffer position - // for the previous |selected_range_|. - void SetSelectedRange(SourceBufferRange* range); - // Returns true if the timestamps of |buffers| are monotonically increasing // since the previous append to the media segment, false otherwise. bool IsMonotonicallyIncreasing(const BufferQueue& buffers); - // Returns true if |selected_range_| is the only range in |ranges_| that - // HasNextBufferPosition(). - bool OnlySelectedRangeIsSeeked() const; - // Measures the distances between buffer timestamps and tracks the max. void UpdateMaxInterbufferDistance(const BufferQueue& buffers); diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc index 30fcf07..3a11661 100644 --- a/media/filters/source_buffer_stream_unittest.cc +++ b/media/filters/source_buffer_stream_unittest.cc @@ -1131,142 +1131,6 @@ TEST_F(SourceBufferStreamTest, Seek_StartOfSegment) { CheckExpectedBuffers(16, 19); } -TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap) { - // Append 5 buffers at positions 0 through 4. - NewSegmentAppend(0, 4); - - // Append 5 buffers at positions 10 through 14, and seek to the beginning of - // this range. - NewSegmentAppend(10, 5); - Seek(10); - - // Now seek to the beginning of the first range. - Seek(0); - - // Completely overlap the old seek point. - NewSegmentAppend(5, 15); - - // The GetNextBuffer() call should respect the 2nd seek point. - CheckExpectedBuffers(0, 0); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap_Pending) { - // Append 5 buffers at positions 10 through 14 and seek to beginning of the - // range. - NewSegmentAppend(10, 5); - Seek(10); - - // Now seek to the beginning of the stream. - Seek(0); - - // Completely overlap the old seek point. - NewSegmentAppend(5, 15); - - // The seek at time 0 should still be pending. - CheckNoNextBuffer(); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap) { - // Append 2 buffers at positions 0 through 1. - NewSegmentAppend(0, 2); - - // Append 15 buffers at positions 5 through 19 and seek to position 15. - NewSegmentAppend(5, 15); - Seek(15); - - // Now seek to the beginning of the stream. - Seek(0); - - // Overlap the middle of the range such that there are now three ranges. - NewSegmentAppend(10, 3); - CheckExpectedRanges("{ [0,1) [5,12) [15,19) }"); - - // The GetNextBuffer() call should respect the 2nd seek point. - CheckExpectedBuffers(0, 0); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap_Pending) { - // Append 15 buffers at positions 5 through 19 and seek to position 15. - NewSegmentAppend(5, 15); - Seek(15); - - // Now seek to the beginning of the stream. - Seek(0); - - // Overlap the middle of the range such that there are now two ranges. - NewSegmentAppend(10, 3); - CheckExpectedRanges("{ [5,12) [15,19) }"); - - // The seek at time 0 should still be pending. - CheckNoNextBuffer(); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap) { - // Append 2 buffers at positions 0 through 1. - NewSegmentAppend(0, 2); - - // Append 15 buffers at positions 5 through 19 and seek to position 15. - NewSegmentAppend(5, 15); - Seek(15); - - // Now seek to the beginning of the stream. - Seek(0); - - // Start overlap the old seek point. - NewSegmentAppend(10, 10); - - // The GetNextBuffer() call should respect the 2nd seek point. - CheckExpectedBuffers(0, 0); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap_Pending) { - // Append 15 buffers at positions 5 through 19 and seek to position 15. - NewSegmentAppend(5, 15); - Seek(15); - - // Now seek to the beginning of the stream. - Seek(0); - - // Start overlap the old seek point. - NewSegmentAppend(10, 10); - - // The seek at time 0 should still be pending. - CheckNoNextBuffer(); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap) { - // Append 5 buffers at positions 0 through 4. - NewSegmentAppend(0, 4); - - // Append 15 buffers at positions 10 through 24 and seek to start of range. - NewSegmentAppend(10, 15); - Seek(10); - - // Now seek to the beginning of the stream. - Seek(0); - - // End overlap the old seek point. - NewSegmentAppend(5, 10); - - // The GetNextBuffer() call should respect the 2nd seek point. - CheckExpectedBuffers(0, 0); -} - -TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap_Pending) { - // Append 15 buffers at positions 10 through 24 and seek to start of range. - NewSegmentAppend(10, 15); - Seek(10); - - // Now seek to the beginning of the stream. - Seek(0); - - // End overlap the old seek point. - NewSegmentAppend(5, 10); - - // The seek at time 0 should still be pending. - CheckNoNextBuffer(); -} - TEST_F(SourceBufferStreamTest, GetNextBuffer_AfterMerges) { // Append 5 buffers at positions 10 through 14. NewSegmentAppend(10, 5); |