diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java index 59bf9d113c..cf0e8a2c28 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java @@ -72,6 +72,7 @@ public class ExtractorSampleSource implements SampleSource, ExtractorOutput, Loa private boolean prepared; private int enabledTrackCount; private TrackInfo[] trackInfos; + private long maxTrackDurationUs; private boolean[] pendingMediaFormat; private boolean[] pendingDiscontinuities; private boolean[] trackEnabledStates; @@ -156,9 +157,13 @@ public class ExtractorSampleSource implements SampleSource, ExtractorOutput, Loa pendingDiscontinuities = new boolean[trackCount]; pendingMediaFormat = new boolean[trackCount]; trackInfos = new TrackInfo[trackCount]; + maxTrackDurationUs = C.UNKNOWN_TIME_US; for (int i = 0; i < trackCount; i++) { MediaFormat format = sampleQueues.valueAt(i).getFormat(); trackInfos[i] = new TrackInfo(format.mimeType, format.durationUs); + if (format.durationUs != C.UNKNOWN_TIME_US && format.durationUs > maxTrackDurationUs) { + maxTrackDurationUs = format.durationUs; + } } prepared = true; return true; @@ -448,6 +453,11 @@ public class ExtractorSampleSource implements SampleSource, ExtractorOutput, Loa loadable = createLoadableFromStart(); } else { Assertions.checkState(isPendingReset()); + if (maxTrackDurationUs != C.UNKNOWN_TIME_US && pendingResetPositionUs >= maxTrackDurationUs) { + loadingFinished = true; + pendingResetPositionUs = NO_RESET_PENDING; + return; + } loadable = createLoadableFromPositionUs(pendingResetPositionUs); pendingResetPositionUs = NO_RESET_PENDING; }