diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java index 511f7f4a8a..c418c427f7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java @@ -93,6 +93,7 @@ import java.util.Arrays; private int[] sampleQueueTrackIds; private boolean sampleQueuesBuilt; private boolean prepared; + private int actualMinLoadableRetryCount; private boolean seenFirstTrackSelection; private boolean notifyDiscontinuity; @@ -160,6 +161,11 @@ import java.util.Arrays; sampleQueues = new SampleQueue[0]; pendingResetPositionUs = C.TIME_UNSET; length = C.LENGTH_UNSET; + // Assume on-demand for MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA, until prepared. + actualMinLoadableRetryCount = + minLoadableRetryCount == ExtractorMediaSource.MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA + ? ExtractorMediaSource.DEFAULT_MIN_LOADABLE_RETRY_COUNT_ON_DEMAND + : minLoadableRetryCount; } public void release() { @@ -359,7 +365,7 @@ import java.util.Arrays; } /* package */ void maybeThrowError() throws IOException { - loader.maybeThrowError(); + loader.maybeThrowError(actualMinLoadableRetryCount); } /* package */ int readData(int track, FormatHolder formatHolder, DecoderInputBuffer buffer, @@ -491,6 +497,10 @@ import java.util.Arrays; haveAudioVideoTracks |= isAudioVideo; } tracks = new TrackGroupArray(trackArray); + if (minLoadableRetryCount == ExtractorMediaSource.MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA + && length == C.LENGTH_UNSET && seekMap.getDurationUs() == C.TIME_UNSET) { + actualMinLoadableRetryCount = ExtractorMediaSource.DEFAULT_MIN_LOADABLE_RETRY_COUNT_LIVE; + } prepared = true; listener.onSourceInfoRefreshed(durationUs, seekMap.isSeekable()); callback.onPrepared(this); @@ -516,16 +526,7 @@ import java.util.Arrays; pendingResetPositionUs = C.TIME_UNSET; } extractedSamplesCountAtStartOfLoad = getExtractedSamplesCount(); - - int minRetryCount = minLoadableRetryCount; - if (minRetryCount == ExtractorMediaSource.MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA) { - // We assume on-demand before we're prepared. - minRetryCount = !prepared || length != C.LENGTH_UNSET - || (seekMap != null && seekMap.getDurationUs() != C.TIME_UNSET) - ? ExtractorMediaSource.DEFAULT_MIN_LOADABLE_RETRY_COUNT_ON_DEMAND - : ExtractorMediaSource.DEFAULT_MIN_LOADABLE_RETRY_COUNT_LIVE; - } - loader.startLoading(loadable, this, minRetryCount); + loader.startLoading(loadable, this, actualMinLoadableRetryCount); } private void configureRetry(ExtractingLoadable loadable) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index be8b3595db..1ba192488d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -184,8 +184,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe public void onSourceInfoRefreshed(long durationUs, boolean isSeekable) { // If we already have the duration from a previous source info refresh, use it. durationUs = durationUs == C.TIME_UNSET ? timelineDurationUs : durationUs; - if ((timelineDurationUs == durationUs && timelineIsSeekable == isSeekable) - || (timelineDurationUs != C.TIME_UNSET && durationUs == C.TIME_UNSET)) { + if (timelineDurationUs == durationUs && timelineIsSeekable == isSeekable) { // Suppress no-op source info changes. return; }