Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index 3749bf2f1878ab954dc318a122e029e88e123d58..a007f84d2e842a5b2224ee045acef7814d55500b 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -843,6 +843,46 @@ void WebMediaPlayerImpl::OnEncryptedMediaInitData( |
base::saturated_cast<unsigned int>(init_data.size())); |
} |
+void WebMediaPlayerImpl::OnMediaTracksUpdated(scoped_ptr<MediaTracks> tracks) { |
+ // For MSE/chunk_demuxer case the media tracks should be handled by WSBI |
+ DCHECK(!chunk_demuxer_); |
+ DCHECK(client_); |
+ |
+ // Remove the old tracks first, if any were present |
+ while (!blink_audio_tracks_.empty()) { |
+ client_->removeAudioTrack(blink_audio_tracks_[0]); |
+ blink_audio_tracks_.erase(blink_audio_tracks_.begin()); |
+ } |
+ while (!blink_video_tracks_.empty()) { |
+ client_->removeVideoTrack(blink_video_tracks_[0]); |
+ blink_audio_tracks_.erase(blink_audio_tracks_.begin()); |
+ } |
+ |
+ // Now report the new media tracks to blink |
+ for (const auto& track : tracks->tracks()) { |
+ if (track->type() == MediaTrack::Audio) { |
+ auto track_id = client_->addAudioTrack( |
+ blink::WebString::fromUTF8(track->id()), |
+ blink::WebMediaPlayerClient::AudioTrackKindMain, |
+ blink::WebString::fromUTF8(track->label()), |
+ blink::WebString::fromUTF8(track->language()), |
+ /*enabled*/ true); |
+ blink_audio_tracks_.push_back(track_id); |
+ } else if (track->type() == MediaTrack::Video) { |
+ auto track_id = client_->addVideoTrack( |
+ blink::WebString::fromUTF8(track->id()), |
+ blink::WebMediaPlayerClient::VideoTrackKindMain, |
+ blink::WebString::fromUTF8(track->label()), |
+ blink::WebString::fromUTF8(track->language()), |
+ /*selected*/ true); |
+ blink_video_tracks_.push_back(track_id); |
+ } else { |
+ // Text tracks are not supported yet. |
+ NOTREACHED(); |
+ } |
+ } |
+} |
+ |
void WebMediaPlayerImpl::OnWaitingForDecryptionKey() { |
encrypted_client_->didBlockPlaybackWaitingForKey(); |
@@ -1371,6 +1411,9 @@ void WebMediaPlayerImpl::StartPipeline() { |
Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = |
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnEncryptedMediaInitData); |
+ Demuxer::MediaTracksUpdatedCB media_tracks_updated_cb = |
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnMediaTracksUpdated); |
+ |
// Figure out which demuxer to use. |
if (load_type_ != LoadTypeMediaSource) { |
DCHECK(!chunk_demuxer_); |
@@ -1378,7 +1421,8 @@ void WebMediaPlayerImpl::StartPipeline() { |
#if !defined(MEDIA_DISABLE_FFMPEG) |
demuxer_.reset(new FFmpegDemuxer(media_task_runner_, data_source_.get(), |
- encrypted_media_init_data_cb, media_log_)); |
+ encrypted_media_init_data_cb, |
+ media_tracks_updated_cb, media_log_)); |
#else |
OnPipelineError(PipelineStatus::DEMUXER_ERROR_COULD_NOT_OPEN); |
return; |