From 6b03e6a17c8a970e41c39bdc686c1ced77371319 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Wed, 22 Jul 2015 18:46:46 +0100 Subject: [PATCH] Fix MP4+MKV sniffing to handle empty atoms / EBML elements. Issue: #641 --- .../google/android/exoplayer/extractor/mp4/Sniffer.java | 4 ++-- .../google/android/exoplayer/extractor/webm/Sniffer.java | 8 +++++--- .../android/exoplayer/extractor/webm/WebmExtractor.java | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Sniffer.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Sniffer.java index bb65ab68e1..ece82e5beb 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Sniffer.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Sniffer.java @@ -102,7 +102,7 @@ import java.io.IOException; atomSize = buffer.readLong(); } // Check the atom size is large enough to include its header. - if (atomSize <= headerSize || atomSize > Integer.MAX_VALUE) { + if (atomSize < headerSize || atomSize > Integer.MAX_VALUE) { return false; } // Stop searching if reading this atom would exceed the search limit. @@ -129,7 +129,7 @@ import java.io.IOException; } else if (atomType == Atom.TYPE_moof) { foundFragment = true; break; - } else { + } else if (atomDataSize != 0) { input.advancePeekPosition(atomDataSize); } bytesSearched += atomSize; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/webm/Sniffer.java b/library/src/main/java/com/google/android/exoplayer/extractor/webm/Sniffer.java index 4edc79a553..b0fddff7fb 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/webm/Sniffer.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/webm/Sniffer.java @@ -76,11 +76,13 @@ import java.io.IOException; return false; } long size = readUint(input); - if (size <= 0 || size > Integer.MAX_VALUE) { + if (size < 0 || size > Integer.MAX_VALUE) { return false; } - input.advancePeekPosition((int) size); - peekLength += size; + if (size != 0) { + input.advancePeekPosition((int) size); + peekLength += size; + } } return peekLength == headerStart + headerSize; } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java index 62edf3c7fd..9b3e56c45c 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java @@ -1187,7 +1187,8 @@ public final class WebmExtractor implements Extractor { System.arraycopy(NalUnitUtil.NAL_START_CODE, 0, buffer, bufferPosition, NalUnitUtil.NAL_START_CODE.length); bufferPosition += NalUnitUtil.NAL_START_CODE.length; - System.arraycopy(parent.data, parent.getPosition(), buffer, bufferPosition, nalUnitLength); + System.arraycopy(parent.data, parent.getPosition(), buffer, bufferPosition, + nalUnitLength); bufferPosition += nalUnitLength; parent.skipBytes(nalUnitLength); }