Commit 2537e883 by olly Committed by Oliver Woodman

Move HlsSampleStreamWrapper to use ArrayList

Also prevent skip when there's a pending reset, and add a
TODO to split/fix chunk discard and downstream format change
reporting.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176760955
parent 7eb0af7c
...@@ -39,8 +39,8 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -39,8 +39,8 @@ import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedList;
/** /**
* Loads {@link HlsMediaChunk}s obtained from a {@link HlsChunkSource}, and provides * Loads {@link HlsMediaChunk}s obtained from a {@link HlsChunkSource}, and provides
...@@ -81,7 +81,7 @@ import java.util.LinkedList; ...@@ -81,7 +81,7 @@ import java.util.LinkedList;
private final Loader loader; private final Loader loader;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final HlsChunkSource.HlsChunkHolder nextChunkHolder; private final HlsChunkSource.HlsChunkHolder nextChunkHolder;
private final LinkedList<HlsMediaChunk> mediaChunks; private final ArrayList<HlsMediaChunk> mediaChunks;
private final Runnable maybeFinishPrepareRunnable; private final Runnable maybeFinishPrepareRunnable;
private final Handler handler; private final Handler handler;
...@@ -137,7 +137,7 @@ import java.util.LinkedList; ...@@ -137,7 +137,7 @@ import java.util.LinkedList;
sampleQueues = new SampleQueue[0]; sampleQueues = new SampleQueue[0];
sampleQueueIsAudioVideoFlags = new boolean[0]; sampleQueueIsAudioVideoFlags = new boolean[0];
sampleQueuesEnabledStates = new boolean[0]; sampleQueuesEnabledStates = new boolean[0];
mediaChunks = new LinkedList<>(); mediaChunks = new ArrayList<>();
maybeFinishPrepareRunnable = new Runnable() { maybeFinishPrepareRunnable = new Runnable() {
@Override @Override
public void run() { public void run() {
...@@ -260,7 +260,7 @@ import java.util.LinkedList; ...@@ -260,7 +260,7 @@ import java.util.LinkedList;
if (!seenFirstTrackSelection) { if (!seenFirstTrackSelection) {
long bufferedDurationUs = positionUs < 0 ? -positionUs : 0; long bufferedDurationUs = positionUs < 0 ? -positionUs : 0;
primaryTrackSelection.updateSelectedTrack(positionUs, bufferedDurationUs, C.TIME_UNSET); primaryTrackSelection.updateSelectedTrack(positionUs, bufferedDurationUs, C.TIME_UNSET);
int chunkIndex = chunkSource.getTrackGroup().indexOf(mediaChunks.getLast().trackFormat); int chunkIndex = chunkSource.getTrackGroup().indexOf(getLastMediaChunk().trackFormat);
if (primaryTrackSelection.getSelectedIndexInTrackGroup() != chunkIndex) { if (primaryTrackSelection.getSelectedIndexInTrackGroup() != chunkIndex) {
// This is the first selection and the chunk loaded during preparation does not match // This is the first selection and the chunk loaded during preparation does not match
// the initially selected format. // the initially selected format.
...@@ -332,7 +332,7 @@ import java.util.LinkedList; ...@@ -332,7 +332,7 @@ import java.util.LinkedList;
return pendingResetPositionUs; return pendingResetPositionUs;
} else { } else {
long bufferedPositionUs = lastSeekPositionUs; long bufferedPositionUs = lastSeekPositionUs;
HlsMediaChunk lastMediaChunk = mediaChunks.getLast(); HlsMediaChunk lastMediaChunk = getLastMediaChunk();
HlsMediaChunk lastCompletedMediaChunk = lastMediaChunk.isLoadCompleted() ? lastMediaChunk HlsMediaChunk lastCompletedMediaChunk = lastMediaChunk.isLoadCompleted() ? lastMediaChunk
: mediaChunks.size() > 1 ? mediaChunks.get(mediaChunks.size() - 2) : null; : mediaChunks.size() > 1 ? mediaChunks.get(mediaChunks.size() - 2) : null;
if (lastCompletedMediaChunk != null) { if (lastCompletedMediaChunk != null) {
...@@ -389,11 +389,17 @@ import java.util.LinkedList; ...@@ -389,11 +389,17 @@ import java.util.LinkedList;
return C.RESULT_NOTHING_READ; return C.RESULT_NOTHING_READ;
} }
// TODO: Split into discard (in discardBuffer) and format change (here and in skipData) steps.
if (!mediaChunks.isEmpty()) { if (!mediaChunks.isEmpty()) {
while (mediaChunks.size() > 1 && finishedReadingChunk(mediaChunks.getFirst())) { int discardToMediaChunkIndex = 0;
mediaChunks.removeFirst(); while (discardToMediaChunkIndex < mediaChunks.size() - 1
&& finishedReadingChunk(mediaChunks.get(discardToMediaChunkIndex))) {
discardToMediaChunkIndex++;
} }
HlsMediaChunk currentChunk = mediaChunks.getFirst(); if (discardToMediaChunkIndex > 0) {
Util.removeRange(mediaChunks, 0, discardToMediaChunkIndex);
}
HlsMediaChunk currentChunk = mediaChunks.get(0);
Format trackFormat = currentChunk.trackFormat; Format trackFormat = currentChunk.trackFormat;
if (!trackFormat.equals(downstreamTrackFormat)) { if (!trackFormat.equals(downstreamTrackFormat)) {
eventDispatcher.downstreamFormatChanged(trackType, trackFormat, eventDispatcher.downstreamFormatChanged(trackType, trackFormat,
...@@ -408,6 +414,10 @@ import java.util.LinkedList; ...@@ -408,6 +414,10 @@ import java.util.LinkedList;
} }
public int skipData(int sampleQueueIndex, long positionUs) { public int skipData(int sampleQueueIndex, long positionUs) {
if (isPendingReset()) {
return 0;
}
SampleQueue sampleQueue = sampleQueues[sampleQueueIndex]; SampleQueue sampleQueue = sampleQueues[sampleQueueIndex];
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) { if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
return sampleQueue.advanceToEnd(); return sampleQueue.advanceToEnd();
...@@ -449,7 +459,7 @@ import java.util.LinkedList; ...@@ -449,7 +459,7 @@ import java.util.LinkedList;
previousChunk = null; previousChunk = null;
loadPositionUs = pendingResetPositionUs; loadPositionUs = pendingResetPositionUs;
} else { } else {
previousChunk = mediaChunks.getLast(); previousChunk = getLastMediaChunk();
loadPositionUs = previousChunk.endTimeUs; loadPositionUs = previousChunk.endTimeUs;
} }
chunkSource.getNextChunk(previousChunk, positionUs, loadPositionUs, nextChunkHolder); chunkSource.getNextChunk(previousChunk, positionUs, loadPositionUs, nextChunkHolder);
...@@ -489,7 +499,7 @@ import java.util.LinkedList; ...@@ -489,7 +499,7 @@ import java.util.LinkedList;
if (isPendingReset()) { if (isPendingReset()) {
return pendingResetPositionUs; return pendingResetPositionUs;
} else { } else {
return loadingFinished ? C.TIME_END_OF_SOURCE : mediaChunks.getLast().endTimeUs; return loadingFinished ? C.TIME_END_OF_SOURCE : getLastMediaChunk().endTimeUs;
} }
} }
...@@ -531,7 +541,7 @@ import java.util.LinkedList; ...@@ -531,7 +541,7 @@ import java.util.LinkedList;
boolean canceled = false; boolean canceled = false;
if (chunkSource.onChunkLoadError(loadable, cancelable, error)) { if (chunkSource.onChunkLoadError(loadable, cancelable, error)) {
if (isMediaChunk) { if (isMediaChunk) {
HlsMediaChunk removed = mediaChunks.removeLast(); HlsMediaChunk removed = mediaChunks.remove(mediaChunks.size() - 1);
Assertions.checkState(removed == loadable); Assertions.checkState(removed == loadable);
if (mediaChunks.isEmpty()) { if (mediaChunks.isEmpty()) {
pendingResetPositionUs = lastSeekPositionUs; pendingResetPositionUs = lastSeekPositionUs;
...@@ -764,6 +774,10 @@ import java.util.LinkedList; ...@@ -764,6 +774,10 @@ import java.util.LinkedList;
containerFormat.language); containerFormat.language);
} }
private HlsMediaChunk getLastMediaChunk() {
return mediaChunks.get(mediaChunks.size() - 1);
}
private boolean isMediaChunk(Chunk chunk) { private boolean isMediaChunk(Chunk chunk) {
return chunk instanceof HlsMediaChunk; return chunk instanceof HlsMediaChunk;
} }
......
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