Push window->period seekTo conversions into ExoPlayerImplInternal
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=138185910
This commit is contained in:
parent
3e2cb9f89a
commit
a5a2bc89f4
@ -48,7 +48,6 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
private final Timeline.Period period;
|
private final Timeline.Period period;
|
||||||
|
|
||||||
private boolean tracksSelected;
|
private boolean tracksSelected;
|
||||||
private boolean pendingInitialSeek;
|
|
||||||
private boolean playWhenReady;
|
private boolean playWhenReady;
|
||||||
private int playbackState;
|
private int playbackState;
|
||||||
private int pendingSeekAcks;
|
private int pendingSeekAcks;
|
||||||
@ -168,17 +167,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void seekToDefaultPosition(int windowIndex) {
|
public void seekToDefaultPosition(int windowIndex) {
|
||||||
if (timeline == null) {
|
seekTo(windowIndex, C.TIME_UNSET);
|
||||||
maskingWindowIndex = windowIndex;
|
|
||||||
maskingWindowPositionMs = C.TIME_UNSET;
|
|
||||||
pendingInitialSeek = true;
|
|
||||||
} else {
|
|
||||||
Assertions.checkIndex(windowIndex, 0, timeline.getWindowCount());
|
|
||||||
pendingSeekAcks++;
|
|
||||||
maskingWindowIndex = windowIndex;
|
|
||||||
maskingWindowPositionMs = 0;
|
|
||||||
internalPlayer.seekTo(timeline.getWindow(windowIndex, window).firstPeriodIndex, C.TIME_UNSET);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -188,27 +177,14 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void seekTo(int windowIndex, long positionMs) {
|
public void seekTo(int windowIndex, long positionMs) {
|
||||||
|
pendingSeekAcks++;
|
||||||
|
maskingWindowIndex = windowIndex;
|
||||||
if (positionMs == C.TIME_UNSET) {
|
if (positionMs == C.TIME_UNSET) {
|
||||||
seekToDefaultPosition(windowIndex);
|
maskingWindowPositionMs = 0;
|
||||||
} else if (timeline == null) {
|
internalPlayer.seekTo(windowIndex, C.TIME_UNSET);
|
||||||
maskingWindowIndex = windowIndex;
|
|
||||||
maskingWindowPositionMs = positionMs;
|
|
||||||
pendingInitialSeek = true;
|
|
||||||
} else {
|
} else {
|
||||||
Assertions.checkIndex(windowIndex, 0, timeline.getWindowCount());
|
|
||||||
pendingSeekAcks++;
|
|
||||||
maskingWindowIndex = windowIndex;
|
|
||||||
maskingWindowPositionMs = positionMs;
|
maskingWindowPositionMs = positionMs;
|
||||||
timeline.getWindow(windowIndex, window);
|
internalPlayer.seekTo(windowIndex, C.msToUs(positionMs));
|
||||||
int periodIndex = window.firstPeriodIndex;
|
|
||||||
long periodPositionMs = window.getPositionInFirstPeriodMs() + positionMs;
|
|
||||||
long periodDurationMs = timeline.getPeriod(periodIndex, period).getDurationMs();
|
|
||||||
while (periodDurationMs != C.TIME_UNSET && periodPositionMs >= periodDurationMs
|
|
||||||
&& periodIndex < window.lastPeriodIndex) {
|
|
||||||
periodPositionMs -= periodDurationMs;
|
|
||||||
periodDurationMs = timeline.getPeriod(++periodIndex, period).getDurationMs();
|
|
||||||
}
|
|
||||||
internalPlayer.seekTo(periodIndex, C.msToUs(periodPositionMs));
|
|
||||||
for (EventListener listener : listeners) {
|
for (EventListener listener : listeners) {
|
||||||
listener.onPositionDiscontinuity();
|
listener.onPositionDiscontinuity();
|
||||||
}
|
}
|
||||||
@ -349,7 +325,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ExoPlayerImplInternal.MSG_SEEK_ACK: {
|
case ExoPlayerImplInternal.MSG_SEEK_ACK: {
|
||||||
if (--pendingSeekAcks == 0) {
|
pendingSeekAcks -= msg.arg1;
|
||||||
|
if (pendingSeekAcks == 0) {
|
||||||
playbackInfo = (ExoPlayerImplInternal.PlaybackInfo) msg.obj;
|
playbackInfo = (ExoPlayerImplInternal.PlaybackInfo) msg.obj;
|
||||||
for (EventListener listener : listeners) {
|
for (EventListener listener : listeners) {
|
||||||
listener.onPositionDiscontinuity();
|
listener.onPositionDiscontinuity();
|
||||||
@ -371,10 +348,6 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
Pair<Timeline, Object> timelineAndManifest = (Pair<Timeline, Object>) msg.obj;
|
Pair<Timeline, Object> timelineAndManifest = (Pair<Timeline, Object>) msg.obj;
|
||||||
timeline = timelineAndManifest.first;
|
timeline = timelineAndManifest.first;
|
||||||
manifest = timelineAndManifest.second;
|
manifest = timelineAndManifest.second;
|
||||||
if (pendingInitialSeek) {
|
|
||||||
pendingInitialSeek = false;
|
|
||||||
seekTo(maskingWindowIndex, maskingWindowPositionMs);
|
|
||||||
}
|
|
||||||
for (EventListener listener : listeners) {
|
for (EventListener listener : listeners) {
|
||||||
listener.onTimelineChanged(timeline, manifest);
|
listener.onTimelineChanged(timeline, manifest);
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,9 @@ import java.io.IOException;
|
|||||||
private int customMessagesProcessed;
|
private int customMessagesProcessed;
|
||||||
private long elapsedRealtimeUs;
|
private long elapsedRealtimeUs;
|
||||||
|
|
||||||
|
private int pendingInitialSeekCount;
|
||||||
|
private int pendingSeekWindowIndex;
|
||||||
|
private long pendingSeekWindowPositionUs;
|
||||||
private long rendererPositionUs;
|
private long rendererPositionUs;
|
||||||
|
|
||||||
private boolean isTimelineReady;
|
private boolean isTimelineReady;
|
||||||
@ -189,8 +192,8 @@ import java.io.IOException;
|
|||||||
handler.obtainMessage(MSG_SET_PLAY_WHEN_READY, playWhenReady ? 1 : 0, 0).sendToTarget();
|
handler.obtainMessage(MSG_SET_PLAY_WHEN_READY, playWhenReady ? 1 : 0, 0).sendToTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void seekTo(int periodIndex, long positionUs) {
|
public void seekTo(int windowIndex, long positionUs) {
|
||||||
handler.obtainMessage(MSG_SEEK_TO, periodIndex, 0, positionUs).sendToTarget();
|
handler.obtainMessage(MSG_SEEK_TO, windowIndex, 0, positionUs).sendToTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
@ -510,16 +513,19 @@ import java.io.IOException;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void seekToInternal(int periodIndex, long periodPositionUs) throws ExoPlaybackException {
|
private void seekToInternal(int windowIndex, long positionUs) throws ExoPlaybackException {
|
||||||
try {
|
if (timeline == null) {
|
||||||
if (periodPositionUs == C.TIME_UNSET && timeline != null
|
pendingInitialSeekCount++;
|
||||||
&& periodIndex < timeline.getPeriodCount()) {
|
pendingSeekWindowIndex = windowIndex;
|
||||||
// We know about the window, so seek to its default initial position now.
|
pendingSeekWindowPositionUs = positionUs;
|
||||||
Pair<Integer, Long> defaultPosition = getDefaultPosition(periodIndex);
|
return;
|
||||||
periodIndex = defaultPosition.first;
|
}
|
||||||
periodPositionUs = defaultPosition.second;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Pair<Integer, Long> periodPosition = getPeriodPosition(windowIndex, positionUs);
|
||||||
|
int periodIndex = periodPosition.first;
|
||||||
|
long periodPositionUs = periodPosition.second;
|
||||||
|
|
||||||
|
try {
|
||||||
if (periodIndex == playbackInfo.periodIndex
|
if (periodIndex == playbackInfo.periodIndex
|
||||||
&& ((periodPositionUs == C.TIME_UNSET && playbackInfo.positionUs == C.TIME_UNSET)
|
&& ((periodPositionUs == C.TIME_UNSET && playbackInfo.positionUs == C.TIME_UNSET)
|
||||||
|| ((periodPositionUs / 1000) == (playbackInfo.positionUs / 1000)))) {
|
|| ((periodPositionUs / 1000) == (playbackInfo.positionUs / 1000)))) {
|
||||||
@ -529,7 +535,7 @@ import java.io.IOException;
|
|||||||
periodPositionUs = seekToPeriodPosition(periodIndex, periodPositionUs);
|
periodPositionUs = seekToPeriodPosition(periodIndex, periodPositionUs);
|
||||||
} finally {
|
} finally {
|
||||||
playbackInfo = new PlaybackInfo(periodIndex, periodPositionUs);
|
playbackInfo = new PlaybackInfo(periodIndex, periodPositionUs);
|
||||||
eventHandler.obtainMessage(MSG_SEEK_ACK, playbackInfo).sendToTarget();
|
eventHandler.obtainMessage(MSG_SEEK_ACK, 1, 0, playbackInfo).sendToTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -819,6 +825,15 @@ import java.io.IOException;
|
|||||||
Timeline oldTimeline = this.timeline;
|
Timeline oldTimeline = this.timeline;
|
||||||
this.timeline = timelineAndManifest.first;
|
this.timeline = timelineAndManifest.first;
|
||||||
|
|
||||||
|
if (pendingInitialSeekCount > 0) {
|
||||||
|
Pair<Integer, Long> periodPosition = getPeriodPosition(pendingSeekWindowIndex,
|
||||||
|
pendingSeekWindowPositionUs);
|
||||||
|
playbackInfo = new PlaybackInfo(periodPosition.first, periodPosition.second);
|
||||||
|
eventHandler.obtainMessage(MSG_SEEK_ACK, pendingInitialSeekCount, 0, playbackInfo)
|
||||||
|
.sendToTarget();
|
||||||
|
pendingInitialSeekCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Update the loaded periods to take into account the new timeline.
|
// Update the loaded periods to take into account the new timeline.
|
||||||
if (playingPeriodHolder != null) {
|
if (playingPeriodHolder != null) {
|
||||||
int index = timeline.getIndexOfPeriod(playingPeriodHolder.uid);
|
int index = timeline.getIndexOfPeriod(playingPeriodHolder.uid);
|
||||||
@ -922,7 +937,8 @@ import java.io.IOException;
|
|||||||
loadingPeriodHolder = null;
|
loadingPeriodHolder = null;
|
||||||
|
|
||||||
// Find the default initial position in the window and seek to it.
|
// Find the default initial position in the window and seek to it.
|
||||||
Pair<Integer, Long> defaultPosition = getDefaultPosition(newPeriodIndex);
|
Pair<Integer, Long> defaultPosition = getPeriodPosition(
|
||||||
|
timeline.getPeriod(newPeriodIndex, period).windowIndex, C.TIME_UNSET);
|
||||||
newPeriodIndex = defaultPosition.first;
|
newPeriodIndex = defaultPosition.first;
|
||||||
long newPlayingPositionUs = defaultPosition.second;
|
long newPlayingPositionUs = defaultPosition.second;
|
||||||
|
|
||||||
@ -930,17 +946,24 @@ import java.io.IOException;
|
|||||||
eventHandler.obtainMessage(MSG_POSITION_DISCONTINUITY, playbackInfo).sendToTarget();
|
eventHandler.obtainMessage(MSG_POSITION_DISCONTINUITY, playbackInfo).sendToTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pair<Integer, Long> getDefaultPosition(int periodIndex) {
|
/**
|
||||||
timeline.getPeriod(periodIndex, period);
|
* Converts (windowIndex, windowPositionUs) to the corresponding (periodIndex, periodPositionUs).
|
||||||
timeline.getWindow(period.windowIndex, window);
|
*
|
||||||
periodIndex = window.firstPeriodIndex;
|
* @param windowIndex The window index.
|
||||||
|
* @param windowPositionUs The window time, or {@link C#TIME_UNSET} to use the window's default
|
||||||
|
* start position.
|
||||||
|
* @return The corresponding (periodIndex, periodPositionUs).
|
||||||
|
*/
|
||||||
|
private Pair<Integer, Long> getPeriodPosition(int windowIndex, long windowPositionUs) {
|
||||||
|
timeline.getWindow(windowIndex, window);
|
||||||
|
int periodIndex = window.firstPeriodIndex;
|
||||||
long periodPositionUs = window.getPositionInFirstPeriodUs()
|
long periodPositionUs = window.getPositionInFirstPeriodUs()
|
||||||
+ window.getDefaultPositionUs();
|
+ (windowPositionUs == C.TIME_UNSET ? window.getDefaultPositionUs() : windowPositionUs);
|
||||||
timeline.getPeriod(periodIndex, period);
|
long periodDurationUs = timeline.getPeriod(periodIndex, period).getDurationUs();
|
||||||
while (periodIndex < window.lastPeriodIndex
|
while (periodDurationUs != C.TIME_UNSET && periodPositionUs >= periodDurationUs
|
||||||
&& periodPositionUs > period.getDurationMs()) {
|
&& periodIndex < window.lastPeriodIndex) {
|
||||||
periodPositionUs -= period.getDurationUs();
|
periodPositionUs -= periodDurationUs;
|
||||||
timeline.getPeriod(periodIndex++, period);
|
periodDurationUs = timeline.getPeriod(++periodIndex, period).getDurationUs();
|
||||||
}
|
}
|
||||||
return Pair.create(periodIndex, periodPositionUs);
|
return Pair.create(periodIndex, periodPositionUs);
|
||||||
}
|
}
|
||||||
@ -970,7 +993,7 @@ import java.io.IOException;
|
|||||||
if (periodStartPositionUs == C.TIME_UNSET) {
|
if (periodStartPositionUs == C.TIME_UNSET) {
|
||||||
// This is the first period of a new window or we don't have a start position, so seek to
|
// This is the first period of a new window or we don't have a start position, so seek to
|
||||||
// the default position for the window.
|
// the default position for the window.
|
||||||
Pair<Integer, Long> defaultPosition = getDefaultPosition(newLoadingPeriodIndex);
|
Pair<Integer, Long> defaultPosition = getPeriodPosition(windowIndex, C.TIME_UNSET);
|
||||||
newLoadingPeriodIndex = defaultPosition.first;
|
newLoadingPeriodIndex = defaultPosition.first;
|
||||||
periodStartPositionUs = defaultPosition.second;
|
periodStartPositionUs = defaultPosition.second;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user