From 8bf0243daf3f20d421cc17d87f5fb9b51d30ef4b Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 29 Sep 2016 07:42:48 -0700 Subject: [PATCH] Fix mp3 extraction failure for short frames ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=134660133 --- .../exoplayer2/extractor/mp3/Mp3Extractor.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java b/library/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java index d201b3ace2..ab501af1cb 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java @@ -272,14 +272,17 @@ public final class Mp3Extractor implements Extractor { long position = input.getPosition(); long length = input.getLength(); + int headerData = 0; + Seeker seeker = null; // Check if there is a Xing header. int xingBase = (synchronizedHeader.version & 1) != 0 ? (synchronizedHeader.channels != 1 ? 36 : 21) // MPEG 1 : (synchronizedHeader.channels != 1 ? 21 : 13); // MPEG 2 or 2.5 - frame.setPosition(xingBase); - int headerData = frame.readInt(); - Seeker seeker = null; + if (frame.limit() >= xingBase + 4) { + frame.setPosition(xingBase); + headerData = frame.readInt(); + } if (headerData == XING_HEADER || headerData == INFO_HEADER) { seeker = XingSeeker.create(synchronizedHeader, frame, position, length); if (seeker != null && !gaplessInfoHolder.hasGaplessInfo()) { @@ -291,7 +294,7 @@ public final class Mp3Extractor implements Extractor { gaplessInfoHolder.setFromXingHeaderValue(scratch.readUnsignedInt24()); } input.skipFully(synchronizedHeader.frameSize); - } else { + } else if (frame.limit() >= 40) { // Check if there is a VBRI header. frame.setPosition(36); // MPEG audio header (4 bytes) + 32 bytes. headerData = frame.readInt();