Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index e56b4bb17a0bc88f2c75e690abca676b8fcddeb9..02ba50503cb9c1d25f644cdb1895050872509ce0 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -154,9 +154,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), |
@@ -186,7 +189,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
#if defined(OS_ANDROID) // WMPI_CAST |
cast_impl_(this, client_, params.context_3d_cb(), delegate), |
#endif |
- 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_); |
@@ -260,6 +264,18 @@ void WebMediaPlayerImpl::load(LoadType load_type, const blink::WebURL& url, |
DoLoad(load_type, url, cors_mode); |
} |
+void WebMediaPlayerImpl::enterFullscreen() { |
+ 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) { |
@@ -969,8 +985,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; |
} |
@@ -1221,6 +1238,11 @@ void WebMediaPlayerImpl::Resume() { |
time_changed)); |
} |
+void WebMediaPlayerImpl::ScheduleRestart() { |
+ pending_suspend_resume_cycle_ = true; |
DaleCurtis
2016/02/02 01:01:33
Why not just use |pending_resume| ?
watk
2016/02/02 20:38:14
I wish I wrote a comment because I've already forg
watk
2016/02/05 03:42:30
Added some comments for this.
|
+ ScheduleSuspend(); |
+} |
+ |
#if defined(OS_ANDROID) // WMPI_CAST |
bool WebMediaPlayerImpl::isRemote() const { |
@@ -1309,10 +1331,29 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { |
"is_downloading_data", is_downloading)); |
} |
+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; |
+ } |
+ |
+ decoder_requires_restart_for_fullscreen_ = true; |
liberato (no reviews please)
2016/02/02 22:46:57
is this being set unconditionally so that EnterFul
watk
2016/02/05 03:42:30
Yep, your assessment was correct. I tried to comme
|
+ if (fullscreen_) |
+ surface_manager_->CreateFullscreenSurface(surface_created_cb); |
+ else |
+ surface_created_cb.Run(SurfaceManager::kNoSurfaceID); |
+} |
+ |
scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { |
return renderer_factory_->CreateRenderer( |
media_task_runner_, worker_task_runner_, audio_source_provider_.get(), |
- compositor_); |
+ compositor_, |
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested)); |
liberato (no reviews please)
2016/02/02 22:46:57
should this be #if android? otherwise, it looks l
watk
2016/02/05 03:42:30
Done.
|
} |
void WebMediaPlayerImpl::StartPipeline() { |