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: |