mirror of
https://github.com/androidx/media.git
synced 2025-05-07 15:40:37 +08:00
Prevent shutter closing for within-window seeks to unprepared periods
Issue: #5507 PiperOrigin-RevId: 315512207
This commit is contained in:
parent
9ef9b56bcd
commit
5aa8a7a507
@ -191,6 +191,10 @@
|
|||||||
([#6926](https://github.com/google/ExoPlayer/issues/6926)).
|
([#6926](https://github.com/google/ExoPlayer/issues/6926)).
|
||||||
* Update `TrackSelectionDialogBuilder` to use AndroidX Compat Dialog
|
* Update `TrackSelectionDialogBuilder` to use AndroidX Compat Dialog
|
||||||
([#7357](https://github.com/google/ExoPlayer/issues/7357)).
|
([#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
|
* Metadata: Add minimal DVB Application Information Table (AIT) support
|
||||||
([#6922](https://github.com/google/ExoPlayer/pull/6922)).
|
([#6922](https://github.com/google/ExoPlayer/pull/6922)).
|
||||||
* Cast extension: Implement playlist API and deprecate the old queue
|
* Cast extension: Implement playlist API and deprecate the old queue
|
||||||
|
@ -48,6 +48,8 @@ import com.google.android.exoplayer2.ExoPlaybackException;
|
|||||||
import com.google.android.exoplayer2.PlaybackPreparer;
|
import com.google.android.exoplayer2.PlaybackPreparer;
|
||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
import com.google.android.exoplayer2.Player.DiscontinuityReason;
|
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.Metadata;
|
||||||
import com.google.android.exoplayer2.metadata.flac.PictureFrame;
|
import com.google.android.exoplayer2.metadata.flac.PictureFrame;
|
||||||
import com.google.android.exoplayer2.metadata.id3.ApicFrame;
|
import com.google.android.exoplayer2.metadata.id3.ApicFrame;
|
||||||
@ -1554,6 +1556,13 @@ public class PlayerView extends FrameLayout implements AdsLoader.AdViewProvider
|
|||||||
SingleTapListener,
|
SingleTapListener,
|
||||||
PlayerControlView.VisibilityListener {
|
PlayerControlView.VisibilityListener {
|
||||||
|
|
||||||
|
private final Period period;
|
||||||
|
private @Nullable Object lastPeriodUidWithTracks;
|
||||||
|
|
||||||
|
public ComponentListener() {
|
||||||
|
period = new Period();
|
||||||
|
}
|
||||||
|
|
||||||
// TextOutput implementation
|
// TextOutput implementation
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1602,6 +1611,29 @@ public class PlayerView extends FrameLayout implements AdsLoader.AdViewProvider
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTracksChanged(TrackGroupArray tracks, TrackSelectionArray selections) {
|
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);
|
updateForCurrentTrackSelections(/* isNewPlayer= */ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user