Index: media/filters/chunk_demuxer.cc |
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
index b7244b93317c19dfd472a3dde125431327b4df1b..ca16d51dd21caaa7cbdcf9d9fb265606d2a60dcd 100644 |
--- a/media/filters/chunk_demuxer.cc |
+++ b/media/filters/chunk_demuxer.cc |
@@ -108,8 +108,11 @@ class SourceState { |
// Appends new data to the StreamParser. |
// Returns true if the data was successfully appended. Returns false if an |
- // error occurred. |
- bool Append(const uint8* data, size_t length); |
+ // error occurred. Appending uses cached |timestamp_offset_| and may update |
+ // |*timestamp_offset| if |timestamp_offset| is not NULL. |
+ // TODO(wolenetz): Rework so |timestamp_offset_| is only valid during |
+ // Append(). See http://crbug.com/347623. |
+ bool Append(const uint8* data, size_t length, double* timestamp_offset); |
// Aborts the current append sequence and resets the parser. |
void Abort(); |
@@ -118,9 +121,9 @@ class SourceState { |
// ChunkDemuxerStreams managed by this object. |
void Remove(TimeDelta start, TimeDelta end, TimeDelta duration); |
- // Sets |timestamp_offset_| if possible. |
- // Returns if the offset was set. Returns false if the offset could not be |
- // updated at this time. |
+ // Sets user-specified |timestamp_offset_| if possible. |
+ // Returns true if the offset was set. Returns false if the offset could not |
+ // be set at this time. |
bool SetTimestampOffset(TimeDelta timestamp_offset); |
// Sets |sequence_mode_| to |sequence_mode| if possible. |
@@ -128,8 +131,6 @@ class SourceState { |
// could not be updated at this time. |
bool SetSequenceMode(bool sequence_mode); |
- TimeDelta timestamp_offset() const { return timestamp_offset_; } |
- |
void set_append_window_start(TimeDelta start) { |
append_window_start_ = start; |
} |
@@ -224,6 +225,10 @@ class SourceState { |
// The offset to apply to media segment timestamps. |
TimeDelta timestamp_offset_; |
+ // Flag that tracks whether or not the current Append() operation changed |
+ // |timestamp_offset_|. |
+ bool timestamp_offset_updated_by_append_; |
+ |
// Tracks the mode by which appended media is processed. If true, then |
// appended media is processed using "sequence" mode. Otherwise, appended |
// media is processed using "segments" mode. |
@@ -365,6 +370,7 @@ SourceState::SourceState(scoped_ptr<StreamParser> stream_parser, |
const IncreaseDurationCB& increase_duration_cb) |
: create_demuxer_stream_cb_(create_demuxer_stream_cb), |
increase_duration_cb_(increase_duration_cb), |
+ timestamp_offset_updated_by_append_(false), |
sequence_mode_(false), |
append_window_end_(kInfiniteDuration()), |
new_media_segment_(false), |
@@ -424,9 +430,15 @@ bool SourceState::SetSequenceMode(bool sequence_mode) { |
return true; |
} |
+bool SourceState::Append(const uint8* data, size_t length, |
+ double* timestamp_offset) { |
+ timestamp_offset_updated_by_append_ = false; |
+ bool err = stream_parser_->Parse(data, length); |
+ |
+ if (timestamp_offset_updated_by_append_ && timestamp_offset) |
+ *timestamp_offset = timestamp_offset_.InSecondsF(); |
-bool SourceState::Append(const uint8* data, size_t length) { |
- return stream_parser_->Parse(data, length); |
+ return err; |
} |
void SourceState::Abort() { |
@@ -1408,8 +1420,8 @@ Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges(const std::string& id) const { |
} |
void ChunkDemuxer::AppendData(const std::string& id, |
- const uint8* data, |
- size_t length) { |
+ const uint8* data, size_t length, |
+ double* timestamp_offset) { |
DVLOG(1) << "AppendData(" << id << ", " << length << ")"; |
DCHECK(!id.empty()); |
@@ -1432,7 +1444,8 @@ void ChunkDemuxer::AppendData(const std::string& id, |
switch (state_) { |
case INITIALIZING: |
DCHECK(IsValidId(id)); |
- if (!source_state_map_[id]->Append(data, length)) { |
+ if (!source_state_map_[id]->Append(data, length, |
+ timestamp_offset)) { |
ReportError_Locked(DEMUXER_ERROR_COULD_NOT_OPEN); |
return; |
} |
@@ -1440,7 +1453,8 @@ void ChunkDemuxer::AppendData(const std::string& id, |
case INITIALIZED: { |
DCHECK(IsValidId(id)); |
- if (!source_state_map_[id]->Append(data, length)) { |
+ if (!source_state_map_[id]->Append(data, length, |
+ timestamp_offset)) { |
ReportError_Locked(PIPELINE_ERROR_DECODE); |
return; |
} |