Chromium Code Reviews| Index: media/filters/chunk_demuxer.cc |
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
| index 49836a129e580d085c1ca956ac27d7c5ac3bea90..097085e81518d5b93060e4983c1465fbfa3e0393 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 |
|
chcunningham
2016/06/24 23:32:55
You are locking though ;)
servolk
2016/06/25 00:36:33
But only while accessing |track_id_to_demux_stream
|
| + // members directly. |
| + DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO); |
| + bool enabled = false; |
| + CHECK(audio_stream); |
| + if (track_ids.size() > 0) { |
|
chcunningham
2016/06/24 23:32:55
IIUC size should never exceed 1 as currently imple
servolk
2016/06/25 00:36:33
Done.
|
| + base::AutoLock auto_lock(lock_); |
|
chcunningham
2016/06/24 23:32:55
Seems you're not settled on this part. I wonder if
servolk
2016/06/25 00:36:33
Done.
|
| + // 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 |
|
chcunningham
2016/06/24 23:32:55
This method has the same unsettled state around th
servolk
2016/06/25 00:36:33
Done.
|
| + // 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) { |