Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index 3b373485a2ae011fd57fcf8bdd8e060aa1357bb7..bd58e7772fee1e6a975be1eed41e81ac82bd1948 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -577,12 +577,70 @@ bool WebMediaPlayerImpl::hasAudio() const { |
return pipeline_metadata_.has_audio; |
} |
+using RestartStreamPlaybackCB = |
+ base::Callback<void(DemuxerStream*, base::TimeDelta)>; |
+ |
+void OnEnabledAudioTracksChanged( |
+ Demuxer* demuxer, |
+ base::TimeDelta currentTime, |
+ const blink::WebVector<blink::WebMediaPlayer::TrackId>& enabledTrackIds, |
+ const RestartStreamPlaybackCB& restart_stream_playback_cb) { |
+ DemuxerStream* audio_stream = demuxer->GetStream(DemuxerStream::AUDIO); |
+ bool enabled = false; |
+ for (const auto& trackId : enabledTrackIds) { |
+ const DemuxerStream* s = demuxer->GetDemuxerStreamByTrackId(trackId); |
+ CHECK(s); |
+ CHECK_EQ(s, audio_stream); |
+ enabled = true; |
+ } |
+ |
+ DVLOG(1) << __FUNCTION__ << (enabled ? " enabling" : " disabling") |
+ << " audio_stream=" << audio_stream |
+ << " currentTime=" << currentTime.InSecondsF(); |
+ bool was_disabled = !audio_stream->enabled(); |
+ audio_stream->set_enabled(enabled, currentTime); |
+ if (enabled && was_disabled) { |
+ restart_stream_playback_cb.Run(audio_stream, currentTime); |
+ } |
+} |
+ |
void WebMediaPlayerImpl::enabledAudioTracksChanged( |
const blink::WebVector<blink::WebMediaPlayer::TrackId>& enabledTrackIds) { |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
CHECK(demuxer_.get()); |
- // TODO(servolk): Implement disabling/enabling audio streams. |
+ media_task_runner_->PostTask( |
chcunningham
2016/06/02 23:49:42
This is bit bouncy.
Main Thread: JS sets enabl
servolk
2016/06/03 02:53:15
Yes, we could do what you suggested, but one signi
chcunningham
2016/06/03 20:54:59
Let me see how our discussion here shakes out
htt
xhwang
2016/06/04 00:09:43
For the thread hopping chcunningham pointed out, w
servolk
2016/06/09 21:00:13
There is a lot of different points here, let me tr
|
+ FROM_HERE, |
+ base::Bind( |
+ &OnEnabledAudioTracksChanged, demuxer_.get(), |
+ base::TimeDelta::FromSecondsD(currentTime()), enabledTrackIds, |
+ BindToCurrentLoop(base::Bind( |
+ &WebMediaPlayerImpl::RestartStreamPlayback, AsWeakPtr())))); |
+} |
+ |
+void OnSelectedVideoTrackChanged( |
+ Demuxer* demuxer, |
+ base::TimeDelta currentTime, |
+ const std::vector<blink::WebMediaPlayer::TrackId>& selectedTrackIdVector, |
+ const RestartStreamPlaybackCB& restart_stream_playback_cb) { |
+ DemuxerStream* video_stream = demuxer->GetStream(DemuxerStream::VIDEO); |
+ bool enabled = false; |
+ if (!selectedTrackIdVector.empty()) { |
+ const DemuxerStream* selectedVideoStream = |
+ demuxer->GetDemuxerStreamByTrackId(selectedTrackIdVector[0]); |
+ CHECK(selectedVideoStream); |
+ CHECK_EQ(selectedVideoStream, video_stream); |
+ enabled = true; |
+ } |
+ |
+ DVLOG(1) << __FUNCTION__ << (enabled ? " enabling" : " disabling") |
+ << " video_stream=" << video_stream |
+ << " currentTime=" << currentTime.InSecondsF(); |
+ bool was_disabled = !video_stream->enabled(); |
+ video_stream->set_enabled(enabled, currentTime); |
+ if (enabled && was_disabled) { |
+ restart_stream_playback_cb.Run(video_stream, currentTime); |
+ } |
} |
void WebMediaPlayerImpl::selectedVideoTrackChanged( |
@@ -590,7 +648,23 @@ void WebMediaPlayerImpl::selectedVideoTrackChanged( |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
CHECK(demuxer_.get()); |
- // TODO(servolk): Implement disabling/enabling video stream. |
+ std::vector<blink::WebMediaPlayer::TrackId> selectedTrackIdVector; |
+ if (selectedTrackId) { |
+ selectedTrackIdVector.push_back(*selectedTrackId); |
+ } |
+ media_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &OnSelectedVideoTrackChanged, demuxer_.get(), |
+ base::TimeDelta::FromSecondsD(currentTime()), selectedTrackIdVector, |
+ BindToCurrentLoop(base::Bind( |
+ &WebMediaPlayerImpl::RestartStreamPlayback, AsWeakPtr())))); |
+} |
+ |
+void WebMediaPlayerImpl::RestartStreamPlayback(DemuxerStream* stream, |
+ base::TimeDelta time) { |
+ DCHECK(main_task_runner_->BelongsToCurrentThread()); |
+ pipeline_.RestartStreamPlayback(stream, time); |
} |
blink::WebSize WebMediaPlayerImpl::naturalSize() const { |