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

Unified Diff: media/blink/webmediaplayer_impl.cc

Issue 2618883002: [Media, Video] Enable the video track for a new renderer. (Closed)
Patch Set: Added OnBeforeResume callback 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 side-by-side diff with in-line comments
Download patch
Index: media/blink/webmediaplayer_impl.cc
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index a73d688ffb666568451ea1889d549ee59786de9f..c44ada4b28883a4085ef020e6e0df6d22797948b 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -200,6 +200,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
base::Unretained(this)),
base::Bind(&WebMediaPlayerImpl::OnPipelineSeeked, AsWeakPtr()),
base::Bind(&WebMediaPlayerImpl::OnPipelineSuspended, AsWeakPtr()),
+ base::Bind(&WebMediaPlayerImpl::OnBeforePipelineResume, AsWeakPtr()),
+ base::Bind(&WebMediaPlayerImpl::OnPipelineResumed, AsWeakPtr()),
base::Bind(&WebMediaPlayerImpl::OnError, AsWeakPtr())),
load_type_(LoadTypeURL),
opaque_(false),
@@ -474,6 +476,7 @@ void WebMediaPlayerImpl::pause() {
DCHECK(watch_time_reporter_);
watch_time_reporter_->OnPaused();
media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE));
+
UpdatePlayState();
}
@@ -671,9 +674,7 @@ void WebMediaPlayerImpl::selectedVideoTrackChanged(
std::ostringstream logstr;
std::vector<MediaTrack::Id> selectedVideoMediaTrackId;
- bool canAddVideoTrack =
- !IsBackgroundVideoTrackOptimizationEnabled() || !IsHidden();
- if (selectedTrackId && canAddVideoTrack) {
+ if (selectedTrackId && !video_track_disabled_) {
selectedVideoMediaTrackId.push_back(selectedTrackId->utf8().data());
logstr << selectedVideoMediaTrackId[0];
}
@@ -1064,6 +1065,7 @@ void WebMediaPlayerImpl::OnCdmAttached(bool success) {
void WebMediaPlayerImpl::OnPipelineSeeked(bool time_updated) {
seeking_ = false;
seek_time_ = base::TimeDelta();
+
if (paused_) {
#if defined(OS_ANDROID) // WMPI_CAST
if (isRemote()) {
@@ -1084,6 +1086,10 @@ void WebMediaPlayerImpl::OnPipelineSeeked(bool time_updated) {
// Reset underflow count upon seek; this prevents looping videos and user
// actions from artificially inflating the underflow count.
underflow_count_ = 0;
+
+ // Apply optimizations for the hidden videos if hidden.
+ if (IsHidden())
+ OnHidden();
sandersd (OOO until July 31) 2017/01/10 21:34:37 OnHidden() does a bit more than what is requested,
whywhat 2017/01/11 19:41:30 I think that's the point of it, no? We initialize
sandersd (OOO until July 31) 2017/01/11 21:54:51 The target state for this code is that OnHidden()
}
void WebMediaPlayerImpl::OnPipelineSuspended() {
@@ -1111,6 +1117,26 @@ void WebMediaPlayerImpl::OnPipelineSuspended() {
}
}
+void WebMediaPlayerImpl::OnBeforePipelineResume() {
+ // Enable video track if we disabled it in the background - this way the new
+ // renderer will attach its callbacks to the video stream properly.
+ // TODO(avayvod): Remove this when disabling and enabling video tracks in
+ // non-playing state works correctly. See https://crbug.com/678374.
+ EnableVideoTrackIfNeeded();
+ is_pipeline_resuming_ = true;
+}
+
+void WebMediaPlayerImpl::OnPipelineResumed() {
+ is_pipeline_resuming_ = false;
+
+ if (IsHidden()) {
+ DisableVideoTrackIfNeeded();
+ return;
sandersd (OOO until July 31) 2017/01/10 21:34:37 Nit: This may be a case where early return is more
whywhat 2017/01/11 19:41:30 Done. For some reason, I expect lint to complain t
+ }
+
+ EnableVideoTrackIfNeeded();
+}
+
void WebMediaPlayerImpl::OnDemuxerOpened() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
client_->mediaSourceOpened(
@@ -1353,18 +1379,16 @@ void WebMediaPlayerImpl::OnHidden() {
if (watch_time_reporter_)
watch_time_reporter_->OnHidden();
- if (!IsStreaming() && IsBackgroundVideoTrackOptimizationEnabled()) {
- if (ShouldPauseWhenHidden()) {
- // OnPause() will set |paused_when_hidden_| to false and call
- // UpdatePlayState(), so set the flag to true after and then return.
- OnPause();
- paused_when_hidden_ = true;
- return;
- }
-
- selectedVideoTrackChanged(nullptr);
+ if (!paused_when_hidden_ && ShouldPauseWhenHidden()) {
sandersd (OOO until July 31) 2017/01/10 21:34:37 As a matter of style, I prefer idempotency whereve
whywhat 2017/01/11 19:41:30 I think it won't because ShouldPauseWhenHidden and
+ // OnPause() will set |paused_when_hidden_| to false and call
+ // UpdatePlayState(), so set the flag to true after and then return.
+ OnPause();
+ paused_when_hidden_ = true;
+ return;
}
+ DisableVideoTrackIfNeeded();
+
UpdatePlayState();
// Schedule suspended playing media to be paused if the user doesn't come back
@@ -1382,19 +1406,14 @@ void WebMediaPlayerImpl::OnShown() {
base::Bind(&VideoFrameCompositor::SetForegroundTime,
base::Unretained(compositor_), base::TimeTicks::Now()));
- if (!IsStreaming() && IsBackgroundVideoTrackOptimizationEnabled()) {
- if (paused_when_hidden_) {
- paused_when_hidden_ = false;
- OnPlay(); // Calls UpdatePlayState() so return afterwards.
- return;
- }
-
- if (client_->hasSelectedVideoTrack()) {
- WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId();
- selectedVideoTrackChanged(&trackId);
- }
+ if (paused_when_hidden_) {
sandersd (OOO until July 31) 2017/01/10 21:34:37 By the same reasoning, this should go right before
whywhat 2017/01/11 19:41:30 Moved the state update above the new logic. I don
+ paused_when_hidden_ = false;
+ OnPlay(); // Calls UpdatePlayState() so return afterwards.
+ return;
}
+ EnableVideoTrackIfNeeded();
+
must_suspend_ = false;
background_pause_timer_.Stop();
@@ -2080,12 +2099,53 @@ void WebMediaPlayerImpl::ActivateViewportIntersectionMonitoring(bool activate) {
}
bool WebMediaPlayerImpl::ShouldPauseWhenHidden() const {
+ DCHECK(IsHidden());
+// Don't pause videos being Cast (Android only) or if the background video
+// optimizations are off (desktop only).
#if defined(OS_ANDROID) // WMPI_CAST
if (isRemote())
return false;
-#endif // defined(OS_ANDROID) // WMPI_CAST
+#else // defined(OS_ANDROID)
+ if (!IsBackgroundVideoTrackOptimizationEnabled())
+ return false;
+#endif // defined(OS_ANDROID)
return hasVideo() && !hasAudio();
sandersd (OOO until July 31) 2017/01/10 21:34:37 Probably worth a comment somewhere: these conditio
whywhat 2017/01/11 19:41:30 Should I make an even stronger comment that they w
sandersd (OOO until July 31) 2017/01/11 21:54:51 OnMetadata is called after demuxer initialization,
}
+bool WebMediaPlayerImpl::ShouldDisableVideoWhenHidden() const {
+ DCHECK(IsHidden());
+ return IsBackgroundVideoTrackOptimizationEnabled() && hasVideo() &&
+ hasAudio() && !IsStreaming();
+}
+
+void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() {
+ DCHECK(!IsHidden());
+
+ // Don't change video track while the pipeline is resuming or seeking.
+ if (is_pipeline_resuming_ || seeking_)
+ return;
+
+ if (video_track_disabled_) {
+ video_track_disabled_ = false;
+ if (client_->hasSelectedVideoTrack()) {
+ WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId();
+ selectedVideoTrackChanged(&trackId);
+ }
+ }
+}
+
+void WebMediaPlayerImpl::DisableVideoTrackIfNeeded() {
+ DCHECK(IsHidden());
+
+ // Don't change video track while the pipeline is resuming or seeking.
+ if (is_pipeline_resuming_ || seeking_)
+ return;
+
+ if (!video_track_disabled_ && ShouldDisableVideoWhenHidden()) {
+ video_track_disabled_ = true;
+ selectedVideoTrackChanged(nullptr);
+ }
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698