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

Unified Diff: media/filters/chunk_demuxer.cc

Issue 341083004: Introduce the playback time into the MSE garbage collection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: New flow to pass the media time to SourceBufferStream. Created 6 years, 6 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
« no previous file with comments | « media/filters/chunk_demuxer.h ('k') | media/filters/frame_processor.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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:
« no previous file with comments | « media/filters/chunk_demuxer.h ('k') | media/filters/frame_processor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698