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() { |