Chromium Code Reviews| 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_); |
|
watk
2016/11/08 22:59:03
Much clearer!
|
| } |
| std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { |