Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1309)

Unified Diff: media/filters/source_buffer_stream.cc

Issue 10879056: Support setting an explicit duration on MediaSource objects (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698