| Index: media/blink/webmediaplayer_impl.cc
|
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
|
| index 76fb82cc3c5fb939a04ace11650f56ae0b7a9af5..1245265f34c1a380a0195b2d923a94de8f9405c2 100644
|
| --- a/media/blink/webmediaplayer_impl.cc
|
| +++ b/media/blink/webmediaplayer_impl.cc
|
| @@ -343,6 +343,8 @@ void WebMediaPlayerImpl::DisableOverlay() {
|
|
|
| if (decoder_requires_restart_for_overlay_)
|
| ScheduleRestart();
|
| + else if (!set_surface_cb_.is_null())
|
| + set_surface_cb_.Run(overlay_surface_id_);
|
| }
|
|
|
| void WebMediaPlayerImpl::enteredFullscreen() {
|
| @@ -1495,45 +1497,46 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) {
|
| }
|
|
|
| void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) {
|
| - if (force_video_overlays_ && surface_id == SurfaceManager::kNoSurfaceID)
|
| - LOG(ERROR) << "Create surface failed.";
|
| -
|
| overlay_surface_id_ = surface_id;
|
| - if (!pending_surface_request_cb_.is_null())
|
| - base::ResetAndReturn(&pending_surface_request_cb_).Run(surface_id);
|
| + if (!set_surface_cb_.is_null()) {
|
| + // If restart is required, the callback is one-shot only.
|
| + if (decoder_requires_restart_for_overlay_)
|
| + base::ResetAndReturn(&set_surface_cb_).Run(surface_id);
|
| + else
|
| + set_surface_cb_.Run(surface_id);
|
| + }
|
| }
|
|
|
| -// TODO(watk): Move this state management out of WMPI.
|
| void WebMediaPlayerImpl::OnSurfaceRequested(
|
| - const SurfaceCreatedCB& surface_created_cb) {
|
| + bool decoder_requires_restart_for_overlay,
|
| + const SurfaceCreatedCB& set_surface_cb) {
|
| DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| DCHECK(surface_manager_);
|
| DCHECK(!use_fallback_path_);
|
|
|
| // A null callback indicates that the decoder is going away.
|
| - if (surface_created_cb.is_null()) {
|
| + if (set_surface_cb.is_null()) {
|
| decoder_requires_restart_for_overlay_ = false;
|
| - pending_surface_request_cb_.Reset();
|
| + set_surface_cb_.Reset();
|
| 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_overlay_ = true;
|
| - if (overlay_enabled_) {
|
| - if (overlay_surface_id_ != SurfaceManager::kNoSurfaceID)
|
| - surface_created_cb.Run(overlay_surface_id_);
|
| - else
|
| - pending_surface_request_cb_ = surface_created_cb;
|
| - } else {
|
| - // Tell the decoder to create its own surface.
|
| - surface_created_cb.Run(SurfaceManager::kNoSurfaceID);
|
| - }
|
| + // If we get a surface request it means GpuVideoDecoder is initializing, so
|
| + // until we get a null surface request, GVD is the active decoder.
|
| + //
|
| + // If |decoder_requires_restart_for_overlay| is true, we must restart the
|
| + // pipeline for fullscreen transitions. The decoder is unable to switch
|
| + // surfaces otherwise. If false, we simply need to tell the decoder about the
|
| + // new surface and it will handle things seamlessly.
|
| + decoder_requires_restart_for_overlay_ = decoder_requires_restart_for_overlay;
|
| + set_surface_cb_ = set_surface_cb;
|
| +
|
| + // If we're waiting for the surface to arrive, OnSurfaceCreated() will be
|
| + // called later when it arrives; so do nothing for now.
|
| + if (overlay_enabled_ && overlay_surface_id_ == SurfaceManager::kNoSurfaceID)
|
| + return;
|
| +
|
| + OnSurfaceCreated(overlay_surface_id_);
|
| }
|
|
|
| std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() {
|
|
|