Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1114 } else { | 1114 } else { |
| 1115 DCHECK(watch_time_reporter_); | 1115 DCHECK(watch_time_reporter_); |
| 1116 watch_time_reporter_->OnPlaying(); | 1116 watch_time_reporter_->OnPlaying(); |
| 1117 } | 1117 } |
| 1118 if (time_updated) | 1118 if (time_updated) |
| 1119 should_notify_time_changed_ = true; | 1119 should_notify_time_changed_ = true; |
| 1120 | 1120 |
| 1121 // Reset underflow count upon seek; this prevents looping videos and user | 1121 // Reset underflow count upon seek; this prevents looping videos and user |
| 1122 // actions from artificially inflating the underflow count. | 1122 // actions from artificially inflating the underflow count. |
| 1123 underflow_count_ = 0; | 1123 underflow_count_ = 0; |
| 1124 | |
| 1125 // Background video optimizations are delayed when shown/hidden if pipeline | |
| 1126 // is seeking. | |
| 1127 UpdateBackgroundVideoOptimizationState(); | |
| 1124 } | 1128 } |
| 1125 | 1129 |
| 1126 void WebMediaPlayerImpl::OnPipelineSuspended() { | 1130 void WebMediaPlayerImpl::OnPipelineSuspended() { |
| 1127 #if defined(OS_ANDROID) | 1131 #if defined(OS_ANDROID) |
| 1128 if (isRemote()) { | 1132 if (isRemote()) { |
| 1129 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner(); | 1133 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner(); |
| 1130 if (frame) | 1134 if (frame) |
| 1131 compositor_->PaintSingleFrame(frame); | 1135 compositor_->PaintSingleFrame(frame); |
| 1132 } | 1136 } |
| 1133 #endif | 1137 #endif |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1153 // renderer will attach its callbacks to the video stream properly. | 1157 // renderer will attach its callbacks to the video stream properly. |
| 1154 // TODO(avayvod): Remove this when disabling and enabling video tracks in | 1158 // TODO(avayvod): Remove this when disabling and enabling video tracks in |
| 1155 // non-playing state works correctly. See https://crbug.com/678374. | 1159 // non-playing state works correctly. See https://crbug.com/678374. |
| 1156 EnableVideoTrackIfNeeded(); | 1160 EnableVideoTrackIfNeeded(); |
| 1157 is_pipeline_resuming_ = true; | 1161 is_pipeline_resuming_ = true; |
| 1158 } | 1162 } |
| 1159 | 1163 |
| 1160 void WebMediaPlayerImpl::OnPipelineResumed() { | 1164 void WebMediaPlayerImpl::OnPipelineResumed() { |
| 1161 is_pipeline_resuming_ = false; | 1165 is_pipeline_resuming_ = false; |
| 1162 | 1166 |
| 1163 if (IsHidden()) { | 1167 UpdateBackgroundVideoOptimizationState(); |
| 1164 DisableVideoTrackIfNeeded(); | |
| 1165 } else { | |
| 1166 EnableVideoTrackIfNeeded(); | |
| 1167 } | |
| 1168 } | 1168 } |
| 1169 | 1169 |
| 1170 void WebMediaPlayerImpl::OnDemuxerOpened() { | 1170 void WebMediaPlayerImpl::OnDemuxerOpened() { |
| 1171 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1171 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1172 client_->mediaSourceOpened( | 1172 client_->mediaSourceOpened( |
| 1173 new WebMediaSourceImpl(chunk_demuxer_, media_log_)); | 1173 new WebMediaSourceImpl(chunk_demuxer_, media_log_)); |
| 1174 } | 1174 } |
| 1175 | 1175 |
| 1176 void WebMediaPlayerImpl::OnError(PipelineStatus status) { | 1176 void WebMediaPlayerImpl::OnError(PipelineStatus status) { |
| 1177 DVLOG(1) << __func__; | 1177 DVLOG(1) << __func__; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1403 if (video_weblayer_) | 1403 if (video_weblayer_) |
| 1404 video_weblayer_->layer()->SetContentsOpaque(opaque_); | 1404 video_weblayer_->layer()->SetContentsOpaque(opaque_); |
| 1405 } | 1405 } |
| 1406 | 1406 |
| 1407 void WebMediaPlayerImpl::OnFrameHidden() { | 1407 void WebMediaPlayerImpl::OnFrameHidden() { |
| 1408 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1408 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1409 | 1409 |
| 1410 if (watch_time_reporter_) | 1410 if (watch_time_reporter_) |
| 1411 watch_time_reporter_->OnHidden(); | 1411 watch_time_reporter_->OnHidden(); |
| 1412 | 1412 |
| 1413 if (ShouldPauseVideoWhenHidden()) { | 1413 if (ShouldPauseVideoWhenHidden()) { |
|
sandersd (OOO until July 31)
2017/01/20 22:57:00
Should just call UpdateBackgroundVideoOptimization
whywhat
2017/01/20 23:24:45
Hm, here we already know we're hidden.
We also wan
sandersd (OOO until July 31)
2017/01/20 23:29:42
Ah I see, I missed the early return when comparing
| |
| 1414 if (!paused_when_hidden_) { | 1414 PauseVideoIfNeeded(); |
| 1415 // OnPause() will set |paused_when_hidden_| to false and call | 1415 return; |
| 1416 // UpdatePlayState(), so set the flag to true after and then return. | |
| 1417 OnPause(); | |
| 1418 paused_when_hidden_ = true; | |
| 1419 return; | |
| 1420 } | |
| 1421 } else { | 1416 } else { |
| 1422 DisableVideoTrackIfNeeded(); | 1417 DisableVideoTrackIfNeeded(); |
| 1423 } | 1418 } |
| 1424 | 1419 |
| 1425 UpdatePlayState(); | 1420 UpdatePlayState(); |
| 1426 | 1421 |
| 1427 // Schedule suspended playing media to be paused if the user doesn't come back | 1422 // Schedule suspended playing media to be paused if the user doesn't come back |
| 1428 // to it within some timeout period to avoid any autoplay surprises. | 1423 // to it within some timeout period to avoid any autoplay surprises. |
| 1429 ScheduleIdlePauseTimer(); | 1424 ScheduleIdlePauseTimer(); |
| 1430 } | 1425 } |
| (...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2175 base::TimeDelta duration = GetPipelineMediaDuration(); | 2170 base::TimeDelta duration = GetPipelineMediaDuration(); |
| 2176 if (duration < max_keyframe_distance_to_disable_background_video_) | 2171 if (duration < max_keyframe_distance_to_disable_background_video_) |
| 2177 return true; | 2172 return true; |
| 2178 | 2173 |
| 2179 // Otherwise, only optimize videos with shorter average keyframe distance. | 2174 // Otherwise, only optimize videos with shorter average keyframe distance. |
| 2180 PipelineStatistics stats = GetPipelineStatistics(); | 2175 PipelineStatistics stats = GetPipelineStatistics(); |
| 2181 return stats.video_keyframe_distance_average < | 2176 return stats.video_keyframe_distance_average < |
| 2182 max_keyframe_distance_to_disable_background_video_; | 2177 max_keyframe_distance_to_disable_background_video_; |
| 2183 } | 2178 } |
| 2184 | 2179 |
| 2180 void WebMediaPlayerImpl::UpdateBackgroundVideoOptimizationState() { | |
| 2181 if (IsHidden()) { | |
| 2182 if (ShouldPauseVideoWhenHidden()) | |
| 2183 PauseVideoIfNeeded(); | |
| 2184 else | |
| 2185 DisableVideoTrackIfNeeded(); | |
| 2186 } else { | |
| 2187 EnableVideoTrackIfNeeded(); | |
| 2188 } | |
| 2189 } | |
| 2190 | |
| 2191 void WebMediaPlayerImpl::PauseVideoIfNeeded() { | |
| 2192 DCHECK(IsHidden()); | |
| 2193 | |
| 2194 // Don't pause video while the pipeline is stopped, resuming or seeking. | |
| 2195 // Also if the video is paused already. | |
| 2196 if (!pipeline_.IsRunning() || is_pipeline_resuming_ || seeking_ || paused_) | |
| 2197 return; | |
| 2198 | |
| 2199 // OnPause() will set |paused_when_hidden_| to false and call | |
| 2200 // UpdatePlayState(), so set the flag to true after and then return. | |
| 2201 OnPause(); | |
| 2202 paused_when_hidden_ = true; | |
| 2203 } | |
| 2204 | |
| 2185 void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() { | 2205 void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() { |
| 2186 // Don't change video track while the pipeline is resuming or seeking. | 2206 // Don't change video track while the pipeline is stopped, resuming or |
| 2187 if (is_pipeline_resuming_ || seeking_) | 2207 // seeking. |
| 2208 if (!pipeline_.IsRunning() || is_pipeline_resuming_ || seeking_) | |
| 2188 return; | 2209 return; |
| 2189 | 2210 |
| 2190 if (video_track_disabled_) { | 2211 if (video_track_disabled_) { |
| 2191 video_track_disabled_ = false; | 2212 video_track_disabled_ = false; |
| 2192 if (client_->hasSelectedVideoTrack()) { | 2213 if (client_->hasSelectedVideoTrack()) { |
| 2193 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId(); | 2214 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId(); |
| 2194 selectedVideoTrackChanged(&trackId); | 2215 selectedVideoTrackChanged(&trackId); |
| 2195 } | 2216 } |
| 2196 } | 2217 } |
| 2197 } | 2218 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2240 UMA_HISTOGRAM_TIMES( | 2261 UMA_HISTOGRAM_TIMES( |
| 2241 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", | 2262 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", |
| 2242 time_to_first_frame); | 2263 time_to_first_frame); |
| 2243 } else { | 2264 } else { |
| 2244 UMA_HISTOGRAM_TIMES("Media.Video.TimeFromForegroundToFirstFrame.Paused", | 2265 UMA_HISTOGRAM_TIMES("Media.Video.TimeFromForegroundToFirstFrame.Paused", |
| 2245 time_to_first_frame); | 2266 time_to_first_frame); |
| 2246 } | 2267 } |
| 2247 } | 2268 } |
| 2248 | 2269 |
| 2249 } // namespace media | 2270 } // namespace media |
| OLD | NEW |