Index: media/filters/chunk_demuxer.cc |
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
index e7525b4191891c5b1c34d53b023cffb21eb9f611..c0943cd681e862b1cdb51c52f0150e20462db863 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()"; |
@@ -248,6 +249,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(); |
} |
@@ -276,6 +285,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_ = BindToCurrentLoop(cb); |
+} |
+ |
TextTrackConfig ChunkDemuxerStream::text_track_config() { |
CHECK_EQ(type_, TEXT); |
base::AutoLock auto_lock(lock_); |
@@ -608,6 +646,48 @@ base::TimeDelta ChunkDemuxer::GetHighestPresentationTimestamp( |
return itr->second->GetHighestPresentationTimestamp(); |
} |
+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); |
+ DCHECK_LE(track_ids.size(), 1u); |
+ if (track_ids.size() > 0) { |
+#if DCHECK_IS_ON() |
+ base::AutoLock auto_lock(lock_); |
+ DCHECK(track_id_to_demux_stream_map_[track_ids[0]] == audio_stream); |
+#endif |
+ enabled = true; |
+ } |
+ DVLOG(1) << __FUNCTION__ << ": " << (enabled ? "enabling" : "disabling") |
+ << " audio stream"; |
+ 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); |
+ DCHECK_LE(track_ids.size(), 1u); |
+ if (track_ids.size() > 0) { |
+#if DCHECK_IS_ON() |
+ base::AutoLock auto_lock(lock_); |
+ DCHECK(track_id_to_demux_stream_map_[track_ids[0]] == video_stream); |
+#endif |
+ enabled = true; |
+ } |
+ DVLOG(1) << __FUNCTION__ << ": " << (enabled ? "enabling" : "disabling") |
+ << " video stream"; |
+ video_stream->set_enabled(enabled, currTime); |
+} |
+ |
bool ChunkDemuxer::EvictCodedFrames(const std::string& id, |
base::TimeDelta currentMediaTime, |
size_t newDataSize) { |
@@ -1047,6 +1127,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: |
@@ -1054,6 +1137,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: { |