Skip to content

Commit

Permalink
Prevent shutter closing for within-window seeks to unprepared periods
Browse files Browse the repository at this point in the history
Issue: google#5507
PiperOrigin-RevId: 315512207
  • Loading branch information
ojw28 committed Jun 17, 2020
1 parent 80f4197 commit e5ec8e6
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
7 changes: 7 additions & 0 deletions RELEASENOTES.md
@@ -1,5 +1,12 @@
# Release notes #

### 2.11.6 (not yet released) ###

* UI: Prevent `PlayerView` from temporarily hiding the video surface 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)).

### 2.11.5 (2020-06-05) ###

* Improve the smoothness of video playback immediately after starting, seeking
Expand Down
Expand Up @@ -48,6 +48,8 @@
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;
Expand Down Expand Up @@ -1506,6 +1508,13 @@ private final class ComponentListener
SingleTapListener,
PlayerControlView.VisibilityListener {

private final Period period;
private @Nullable Object lastPeriodUidWithTracks;

public ComponentListener() {
period = new Period();
}

// TextOutput implementation

@Override
Expand Down Expand Up @@ -1554,6 +1563,29 @@ public void onRenderedFirstFrame() {

@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);
}

Expand Down

0 comments on commit e5ec8e6

Please sign in to comment.