Add state masking for seeking.

The playback state will be immediately set to the most likely final state.

PiperOrigin-RevId: 302645852
This commit is contained in:
tonihei 2020-03-24 12:29:55 +00:00 committed by Oliver Woodman
parent 4e5b2c692f
commit aa987fdb79
2 changed files with 17 additions and 2 deletions

View File

@ -589,6 +589,7 @@ import java.util.concurrent.TimeoutException;
return playbackInfo.isLoading; return playbackInfo.isLoading;
} }
@SuppressWarnings("deprecation")
@Override @Override
public void seekTo(int windowIndex, long positionMs) { public void seekTo(int windowIndex, long positionMs) {
Timeline timeline = playbackInfo.timeline; Timeline timeline = playbackInfo.timeline;
@ -596,6 +597,8 @@ import java.util.concurrent.TimeoutException;
throw new IllegalSeekPositionException(timeline, windowIndex, positionMs); throw new IllegalSeekPositionException(timeline, windowIndex, positionMs);
} }
hasPendingSeek = true; hasPendingSeek = true;
boolean playWhenReady = getPlayWhenReady();
@Player.State int playbackState = getPlaybackState();
pendingOperationAcks++; pendingOperationAcks++;
if (isPlayingAd()) { if (isPlayingAd()) {
// TODO: Investigate adding support for seeking during ads. This is complicated to do in // TODO: Investigate adding support for seeking during ads. This is complicated to do in
@ -612,8 +615,20 @@ import java.util.concurrent.TimeoutException;
return; return;
} }
maskWindowIndexAndPositionForSeek(timeline, windowIndex, positionMs); maskWindowIndexAndPositionForSeek(timeline, windowIndex, positionMs);
@Player.State
int newPlaybackState =
playbackState == Player.STATE_IDLE ? Player.STATE_IDLE : Player.STATE_BUFFERING;
boolean playbackStateChanged = playbackState != newPlaybackState;
playbackInfo = playbackInfo.copyWithPlaybackState(newPlaybackState);
internalPlayer.seekTo(timeline, windowIndex, C.msToUs(positionMs)); internalPlayer.seekTo(timeline, windowIndex, C.msToUs(positionMs));
notifyListeners(listener -> listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK)); notifyListeners(
listener -> {
listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK);
if (playbackStateChanged) {
listener.onPlayerStateChanged(playWhenReady, newPlaybackState);
listener.onPlaybackStateChanged(newPlaybackState);
}
});
} }
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */ /** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */

View File

@ -1076,7 +1076,7 @@ public final class AnalyticsCollectorTest {
WINDOW_0 /* setPlayWhenReady=false */, WINDOW_0 /* setPlayWhenReady=false */,
WINDOW_0 /* BUFFERING */, WINDOW_0 /* BUFFERING */,
contentBeforeMidroll /* READY */, contentBeforeMidroll /* READY */,
midrollAd /* BUFFERING */, contentAfterMidroll /* BUFFERING */,
midrollAd /* setPlayWhenReady=true */, midrollAd /* setPlayWhenReady=true */,
midrollAd /* READY */, midrollAd /* READY */,
contentAfterMidroll /* ENDED */); contentAfterMidroll /* ENDED */);