Chromium Code Reviews| Index: media/blink/webmediaplayer_impl.cc |
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
| index ccab77a313e8aa813ffced4069645d522a2f666d..8dbbf4ddc6e47dade94b2ef7c9d07aa8117000d9 100644 |
| --- a/media/blink/webmediaplayer_impl.cc |
| +++ b/media/blink/webmediaplayer_impl.cc |
| @@ -207,7 +207,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
| volume_multiplier_(1.0), |
| renderer_factory_(std::move(renderer_factory)), |
| surface_manager_(params.surface_manager()), |
| - suppress_destruction_errors_(false) { |
| + suppress_destruction_errors_(false), |
| + can_suspend_state_(CanSuspendState::UNKNOWN) { |
| DCHECK(!adjust_allocated_memory_cb_.is_null()); |
| DCHECK(renderer_factory_); |
| DCHECK(client_); |
| @@ -1079,13 +1080,28 @@ void WebMediaPlayerImpl::OnShown() { |
| void WebMediaPlayerImpl::OnSuspendRequested(bool must_suspend) { |
| DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| -#if defined(OS_MACOSX) |
| - // TODO(sandersd): Idle suspend is disabled on OSX since hardware decoded |
| - // frames are owned by the video decoder in the GPU process. A mechanism for |
| - // detaching ownership from the decoder is needed. http://crbug.com/595716. |
| - return; |
| +#if defined(OS_MACOSX) || defined(OS_WIN) |
|
sandersd (OOO until July 31)
2016/04/12 23:19:19
Move this check into SetSuspendState(), now that t
DaleCurtis
2016/04/12 23:33:29
Done. I was surprised to see that SetSuspendState(
|
| + // TODO(sandersd): Idle suspend is disabled on OSX and Windows for hardware |
| + // decoding / opaque video frames since hardware decoded frames are owned by |
| + // the video decoder in the GPU process. Remove once OSX and Windows hardware |
| + // decoders support frames which outlive the decoder. http://crbug.com/595716 |
| + // and http://crbug.com/602708. |
| + if (can_suspend_state_ == CanSuspendState::UNKNOWN) { |
| + scoped_refptr<VideoFrame> frame = GetCurrentFrameFromCompositor(); |
| + if (frame) { |
| + can_suspend_state_ = |
| + frame->metadata()->IsTrue(VideoFrameMetadata::DECODER_OWNS_FRAME) |
| + ? CanSuspendState::NO |
| + : CanSuspendState::YES; |
| + } |
| + } |
| +#else |
| + can_suspend_state_ = CanSuspendState::YES; |
| #endif |
| + if (can_suspend_state_ == CanSuspendState::NO) |
| + return; |
| + |
| if (must_suspend) { |
| must_suspend_ = true; |
| } else { |