Chromium Code Reviews| Index: media/blink/webmediaplayer_impl.cc |
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
| index 5dd65d08719b7a279d88dca947fdb3f0d3ec82f9..9b1cedf56725a3308e8d92ad0978ead7da0f2257 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 |
|
liberato (no reviews please)
2016/01/12 22:14:58
are these ifdefs needed? cast_impl_.isRemote() wi
hubbe
2016/01/12 22:39:26
cast_impl_ doesn't exist on non-android.
I could m
|
| + if (cast_impl_.isRemote() && paused_) { |
| + cast_impl_.play(); |
|
liberato (no reviews please)
2016/01/12 22:14:58
if it's remote and already playing, why do we fall
hubbe
2016/01/12 22:39:26
Fixed.
|
| + 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::DisplayCastFrame, |
| + new_frame)); |
| + } else { |
| + compositor_->PaintFrameUsingOldRenderingPath(new_frame); |
| + } |
| +} |
| + |
| +void WebMediaPlayerImpl::DisplayCastFrame( |
|
liberato (no reviews please)
2016/01/12 22:14:58
since this only works as a suspend callback, maybe
hubbe
2016/01/12 22:39:25
Done.
|
| + 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(); |