| Index: media/blink/webmediaplayer_impl.cc
|
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
|
| index 5dd65d08719b7a279d88dca947fdb3f0d3ec82f9..70f25ae607a5856c1d2f5f74019926ac03b5de42 100644
|
| --- a/media/blink/webmediaplayer_impl.cc
|
| +++ b/media/blink/webmediaplayer_impl.cc
|
| @@ -64,6 +64,9 @@ using blink::WebMediaPlayer;
|
| using blink::WebRect;
|
| using blink::WebSize;
|
| using blink::WebString;
|
| +using gpu::gles2::GLES2Interface;
|
| +
|
| +namespace media {
|
|
|
| namespace {
|
|
|
| @@ -86,23 +89,20 @@ namespace {
|
| const double kMinRate = 0.0625;
|
| const double kMaxRate = 16.0;
|
|
|
| -void SetSinkIdOnMediaThread(
|
| - scoped_refptr<media::WebAudioSourceProviderImpl> sink,
|
| - const std::string& device_id,
|
| - const url::Origin& security_origin,
|
| - const media::SwitchOutputDeviceCB& callback) {
|
| +void SetSinkIdOnMediaThread(scoped_refptr<WebAudioSourceProviderImpl> sink,
|
| + const std::string& device_id,
|
| + const url::Origin& security_origin,
|
| + const SwitchOutputDeviceCB& callback) {
|
| if (sink->GetOutputDevice()) {
|
| sink->GetOutputDevice()->SwitchOutputDevice(device_id, security_origin,
|
| callback);
|
| } else {
|
| - callback.Run(media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL);
|
| + callback.Run(OUTPUT_DEVICE_STATUS_ERROR_INTERNAL);
|
| }
|
| }
|
|
|
| } // namespace
|
|
|
| -namespace media {
|
| -
|
| class BufferedDataSourceHostImpl;
|
|
|
| #define STATIC_ASSERT_MATCHING_ENUM(name, name2) \
|
| @@ -181,7 +181,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
|
| base::Bind(&WebMediaPlayerImpl::SetCdm,
|
| AsWeakPtr(),
|
| base::Bind(&IgnoreCdmAttached))),
|
| - renderer_factory_(std::move(renderer_factory)) {
|
| + renderer_factory_(std::move(renderer_factory)),
|
| + cast_impl_(this, client_, params.context_3d_cb()) {
|
| DCHECK(!adjust_allocated_memory_cb_.is_null());
|
|
|
| if (delegate)
|
| @@ -300,13 +301,25 @@ void WebMediaPlayerImpl::DoLoad(LoadType load_type,
|
| data_source_->SetBufferingStrategy(buffering_strategy_);
|
| data_source_->Initialize(
|
| base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr()));
|
| +
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + cast_impl_.Initialize(url, frame_);
|
| +#endif
|
| }
|
|
|
| void WebMediaPlayerImpl::play() {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(main_task_runner_->BelongsToCurrentThread());
|
|
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + if (cast_impl_.isRemote()) {
|
| + cast_impl_.play();
|
| + return;
|
| + }
|
| +#endif
|
| +
|
| paused_ = false;
|
| +
|
| pipeline_.SetPlaybackRate(playback_rate_);
|
| if (data_source_)
|
| data_source_->MediaIsPlaying();
|
| @@ -323,6 +336,14 @@ void WebMediaPlayerImpl::pause() {
|
|
|
| const bool was_already_paused = paused_ || playback_rate_ == 0;
|
| paused_ = true;
|
| +
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + if (cast_impl_.isRemote()) {
|
| + cast_impl_.pause();
|
| + return;
|
| + }
|
| +#endif
|
| +
|
| pipeline_.SetPlaybackRate(0.0);
|
| UpdatePausedTime();
|
|
|
| @@ -343,12 +364,19 @@ void WebMediaPlayerImpl::seek(double seconds) {
|
|
|
| ended_ = false;
|
|
|
| + base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds);
|
| +
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + if (cast_impl_.isRemote()) {
|
| + cast_impl_.seek(new_seek_time);
|
| + return;
|
| + }
|
| +#endif
|
| +
|
| ReadyState old_state = ready_state_;
|
| if (ready_state_ > WebMediaPlayer::ReadyStateHaveMetadata)
|
| SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
|
|
|
| - base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds);
|
| -
|
| if (seeking_ || suspended_) {
|
| // Once resuming, it's too late to change the resume time and so the
|
| // implementation is a little different.
|
| @@ -422,7 +450,6 @@ void WebMediaPlayerImpl::seek(double seconds) {
|
| if (chunk_demuxer_)
|
| chunk_demuxer_->StartWaitingForSeek(seek_time_);
|
|
|
| - // Kick off the asynchronous seek!
|
| pipeline_.Seek(seek_time_, BIND_TO_RENDER_LOOP1(
|
| &WebMediaPlayerImpl::OnPipelineSeeked, true));
|
| }
|
| @@ -539,6 +566,10 @@ blink::WebSize WebMediaPlayerImpl::naturalSize() const {
|
| bool WebMediaPlayerImpl::paused() const {
|
| DCHECK(main_task_runner_->BelongsToCurrentThread());
|
|
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + if (cast_impl_.isRemote())
|
| + return cast_impl_.paused();
|
| +#endif
|
| return pipeline_.GetPlaybackRate() == 0.0f;
|
| }
|
|
|
| @@ -586,7 +617,17 @@ double WebMediaPlayerImpl::currentTime() const {
|
| : seek_time_.InSecondsF();
|
| }
|
|
|
| - return (paused_ ? paused_time_ : pipeline_.GetMediaTime()).InSecondsF();
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + if (cast_impl_.isRemote()) {
|
| + return cast_impl_.currentTime();
|
| + }
|
| +#endif
|
| +
|
| + if (paused_) {
|
| + return paused_time_.InSecondsF();
|
| + }
|
| +
|
| + return pipeline_.GetMediaTime().InSecondsF();
|
| }
|
|
|
| WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const {
|
| @@ -1048,6 +1089,9 @@ void WebMediaPlayerImpl::OnHidden() {
|
| if (!pipeline_.IsRunning())
|
| return;
|
|
|
| + if (suspended_)
|
| + return;
|
| +
|
| if (resuming_ || seeking_) {
|
| pending_suspend_ = true;
|
| return;
|
| @@ -1101,7 +1145,7 @@ void WebMediaPlayerImpl::OnShown() {
|
|
|
| // We may not be suspended if we were not yet subscribed or the pipeline was
|
| // not yet started when OnHidden() fired.
|
| - if (!suspended_)
|
| + if (!suspended_ || resuming_)
|
| return;
|
|
|
| Resume();
|
| @@ -1140,6 +1184,82 @@ void WebMediaPlayerImpl::Resume() {
|
| time_changed));
|
| }
|
|
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| +void WebMediaPlayerImpl::set_media_player_manager(
|
| + RendererMediaPlayerManagerInterface* media_player_manager) {
|
| + cast_impl_.set_media_player_manager(media_player_manager);
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::requestRemotePlayback() {
|
| + cast_impl_.requestRemotePlayback();
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::requestRemotePlaybackControl() {
|
| + cast_impl_.requestRemotePlaybackControl();
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::OnRemotePlaybackEnded() {
|
| + DVLOG(1) << __FUNCTION__;
|
| + DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| +
|
| + ended_ = true;
|
| + client_->timeChanged();
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::OnDisconnectedFromRemoteDevice(double t) {
|
| + pipeline_.SetPlaybackRate(0.0);
|
| + paused_time_ = base::TimeDelta::FromSecondsD(t);
|
| + pending_seek_ = true;
|
| + pending_seek_time_ = paused_time_;
|
| +
|
| + if (suspended_ && !resuming_)
|
| + Resume();
|
| +
|
| + // We already told the delegate we're paused when remoting started.
|
| + client_->disconnectedFromRemoteDevice();
|
| + if (!paused_) {
|
| + paused_ = true;
|
| + client_->playbackStateChanged();
|
| + }
|
| + if (paused_time_ == pipeline_.GetMediaDuration()) {
|
| + ended_ = true;
|
| + }
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::SuspendForRemote(
|
| + const scoped_refptr<VideoFrame>& new_frame) {
|
| + if (!suspended_ && !suspending_) {
|
| + suspended_ = true;
|
| + suspending_ = true;
|
| + pipeline_.Suspend(
|
| + BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::DisplayCastFrameAfterSuspend,
|
| + new_frame));
|
| + } else {
|
| + compositor_->PaintFrameUsingOldRenderingPath(new_frame);
|
| + }
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::DisplayCastFrameAfterSuspend(
|
| + const scoped_refptr<VideoFrame>& new_frame,
|
| + PipelineStatus status) {
|
| + compositor_->PaintFrameUsingOldRenderingPath(new_frame);
|
| + OnPipelineSuspended(status);
|
| +}
|
| +
|
| +gfx::Size WebMediaPlayerImpl::GetCanvasSize() const {
|
| + if (!video_weblayer_)
|
| + return gfx::Size(0, 0);
|
| +
|
| + gfx::Size video_size_css_px = video_weblayer_->bounds();
|
| + float device_scale_factor = frame_->view()->deviceScaleFactor();
|
| + // canvas_size will be the size in device pixels when pageScaleFactor == 1
|
| + gfx::Size canvas_size(
|
| + static_cast<int>(video_size_css_px.width() * device_scale_factor),
|
| + static_cast<int>(video_size_css_px.height() * device_scale_factor));
|
| + return canvas_size;
|
| +}
|
| +#endif // defined(OS_ANDROID) // WMPI_CAST
|
| +
|
| void WebMediaPlayerImpl::DataSourceInitialized(bool success) {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| @@ -1321,6 +1441,12 @@ void WebMediaPlayerImpl::UpdatePausedTime() {
|
| }
|
|
|
| void WebMediaPlayerImpl::NotifyPlaybackStarted() {
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + // We do not tell our delegates about remote playback, becuase that would
|
| + // keep the device awake, which is not what we want.
|
| + if (cast_impl_.isRemote())
|
| + return;
|
| +#endif
|
| if (delegate_)
|
| delegate_->DidPlay(this);
|
| if (!memory_usage_reporting_timer_.IsRunning()) {
|
| @@ -1331,6 +1457,10 @@ void WebMediaPlayerImpl::NotifyPlaybackStarted() {
|
| }
|
|
|
| void WebMediaPlayerImpl::NotifyPlaybackPaused() {
|
| +#if defined(OS_ANDROID) // WMPI_CAST
|
| + if (cast_impl_.isRemote())
|
| + return;
|
| +#endif
|
| if (delegate_)
|
| delegate_->DidPause(this);
|
| memory_usage_reporting_timer_.Stop();
|
|
|