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

Unified Diff: media/filters/chunk_demuxer.cc

Issue 1935873002: Implement disabling and enabling media tracks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@track-control2
Patch Set: Check track ids via track_id_to_demux_stream_map_ Created 4 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
Index: media/filters/chunk_demuxer.cc
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
index 49836a129e580d085c1ca956ac27d7c5ac3bea90..959f4989c033b0540c62bca2b93f8f8c786605ee 100644
--- a/media/filters/chunk_demuxer.cc
+++ b/media/filters/chunk_demuxer.cc
@@ -38,7 +38,8 @@ ChunkDemuxerStream::ChunkDemuxerStream(Type type,
media_track_id_(media_track_id),
state_(UNINITIALIZED),
splice_frames_enabled_(splice_frames_enabled),
- partial_append_window_trimming_enabled_(false) {}
+ partial_append_window_trimming_enabled_(false),
+ is_enabled_(true) {}
void ChunkDemuxerStream::StartReturningData() {
DVLOG(1) << "ChunkDemuxerStream::StartReturningData()";
@@ -244,6 +245,14 @@ void ChunkDemuxerStream::Read(const ReadCB& read_cb) {
DCHECK(read_cb_.is_null());
read_cb_ = BindToCurrentLoop(read_cb);
+
+ if (!is_enabled_) {
+ DVLOG(1) << "Read from disabled stream, returning EOS";
+ base::ResetAndReturn(&read_cb_).Run(kOk,
+ StreamParserBuffer::CreateEOSBuffer());
+ return;
+ }
+
CompletePendingReadIfPossible_Locked();
}
@@ -272,6 +281,35 @@ VideoRotation ChunkDemuxerStream::video_rotation() {
return VIDEO_ROTATION_0;
}
+bool ChunkDemuxerStream::enabled() const {
+ base::AutoLock auto_lock(lock_);
+ return is_enabled_;
+}
+
+void ChunkDemuxerStream::set_enabled(bool enabled, base::TimeDelta timestamp) {
+ base::AutoLock auto_lock(lock_);
+
+ if (enabled == is_enabled_)
+ return;
+
+ is_enabled_ = enabled;
+ if (enabled) {
+ DCHECK(stream_);
+ stream_->Seek(timestamp);
+ if (!stream_restarted_cb_.is_null())
+ stream_restarted_cb_.Run(this, timestamp);
+ } else if (!read_cb_.is_null()) {
+ DVLOG(1) << "Read from disabled stream, returning EOS";
+ base::ResetAndReturn(&read_cb_).Run(kOk,
+ StreamParserBuffer::CreateEOSBuffer());
+ }
+}
+
+void ChunkDemuxerStream::SetStreamRestartedCB(const StreamRestartedCB& cb) {
+ DCHECK(!cb.is_null());
+ stream_restarted_cb_ = cb;
+}
+
TextTrackConfig ChunkDemuxerStream::text_track_config() {
CHECK_EQ(type_, TEXT);
base::AutoLock auto_lock(lock_);
@@ -593,6 +631,38 @@ Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges(const std::string& id) const {
return itr->second->GetBufferedRanges(duration_, state_ == ENDED);
}
+void ChunkDemuxer::OnEnabledAudioTracksChanged(
+ const std::vector<MediaTrack::Id>& track_ids,
+ base::TimeDelta currTime) {
+ // Note: We intentionally don't lock here, since we are not accessing any
+ // members directly.
+ DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
+ bool enabled = false;
+ CHECK(audio_stream);
+ if (track_ids.size() > 0) {
+ base::AutoLock auto_lock(lock_);
+ DCHECK(track_id_to_demux_stream_map_[track_ids[0]] == audio_stream);
+ enabled = true;
+ }
+ audio_stream->set_enabled(enabled, currTime);
+}
+
+void ChunkDemuxer::OnSelectedVideoTrackChanged(
+ const std::vector<MediaTrack::Id>& track_ids,
+ base::TimeDelta currTime) {
+ // Note: We intentionally don't lock here, since we are not accessing any
+ // members directly.
+ DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
+ bool enabled = false;
+ CHECK(video_stream);
+ if (track_ids.size() > 0) {
+ base::AutoLock auto_lock(lock_);
+ DCHECK(track_id_to_demux_stream_map_[track_ids[0]] == video_stream);
+ enabled = true;
+ }
+ video_stream->set_enabled(enabled, currTime);
+}
+
bool ChunkDemuxer::EvictCodedFrames(const std::string& id,
base::TimeDelta currentMediaTime,
size_t newDataSize) {
@@ -1032,6 +1102,9 @@ ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream(
return NULL;
audio_.reset(new ChunkDemuxerStream(
DemuxerStream::AUDIO, splice_frames_enabled_, media_track_id));
+ DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
+ track_id_to_demux_stream_map_.end());
+ track_id_to_demux_stream_map_[media_track_id] = audio_.get();
return audio_.get();
break;
case DemuxerStream::VIDEO:
@@ -1039,6 +1112,9 @@ ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream(
return NULL;
video_.reset(new ChunkDemuxerStream(
DemuxerStream::VIDEO, splice_frames_enabled_, media_track_id));
+ DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
+ track_id_to_demux_stream_map_.end());
+ track_id_to_demux_stream_map_[media_track_id] = video_.get();
return video_.get();
break;
case DemuxerStream::TEXT: {

Powered by Google App Engine
This is Rietveld 408576698