Chromium Code Reviews| Index: media/base/pipeline_impl.cc |
| diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc |
| index 36747bd48b3cd7ba73421aa5d2de35966c903170..c7ee5b0965a52dfa09d2c818c95424edca03412f 100644 |
| --- a/media/base/pipeline_impl.cc |
| +++ b/media/base/pipeline_impl.cc |
| @@ -57,6 +57,15 @@ class PipelineImpl::RendererWrapper : public DemuxerHost, |
| PipelineStatistics GetStatistics() const; |
| void SetCdm(CdmContext* cdm_context, const CdmAttachedCB& cdm_attached_cb); |
| + // |enabledTrackIds| contains track ids of enabled audio tracks. |
| + void OnEnabledAudioTracksChanged( |
| + const std::vector<MediaTrack::Id>& enabledTrackIds); |
| + |
| + // |trackId| either empty, which means no video track is selected, or contain |
| + // one element - the selected video track id. |
| + void OnSelectedVideoTrackChanged( |
| + const std::vector<MediaTrack::Id>& selectedTrackId); |
| + |
| private: |
| // Contains state shared between main and media thread. |
| // Main thread can only read. Media thread can both - read and write. |
| @@ -224,6 +233,24 @@ void PipelineImpl::Start(Demuxer* demuxer, |
| weak_factory_.GetWeakPtr())); |
| } |
| +void PipelineImpl::OnEnabledAudioTracksChanged( |
| + const std::vector<MediaTrack::Id>& enabledTrackIds) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + media_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&RendererWrapper::OnEnabledAudioTracksChanged, |
| + base::Unretained(renderer_wrapper_.get()), enabledTrackIds)); |
| +} |
| + |
| +void PipelineImpl::OnSelectedVideoTrackChanged( |
| + const std::vector<MediaTrack::Id>& selectedTrackId) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + media_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&RendererWrapper::OnSelectedVideoTrackChanged, |
| + base::Unretained(renderer_wrapper_.get()), selectedTrackId)); |
| +} |
| + |
| void PipelineImpl::Stop() { |
| DVLOG(2) << __FUNCTION__; |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| @@ -519,6 +546,40 @@ void PipelineImpl::RendererWrapper::OnEnded() { |
| RunEndedCallbackIfNeeded(); |
| } |
| +void PipelineImpl::RendererWrapper::OnEnabledAudioTracksChanged( |
| + const std::vector<MediaTrack::Id>& enabledTrackIds) { |
| + DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| + |
| + // This might happen at the very beginning of the media playback, when the |
| + // first video track gets selected by default before the playback has been |
| + // started, so we don't need to react to this. |
| + if (!demuxer_ || !shared_state_.renderer) { |
| + return; |
| + } |
| + |
| + base::TimeDelta currTime = (state_ == kPlaying) |
| + ? shared_state_.renderer->GetMediaTime() |
| + : start_timestamp_; |
| + demuxer_->OnEnabledAudioTracksChanged(enabledTrackIds, currTime); |
| +} |
| + |
| +void PipelineImpl::RendererWrapper::OnSelectedVideoTrackChanged( |
| + const std::vector<MediaTrack::Id>& selectedTrackId) { |
| + DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| + |
| + // This might happen at the very beginning of the media playback, when the |
| + // first video track gets selected by default before the playback has been |
|
chcunningham
2016/06/24 23:32:55
What if something other than the first/default tra
|
| + // started, so we don't need to react to this. |
| + if (!demuxer_ || !shared_state_.renderer) { |
| + return; |
| + } |
| + |
| + base::TimeDelta currTime = (state_ == kPlaying) |
| + ? shared_state_.renderer->GetMediaTime() |
| + : start_timestamp_; |
| + demuxer_->OnSelectedVideoTrackChanged(selectedTrackId, currTime); |
| +} |
| + |
| void PipelineImpl::RendererWrapper::OnStatisticsUpdate( |
| const PipelineStatistics& stats) { |
| DVLOG(3) << __FUNCTION__; |