Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(662)

Unified Diff: media/blink/webmediaplayer_impl.cc

Issue 1655083002: Enable SurfaceView fullscreen video on Android with WebMediaPlayerImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@avda-sv
Patch Set: Adressed comments; moved blink parts to another CL Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698