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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 #else | 117 #else |
118 return !base::CommandLine::ForCurrentProcess()->HasSwitch( | 118 return !base::CommandLine::ForCurrentProcess()->HasSwitch( |
119 switches::kDisableMediaSuspend); | 119 switches::kDisableMediaSuspend); |
120 #endif | 120 #endif |
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() { |
| 128 return base::FeatureList::IsEnabled(kBackgroundVideoTrackOptimization); |
| 129 } |
| 130 |
127 bool IsNetworkStateError(blink::WebMediaPlayer::NetworkState state) { | 131 bool IsNetworkStateError(blink::WebMediaPlayer::NetworkState state) { |
128 bool result = state == blink::WebMediaPlayer::NetworkStateFormatError || | 132 bool result = state == blink::WebMediaPlayer::NetworkStateFormatError || |
129 state == blink::WebMediaPlayer::NetworkStateNetworkError || | 133 state == blink::WebMediaPlayer::NetworkStateNetworkError || |
130 state == blink::WebMediaPlayer::NetworkStateDecodeError; | 134 state == blink::WebMediaPlayer::NetworkStateDecodeError; |
131 DCHECK_EQ(state > blink::WebMediaPlayer::NetworkStateLoaded, result); | 135 DCHECK_EQ(state > blink::WebMediaPlayer::NetworkStateLoaded, result); |
132 return result; | 136 return result; |
133 } | 137 } |
134 | 138 |
135 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) { | 139 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) { |
136 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270) | 140 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270) |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 << "]"; | 648 << "]"; |
645 pipeline_.OnEnabledAudioTracksChanged(enabledMediaTrackIds); | 649 pipeline_.OnEnabledAudioTracksChanged(enabledMediaTrackIds); |
646 } | 650 } |
647 | 651 |
648 void WebMediaPlayerImpl::selectedVideoTrackChanged( | 652 void WebMediaPlayerImpl::selectedVideoTrackChanged( |
649 blink::WebMediaPlayer::TrackId* selectedTrackId) { | 653 blink::WebMediaPlayer::TrackId* selectedTrackId) { |
650 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 654 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
651 | 655 |
652 std::ostringstream logstr; | 656 std::ostringstream logstr; |
653 std::vector<MediaTrack::Id> selectedVideoMediaTrackId; | 657 std::vector<MediaTrack::Id> selectedVideoMediaTrackId; |
654 if (selectedTrackId) { | 658 bool canAddVideoTrack = |
| 659 !IsBackgroundVideoTrackOptimizationEnabled() || !IsHidden(); |
| 660 if (selectedTrackId && canAddVideoTrack) { |
655 selectedVideoMediaTrackId.push_back(selectedTrackId->utf8().data()); | 661 selectedVideoMediaTrackId.push_back(selectedTrackId->utf8().data()); |
656 logstr << selectedVideoMediaTrackId[0]; | 662 logstr << selectedVideoMediaTrackId[0]; |
657 } | 663 } |
658 MEDIA_LOG(INFO, media_log_) << "Selected video track: [" << logstr.str() | 664 MEDIA_LOG(INFO, media_log_) << "Selected video track: [" << logstr.str() |
659 << "]"; | 665 << "]"; |
660 pipeline_.OnSelectedVideoTrackChanged(selectedVideoMediaTrackId); | 666 pipeline_.OnSelectedVideoTrackChanged(selectedVideoMediaTrackId); |
661 } | 667 } |
662 | 668 |
663 blink::WebSize WebMediaPlayerImpl::naturalSize() const { | 669 blink::WebSize WebMediaPlayerImpl::naturalSize() const { |
664 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 670 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1302 | 1308 |
1303 opaque_ = opaque; | 1309 opaque_ = opaque; |
1304 // Modify content opaqueness of cc::Layer directly so that | 1310 // Modify content opaqueness of cc::Layer directly so that |
1305 // SetContentsOpaqueIsFixed is ignored. | 1311 // SetContentsOpaqueIsFixed is ignored. |
1306 if (video_weblayer_) | 1312 if (video_weblayer_) |
1307 video_weblayer_->layer()->SetContentsOpaque(opaque_); | 1313 video_weblayer_->layer()->SetContentsOpaque(opaque_); |
1308 } | 1314 } |
1309 | 1315 |
1310 void WebMediaPlayerImpl::OnHidden() { | 1316 void WebMediaPlayerImpl::OnHidden() { |
1311 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1317 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1318 |
| 1319 if (IsBackgroundVideoTrackOptimizationEnabled()) |
| 1320 selectedVideoTrackChanged(nullptr); |
| 1321 |
1312 if (watch_time_reporter_) | 1322 if (watch_time_reporter_) |
1313 watch_time_reporter_->OnHidden(); | 1323 watch_time_reporter_->OnHidden(); |
1314 | 1324 |
1315 UpdatePlayState(); | 1325 UpdatePlayState(); |
1316 | 1326 |
1317 // Schedule suspended playing media to be paused if the user doesn't come back | 1327 // Schedule suspended playing media to be paused if the user doesn't come back |
1318 // to it within some timeout period to avoid any autoplay surprises. | 1328 // to it within some timeout period to avoid any autoplay surprises. |
1319 ScheduleIdlePauseTimer(); | 1329 ScheduleIdlePauseTimer(); |
1320 } | 1330 } |
1321 | 1331 |
1322 void WebMediaPlayerImpl::OnShown() { | 1332 void WebMediaPlayerImpl::OnShown() { |
1323 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1333 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1324 if (watch_time_reporter_) | 1334 if (watch_time_reporter_) |
1325 watch_time_reporter_->OnShown(); | 1335 watch_time_reporter_->OnShown(); |
1326 | 1336 |
| 1337 if (IsBackgroundVideoTrackOptimizationEnabled() && |
| 1338 client_->hasSelectedVideoTrack()) { |
| 1339 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId(); |
| 1340 selectedVideoTrackChanged(&trackId); |
| 1341 } |
| 1342 |
1327 must_suspend_ = false; | 1343 must_suspend_ = false; |
1328 background_pause_timer_.Stop(); | 1344 background_pause_timer_.Stop(); |
1329 | 1345 |
1330 UpdatePlayState(); | 1346 UpdatePlayState(); |
1331 } | 1347 } |
1332 | 1348 |
1333 bool WebMediaPlayerImpl::OnSuspendRequested(bool must_suspend) { | 1349 bool WebMediaPlayerImpl::OnSuspendRequested(bool must_suspend) { |
1334 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1350 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1335 | 1351 |
1336 if (must_suspend) { | 1352 if (must_suspend) { |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 | 1709 |
1694 #if defined(OS_ANDROID) // WMPI_CAST | 1710 #if defined(OS_ANDROID) // WMPI_CAST |
1695 bool is_remote = isRemote(); | 1711 bool is_remote = isRemote(); |
1696 bool is_streaming = false; | 1712 bool is_streaming = false; |
1697 #else | 1713 #else |
1698 bool is_remote = false; | 1714 bool is_remote = false; |
1699 bool is_streaming = data_source_ && data_source_->IsStreaming(); | 1715 bool is_streaming = data_source_ && data_source_->IsStreaming(); |
1700 #endif | 1716 #endif |
1701 | 1717 |
1702 bool is_suspended = pipeline_controller_.IsSuspended(); | 1718 bool is_suspended = pipeline_controller_.IsSuspended(); |
1703 bool is_backgrounded = | 1719 bool is_backgrounded = IsBackgroundedSuspendEnabled() && IsHidden(); |
1704 IsBackgroundedSuspendEnabled() && delegate_ && delegate_->IsHidden(); | |
1705 PlayState state = UpdatePlayState_ComputePlayState( | 1720 PlayState state = UpdatePlayState_ComputePlayState( |
1706 is_remote, is_streaming, is_suspended, is_backgrounded); | 1721 is_remote, is_streaming, is_suspended, is_backgrounded); |
1707 SetDelegateState(state.delegate_state); | 1722 SetDelegateState(state.delegate_state); |
1708 SetMemoryReportingState(state.is_memory_reporting_enabled); | 1723 SetMemoryReportingState(state.is_memory_reporting_enabled); |
1709 SetSuspendState(state.is_suspended || pending_suspend_resume_cycle_); | 1724 SetSuspendState(state.is_suspended || pending_suspend_resume_cycle_); |
1710 } | 1725 } |
1711 | 1726 |
1712 void WebMediaPlayerImpl::SetDelegateState(DelegateState new_state) { | 1727 void WebMediaPlayerImpl::SetDelegateState(DelegateState new_state) { |
1713 if (!delegate_) | 1728 if (!delegate_) |
1714 return; | 1729 return; |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 this, &WebMediaPlayerImpl::OnPause); | 1968 this, &WebMediaPlayerImpl::OnPause); |
1954 } | 1969 } |
1955 | 1970 |
1956 void WebMediaPlayerImpl::CreateWatchTimeReporter() { | 1971 void WebMediaPlayerImpl::CreateWatchTimeReporter() { |
1957 // Create the watch time reporter and synchronize its initial state. | 1972 // Create the watch time reporter and synchronize its initial state. |
1958 watch_time_reporter_.reset(new WatchTimeReporter( | 1973 watch_time_reporter_.reset(new WatchTimeReporter( |
1959 hasAudio(), hasVideo(), !!chunk_demuxer_, is_encrypted_, media_log_, | 1974 hasAudio(), hasVideo(), !!chunk_demuxer_, is_encrypted_, media_log_, |
1960 pipeline_metadata_.natural_size, | 1975 pipeline_metadata_.natural_size, |
1961 base::Bind(&GetCurrentTimeInternal, this))); | 1976 base::Bind(&GetCurrentTimeInternal, this))); |
1962 watch_time_reporter_->OnVolumeChange(volume_); | 1977 watch_time_reporter_->OnVolumeChange(volume_); |
1963 if (delegate_ && delegate_->IsHidden()) | 1978 if (IsHidden()) |
1964 watch_time_reporter_->OnHidden(); | 1979 watch_time_reporter_->OnHidden(); |
1965 else | 1980 else |
1966 watch_time_reporter_->OnShown(); | 1981 watch_time_reporter_->OnShown(); |
1967 } | 1982 } |
1968 | 1983 |
| 1984 bool WebMediaPlayerImpl::IsHidden() const { |
| 1985 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1986 |
| 1987 return delegate_ && delegate_->IsHidden(); |
| 1988 } |
| 1989 |
1969 } // namespace media | 1990 } // namespace media |
OLD | NEW |