| Index: media/blink/webmediaplayer_impl.cc
|
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
|
| index 4ae617d9e2aa86c553493eeb2bb0670013d3e22c..d5e486f532626d991d6faef32157eb8a8a15d839 100644
|
| --- a/media/blink/webmediaplayer_impl.cc
|
| +++ b/media/blink/webmediaplayer_impl.cc
|
| @@ -155,9 +155,12 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
|
| suspending_(false),
|
| suspended_(false),
|
| resuming_(false),
|
| + pending_suspend_resume_cycle_(false),
|
| ended_(false),
|
| pending_seek_(false),
|
| should_notify_time_changed_(false),
|
| + fullscreen_(false),
|
| + decoder_requires_restart_for_fullscreen_(false),
|
| client_(client),
|
| encrypted_client_(encrypted_client),
|
| delegate_(delegate),
|
| @@ -190,7 +193,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
|
| #endif
|
| volume_(1.0),
|
| volume_multiplier_(1.0),
|
| - renderer_factory_(std::move(renderer_factory)) {
|
| + renderer_factory_(std::move(renderer_factory)),
|
| + surface_manager_(params.surface_manager()) {
|
| DCHECK(!adjust_allocated_memory_cb_.is_null());
|
| DCHECK(renderer_factory_);
|
|
|
| @@ -264,6 +268,18 @@ void WebMediaPlayerImpl::load(LoadType load_type, const blink::WebURL& url,
|
| DoLoad(load_type, url, cors_mode);
|
| }
|
|
|
| +void WebMediaPlayerImpl::enteredFullscreen() {
|
| + fullscreen_ = true;
|
| + if (decoder_requires_restart_for_fullscreen_)
|
| + ScheduleRestart();
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::exitedFullscreen() {
|
| + fullscreen_ = false;
|
| + if (decoder_requires_restart_for_fullscreen_)
|
| + ScheduleRestart();
|
| +}
|
| +
|
| void WebMediaPlayerImpl::DoLoad(LoadType load_type,
|
| const blink::WebURL& url,
|
| CORSMode cors_mode) {
|
| @@ -972,8 +988,9 @@ void WebMediaPlayerImpl::OnPipelineSuspended(PipelineStatus status) {
|
| }
|
| #endif
|
|
|
| - if (pending_resume_) {
|
| + if (pending_resume_ || pending_suspend_resume_cycle_) {
|
| pending_resume_ = false;
|
| + pending_suspend_resume_cycle_ = false;
|
| Resume();
|
| return;
|
| }
|
| @@ -1239,6 +1256,15 @@ void WebMediaPlayerImpl::Resume() {
|
| time_changed));
|
| }
|
|
|
| +void WebMediaPlayerImpl::ScheduleRestart() {
|
| + // If we're suspended but not resuming there is no need to restart because
|
| + // there is no renderer to kill.
|
| + if (!suspended_ || resuming_) {
|
| + pending_suspend_resume_cycle_ = true;
|
| + ScheduleSuspend();
|
| + }
|
| +}
|
| +
|
| #if defined(OS_ANDROID) // WMPI_CAST
|
|
|
| bool WebMediaPlayerImpl::isRemote() const {
|
| @@ -1327,10 +1353,44 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) {
|
| "is_downloading_data", is_downloading));
|
| }
|
|
|
| +// TODO(watk): Move this state management out of WMPI.
|
| +void WebMediaPlayerImpl::OnSurfaceRequested(
|
| + const SurfaceCreatedCB& surface_created_cb) {
|
| + DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| + DCHECK(surface_manager_);
|
| +
|
| + // A null callback indicates that the decoder is going away.
|
| + if (surface_created_cb.is_null()) {
|
| + decoder_requires_restart_for_fullscreen_ = false;
|
| + return;
|
| + }
|
| +
|
| + // If we're getting a surface request it means GVD is initializing, so until
|
| + // we get a null surface request, GVD is the active decoder. While that's the
|
| + // case we should restart the pipeline on fullscreen transitions so that when
|
| + // we create a new GVD it will request a surface again and get the right kind
|
| + // of surface for the fullscreen state.
|
| + // TODO(watk): Don't require a pipeline restart to switch surfaces for
|
| + // cases where it isn't necessary.
|
| + decoder_requires_restart_for_fullscreen_ = true;
|
| + if (fullscreen_) {
|
| + surface_manager_->CreateFullscreenSurface(pipeline_metadata_.natural_size,
|
| + surface_created_cb);
|
| + } else {
|
| + // Tell the decoder to create its own surface.
|
| + surface_created_cb.Run(SurfaceManager::kNoSurfaceID);
|
| + }
|
| +}
|
| +
|
| scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() {
|
| + RequestSurfaceCB request_surface_cb;
|
| +#if defined(OS_ANDROID)
|
| + request_surface_cb =
|
| + BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested);
|
| +#endif
|
| return renderer_factory_->CreateRenderer(
|
| media_task_runner_, worker_task_runner_, audio_source_provider_.get(),
|
| - compositor_);
|
| + compositor_, request_surface_cb);
|
| }
|
|
|
| void WebMediaPlayerImpl::StartPipeline() {
|
| @@ -1428,8 +1488,13 @@ void WebMediaPlayerImpl::OnNaturalSizeChanged(gfx::Size size) {
|
|
|
| media_log_->AddEvent(
|
| media_log_->CreateVideoSizeSetEvent(size.width(), size.height()));
|
| +
|
| + if (fullscreen_ && surface_manager_ &&
|
| + pipeline_metadata_.natural_size != size) {
|
| + surface_manager_->NaturalSizeChanged(size);
|
| + }
|
| +
|
| pipeline_metadata_.natural_size = size;
|
| -
|
| client_->sizeChanged();
|
| }
|
|
|
|
|