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 "content/renderer/media/android/webmediaplayer_android.h" | 5 #include "content/renderer/media/android/webmediaplayer_android.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 enable_texture_copy_(enable_texture_copy), | 175 enable_texture_copy_(enable_texture_copy), |
| 176 suppress_deleting_texture_(false), | 176 suppress_deleting_texture_(false), |
| 177 playback_completed_(false), | 177 playback_completed_(false), |
| 178 volume_(1.0), | 178 volume_(1.0), |
| 179 volume_multiplier_(1.0), | 179 volume_multiplier_(1.0), |
| 180 weak_factory_(this) { | 180 weak_factory_(this) { |
| 181 DCHECK(player_manager_); | 181 DCHECK(player_manager_); |
| 182 | 182 |
| 183 DCHECK(main_thread_checker_.CalledOnValidThread()); | 183 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 184 | 184 |
| 185 if (delegate_) | 185 if (delegate_) { |
| 186 delegate_id_ = delegate_->AddObserver(this); | 186 delegate_id_ = delegate_->AddObserver(this); |
| 187 delegate_->SetIdle(delegate_id_, true); | |
| 188 } | |
| 187 | 189 |
| 188 player_id_ = player_manager_->RegisterMediaPlayer(this); | 190 player_id_ = player_manager_->RegisterMediaPlayer(this); |
| 189 | 191 |
| 190 TryCreateStreamTextureProxyIfNeeded(); | 192 TryCreateStreamTextureProxyIfNeeded(); |
| 191 interpolator_.SetUpperBound(base::TimeDelta()); | 193 interpolator_.SetUpperBound(base::TimeDelta()); |
| 192 } | 194 } |
| 193 | 195 |
| 194 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { | 196 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
| 195 DCHECK(main_thread_checker_.CalledOnValidThread()); | 197 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 196 SetVideoFrameProviderClient(NULL); | 198 SetVideoFrameProviderClient(NULL); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 288 return false; | 290 return false; |
| 289 } | 291 } |
| 290 | 292 |
| 291 void WebMediaPlayerAndroid::play() { | 293 void WebMediaPlayerAndroid::play() { |
| 292 DCHECK(main_thread_checker_.CalledOnValidThread()); | 294 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 293 | 295 |
| 294 if (hasVideo() && player_manager_->render_frame()->IsHidden()) { | 296 if (hasVideo() && player_manager_->render_frame()->IsHidden()) { |
| 295 bool can_video_play_in_background = | 297 bool can_video_play_in_background = |
| 296 base::CommandLine::ForCurrentProcess()->HasSwitch( | 298 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 297 switches::kDisableMediaSuspend) || | 299 switches::kDisableMediaSuspend) || |
| 298 (IsBackgroundVideoCandidate() && | 300 (IsBackgroundVideoCandidate() && delegate_ && |
|
whywhat
2016/12/12 18:11:23
nit: isBackgroundVideoCandidate will already check
sandersd (OOO until July 31)
2017/01/05 23:12:21
Done.
| |
| 299 delegate_ && delegate_->IsPlayingBackgroundVideo()); | 301 delegate_->IsFrameHidden() && !delegate_->IsFrameClosed() && |
| 302 delegate_->IsBackgroundVideoPlaybackAllowed()); | |
| 300 if (!can_video_play_in_background) { | 303 if (!can_video_play_in_background) { |
| 301 is_play_pending_ = true; | 304 is_play_pending_ = true; |
| 302 return; | 305 return; |
| 303 } | 306 } |
| 304 } | 307 } |
| 305 is_play_pending_ = false; | 308 is_play_pending_ = false; |
| 306 | 309 |
| 307 TryCreateStreamTextureProxyIfNeeded(); | 310 TryCreateStreamTextureProxyIfNeeded(); |
| 308 // There is no need to establish the surface texture peer for fullscreen | 311 // There is no need to establish the surface texture peer for fullscreen |
| 309 // video. | 312 // video. |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 816 | 819 |
| 817 // Lazily allocate compositing layer. | 820 // Lazily allocate compositing layer. |
| 818 if (!video_weblayer_) { | 821 if (!video_weblayer_) { |
| 819 video_weblayer_.reset(new cc_blink::WebLayerImpl( | 822 video_weblayer_.reset(new cc_blink::WebLayerImpl( |
| 820 cc::VideoLayer::Create(this, media::VIDEO_ROTATION_0))); | 823 cc::VideoLayer::Create(this, media::VIDEO_ROTATION_0))); |
| 821 client_->setWebLayer(video_weblayer_.get()); | 824 client_->setWebLayer(video_weblayer_.get()); |
| 822 | 825 |
| 823 // If we're paused after we receive metadata for the first time, tell the | 826 // If we're paused after we receive metadata for the first time, tell the |
| 824 // delegate we can now be safely suspended due to inactivity if a subsequent | 827 // delegate we can now be safely suspended due to inactivity if a subsequent |
| 825 // play event does not occur. | 828 // play event does not occur. |
| 826 if (paused() && delegate_) | 829 if (paused() && delegate_) { |
| 827 delegate_->DidPause(delegate_id_, false); | 830 delegate_->DidPause(delegate_id_); |
| 831 delegate_->SetIdle(delegate_id_, true); | |
| 832 } | |
| 828 } | 833 } |
| 829 } | 834 } |
| 830 | 835 |
| 831 void WebMediaPlayerAndroid::OnTimeUpdate(base::TimeDelta current_timestamp, | 836 void WebMediaPlayerAndroid::OnTimeUpdate(base::TimeDelta current_timestamp, |
| 832 base::TimeTicks current_time_ticks) { | 837 base::TimeTicks current_time_ticks) { |
| 833 DCHECK(main_thread_checker_.CalledOnValidThread()); | 838 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 834 | 839 |
| 835 if (seeking()) | 840 if (seeking()) |
| 836 return; | 841 return; |
| 837 | 842 |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1192 interpolator_.StartInterpolating(); | 1197 interpolator_.StartInterpolating(); |
| 1193 else | 1198 else |
| 1194 interpolator_.StopInterpolating(); | 1199 interpolator_.StopInterpolating(); |
| 1195 | 1200 |
| 1196 if (delegate_) { | 1201 if (delegate_) { |
| 1197 if (is_playing) { | 1202 if (is_playing) { |
| 1198 // We must specify either video or audio to the delegate, but neither may | 1203 // We must specify either video or audio to the delegate, but neither may |
| 1199 // be known at this point -- there are no video only containers, so only | 1204 // be known at this point -- there are no video only containers, so only |
| 1200 // send audio if we know for sure its audio. The browser side player will | 1205 // send audio if we know for sure its audio. The browser side player will |
| 1201 // fill in the correct value later for media sessions. | 1206 // fill in the correct value later for media sessions. |
| 1202 delegate_->DidPlay(delegate_id_, hasVideo(), !hasVideo(), isRemote(), | 1207 if (isRemote()) { |
| 1203 media::DurationToMediaContentType(duration_)); | 1208 delegate_->PlayerGone(delegate_id_); |
| 1209 } else { | |
| 1210 delegate_->DidPlay(delegate_id_, !hasVideo(), hasVideo(), | |
| 1211 media::DurationToMediaContentType(duration_)); | |
| 1212 } | |
| 1213 delegate_->SetIdle(delegate_id_, false); | |
| 1204 } else { | 1214 } else { |
| 1205 // Even if OnPlaybackComplete() has not been called yet, Blink may have | 1215 // Even if OnPlaybackComplete() has not been called yet, Blink may have |
| 1206 // already fired the ended event based on current time relative to | 1216 // already fired the ended event based on current time relative to |
| 1207 // duration -- so we need to check both possibilities here. | 1217 // duration -- so we need to check both possibilities here. |
| 1208 delegate_->DidPause(delegate_id_, | 1218 if (playback_completed_ || currentTime() >= duration()) { |
| 1209 playback_completed_ || currentTime() >= duration()); | 1219 delegate_->PlayerGone(delegate_id_); |
| 1220 } else { | |
| 1221 delegate_->DidPause(delegate_id_); | |
| 1222 } | |
| 1223 delegate_->SetIdle(delegate_id_, true); | |
| 1210 } | 1224 } |
| 1211 } | 1225 } |
| 1212 } | 1226 } |
| 1213 | 1227 |
| 1214 void WebMediaPlayerAndroid::OnHidden() { | 1228 void WebMediaPlayerAndroid::OnFrameHidden() { |
| 1215 // Pause audible video preserving its session. | 1229 // Pause audible video preserving its session. |
| 1216 if (hasVideo() && IsBackgroundVideoCandidate() && !paused()) { | 1230 if (hasVideo() && IsBackgroundVideoCandidate() && !paused()) { |
| 1217 Pause(false); | 1231 Pause(false); |
| 1218 is_play_pending_ = true; | 1232 is_play_pending_ = true; |
| 1219 return; | 1233 return; |
| 1220 } | 1234 } |
| 1221 | 1235 |
| 1222 OnSuspendRequested(false); | 1236 OnIdleTimeout(); |
| 1223 } | 1237 } |
| 1224 | 1238 |
| 1225 void WebMediaPlayerAndroid::OnShown() { | 1239 void WebMediaPlayerAndroid::OnFrameClosed() { |
| 1240 SuspendAndReleaseResources(); | |
| 1241 } | |
| 1242 | |
| 1243 void WebMediaPlayerAndroid::OnFrameShown() { | |
| 1226 if (is_play_pending_) | 1244 if (is_play_pending_) |
| 1227 play(); | 1245 play(); |
| 1228 } | 1246 } |
| 1229 | 1247 |
| 1230 bool WebMediaPlayerAndroid::OnSuspendRequested(bool must_suspend) { | 1248 bool WebMediaPlayerAndroid::OnIdleTimeout() { |
| 1231 if (!must_suspend && | 1249 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1232 base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 1233 switches::kDisableMediaSuspend)) { | 1250 switches::kDisableMediaSuspend)) { |
| 1234 return true; | 1251 return true; |
| 1235 } | 1252 } |
| 1236 | 1253 |
| 1237 // If we're idle or playing video, pause and release resources; audio only | 1254 // If we're idle or playing video, pause and release resources; audio only |
| 1238 // players are allowed to continue unless indicated otherwise by the call. | 1255 // players are allowed to continue. |
| 1239 if (must_suspend || (paused() && playback_completed_) || | 1256 if ((paused() && playback_completed_) || |
| 1240 (hasVideo() && !IsBackgroundVideoCandidate())) { | 1257 (hasVideo() && !IsBackgroundVideoCandidate())) { |
| 1241 SuspendAndReleaseResources(); | 1258 SuspendAndReleaseResources(); |
| 1242 } | 1259 } |
| 1243 | 1260 |
| 1244 return true; | 1261 return true; |
| 1245 } | 1262 } |
| 1246 | 1263 |
| 1247 void WebMediaPlayerAndroid::OnPlay() { | 1264 void WebMediaPlayerAndroid::OnPlay() { |
| 1248 play(); | 1265 play(); |
| 1249 client_->playbackStateChanged(); | 1266 client_->playbackStateChanged(); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1315 | 1332 |
| 1316 bool WebMediaPlayerAndroid::IsBackgroundVideoCandidate() const { | 1333 bool WebMediaPlayerAndroid::IsBackgroundVideoCandidate() const { |
| 1317 DCHECK(hasVideo()); | 1334 DCHECK(hasVideo()); |
| 1318 | 1335 |
| 1319 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1336 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1320 switches::kDisableMediaSuspend)) { | 1337 switches::kDisableMediaSuspend)) { |
| 1321 return false; | 1338 return false; |
| 1322 } | 1339 } |
| 1323 | 1340 |
| 1324 return base::FeatureList::IsEnabled(media::kResumeBackgroundVideo) && | 1341 return base::FeatureList::IsEnabled(media::kResumeBackgroundVideo) && |
| 1325 hasAudio() && !isRemote() && delegate_ && delegate_->IsHidden(); | 1342 hasAudio() && !isRemote() && delegate_ && delegate_->IsFrameHidden() && |
| 1343 !delegate_->IsFrameClosed(); | |
| 1326 } | 1344 } |
| 1327 | 1345 |
| 1328 } // namespace content | 1346 } // namespace content |
| OLD | NEW |