From 1a3de408ac0656ea140083fce420dc9b6da275b6 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 7 Jul 2016 05:04:15 -0700 Subject: [PATCH] A few bug fixes. 1. Suppress onContinueLoadingRequested until a source is prepared (since such calls are not supposed to be made until after preparation has completed). 2. Don't use the format evaluator in HlsChunkSource prior to prepration completing. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=126794616 --- .../android/exoplayer/MultiSampleSource.java | 4 ++ .../android/exoplayer/hls/HlsChunkSource.java | 50 ++++++++++++------- .../exoplayer/hls/HlsSampleSource.java | 4 ++ 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/MultiSampleSource.java b/library/src/main/java/com/google/android/exoplayer/MultiSampleSource.java index 543df7eb7a..95357ecf1d 100644 --- a/library/src/main/java/com/google/android/exoplayer/MultiSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/MultiSampleSource.java @@ -192,6 +192,10 @@ public final class MultiSampleSource implements SampleSource, SampleSource.Callb @Override public void onContinueLoadingRequested(SampleSource ignored) { + if (trackGroups == null) { + // Still preparing. + return; + } callback.onContinueLoadingRequested(this); } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java index 7e5b50eda5..bbb56efbc9 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java @@ -75,7 +75,6 @@ public class HlsChunkSource { private final Variant[] variants; private final HlsMediaPlaylist[] variantPlaylists; private final long[] variantLastPlaylistLoadTimesMs; - private final int initialEnabledVariantIndex; private boolean seenFirstExternalTrackSelection; private byte[] scratchSpace; @@ -119,7 +118,6 @@ public class HlsChunkSource { initialTrackSelection[i] = i; } selectTracksInternal(initialTrackSelection, false); - initialEnabledVariantIndex = getEnabledVariantIndex(variants[0].format); } /** @@ -440,6 +438,10 @@ public class HlsChunkSource { enabledVariantBlacklistTimes = new long[enabledVariants.length]; enabledVariantBlacklistFlags = new boolean[enabledVariants.length]; + if (!isExternal) { + return; + } + if (enabledVariants.length > 1) { Format[] formats = new Format[enabledVariants.length]; for (int i = 0; i < formats.length; i++) { @@ -458,24 +460,36 @@ public class HlsChunkSource { private void updateFormatEvaluation(HlsMediaChunk previous, long playbackPositionUs) { clearStaleBlacklistedVariants(); - 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; - if (previous != null) { - // Use start time of the previous chunk rather than its end time because switching format - // will require downloading overlapping segments. - bufferedDurationUs = Math.max(0, previous.startTimeUs - playbackPositionUs); - } else { - bufferedDurationUs = 0; + if (!seenFirstExternalTrackSelection) { + if (!enabledVariantBlacklistFlags[getEnabledVariantIndex(variants[0].format)]) { + // Use the first variant prior to external track selection, unless it's been blacklisted. + evaluation.format = variants[0].format; + return; } - adaptiveFormatEvaluator.evaluateFormat(bufferedDurationUs, enabledVariantBlacklistFlags, - evaluation); - } else { - evaluation.format = enabledVariants[0].format; + // Try from lowest bitrate to highest. + for (int i = enabledVariants.length - 1; i >= 0; i--) { + if (!enabledVariantBlacklistFlags[i]) { + evaluation.format = enabledVariants[i].format; + return; + } + } + // Should never happen. + throw new IllegalStateException(); } + if (enabledVariants.length == 1) { + evaluation.format = enabledVariants[0].format; + return; + } + long bufferedDurationUs; + if (previous != null) { + // Use start time of the previous chunk rather than its end time because switching format + // will require downloading overlapping segments. + bufferedDurationUs = Math.max(0, previous.startTimeUs - playbackPositionUs); + } else { + bufferedDurationUs = 0; + } + adaptiveFormatEvaluator.evaluateFormat(bufferedDurationUs, enabledVariantBlacklistFlags, + evaluation); } private boolean shouldRerequestLiveMediaPlaylist(int variantIndex) { diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java index 1cacbd8601..5d99dcd4c2 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java @@ -284,6 +284,10 @@ public final class HlsSampleSource implements SampleSource, @Override public void onContinueLoadingRequested(HlsTrackStreamWrapper trackStreamWrapper) { + if (trackGroups == null) { + // Still preparing. + return; + } callback.onContinueLoadingRequested(this); }