| Index: media/filters/chunk_demuxer.cc
|
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
|
| index b38274a4fb0ad203b03d7c0b085884724ff45937..f6633b3bf9d273a2488738686c0fbc06923bb3bd 100644
|
| --- a/media/filters/chunk_demuxer.cc
|
| +++ b/media/filters/chunk_demuxer.cc
|
| @@ -123,6 +123,11 @@ class SourceState {
|
| // updated at this time.
|
| bool SetTimestampOffset(TimeDelta timestamp_offset);
|
|
|
| + // Sets |sequence_mode_| to |sequence_mode| if possible.
|
| + // Returns true if the mode update was allowed. Returns false if the mode
|
| + // 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) {
|
| @@ -217,6 +222,13 @@ class SourceState {
|
| // The offset to apply to media segment timestamps.
|
| TimeDelta timestamp_offset_;
|
|
|
| + // 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.
|
| + // TODO(wolenetz): Enable "sequence" mode logic. See http://crbug.com/249422
|
| + // and http://crbug.com/333437.
|
| + bool sequence_mode_;
|
| +
|
| TimeDelta append_window_start_;
|
| TimeDelta append_window_end_;
|
|
|
| @@ -228,8 +240,9 @@ class SourceState {
|
| // appended data.
|
| bool new_media_segment_;
|
|
|
| - // Keeps track of whether |timestamp_offset_| can be modified.
|
| - bool can_update_offset_;
|
| + // Keeps track of whether |timestamp_offset_| or |sequence_mode_| can be
|
| + // updated. These cannot be updated if a media segment is being parsed.
|
| + bool parsing_media_segment_;
|
|
|
| // The object used to parse appended data.
|
| scoped_ptr<StreamParser> stream_parser_;
|
| @@ -356,9 +369,10 @@ 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),
|
| + sequence_mode_(false),
|
| append_window_end_(kInfiniteDuration()),
|
| new_media_segment_(false),
|
| - can_update_offset_(true),
|
| + parsing_media_segment_(false),
|
| stream_parser_(stream_parser.release()),
|
| audio_(NULL),
|
| audio_needs_keyframe_(true),
|
| @@ -406,13 +420,22 @@ void SourceState::Init(const StreamParser::InitCB& init_cb,
|
| }
|
|
|
| bool SourceState::SetTimestampOffset(TimeDelta timestamp_offset) {
|
| - if (!can_update_offset_)
|
| + if (parsing_media_segment_)
|
| return false;
|
|
|
| timestamp_offset_ = timestamp_offset;
|
| return true;
|
| }
|
|
|
| +bool SourceState::SetSequenceMode(bool sequence_mode) {
|
| + if (parsing_media_segment_)
|
| + return false;
|
| +
|
| + sequence_mode_ = sequence_mode;
|
| + return true;
|
| +}
|
| +
|
| +
|
| bool SourceState::Append(const uint8* data, size_t length) {
|
| return stream_parser_->Parse(data, length);
|
| }
|
| @@ -421,7 +444,7 @@ void SourceState::Abort() {
|
| stream_parser_->Flush();
|
| audio_needs_keyframe_ = true;
|
| video_needs_keyframe_ = true;
|
| - can_update_offset_ = true;
|
| + parsing_media_segment_ = false;
|
| }
|
|
|
| void SourceState::Remove(TimeDelta start, TimeDelta end, TimeDelta duration) {
|
| @@ -744,13 +767,13 @@ bool SourceState::OnNewConfigs(
|
|
|
| void SourceState::OnNewMediaSegment() {
|
| DVLOG(2) << "OnNewMediaSegment()";
|
| - can_update_offset_ = false;
|
| + parsing_media_segment_ = true;
|
| new_media_segment_ = true;
|
| }
|
|
|
| void SourceState::OnEndOfMediaSegment() {
|
| DVLOG(2) << "OnEndOfMediaSegment()";
|
| - can_update_offset_ = true;
|
| + parsing_media_segment_ = false;
|
| new_media_segment_ = false;
|
| }
|
|
|
| @@ -1524,6 +1547,16 @@ bool ChunkDemuxer::SetTimestampOffset(const std::string& id, TimeDelta offset) {
|
| return source_state_map_[id]->SetTimestampOffset(offset);
|
| }
|
|
|
| +bool ChunkDemuxer::SetSequenceMode(const std::string& id,
|
| + bool sequence_mode) {
|
| + base::AutoLock auto_lock(lock_);
|
| + DVLOG(1) << "SetSequenceMode(" << id << ", " << sequence_mode << ")";
|
| + CHECK(IsValidId(id));
|
| + DCHECK_NE(state_, ENDED);
|
| +
|
| + return source_state_map_[id]->SetSequenceMode(sequence_mode);
|
| +}
|
| +
|
| void ChunkDemuxer::MarkEndOfStream(PipelineStatus status) {
|
| DVLOG(1) << "MarkEndOfStream(" << status << ")";
|
| base::AutoLock auto_lock(lock_);
|
|
|