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

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

Issue 2631633003: [Video] Only start tracking foreground time if the video was resumed. (Closed)
Patch Set: Split the histogram into paused and disabled track Created 3 years, 11 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 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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 } 121 }
122 122
123 bool IsResumeBackgroundVideosEnabled() { 123 bool IsResumeBackgroundVideosEnabled() {
124 return base::FeatureList::IsEnabled(kResumeBackgroundVideo); 124 return base::FeatureList::IsEnabled(kResumeBackgroundVideo);
125 } 125 }
126 126
127 bool IsBackgroundVideoTrackOptimizationEnabled() { 127 bool IsBackgroundVideoTrackOptimizationEnabled() {
128 return base::FeatureList::IsEnabled(kBackgroundVideoTrackOptimization); 128 return base::FeatureList::IsEnabled(kBackgroundVideoTrackOptimization);
129 } 129 }
130 130
131 bool IsBackgroundVideoPauseEnabled() {
132 #if defined(OS_ANDROID)
133 return true;
134 #else
135 return IsBackgroundVideoTrackOptimizationEnabled();
136 #endif
137 }
138
131 bool IsNetworkStateError(blink::WebMediaPlayer::NetworkState state) { 139 bool IsNetworkStateError(blink::WebMediaPlayer::NetworkState state) {
132 bool result = state == blink::WebMediaPlayer::NetworkStateFormatError || 140 bool result = state == blink::WebMediaPlayer::NetworkStateFormatError ||
133 state == blink::WebMediaPlayer::NetworkStateNetworkError || 141 state == blink::WebMediaPlayer::NetworkStateNetworkError ||
134 state == blink::WebMediaPlayer::NetworkStateDecodeError; 142 state == blink::WebMediaPlayer::NetworkStateDecodeError;
135 DCHECK_EQ(state > blink::WebMediaPlayer::NetworkStateLoaded, result); 143 DCHECK_EQ(state > blink::WebMediaPlayer::NetworkStateLoaded, result);
136 return result; 144 return result;
137 } 145 }
138 146
139 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) { 147 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) {
140 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270) 148 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270)
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 if (video_weblayer_) 1411 if (video_weblayer_)
1404 video_weblayer_->layer()->SetContentsOpaque(opaque_); 1412 video_weblayer_->layer()->SetContentsOpaque(opaque_);
1405 } 1413 }
1406 1414
1407 void WebMediaPlayerImpl::OnFrameHidden() { 1415 void WebMediaPlayerImpl::OnFrameHidden() {
1408 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1416 DCHECK(main_task_runner_->BelongsToCurrentThread());
1409 1417
1410 if (watch_time_reporter_) 1418 if (watch_time_reporter_)
1411 watch_time_reporter_->OnHidden(); 1419 watch_time_reporter_->OnHidden();
1412 1420
1413 if (ShouldPauseWhenHidden()) { 1421 if (IsBackgroundVideoPauseEnabled() && ShouldPauseWhenHidden()) {
1414 if (!paused_when_hidden_) { 1422 if (!paused_when_hidden_) {
1415 // OnPause() will set |paused_when_hidden_| to false and call 1423 // OnPause() will set |paused_when_hidden_| to false and call
1416 // UpdatePlayState(), so set the flag to true after and then return. 1424 // UpdatePlayState(), so set the flag to true after and then return.
1417 OnPause(); 1425 OnPause();
1418 paused_when_hidden_ = true; 1426 paused_when_hidden_ = true;
1419 return; 1427 return;
1420 } 1428 }
1421 } else { 1429 } else {
1422 DisableVideoTrackIfNeeded(); 1430 DisableVideoTrackIfNeeded();
1423 } 1431 }
(...skipping 10 matching lines...) Expand all
1434 UpdatePlayState(); 1442 UpdatePlayState();
1435 } 1443 }
1436 1444
1437 void WebMediaPlayerImpl::OnFrameShown() { 1445 void WebMediaPlayerImpl::OnFrameShown() {
1438 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1446 DCHECK(main_task_runner_->BelongsToCurrentThread());
1439 background_pause_timer_.Stop(); 1447 background_pause_timer_.Stop();
1440 1448
1441 if (watch_time_reporter_) 1449 if (watch_time_reporter_)
1442 watch_time_reporter_->OnShown(); 1450 watch_time_reporter_->OnShown();
1443 1451
1444 compositor_task_runner_->PostTask( 1452 // Only track the time to the first frame if playing or about to play because
1445 FROM_HERE, 1453 // of being shown and only for videos we would optimize background playback
1446 base::Bind(&VideoFrameCompositor::SetForegroundTime, 1454 // for.
1447 base::Unretained(compositor_), base::TimeTicks::Now())); 1455 if (!paused_ && ShouldDisableVideoWhenHidden()) {
1456 compositor_task_runner_->PostTask(
1457 FROM_HERE,
1458 base::Bind(
1459 &VideoFrameCompositor::SetForegroundTime,
1460 base::Unretained(compositor_), base::TimeTicks::Now(),
1461 VideoFrameCompositor::BackgroundVideoOptimization::DisabledTrack));
1462 } else if (paused_when_hidden_ && ShouldPauseWhenHidden()) {
1463 compositor_task_runner_->PostTask(
1464 FROM_HERE,
1465 base::Bind(&VideoFrameCompositor::SetForegroundTime,
1466 base::Unretained(compositor_), base::TimeTicks::Now(),
1467 VideoFrameCompositor::BackgroundVideoOptimization::Paused));
1468 }
1448 1469
1449 if (paused_when_hidden_) { 1470 if (paused_when_hidden_) {
1450 paused_when_hidden_ = false; 1471 paused_when_hidden_ = false;
1451 OnPlay(); // Calls UpdatePlayState() so return afterwards. 1472 OnPlay(); // Calls UpdatePlayState() so return afterwards.
1452 return; 1473 return;
1453 } 1474 }
1454 1475
1455 EnableVideoTrackIfNeeded(); 1476 EnableVideoTrackIfNeeded();
1456 1477
1457 UpdatePlayState(); 1478 UpdatePlayState();
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
2116 return pipeline_metadata_.video_rotation == VIDEO_ROTATION_0; 2137 return pipeline_metadata_.video_rotation == VIDEO_ROTATION_0;
2117 } 2138 }
2118 2139
2119 void WebMediaPlayerImpl::ActivateViewportIntersectionMonitoring(bool activate) { 2140 void WebMediaPlayerImpl::ActivateViewportIntersectionMonitoring(bool activate) {
2120 DCHECK(main_task_runner_->BelongsToCurrentThread()); 2141 DCHECK(main_task_runner_->BelongsToCurrentThread());
2121 2142
2122 client_->activateViewportIntersectionMonitoring(activate); 2143 client_->activateViewportIntersectionMonitoring(activate);
2123 } 2144 }
2124 2145
2125 bool WebMediaPlayerImpl::ShouldPauseWhenHidden() const { 2146 bool WebMediaPlayerImpl::ShouldPauseWhenHidden() const {
2126 DCHECK(IsHidden()); 2147 // Don't pause videos being Cast (Android only).
2127 // Don't pause videos being Cast (Android only) or if the background video
2128 // optimizations are off (desktop only).
2129 #if defined(OS_ANDROID) // WMPI_CAST 2148 #if defined(OS_ANDROID) // WMPI_CAST
2130 if (isRemote()) 2149 if (isRemote())
2131 return false; 2150 return false;
2132 #else // defined(OS_ANDROID)
2133 if (!IsBackgroundVideoTrackOptimizationEnabled())
2134 return false;
2135 #endif // defined(OS_ANDROID) 2151 #endif // defined(OS_ANDROID)
2136 2152
2137 return hasVideo() && !hasAudio(); 2153 return hasVideo() && !hasAudio();
2138 } 2154 }
2139 2155
2140 bool WebMediaPlayerImpl::ShouldDisableVideoWhenHidden() const { 2156 bool WebMediaPlayerImpl::ShouldDisableVideoWhenHidden() const {
2141 DCHECK(main_task_runner_->BelongsToCurrentThread()); 2157 DCHECK(main_task_runner_->BelongsToCurrentThread());
2142 DCHECK(IsHidden());
2143 2158
2144 if (!IsBackgroundVideoTrackOptimizationEnabled() || !hasVideo() || 2159 // Don't disable video track for videos being Cast (Android only).
2145 !hasAudio() || IsStreaming()) { 2160 #if defined(OS_ANDROID) // WMPI_CAST
2161 if (isRemote())
2146 return false; 2162 return false;
2147 } 2163 #endif // defined(OS_ANDROID)
2164
2165 if (!hasVideo() || !hasAudio() || IsStreaming())
2166 return false;
2148 2167
2149 PipelineStatistics stats = GetPipelineStatistics(); 2168 PipelineStatistics stats = GetPipelineStatistics();
2150 return stats.video_keyframe_distance_average < 2169 return stats.video_keyframe_distance_average <
2151 max_keyframe_distance_to_disable_background_video_; 2170 max_keyframe_distance_to_disable_background_video_;
2152 } 2171 }
2153 2172
2154 void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() { 2173 void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() {
2155 DCHECK(!IsHidden()); 2174 DCHECK(!IsHidden());
2156 2175
2157 // Don't change video track while the pipeline is resuming or seeking. 2176 // Don't change video track while the pipeline is resuming or seeking.
2158 if (is_pipeline_resuming_ || seeking_) 2177 if (is_pipeline_resuming_ || seeking_)
2159 return; 2178 return;
2160 2179
2161 if (video_track_disabled_) { 2180 if (video_track_disabled_) {
2162 video_track_disabled_ = false; 2181 video_track_disabled_ = false;
2163 if (client_->hasSelectedVideoTrack()) { 2182 if (client_->hasSelectedVideoTrack()) {
2164 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId(); 2183 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId();
2165 selectedVideoTrackChanged(&trackId); 2184 selectedVideoTrackChanged(&trackId);
2166 } 2185 }
2167 } 2186 }
2168 } 2187 }
2169 2188
2170 void WebMediaPlayerImpl::DisableVideoTrackIfNeeded() { 2189 void WebMediaPlayerImpl::DisableVideoTrackIfNeeded() {
2171 DCHECK(IsHidden()); 2190 DCHECK(IsHidden());
2172 2191
2173 // Don't change video track while the pipeline is resuming or seeking. 2192 // Don't change video track while the pipeline is resuming or seeking.
2174 if (is_pipeline_resuming_ || seeking_) 2193 if (is_pipeline_resuming_ || seeking_)
2175 return; 2194 return;
2176 2195
2177 if (!video_track_disabled_ && ShouldDisableVideoWhenHidden()) { 2196 if (!video_track_disabled_ && IsBackgroundVideoTrackOptimizationEnabled() &&
2197 ShouldDisableVideoWhenHidden()) {
2178 video_track_disabled_ = true; 2198 video_track_disabled_ = true;
2179 selectedVideoTrackChanged(nullptr); 2199 selectedVideoTrackChanged(nullptr);
2180 } 2200 }
2181 } 2201 }
2182 2202
2183 void WebMediaPlayerImpl::SetPipelineStatisticsForTest( 2203 void WebMediaPlayerImpl::SetPipelineStatisticsForTest(
2184 const PipelineStatistics& stats) { 2204 const PipelineStatistics& stats) {
2185 pipeline_statistics_for_test_ = base::make_optional(stats); 2205 pipeline_statistics_for_test_ = base::make_optional(stats);
2186 } 2206 }
2187 2207
2188 PipelineStatistics WebMediaPlayerImpl::GetPipelineStatistics() const { 2208 PipelineStatistics WebMediaPlayerImpl::GetPipelineStatistics() const {
2189 DCHECK(main_task_runner_->BelongsToCurrentThread()); 2209 DCHECK(main_task_runner_->BelongsToCurrentThread());
2190 2210
2191 return pipeline_statistics_for_test_.value_or(pipeline_.GetStatistics()); 2211 return pipeline_statistics_for_test_.value_or(pipeline_.GetStatistics());
2192 } 2212 }
2193 2213
2194 } // namespace media 2214 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698