summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorvrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-10 22:33:31 +0000
committervrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-10 22:33:31 +0000
commit2895fb81910d04939864384ee70c57b165e36e06 (patch)
tree0e11b379a63201130a6b252eec1c6b2e20e98b15 /media
parent08ce852f1eb651bbcef0eda5c500c5335d48ac44 (diff)
downloadchromium_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.cc59
-rw-r--r--media/filters/source_buffer_stream.h8
-rw-r--r--media/filters/source_buffer_stream_unittest.cc136
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);