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

Side by Side Diff: media/blink/webmediaplayer_impl.cc

Issue 2445533002: Don't suspend the pipeline before HaveFutureData while decoding progressing (Closed)
Patch Set: Use loading progress instead of decoding progress Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/blink/webmediaplayer_impl.h" 5 #include "media/blink/webmediaplayer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #include <string> 10 #include <string>
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 suppress_destruction_errors_(false), 229 suppress_destruction_errors_(false),
230 can_suspend_state_(CanSuspendState::UNKNOWN), 230 can_suspend_state_(CanSuspendState::UNKNOWN),
231 use_fallback_path_(false), 231 use_fallback_path_(false),
232 is_encrypted_(false), 232 is_encrypted_(false),
233 underflow_count_(0), 233 underflow_count_(0),
234 observer_(params.media_observer()) { 234 observer_(params.media_observer()) {
235 DCHECK(!adjust_allocated_memory_cb_.is_null()); 235 DCHECK(!adjust_allocated_memory_cb_.is_null());
236 DCHECK(renderer_factory_); 236 DCHECK(renderer_factory_);
237 DCHECK(client_); 237 DCHECK(client_);
238 238
239 tick_clock_ = &default_tick_clock_;
240
239 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch( 241 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
240 switches::kForceVideoOverlays); 242 switches::kForceVideoOverlays);
241 243
242 disable_fullscreen_video_overlays_ = 244 disable_fullscreen_video_overlays_ =
243 !base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo); 245 !base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo);
244 246
245 if (delegate_) 247 if (delegate_)
246 delegate_id_ = delegate_->AddObserver(this); 248 delegate_id_ = delegate_->AddObserver(this);
247 249
248 media_log_->AddEvent( 250 media_log_->AddEvent(
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 // If we've idle suspended before reaching kHaveFutureData and loading has 777 // If we've idle suspended before reaching kHaveFutureData and loading has
776 // progressed we need to spin up the renderer and figure out if we have enough 778 // progressed we need to spin up the renderer and figure out if we have enough
777 // data yet; |client_| may be waiting on this signal to trigger playback. The 779 // data yet; |client_| may be waiting on this signal to trigger playback. The
778 // idle timeout is long enough that this is a low-cost operation. 780 // idle timeout is long enough that this is a low-cost operation.
779 if (highest_ready_state_ < ReadyState::ReadyStateHaveFutureData && 781 if (highest_ready_state_ < ReadyState::ReadyStateHaveFutureData &&
780 pipeline_controller_.IsSuspended() && did_loading_progress && is_idle_) { 782 pipeline_controller_.IsSuspended() && did_loading_progress && is_idle_) {
781 is_idle_ = false; 783 is_idle_ = false;
782 UpdatePlayState(); 784 UpdatePlayState();
783 } 785 }
784 786
787 if (did_loading_progress)
788 last_time_loading_progressed_ = tick_clock_->NowTicks();
789
785 return did_loading_progress; 790 return did_loading_progress;
786 } 791 }
787 792
788 void WebMediaPlayerImpl::paint(blink::WebCanvas* canvas, 793 void WebMediaPlayerImpl::paint(blink::WebCanvas* canvas,
789 const blink::WebRect& rect, 794 const blink::WebRect& rect,
790 SkPaint& paint) { 795 SkPaint& paint) {
791 DCHECK(main_task_runner_->BelongsToCurrentThread()); 796 DCHECK(main_task_runner_->BelongsToCurrentThread());
792 TRACE_EVENT0("media", "WebMediaPlayerImpl:paint"); 797 TRACE_EVENT0("media", "WebMediaPlayerImpl:paint");
793 798
794 // TODO(sandersd): Move this check into GetCurrentFrameFromCompositor() when 799 // TODO(sandersd): Move this check into GetCurrentFrameFromCompositor() when
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 1309
1305 must_suspend_ = false; 1310 must_suspend_ = false;
1306 background_pause_timer_.Stop(); 1311 background_pause_timer_.Stop();
1307 1312
1308 UpdatePlayState(); 1313 UpdatePlayState();
1309 } 1314 }
1310 1315
1311 void WebMediaPlayerImpl::OnSuspendRequested(bool must_suspend) { 1316 void WebMediaPlayerImpl::OnSuspendRequested(bool must_suspend) {
1312 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1317 DCHECK(main_task_runner_->BelongsToCurrentThread());
1313 1318
1314 if (must_suspend) 1319 if (must_suspend) {
1315 must_suspend_ = true; 1320 must_suspend_ = true;
1316 else 1321 UpdatePlayState();
1322 return;
1323 }
1324
1325 // If we're beyond HaveFutureData, we can safely suspend at any time.
1326 if (highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData) {
1317 is_idle_ = true; 1327 is_idle_ = true;
1328 UpdatePlayState();
1329 return;
1330 }
1318 1331
1319 UpdatePlayState(); 1332 // Before HaveFutureData blink will not call play(), so we must be careful to
DaleCurtis 2016/10/28 19:11:42 This will never be called again. So even after 3 s
watk 2016/10/28 20:03:22 What about calling delegate_->DidPause()? Then the
1333 // only suspend if we'll eventually receive an event that will trigger a
1334 // resume. If the last time loading progressed was longer than 3 seconds ago,
1335 // and we still haven't reached HaveFutureData, assume that we're waiting on
1336 // more data to proceed. When that data is loaded the pipeline will be resumed
1337 // by didLoadingProgress().
1338 if (last_time_loading_progressed_.is_null() ||
1339 (tick_clock_->NowTicks() - last_time_loading_progressed_) >
1340 base::TimeDelta::FromSeconds(3)) {
1341 is_idle_ = true;
1342 UpdatePlayState();
1343 }
1320 } 1344 }
1321 1345
1322 void WebMediaPlayerImpl::OnPlay() { 1346 void WebMediaPlayerImpl::OnPlay() {
1323 play(); 1347 play();
1324 client_->playbackStateChanged(); 1348 client_->playbackStateChanged();
1325 } 1349 }
1326 1350
1327 void WebMediaPlayerImpl::OnPause() { 1351 void WebMediaPlayerImpl::OnPause() {
1328 pause(); 1352 pause();
1329 client_->playbackStateChanged(); 1353 client_->playbackStateChanged();
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 pipeline_metadata_.natural_size, 1917 pipeline_metadata_.natural_size,
1894 base::Bind(&GetCurrentTimeInternal, this))); 1918 base::Bind(&GetCurrentTimeInternal, this)));
1895 watch_time_reporter_->OnVolumeChange(volume_); 1919 watch_time_reporter_->OnVolumeChange(volume_);
1896 if (delegate_ && delegate_->IsHidden()) 1920 if (delegate_ && delegate_->IsHidden())
1897 watch_time_reporter_->OnHidden(); 1921 watch_time_reporter_->OnHidden();
1898 else 1922 else
1899 watch_time_reporter_->OnShown(); 1923 watch_time_reporter_->OnShown();
1900 } 1924 }
1901 1925
1902 } // namespace media 1926 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698