diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java index 1f8f713e51..5dca9ad6c8 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java @@ -195,7 +195,12 @@ public final class Mp4Extractor implements Extractor, SeekMap { if (shouldParseContainerAtom(atomType)) { long endPosition = input.getPosition() + atomSize - atomHeaderBytesRead; containerAtoms.add(new ContainerAtom(atomType, endPosition)); - enterReadingAtomHeaderState(); + if (atomSize == atomHeaderBytesRead) { + processAtomEnded(endPosition); + } else { + // Start reading the first child atom. + enterReadingAtomHeaderState(); + } } else if (shouldParseLeafAtom(atomType)) { // We don't support parsing of leaf atoms that define extended atom sizes, or that have // lengths greater than Integer.MAX_VALUE. @@ -238,7 +243,11 @@ public final class Mp4Extractor implements Extractor, SeekMap { seekRequired = true; } } + processAtomEnded(atomEndPosition); + return seekRequired && parserState != STATE_READING_SAMPLE; + } + private void processAtomEnded(long atomEndPosition) { while (!containerAtoms.isEmpty() && containerAtoms.peek().endPosition == atomEndPosition) { Atom.ContainerAtom containerAtom = containerAtoms.pop(); if (containerAtom.type == Atom.TYPE_moov) { @@ -246,14 +255,13 @@ public final class Mp4Extractor implements Extractor, SeekMap { processMoovAtom(containerAtom); containerAtoms.clear(); parserState = STATE_READING_SAMPLE; - return false; } else if (!containerAtoms.isEmpty()) { containerAtoms.peek().add(containerAtom); } } - - enterReadingAtomHeaderState(); - return seekRequired; + if (parserState != STATE_READING_SAMPLE) { + enterReadingAtomHeaderState(); + } } /** @@ -289,7 +297,6 @@ public final class Mp4Extractor implements Extractor, SeekMap { if (udta != null) { gaplessInfo = AtomParsers.parseUdta(udta); } - for (int i = 0; i < moov.containerChildren.size(); i++) { Atom.ContainerAtom atom = moov.containerChildren.get(i); if (atom.type != Atom.TYPE_trak) {