Commit 49a93daf by olly Committed by Oliver Woodman

Restore HLS playback tests.

This fixes HlsChunkSource to allow selection of variants
other than the first one (as originally ordered in the
master playlist) in the case that the first one is
blacklisted. Having done this, the two disabled tests can
be restored.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126646547
parent 8db06a33
...@@ -75,7 +75,9 @@ public class HlsChunkSource { ...@@ -75,7 +75,9 @@ public class HlsChunkSource {
private final Variant[] variants; private final Variant[] variants;
private final HlsMediaPlaylist[] variantPlaylists; private final HlsMediaPlaylist[] variantPlaylists;
private final long[] variantLastPlaylistLoadTimesMs; private final long[] variantLastPlaylistLoadTimesMs;
private final int initialEnabledVariantIndex;
private boolean seenFirstExternalTrackSelection;
private byte[] scratchSpace; private byte[] scratchSpace;
private boolean live; private boolean live;
private long durationUs; private long durationUs;
...@@ -112,7 +114,12 @@ public class HlsChunkSource { ...@@ -112,7 +114,12 @@ public class HlsChunkSource {
evaluation = new Evaluation(); evaluation = new Evaluation();
variantPlaylists = new HlsMediaPlaylist[variants.length]; variantPlaylists = new HlsMediaPlaylist[variants.length];
variantLastPlaylistLoadTimesMs = new long[variants.length]; variantLastPlaylistLoadTimesMs = new long[variants.length];
selectTracks(new int[] {0}, false); int[] initialTrackSelection = new int[variants.length];
for (int i = 0; i < variants.length; i++) {
initialTrackSelection[i] = i;
}
selectTracksInternal(initialTrackSelection, false);
initialEnabledVariantIndex = getEnabledVariantIndex(variants[0].format);
} }
/** /**
...@@ -187,38 +194,9 @@ public class HlsChunkSource { ...@@ -187,38 +194,9 @@ public class HlsChunkSource {
* This method should only be called after the source has been prepared. * This method should only be called after the source has been prepared.
* *
* @param tracks The track indices. * @param tracks The track indices.
* @param isFirstTrackSelection True if this is the first selection, false otherwise.
*/ */
public void selectTracks(int[] tracks, boolean isFirstTrackSelection) { public void selectTracks(int[] tracks) {
// Construct and sort the enabled variants. selectTracksInternal(tracks, true);
enabledVariants = new Variant[tracks.length];
for (int i = 0; i < tracks.length; i++) {
enabledVariants[i] = variants[tracks[i]];
}
Arrays.sort(enabledVariants, new Comparator<Variant>() {
private final Comparator<Format> formatComparator =
new Format.DecreasingBandwidthComparator();
@Override
public int compare(Variant first, Variant second) {
return formatComparator.compare(first.format, second.format);
}
});
// Reset the enabled variant blacklist flags.
enabledVariantBlacklistTimes = new long[enabledVariants.length];
enabledVariantBlacklistFlags = new boolean[enabledVariants.length];
if (enabledVariants.length > 1) {
Format[] formats = new Format[enabledVariants.length];
for (int i = 0; i < formats.length; i++) {
formats[i] = enabledVariants[i].format;
}
// TODO[REFACTOR]: We need to disable this at some point.
adaptiveFormatEvaluator.enable(formats);
if (!isFirstTrackSelection || !Util.contains(formats, evaluation.format)) {
evaluation.format = null;
}
}
} }
/** /**
...@@ -441,9 +419,50 @@ public class HlsChunkSource { ...@@ -441,9 +419,50 @@ public class HlsChunkSource {
// Private methods. // Private methods.
private void selectTracksInternal(int[] tracks, boolean isExternal) {
seenFirstExternalTrackSelection |= isExternal;
// Construct and sort the enabled variants.
enabledVariants = new Variant[tracks.length];
for (int i = 0; i < tracks.length; i++) {
enabledVariants[i] = variants[tracks[i]];
}
Arrays.sort(enabledVariants, new Comparator<Variant>() {
private final Comparator<Format> formatComparator =
new Format.DecreasingBandwidthComparator();
@Override
public int compare(Variant first, Variant second) {
return formatComparator.compare(first.format, second.format);
}
});
// Reset the enabled variant blacklist flags.
enabledVariantBlacklistTimes = new long[enabledVariants.length];
enabledVariantBlacklistFlags = new boolean[enabledVariants.length];
if (enabledVariants.length > 1) {
Format[] formats = new Format[enabledVariants.length];
for (int i = 0; i < formats.length; i++) {
formats[i] = enabledVariants[i].format;
}
// TODO[REFACTOR]: We need to disable this at some point.
adaptiveFormatEvaluator.enable(formats);
if (!Util.contains(formats, evaluation.format)) {
evaluation.format = null;
}
} else {
evaluation.trigger = FormatEvaluator.TRIGGER_UNKNOWN;
evaluation.data = null;
}
}
private void updateFormatEvaluation(HlsMediaChunk previous, long playbackPositionUs) { private void updateFormatEvaluation(HlsMediaChunk previous, long playbackPositionUs) {
clearStaleBlacklistedVariants(); clearStaleBlacklistedVariants();
if (enabledVariants.length > 1) { if (!seenFirstExternalTrackSelection
&& !enabledVariantBlacklistFlags[initialEnabledVariantIndex]) {
// Use the first variant prior to external track selection, unless it's been blacklisted.
evaluation.format = variants[0].format;
} else if (enabledVariants.length > 1) {
long bufferedDurationUs; long bufferedDurationUs;
if (previous != null) { if (previous != null) {
// Use start time of the previous chunk rather than its end time because switching format // Use start time of the previous chunk rather than its end time because switching format
...@@ -456,8 +475,6 @@ public class HlsChunkSource { ...@@ -456,8 +475,6 @@ public class HlsChunkSource {
evaluation); evaluation);
} else { } else {
evaluation.format = enabledVariants[0].format; evaluation.format = enabledVariants[0].format;
evaluation.trigger = FormatEvaluator.TRIGGER_UNKNOWN;
evaluation.data = null;
} }
} }
......
...@@ -274,7 +274,7 @@ public final class HlsSampleSource implements SampleSource, ...@@ -274,7 +274,7 @@ public final class HlsSampleSource implements SampleSource,
} }
@Override @Override
public void onContinueLoadingRequested(HlsTrackStreamWrapper trackStreanWrapper) { public void onContinueLoadingRequested(HlsTrackStreamWrapper trackStreamWrapper) {
callback.onContinueLoadingRequested(this); callback.onContinueLoadingRequested(this);
} }
......
...@@ -168,7 +168,7 @@ import java.util.List; ...@@ -168,7 +168,7 @@ import java.util.List;
int[] tracks = selection.getTracks(); int[] tracks = selection.getTracks();
setTrackGroupEnabledState(group, true); setTrackGroupEnabledState(group, true);
if (group == primaryTrackGroupIndex) { if (group == primaryTrackGroupIndex) {
chunkSource.selectTracks(tracks, isFirstTrackSelection); chunkSource.selectTracks(tracks);
} }
newStreams[i] = new TrackStreamImpl(group); newStreams[i] = new TrackStreamImpl(group);
} }
...@@ -379,7 +379,11 @@ import java.util.List; ...@@ -379,7 +379,11 @@ import java.util.List;
loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, loadable.bytesLoaded(), error, loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, loadable.bytesLoaded(), error,
canceled); canceled);
if (canceled) { if (canceled) {
callback.onContinueLoadingRequested(this); if (!prepared) {
continueLoading(lastSeekPositionUs);
} else {
callback.onContinueLoadingRequested(this);
}
return Loader.DONT_RETRY; return Loader.DONT_RETRY;
} else { } else {
return Loader.RETRY; return Loader.RETRY;
......
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