From 5aa8a7a5074cbbd13976bffec6b45e8b0b4a6a60 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 9 Jun 2020 18:37:00 +0100 Subject: [PATCH] Prevent shutter closing for within-window seeks to unprepared periods Issue: #5507 PiperOrigin-RevId: 315512207 --- RELEASENOTES.md | 4 +++ .../android/exoplayer2/ui/PlayerView.java | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a7ad147963..0286ccec23 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -191,6 +191,10 @@ ([#6926](https://github.com/google/ExoPlayer/issues/6926)). * Update `TrackSelectionDialogBuilder` to use AndroidX Compat Dialog ([#7357](https://github.com/google/ExoPlayer/issues/7357)). + * Prevent the video surface going black when seeking to an unprepared + period within the current window. For example when seeking over an ad + group, or to the next period in a multi-period DASH stream + ([#5507](https://github.com/google/ExoPlayer/issues/5507)). * Metadata: Add minimal DVB Application Information Table (AIT) support ([#6922](https://github.com/google/ExoPlayer/pull/6922)). * Cast extension: Implement playlist API and deprecate the old queue diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index a307bd5fd2..985fbd3dda 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -48,6 +48,8 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.PlaybackPreparer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.flac.PictureFrame; import com.google.android.exoplayer2.metadata.id3.ApicFrame; @@ -1554,6 +1556,13 @@ public class PlayerView extends FrameLayout implements AdsLoader.AdViewProvider SingleTapListener, PlayerControlView.VisibilityListener { + private final Period period; + private @Nullable Object lastPeriodUidWithTracks; + + public ComponentListener() { + period = new Period(); + } + // TextOutput implementation @Override @@ -1602,6 +1611,29 @@ public class PlayerView extends FrameLayout implements AdsLoader.AdViewProvider @Override public void onTracksChanged(TrackGroupArray tracks, TrackSelectionArray selections) { + // Suppress the update if transitioning to an unprepared period within the same window. This + // is necessary to avoid closing the shutter when such a transition occurs. See: + // https://github.com/google/ExoPlayer/issues/5507. + Player player = Assertions.checkNotNull(PlayerView.this.player); + Timeline timeline = player.getCurrentTimeline(); + if (timeline.isEmpty()) { + lastPeriodUidWithTracks = null; + } else if (!player.getCurrentTrackGroups().isEmpty()) { + lastPeriodUidWithTracks = + timeline.getPeriod(player.getCurrentPeriodIndex(), period, /* setIds= */ true).uid; + } else if (lastPeriodUidWithTracks != null) { + int lastPeriodIndexWithTracks = timeline.getIndexOfPeriod(lastPeriodUidWithTracks); + if (lastPeriodIndexWithTracks != C.INDEX_UNSET) { + int lastWindowIndexWithTracks = + timeline.getPeriod(lastPeriodIndexWithTracks, period).windowIndex; + if (player.getCurrentWindowIndex() == lastWindowIndexWithTracks) { + // We're in the same window. Suppress the update. + return; + } + } + lastPeriodUidWithTracks = null; + } + updateForCurrentTrackSelections(/* isNewPlayer= */ false); }