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

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

Issue 2696663002: Media Remoting: Don't auto suspend the media pipeline. (Closed)
Patch Set: Fix tests. Created 3 years, 10 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
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | media/blink/webmediaplayer_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 media_log_->AddEvent( 260 media_log_->AddEvent(
261 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 261 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED));
262 262
263 if (params.initial_cdm()) 263 if (params.initial_cdm())
264 SetCdm(params.initial_cdm()); 264 SetCdm(params.initial_cdm());
265 265
266 // TODO(xhwang): When we use an external Renderer, many methods won't work, 266 // TODO(xhwang): When we use an external Renderer, many methods won't work,
267 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861 267 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861
268 audio_source_provider_ = 268 audio_source_provider_ =
269 new WebAudioSourceProviderImpl(params.audio_renderer_sink(), media_log_); 269 new WebAudioSourceProviderImpl(params.audio_renderer_sink(), media_log_);
270
271 if (observer_)
272 observer_->SetClient(this);
270 } 273 }
271 274
272 WebMediaPlayerImpl::~WebMediaPlayerImpl() { 275 WebMediaPlayerImpl::~WebMediaPlayerImpl() {
273 DCHECK(main_task_runner_->BelongsToCurrentThread()); 276 DCHECK(main_task_runner_->BelongsToCurrentThread());
274 277
275 suppress_destruction_errors_ = true; 278 suppress_destruction_errors_ = true;
276 279
277 delegate_->PlayerGone(delegate_id_); 280 delegate_->PlayerGone(delegate_id_);
278 delegate_->RemoveObserver(delegate_id_); 281 delegate_->RemoveObserver(delegate_id_);
279 282
(...skipping 1548 matching lines...) Expand 10 before | Expand all | Expand 10 after
1828 &event)); 1831 &event));
1829 event.Wait(); 1832 event.Wait();
1830 return video_frame; 1833 return video_frame;
1831 } 1834 }
1832 1835
1833 void WebMediaPlayerImpl::UpdatePlayState() { 1836 void WebMediaPlayerImpl::UpdatePlayState() {
1834 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1837 DCHECK(main_task_runner_->BelongsToCurrentThread());
1835 1838
1836 #if defined(OS_ANDROID) // WMPI_CAST 1839 #if defined(OS_ANDROID) // WMPI_CAST
1837 bool is_remote = isRemote(); 1840 bool is_remote = isRemote();
1838 bool is_streaming = false; 1841 bool can_auto_suspend = true;
1839 #else 1842 #else
1840 bool is_remote = false; 1843 bool is_remote = false;
1841 bool is_streaming = IsStreaming(); 1844 bool can_auto_suspend = !disable_pipeline_auto_suspend_ && !IsStreaming();
1842 #endif 1845 #endif
1843 1846
1844 bool is_suspended = pipeline_controller_.IsSuspended(); 1847 bool is_suspended = pipeline_controller_.IsSuspended();
1845 bool is_backgrounded = IsBackgroundedSuspendEnabled() && IsHidden(); 1848 bool is_backgrounded = IsBackgroundedSuspendEnabled() && IsHidden();
1846 PlayState state = UpdatePlayState_ComputePlayState( 1849 PlayState state = UpdatePlayState_ComputePlayState(
1847 is_remote, is_streaming, is_suspended, is_backgrounded); 1850 is_remote, can_auto_suspend, is_suspended, is_backgrounded);
1848 SetDelegateState(state.delegate_state, state.is_idle); 1851 SetDelegateState(state.delegate_state, state.is_idle);
1849 SetMemoryReportingState(state.is_memory_reporting_enabled); 1852 SetMemoryReportingState(state.is_memory_reporting_enabled);
1850 SetSuspendState(state.is_suspended || pending_suspend_resume_cycle_); 1853 SetSuspendState(state.is_suspended || pending_suspend_resume_cycle_);
1851 } 1854 }
1852 1855
1853 void WebMediaPlayerImpl::SetDelegateState(DelegateState new_state, 1856 void WebMediaPlayerImpl::SetDelegateState(DelegateState new_state,
1854 bool is_idle) { 1857 bool is_idle) {
1855 DCHECK(delegate_); 1858 DCHECK(delegate_);
1856 1859
1857 // Prevent duplicate delegate calls. 1860 // Prevent duplicate delegate calls.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 if (preroll_attempt_pending_) { 1931 if (preroll_attempt_pending_) {
1929 preroll_attempt_pending_ = false; 1932 preroll_attempt_pending_ = false;
1930 preroll_attempt_start_time_ = tick_clock_->NowTicks(); 1933 preroll_attempt_start_time_ = tick_clock_->NowTicks();
1931 } 1934 }
1932 pipeline_controller_.Resume(); 1935 pipeline_controller_.Resume();
1933 } 1936 }
1934 } 1937 }
1935 1938
1936 WebMediaPlayerImpl::PlayState 1939 WebMediaPlayerImpl::PlayState
1937 WebMediaPlayerImpl::UpdatePlayState_ComputePlayState(bool is_remote, 1940 WebMediaPlayerImpl::UpdatePlayState_ComputePlayState(bool is_remote,
1938 bool is_streaming, 1941 bool can_auto_suspend,
1939 bool is_suspended, 1942 bool is_suspended,
1940 bool is_backgrounded) { 1943 bool is_backgrounded) {
1941 PlayState result; 1944 PlayState result;
1942 1945
1943 bool must_suspend = delegate_->IsFrameClosed(); 1946 bool must_suspend = delegate_->IsFrameClosed();
1944 bool is_stale = delegate_->IsStale(delegate_id_); 1947 bool is_stale = delegate_->IsStale(delegate_id_);
1945 1948
1946 // This includes both data source (before pipeline startup) and pipeline 1949 // This includes both data source (before pipeline startup) and pipeline
1947 // errors. 1950 // errors.
1948 bool has_error = IsNetworkStateError(network_state_); 1951 bool has_error = IsNetworkStateError(network_state_);
1949 1952
1950 // After HaveMetadata, we know which tracks are present and the duration. 1953 // After HaveMetadata, we know which tracks are present and the duration.
1951 bool have_metadata = ready_state_ >= WebMediaPlayer::ReadyStateHaveMetadata; 1954 bool have_metadata = ready_state_ >= WebMediaPlayer::ReadyStateHaveMetadata;
1952 1955
1953 // After HaveFutureData, Blink will call play() if the state is not paused; 1956 // After HaveFutureData, Blink will call play() if the state is not paused;
1954 // prior to this point |paused_| is not accurate. 1957 // prior to this point |paused_| is not accurate.
1955 bool have_future_data = 1958 bool have_future_data =
1956 highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData; 1959 highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData;
1957 1960
1958 // Background suspend is not enabled for audio-only players unless paused, 1961 // Background suspend is not enabled for audio-only players unless paused,
1959 // though in the case of audio-only the session should be kept. 1962 // though in the case of audio-only the session should be kept.
1960 // Videos are not suspended if the user resumed the playback via the remote 1963 // Videos are not suspended if the user resumed the playback via the remote
1961 // controls earlier and it's still playing. 1964 // controls earlier and it's still playing.
1962 bool is_backgrounded_video = is_backgrounded && have_metadata && hasVideo(); 1965 bool is_backgrounded_video = is_backgrounded && have_metadata && hasVideo();
1963 bool can_play_backgrounded = is_backgrounded_video && !is_remote && 1966 bool can_play_backgrounded = is_backgrounded_video && !is_remote &&
1964 hasAudio() && IsResumeBackgroundVideosEnabled(); 1967 hasAudio() && IsResumeBackgroundVideosEnabled();
1965 bool is_background_playing = delegate_->IsBackgroundVideoPlaybackUnlocked(); 1968 bool is_background_playing = delegate_->IsBackgroundVideoPlaybackUnlocked();
1966 bool background_suspended = !is_streaming && is_backgrounded_video && 1969 bool background_suspended = can_auto_suspend && is_backgrounded_video &&
1967 !(can_play_backgrounded && is_background_playing); 1970 !(can_play_backgrounded && is_background_playing);
1968 bool background_pause_suspended = 1971 bool background_pause_suspended =
1969 !is_streaming && is_backgrounded && paused_ && have_future_data; 1972 can_auto_suspend && is_backgrounded && paused_ && have_future_data;
1970 1973
1971 // Idle suspension is allowed prior to have future data since there exist 1974 // Idle suspension is allowed prior to have future data since there exist
1972 // mechanisms to exit the idle state when the player is capable of reaching 1975 // mechanisms to exit the idle state when the player is capable of reaching
1973 // the have future data state; see didLoadingProgress(). 1976 // the have future data state; see didLoadingProgress().
1974 // 1977 //
1975 // TODO(sandersd): Make the delegate suspend idle players immediately when 1978 // TODO(sandersd): Make the delegate suspend idle players immediately when
1976 // hidden. 1979 // hidden.
1977 bool idle_suspended = 1980 bool idle_suspended =
1978 !is_streaming && is_stale && paused_ && !seeking_ && !overlay_enabled_; 1981 can_auto_suspend && is_stale && paused_ && !seeking_ && !overlay_enabled_;
1979 1982
1980 // If we're already suspended, see if we can wait for user interaction. Prior 1983 // If we're already suspended, see if we can wait for user interaction. Prior
1981 // to HaveFutureData, we require |is_stale| to remain suspended. |is_stale| 1984 // to HaveFutureData, we require |is_stale| to remain suspended. |is_stale|
1982 // will be cleared when we receive data which may take us to HaveFutureData. 1985 // will be cleared when we receive data which may take us to HaveFutureData.
1983 bool can_stay_suspended = 1986 bool can_stay_suspended =
1984 (is_stale || have_future_data) && is_suspended && paused_ && !seeking_; 1987 (is_stale || have_future_data) && is_suspended && paused_ && !seeking_;
1985 1988
1986 // Combined suspend state. 1989 // Combined suspend state.
1987 result.is_suspended = is_remote || must_suspend || idle_suspended || 1990 result.is_suspended = is_remote || must_suspend || idle_suspended ||
1988 background_suspended || background_pause_suspended || 1991 background_suspended || background_pause_suspended ||
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 if (hasAudio()) { 2283 if (hasAudio()) {
2281 UMA_HISTOGRAM_TIMES( 2284 UMA_HISTOGRAM_TIMES(
2282 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", 2285 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack",
2283 time_to_first_frame); 2286 time_to_first_frame);
2284 } else { 2287 } else {
2285 UMA_HISTOGRAM_TIMES("Media.Video.TimeFromForegroundToFirstFrame.Paused", 2288 UMA_HISTOGRAM_TIMES("Media.Video.TimeFromForegroundToFirstFrame.Paused",
2286 time_to_first_frame); 2289 time_to_first_frame);
2287 } 2290 }
2288 } 2291 }
2289 2292
2293 void WebMediaPlayerImpl::SwitchRenderer(bool disable_pipeline_auto_suspend) {
2294 DCHECK(main_task_runner_->BelongsToCurrentThread());
2295 disable_pipeline_auto_suspend_ = disable_pipeline_auto_suspend;
2296 ScheduleRestart();
2297 }
2298
2290 } // namespace media 2299 } // namespace media
OLDNEW
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | media/blink/webmediaplayer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698