Commit 3868b1d4 by Oliver Woodman

Clean up media playlist blacklisting / fix nits.

It seems fairly safe to assume a playlist wont be blacklisted
within 1ms of the device booting :).
parent 2bb2e2c4
...@@ -107,10 +107,9 @@ public class HlsChunkSource { ...@@ -107,10 +107,9 @@ public class HlsChunkSource {
public static final long DEFAULT_MAX_BUFFER_TO_SWITCH_DOWN_MS = 20000; public static final long DEFAULT_MAX_BUFFER_TO_SWITCH_DOWN_MS = 20000;
/** /**
* The default maximum time a media playlist is blacklisted without * The default time for which a media playlist should be blacklisted.
* rechecking if it is alive again (because an encoder reset, for example)
*/ */
public static final long DEFAULT_MAX_TIME_MEDIA_PLAYLIST_BLACKLISTED_MS = 60000; public static final long DEFAULT_PLAYLIST_BLACKLIST_MS = 60000;
private static final String TAG = "HlsChunkSource"; private static final String TAG = "HlsChunkSource";
private static final String AAC_FILE_EXTENSION = ".aac"; private static final String AAC_FILE_EXTENSION = ".aac";
...@@ -132,8 +131,7 @@ public class HlsChunkSource { ...@@ -132,8 +131,7 @@ public class HlsChunkSource {
/* package */ byte[] scratchSpace; /* package */ byte[] scratchSpace;
/* package */ final HlsMediaPlaylist[] mediaPlaylists; /* package */ final HlsMediaPlaylist[] mediaPlaylists;
/* package */ final boolean[] mediaPlaylistBlacklistFlags; /* package */ final long[] mediaPlaylistBlacklistTimesMs;
/* package */ final long[] mediaPlaylistBlacklistedTimeMs;
/* package */ final long[] lastMediaPlaylistLoadTimesMs; /* package */ final long[] lastMediaPlaylistLoadTimesMs;
/* package */ boolean live; /* package */ boolean live;
/* package */ long durationUs; /* package */ long durationUs;
...@@ -188,16 +186,14 @@ public class HlsChunkSource { ...@@ -188,16 +186,14 @@ public class HlsChunkSource {
if (playlist.type == HlsPlaylist.TYPE_MEDIA) { if (playlist.type == HlsPlaylist.TYPE_MEDIA) {
enabledVariants = new Variant[] {new Variant(0, playlistUrl, 0, null, -1, -1)}; enabledVariants = new Variant[] {new Variant(0, playlistUrl, 0, null, -1, -1)};
mediaPlaylists = new HlsMediaPlaylist[1]; mediaPlaylists = new HlsMediaPlaylist[1];
mediaPlaylistBlacklistFlags = new boolean[1]; mediaPlaylistBlacklistTimesMs = new long[1];
mediaPlaylistBlacklistedTimeMs = new long[1];
lastMediaPlaylistLoadTimesMs = new long[1]; lastMediaPlaylistLoadTimesMs = new long[1];
setMediaPlaylist(0, (HlsMediaPlaylist) playlist); setMediaPlaylist(0, (HlsMediaPlaylist) playlist);
} else { } else {
Assertions.checkState(playlist.type == HlsPlaylist.TYPE_MASTER); Assertions.checkState(playlist.type == HlsPlaylist.TYPE_MASTER);
enabledVariants = filterVariants((HlsMasterPlaylist) playlist, variantIndices); enabledVariants = filterVariants((HlsMasterPlaylist) playlist, variantIndices);
mediaPlaylists = new HlsMediaPlaylist[enabledVariants.length]; mediaPlaylists = new HlsMediaPlaylist[enabledVariants.length];
mediaPlaylistBlacklistFlags = new boolean[enabledVariants.length]; mediaPlaylistBlacklistTimesMs = new long[enabledVariants.length];
mediaPlaylistBlacklistedTimeMs = new long[enabledVariants.length];
lastMediaPlaylistLoadTimesMs = new long[enabledVariants.length]; lastMediaPlaylistLoadTimesMs = new long[enabledVariants.length];
} }
...@@ -370,8 +366,7 @@ public class HlsChunkSource { ...@@ -370,8 +366,7 @@ public class HlsChunkSource {
int responseCode = responseCodeException.responseCode; int responseCode = responseCodeException.responseCode;
if (responseCode == 404 || responseCode == 410) { if (responseCode == 404 || responseCode == 410) {
MediaPlaylistChunk playlistChunk = (MediaPlaylistChunk) chunk; MediaPlaylistChunk playlistChunk = (MediaPlaylistChunk) chunk;
mediaPlaylistBlacklistFlags[playlistChunk.variantIndex] = true; mediaPlaylistBlacklistTimesMs[playlistChunk.variantIndex] = SystemClock.elapsedRealtime();
mediaPlaylistBlacklistedTimeMs[playlistChunk.variantIndex] = SystemClock.elapsedRealtime();
if (!allPlaylistsBlacklisted()) { if (!allPlaylistsBlacklisted()) {
// We've handled the 404/410 by blacklisting the playlist. // We've handled the 404/410 by blacklisting the playlist.
Log.w(TAG, "Blacklisted playlist (" + responseCode + "): " Log.w(TAG, "Blacklisted playlist (" + responseCode + "): "
...@@ -381,8 +376,7 @@ public class HlsChunkSource { ...@@ -381,8 +376,7 @@ public class HlsChunkSource {
// This was the last non-blacklisted playlist. Don't blacklist it. // This was the last non-blacklisted playlist. Don't blacklist it.
Log.w(TAG, "Final playlist not blacklisted (" + responseCode + "): " Log.w(TAG, "Final playlist not blacklisted (" + responseCode + "): "
+ playlistChunk.dataSpec.uri); + playlistChunk.dataSpec.uri);
mediaPlaylistBlacklistFlags[playlistChunk.variantIndex] = false; mediaPlaylistBlacklistTimesMs[playlistChunk.variantIndex] = 0;
mediaPlaylistBlacklistedTimeMs[playlistChunk.variantIndex] = 0;
return false; return false;
} }
} }
...@@ -404,7 +398,7 @@ public class HlsChunkSource { ...@@ -404,7 +398,7 @@ public class HlsChunkSource {
: adaptiveMode == ADAPTIVE_MODE_SPLICE ? previousTsChunk.startTimeUs : adaptiveMode == ADAPTIVE_MODE_SPLICE ? previousTsChunk.startTimeUs
: previousTsChunk.endTimeUs; : previousTsChunk.endTimeUs;
long bufferedUs = bufferedPositionUs - playbackPositionUs; long bufferedUs = bufferedPositionUs - playbackPositionUs;
if (mediaPlaylistBlacklistFlags[variantIndex] if (mediaPlaylistBlacklistTimesMs[variantIndex] != 0
|| (idealVariantIndex > variantIndex && bufferedUs < maxBufferDurationToSwitchDownUs) || (idealVariantIndex > variantIndex && bufferedUs < maxBufferDurationToSwitchDownUs)
|| (idealVariantIndex < variantIndex && bufferedUs > minBufferDurationToSwitchUpUs)) { || (idealVariantIndex < variantIndex && bufferedUs > minBufferDurationToSwitchUpUs)) {
// Switch variant. // Switch variant.
...@@ -417,7 +411,7 @@ public class HlsChunkSource { ...@@ -417,7 +411,7 @@ public class HlsChunkSource {
private int getVariantIndexForBandwdith(int bandwidth) { private int getVariantIndexForBandwdith(int bandwidth) {
int lowestQualityEnabledVariant = 0; int lowestQualityEnabledVariant = 0;
for (int i = 0; i < enabledVariants.length; i++) { for (int i = 0; i < enabledVariants.length; i++) {
if (!mediaPlaylistBlacklistFlags[i]) { if (mediaPlaylistBlacklistTimesMs[i] == 0) {
if (enabledVariants[i].bandwidth <= bandwidth) { if (enabledVariants[i].bandwidth <= bandwidth) {
return i; return i;
} }
...@@ -545,8 +539,8 @@ public class HlsChunkSource { ...@@ -545,8 +539,8 @@ public class HlsChunkSource {
} }
private boolean allPlaylistsBlacklisted() { private boolean allPlaylistsBlacklisted() {
for (int i = 0; i < mediaPlaylistBlacklistFlags.length; i++) { for (int i = 0; i < mediaPlaylistBlacklistTimesMs.length; i++) {
if (!mediaPlaylistBlacklistFlags[i]) { if (mediaPlaylistBlacklistTimesMs[i] == 0) {
return false; return false;
} }
} }
...@@ -555,11 +549,10 @@ public class HlsChunkSource { ...@@ -555,11 +549,10 @@ public class HlsChunkSource {
private void clearStaleBlacklistedPlaylists() { private void clearStaleBlacklistedPlaylists() {
long currentTime = SystemClock.elapsedRealtime(); long currentTime = SystemClock.elapsedRealtime();
for (int i = 0; i < mediaPlaylistBlacklistFlags.length; i++) { for (int i = 0; i < mediaPlaylistBlacklistTimesMs.length; i++) {
if (mediaPlaylistBlacklistFlags[i] && if (mediaPlaylistBlacklistTimesMs[i] != 0
currentTime - mediaPlaylistBlacklistedTimeMs[i] > DEFAULT_MAX_TIME_MEDIA_PLAYLIST_BLACKLISTED_MS) { && currentTime - mediaPlaylistBlacklistTimesMs[i] > DEFAULT_PLAYLIST_BLACKLIST_MS) {
mediaPlaylistBlacklistFlags[i] = false; mediaPlaylistBlacklistTimesMs[i] = 0;
mediaPlaylistBlacklistedTimeMs[i] = 0;
} }
} }
} }
......
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