Commit 765d1659 by Oliver Woodman

Return "seeked to" position immediately after seek.

parent c1b8352e
...@@ -33,6 +33,7 @@ import android.util.Pair; ...@@ -33,6 +33,7 @@ import android.util.Pair;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* Implements the internal behavior of {@link ExoPlayerImpl}. * Implements the internal behavior of {@link ExoPlayerImpl}.
...@@ -66,6 +67,7 @@ import java.util.List; ...@@ -66,6 +67,7 @@ import java.util.List;
private final HandlerThread internalPlaybackThread; private final HandlerThread internalPlaybackThread;
private final Handler eventHandler; private final Handler eventHandler;
private final StandaloneMediaClock standaloneMediaClock; private final StandaloneMediaClock standaloneMediaClock;
private final AtomicInteger pendingSeekCount;
private final List<TrackRenderer> enabledRenderers; private final List<TrackRenderer> enabledRenderers;
private final MediaFormat[][] trackFormats; private final MediaFormat[][] trackFormats;
private final int[] selectedTrackIndices; private final int[] selectedTrackIndices;
...@@ -82,6 +84,7 @@ import java.util.List; ...@@ -82,6 +84,7 @@ import java.util.List;
private int state; private int state;
private int customMessagesSent = 0; private int customMessagesSent = 0;
private int customMessagesProcessed = 0; private int customMessagesProcessed = 0;
private long lastSeekPositionMs;
private long elapsedRealtimeUs; private long elapsedRealtimeUs;
private volatile long durationUs; private volatile long durationUs;
...@@ -100,6 +103,7 @@ import java.util.List; ...@@ -100,6 +103,7 @@ import java.util.List;
this.bufferedPositionUs = TrackRenderer.UNKNOWN_TIME_US; this.bufferedPositionUs = TrackRenderer.UNKNOWN_TIME_US;
standaloneMediaClock = new StandaloneMediaClock(); standaloneMediaClock = new StandaloneMediaClock();
pendingSeekCount = new AtomicInteger();
enabledRenderers = new ArrayList<>(selectedTrackIndices.length); enabledRenderers = new ArrayList<>(selectedTrackIndices.length);
trackFormats = new MediaFormat[selectedTrackIndices.length][]; trackFormats = new MediaFormat[selectedTrackIndices.length][];
// Note: The documentation for Process.THREAD_PRIORITY_AUDIO that states "Applications can // Note: The documentation for Process.THREAD_PRIORITY_AUDIO that states "Applications can
...@@ -115,7 +119,7 @@ import java.util.List; ...@@ -115,7 +119,7 @@ import java.util.List;
} }
public long getCurrentPosition() { public long getCurrentPosition() {
return positionUs / 1000; return pendingSeekCount.get() > 0 ? lastSeekPositionMs : (positionUs / 1000);
} }
public long getBufferedPosition() { public long getBufferedPosition() {
...@@ -137,6 +141,8 @@ import java.util.List; ...@@ -137,6 +141,8 @@ import java.util.List;
} }
public void seekTo(long positionMs) { public void seekTo(long positionMs) {
lastSeekPositionMs = positionMs;
pendingSeekCount.incrementAndGet();
handler.obtainMessage(MSG_SEEK_TO, Util.getTopInt(positionMs), handler.obtainMessage(MSG_SEEK_TO, Util.getTopInt(positionMs),
Util.getBottomInt(positionMs)).sendToTarget(); Util.getBottomInt(positionMs)).sendToTarget();
} }
...@@ -490,25 +496,29 @@ import java.util.List; ...@@ -490,25 +496,29 @@ import java.util.List;
} }
private void seekToInternal(long positionMs) throws ExoPlaybackException { private void seekToInternal(long positionMs) throws ExoPlaybackException {
if (positionMs == (positionUs / 1000)) { try {
// Seek is to the current position. Do nothing. if (positionMs == (positionUs / 1000)) {
return; // Seek is to the current position. Do nothing.
} return;
}
rebuffering = false; rebuffering = false;
positionUs = positionMs * 1000; positionUs = positionMs * 1000;
standaloneMediaClock.stop(); standaloneMediaClock.stop();
standaloneMediaClock.setPositionUs(positionUs); standaloneMediaClock.setPositionUs(positionUs);
if (state == ExoPlayer.STATE_IDLE || state == ExoPlayer.STATE_PREPARING) { if (state == ExoPlayer.STATE_IDLE || state == ExoPlayer.STATE_PREPARING) {
return; return;
} }
for (int i = 0; i < enabledRenderers.size(); i++) { for (int i = 0; i < enabledRenderers.size(); i++) {
TrackRenderer renderer = enabledRenderers.get(i); TrackRenderer renderer = enabledRenderers.get(i);
ensureStopped(renderer); ensureStopped(renderer);
renderer.seekTo(positionUs); renderer.seekTo(positionUs);
}
setState(ExoPlayer.STATE_BUFFERING);
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
} finally {
pendingSeekCount.decrementAndGet();
} }
setState(ExoPlayer.STATE_BUFFERING);
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
} }
private void stopInternal() { private void stopInternal() {
...@@ -577,16 +587,16 @@ import java.util.List; ...@@ -577,16 +587,16 @@ import java.util.List;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Pair<ExoPlayerComponent, Object> targetAndMessage = (Pair<ExoPlayerComponent, Object>) obj; Pair<ExoPlayerComponent, Object> targetAndMessage = (Pair<ExoPlayerComponent, Object>) obj;
targetAndMessage.first.handleMessage(what, targetAndMessage.second); targetAndMessage.first.handleMessage(what, targetAndMessage.second);
if (state != ExoPlayer.STATE_IDLE && state != ExoPlayer.STATE_PREPARING) {
// The message may have caused something to change that now requires us to do work.
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
}
} finally { } finally {
synchronized (this) { synchronized (this) {
customMessagesProcessed++; customMessagesProcessed++;
notifyAll(); notifyAll();
} }
} }
if (state != ExoPlayer.STATE_IDLE && state != ExoPlayer.STATE_PREPARING) {
// The message may have caused something to change that now requires us to do work.
handler.sendEmptyMessage(MSG_DO_SOME_WORK);
}
} }
private void setRendererSelectedTrackInternal(int rendererIndex, int trackIndex) private void setRendererSelectedTrackInternal(int rendererIndex, int trackIndex)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment