diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-07 04:50:38 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-07 04:50:38 +0000 |
commit | 141cb9d85c5e24de307a6008ac8e1577c81a656e (patch) | |
tree | cab373054d666e8abc0c24127128eee13c5d9c80 /media | |
parent | a6739bcdf8df5b082677de2ce50a8c743996960f (diff) | |
download | chromium_src-141cb9d85c5e24de307a6008ac8e1577c81a656e.zip chromium_src-141cb9d85c5e24de307a6008ac8e1577c81a656e.tar.gz chromium_src-141cb9d85c5e24de307a6008ac8e1577c81a656e.tar.bz2 |
Fix SourceBufferStream::Remove() for buffers before the current play position.
BUG=286442
TEST=SourceBufferStreamTest.Remove_BeforeCurrentPosition
Review URL: https://chromiumcodereview.appspot.com/23703007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221896 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/source_buffer_stream.cc | 22 | ||||
-rw-r--r-- | media/filters/source_buffer_stream_unittest.cc | 17 |
2 files changed, 34 insertions, 5 deletions
diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc index b0038dd..15f894c 100644 --- a/media/filters/source_buffer_stream.cc +++ b/media/filters/source_buffer_stream.cc @@ -471,6 +471,9 @@ bool SourceBufferStream::Append( void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, base::TimeDelta duration) { + DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF() + << ", " << end.InSecondsF() + << ", " << duration.InSecondsF() << ")"; DCHECK(start >= base::TimeDelta()) << start.InSecondsF(); DCHECK(start < end) << "start " << start.InSecondsF() << " end " << end.InSecondsF(); @@ -497,17 +500,22 @@ void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, if (new_range) { itr = ranges_.insert(++itr, new_range); --itr; + + // Update the selected range if the next buffer position was transferred + // to |new_range|. + if (new_range->HasNextBufferPosition()) + SetSelectedRange(new_range); } // If the current range now is completely covered by the removal // range then delete it and move on. if (start <= range->GetStartTimestamp()) { if (selected_range_ == range) - SetSelectedRange(NULL); + SetSelectedRange(NULL); - delete range; - itr = ranges_.erase(itr); - continue; + delete range; + itr = ranges_.erase(itr); + continue; } // Truncate the current range so that it only contains data before @@ -518,6 +526,7 @@ void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, // Check to see if the current playback position was removed and // update the selected range appropriately. if (!saved_buffers.empty()) { + DCHECK(!range->HasNextBufferPosition()); SetSelectedRange(NULL); SetSelectedRangeIfNeeded(saved_buffers.front()->GetDecodeTimestamp()); } @@ -525,6 +534,9 @@ void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, // Move on to the next range. ++itr; } + + DCHECK(IsRangeListSorted(ranges_)); + DCHECK(OnlySelectedRangeIsSeeked()); } void SourceBufferStream::ResetSeekState() { @@ -1253,6 +1265,8 @@ void SourceBufferStream::CompleteConfigChange() { void SourceBufferStream::SetSelectedRangeIfNeeded( const base::TimeDelta timestamp) { + DVLOG(1) << __FUNCTION__ << "(" << timestamp.InSecondsF() << ")"; + if (selected_range_) { DCHECK(track_buffer_.empty()); return; diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc index 3c12074..0507175 100644 --- a/media/filters/source_buffer_stream_unittest.cc +++ b/media/filters/source_buffer_stream_unittest.cc @@ -2940,7 +2940,7 @@ TEST_F(SourceBufferStreamTest, Remove_Partial4) { CheckExpectedRangesByTimestamp("{ [10,40) [2060,2150) }"); } -// Test behavior when the current positing is removed and new buffers +// Test behavior when the current position is removed and new buffers // are appended over the removal range. TEST_F(SourceBufferStreamTest, Remove_CurrentPosition) { Seek(0); @@ -2964,6 +2964,21 @@ TEST_F(SourceBufferStreamTest, Remove_CurrentPosition) { CheckExpectedBuffers("210K 240 270K 300 330"); } +// Test behavior when buffers in the selected range before the current position +// are removed. +TEST_F(SourceBufferStreamTest, Remove_BeforeCurrentPosition) { + Seek(0); + NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); + CheckExpectedRangesByTimestamp("{ [0,360) }"); + CheckExpectedBuffers("0K 30 60 90K 120"); + + // Remove a range that is before the current playback position. + RemoveInMs(0, 90, 360); + CheckExpectedRangesByTimestamp("{ [90,360) }"); + + CheckExpectedBuffers("150 180K 210 240 270K 300 330"); +} + // TODO(vrk): Add unit tests where keyframes are unaligned between streams. // (crbug.com/133557) |