From f04e412a1c1b1f57a8921852ce6ed3d9fb08a263 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 15 Mar 2016 08:37:31 -0700 Subject: [PATCH] Improve unsupported edts handling When the edited sample sequence does not contain any sync sample Exoplayer does not provide support. This CL changes the ArrayIndexOutOfBoundsException for a more explicative ParserException. Issue: #1336 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=117241805 --- .../exoplayer/extractor/mp4/AtomParsers.java | 14 +++++++++++++- .../exoplayer/extractor/mp4/Mp4Extractor.java | 5 +++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java index ef6070122f..97bd4f63c1 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer.extractor.mp4; import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; +import com.google.android.exoplayer.ParserException; import com.google.android.exoplayer.extractor.GaplessInfo; import com.google.android.exoplayer.util.Ac3Util; import com.google.android.exoplayer.util.Assertions; @@ -82,8 +83,10 @@ import java.util.List; * @param track Track to which this sample table corresponds. * @param stblAtom stbl (sample table) atom to parse. * @return Sample table described by the stbl atom. + * @throws ParserException If the resulting sample sequence does not contain a sync sample. */ - public static TrackSampleTable parseStbl(Track track, Atom.ContainerAtom stblAtom) { + public static TrackSampleTable parseStbl(Track track, Atom.ContainerAtom stblAtom) + throws ParserException { // Array of sample sizes. ParsableByteArray stsz = stblAtom.getLeafAtomOfType(Atom.TYPE_stsz).data; @@ -327,6 +330,15 @@ import java.util.List; } pts += duration; } + + boolean hasSyncSample = false; + for (int i = 0; i < editedFlags.length && !hasSyncSample; i++) { + hasSyncSample |= (editedFlags[i] & C.SAMPLE_FLAG_SYNC) != 0; + } + if (!hasSyncSample) { + throw new ParserException("The edited sample sequence does not contain a sync sample."); + } + return new TrackSampleTable(editedOffsets, editedSizes, editedMaximumSize, editedTimestamps, editedFlags); } 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 c3dcc4ca0f..8a4a998135 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 @@ -17,6 +17,7 @@ package com.google.android.exoplayer.extractor.mp4; import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; +import com.google.android.exoplayer.ParserException; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; @@ -247,7 +248,7 @@ public final class Mp4Extractor implements Extractor, SeekMap { return seekRequired && parserState != STATE_READING_SAMPLE; } - private void processAtomEnded(long atomEndPosition) { + private void processAtomEnded(long atomEndPosition) throws ParserException { while (!containerAtoms.isEmpty() && containerAtoms.peek().endPosition == atomEndPosition) { Atom.ContainerAtom containerAtom = containerAtoms.pop(); if (containerAtom.type == Atom.TYPE_moov) { @@ -288,7 +289,7 @@ public final class Mp4Extractor implements Extractor, SeekMap { /** * Updates the stored track metadata to reflect the contents of the specified moov atom. */ - private void processMoovAtom(ContainerAtom moov) { + private void processMoovAtom(ContainerAtom moov) throws ParserException { long durationUs = C.UNKNOWN_TIME_US; List tracks = new ArrayList<>(); long earliestSampleOffset = Long.MAX_VALUE;