| Index: media/filters/chunk_demuxer.cc
|
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
|
| index d33c7864ce11f8d49584eb9b1117ceb809410ae8..829b61cc3da7f2968e7fddb8bcead4a7171e8788 100644
|
| --- a/media/filters/chunk_demuxer.cc
|
| +++ b/media/filters/chunk_demuxer.cc
|
| @@ -105,7 +105,8 @@ class SourceState {
|
| bool allow_audio,
|
| bool allow_video,
|
| const StreamParser::NeedKeyCB& need_key_cb,
|
| - const NewTextTrackCB& new_text_track_cb);
|
| + const NewTextTrackCB& new_text_track_cb,
|
| + base::TimeDelta* media_time);
|
|
|
| // Appends new data to the StreamParser.
|
| // Returns true if the data was successfully appended. Returns false if an
|
| @@ -184,7 +185,8 @@ class SourceState {
|
| // frame's track.
|
| // Returns true on a successful call. Returns false if an error occurred while
|
| // processing the buffers.
|
| - bool OnNewBuffers(const StreamParser::BufferQueue& audio_buffers,
|
| + bool OnNewBuffers(base::TimeDelta* media_time,
|
| + const StreamParser::BufferQueue& audio_buffers,
|
| const StreamParser::BufferQueue& video_buffers,
|
| const StreamParser::TextBufferQueueMap& text_map);
|
|
|
| @@ -269,7 +271,8 @@ void SourceState::Init(const StreamParser::InitCB& init_cb,
|
| bool allow_audio,
|
| bool allow_video,
|
| const StreamParser::NeedKeyCB& need_key_cb,
|
| - const NewTextTrackCB& new_text_track_cb) {
|
| + const NewTextTrackCB& new_text_track_cb,
|
| + base::TimeDelta* media_time) {
|
| new_text_track_cb_ = new_text_track_cb;
|
| init_cb_ = init_cb;
|
|
|
| @@ -279,7 +282,9 @@ void SourceState::Init(const StreamParser::InitCB& init_cb,
|
| base::Unretained(this),
|
| allow_audio,
|
| allow_video),
|
| - base::Bind(&SourceState::OnNewBuffers, base::Unretained(this)),
|
| + base::Bind(&SourceState::OnNewBuffers,
|
| + base::Unretained(this),
|
| + media_time),
|
| new_text_track_cb_.is_null(),
|
| need_key_cb,
|
| base::Bind(&SourceState::OnNewMediaSegment, base::Unretained(this)),
|
| @@ -681,6 +686,7 @@ void SourceState::OnEndOfMediaSegment() {
|
| }
|
|
|
| bool SourceState::OnNewBuffers(
|
| + base::TimeDelta* media_time,
|
| const StreamParser::BufferQueue& audio_buffers,
|
| const StreamParser::BufferQueue& video_buffers,
|
| const StreamParser::TextBufferQueueMap& text_map) {
|
| @@ -713,7 +719,8 @@ bool SourceState::OnNewBuffers(
|
| append_window_start_during_append_,
|
| append_window_end_during_append_,
|
| &new_media_segment_,
|
| - timestamp_offset_during_append_)) {
|
| + timestamp_offset_during_append_,
|
| + *media_time)) {
|
| return false;
|
| }
|
|
|
| @@ -795,13 +802,14 @@ void ChunkDemuxerStream::Seek(TimeDelta time) {
|
| stream_->Seek(time);
|
| }
|
|
|
| -bool ChunkDemuxerStream::Append(const StreamParser::BufferQueue& buffers) {
|
| +bool ChunkDemuxerStream::Append(const StreamParser::BufferQueue& buffers,
|
| + base::TimeDelta media_time) {
|
| if (buffers.empty())
|
| return false;
|
|
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK_NE(state_, SHUTDOWN);
|
| - if (!stream_->Append(buffers)) {
|
| + if (!stream_->Append(buffers, media_time)) {
|
| DVLOG(1) << "ChunkDemuxerStream::Append() : stream append failed";
|
| return false;
|
| }
|
| @@ -1024,6 +1032,7 @@ ChunkDemuxer::ChunkDemuxer(const base::Closure& open_cb,
|
| enable_text_(false),
|
| log_cb_(log_cb),
|
| duration_(kNoTimestamp()),
|
| + media_time_(kNoTimestamp()),
|
| user_specified_duration_(-1),
|
| liveness_(LIVENESS_UNKNOWN),
|
| splice_frames_enabled_(splice_frames_enabled) {
|
| @@ -1116,6 +1125,7 @@ void ChunkDemuxer::StartWaitingForSeek(TimeDelta seek_time) {
|
| DCHECK(state_ == INITIALIZED || state_ == ENDED || state_ == SHUTDOWN ||
|
| state_ == PARSE_ERROR) << state_;
|
| DCHECK(seek_cb_.is_null());
|
| + media_time_ = seek_time;
|
|
|
| if (state_ == SHUTDOWN || state_ == PARSE_ERROR)
|
| return;
|
| @@ -1205,7 +1215,8 @@ ChunkDemuxer::Status ChunkDemuxer::AddId(
|
| has_audio,
|
| has_video,
|
| need_key_cb_,
|
| - new_text_track_cb);
|
| + new_text_track_cb,
|
| + &media_time_);
|
|
|
| source_state_map_[id] = source_state.release();
|
| return kOk;
|
| @@ -1247,6 +1258,9 @@ void ChunkDemuxer::AppendData(const std::string& id,
|
|
|
| Ranges<TimeDelta> ranges;
|
|
|
| + // TODO(damienv): Retrieve the current media time outside of any lock.
|
| + base::TimeDelta current_media_time = kNoTimestamp();
|
| +
|
| {
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK_NE(state_, ENDED);
|
| @@ -1259,6 +1273,7 @@ void ChunkDemuxer::AppendData(const std::string& id,
|
| return;
|
|
|
| DCHECK(data);
|
| + media_time_ = current_media_time;
|
|
|
| switch (state_) {
|
| case INITIALIZING:
|
|
|