Chromium Code Reviews| Index: media/filters/source_buffer_stream.cc |
| diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc |
| index b05c55e80635c35b6388b89afa26a798e375f0f5..d1af0b7d5e132efc11175264c7ed6cb80ab1e736 100644 |
| --- a/media/filters/source_buffer_stream.cc |
| +++ b/media/filters/source_buffer_stream.cc |
| @@ -83,6 +83,7 @@ class SourceBufferRange { |
| // a buffer at that position would have been deleted. |
| bool TruncateAt(scoped_refptr<StreamParserBuffer> buffer, |
| BufferQueue* deleted_buffers); |
| + bool TruncateAt(base::TimeDelta timestamp, BufferQueue* deleted_buffers); |
| // Deletes all buffers in range. |
| bool DeleteAll(BufferQueue* deleted_buffers); |
| @@ -415,6 +416,12 @@ bool SourceBufferStream::Append( |
| return true; |
| } |
| +void SourceBufferStream::ResetSeekState() { |
| + SetSelectedRange(NULL); |
| + track_buffer_.clear(); |
| + config_change_pending_ = false; |
| +} |
| + |
| bool SourceBufferStream::ShouldSeekToStartOfBuffered( |
| base::TimeDelta seek_timestamp) const { |
| if (ranges_.empty()) |
| @@ -721,9 +728,7 @@ void SourceBufferStream::MergeWithAdjacentRangeIfNecessary( |
| void SourceBufferStream::Seek(base::TimeDelta timestamp) { |
| DCHECK(timestamp >= base::TimeDelta()); |
| - SetSelectedRange(NULL); |
| - track_buffer_.clear(); |
| - config_change_pending_ = false; |
| + ResetSeekState(); |
| if (ShouldSeekToStartOfBuffered(timestamp)) { |
| SetSelectedRange(ranges_.front()); |
| @@ -753,6 +758,33 @@ bool SourceBufferStream::IsSeekPending() const { |
| return seek_pending_; |
| } |
| +void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { |
| + RangeList::iterator itr = ranges_.end(); |
| + for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { |
| + if ((*itr)->GetEndTimestamp() > duration) |
| + break; |
| + } |
| + if (itr == ranges_.end()) |
| + return; |
| + |
| + // Need to partially truncate this range. |
| + if ((*itr)->GetStartTimestamp() < duration) { |
| + bool deleted_seek_point = (*itr)->TruncateAt(duration, NULL); |
| + if (deleted_seek_point) |
| + ResetSeekState(); |
| + ++itr; |
| + } |
| + |
| + // Delete all ranges that begin after |duration|. |
| + while (itr != ranges_.end()) { |
| + // If we're about to delete the selected range, also reset the seek state. |
|
acolwell GONE FROM CHROMIUM
2012/08/24 18:19:10
DCHECK_GE((*itr)->GetStartTimestamp(), duration)?
vrk (LEFT CHROMIUM)
2012/08/28 00:03:22
Done.
|
| + if (*itr== selected_range_) |
| + ResetSeekState(); |
| + delete *itr; |
| + itr = ranges_.erase(itr); |
| + } |
| +} |
| + |
| SourceBufferStream::Status SourceBufferStream::GetNextBuffer( |
| scoped_refptr<StreamParserBuffer>* out_buffer) { |
| CHECK(!config_change_pending_); |
| @@ -1090,6 +1122,16 @@ bool SourceBufferRange::DeleteAll(BufferQueue* removed_buffers) { |
| } |
| bool SourceBufferRange::TruncateAt( |
| + base::TimeDelta timestamp, BufferQueue* removed_buffers) { |
|
acolwell GONE FROM CHROMIUM
2012/08/24 18:19:10
Remove |remove_buffers| since there is only one ca
vrk (LEFT CHROMIUM)
2012/08/28 00:03:22
Done.
|
| + // Need to make a dummy buffer with timestamp |timestamp| in order to search |
| + // the |buffers_| container. |
| + scoped_refptr<StreamParserBuffer> dummy_buffer = |
| + StreamParserBuffer::CopyFrom(NULL, 0, false); |
| + dummy_buffer->SetDecodeTimestamp(timestamp); |
| + return TruncateAt(dummy_buffer, removed_buffers); |
| +} |
| + |
| +bool SourceBufferRange::TruncateAt( |
| scoped_refptr<StreamParserBuffer> buffer, BufferQueue* removed_buffers) { |
| // Find the place in |buffers_| where we will begin deleting data. |
| BufferQueue::iterator starting_point = |
| @@ -1210,8 +1252,7 @@ void SourceBufferRange::FreeBufferRange( |
| bool SourceBufferRange::TruncateAt( |
| const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) { |
| - DCHECK(removed_buffers); |
| - DCHECK(removed_buffers->empty()); |
| + DCHECK(!removed_buffers || removed_buffers->empty()); |
| // Return if we're not deleting anything. |
| if (starting_point == buffers_.end()) |
| @@ -1224,7 +1265,7 @@ bool SourceBufferRange::TruncateAt( |
| base::TimeDelta next_buffer_timestamp = GetNextTimestamp(); |
| if (next_buffer_timestamp == kNoTimestamp() || |
| next_buffer_timestamp >= (*starting_point)->GetDecodeTimestamp()) { |
| - if (HasNextBuffer()) { |
| + if (HasNextBuffer() && removed_buffers) { |
| int starting_offset = starting_point - buffers_.begin(); |
| int next_buffer_offset = next_buffer_index_ - starting_offset; |
| DCHECK_GE(next_buffer_offset, 0); |