Push window->period seekTo conversions into ExoPlayerImplInternal

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138185910
This commit is contained in:
olly 2016-11-04 07:03:51 -07:00 committed by Oliver Woodman
parent 3e2cb9f89a
commit a5a2bc89f4
2 changed files with 55 additions and 59 deletions

View File

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

View File

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