From 7aae5805b837eefab8835de6bd488132d69fb890 Mon Sep 17 00:00:00 2001 From: eguven Date: Tue, 31 May 2016 07:51:46 -0700 Subject: [PATCH] Added Mp3ExtractorTest and modified Mp3Extractor to pass the test. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=123640738 --- library/src/androidTest/assets/mp3/bear.mp3 | Bin 0 -> 44745 bytes .../src/androidTest/assets/mp3/bear.mp3.dump | 494 ++++++++++++++++++ .../extractor/mp3/Mp3ExtractorTest.java | 37 ++ .../exoplayer/extractor/mp3/Mp3Extractor.java | 14 +- 4 files changed, 540 insertions(+), 5 deletions(-) create mode 100644 library/src/androidTest/assets/mp3/bear.mp3 create mode 100644 library/src/androidTest/assets/mp3/bear.mp3.dump create mode 100644 library/src/androidTest/java/com/google/android/exoplayer/extractor/mp3/Mp3ExtractorTest.java diff --git a/library/src/androidTest/assets/mp3/bear.mp3 b/library/src/androidTest/assets/mp3/bear.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0c1001ce3993c617ca52a7969b4ce58fd22fc78b GIT binary patch literal 44745 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%0A^Ef>{)Y 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 Kul@h;Oa2GE^8UjB literal 0 HcmV?d00001 diff --git a/library/src/androidTest/assets/mp3/bear.mp3.dump b/library/src/androidTest/assets/mp3/bear.mp3.dump new file mode 100644 index 0000000000..6e44b4eb72 --- /dev/null +++ b/library/src/androidTest/assets/mp3/bear.mp3.dump @@ -0,0 +1,494 @@ +seekMap: + isSeekable = true + duration = 2784000 + getPosition(0) = 201 +numberOfTracks = 1 +track 0: + format: + bitrate = -1 + id = null + containerMimeType = null + sampleMimeType = audio/mpeg + maxInputSize = 4096 + requiresSecureDecryption = false + width = -1 + height = -1 + frameRate = -1.0 + rotationDegrees = -1 + pixelWidthHeightRatio = -1.0 + channelCount = 2 + sampleRate = 48000 + pcmEncoding = -1 + encoderDelay = 956 + encoderPadding = 3352 + subsampleOffsetUs = 9223372036854775807 + selectionFlags = 0 + language = null + drmInitData = - + initializationData: + sample count = 116 + sample 0: + time = 0 + flags = 1 + data = length 384, hash B1FBF8BD + sample 1: + time = 24000 + flags = 1 + data = length 384, hash 2B9A3B72 + sample 2: + time = 48000 + flags = 1 + data = length 384, hash 33C65BA6 + sample 3: + time = 72000 + flags = 1 + data = length 384, hash E64FE475 + sample 4: + time = 96000 + flags = 1 + data = length 384, hash E9122D34 + sample 5: + time = 120000 + flags = 1 + data = length 384, hash 9CC87327 + sample 6: + time = 144000 + flags = 1 + data = length 384, hash 118CF6DA + sample 7: + time = 168000 + flags = 1 + data = length 384, hash 9610D9D6 + sample 8: + time = 192000 + flags = 1 + data = length 384, hash 6ABFE405 + sample 9: + time = 216000 + flags = 1 + data = length 384, hash EE5C93A9 + sample 10: + time = 240000 + flags = 1 + data = length 384, hash 44E0D140 + sample 11: + time = 264000 + flags = 1 + data = length 384, hash 3B3DE1D6 + sample 12: + time = 288000 + flags = 1 + data = length 384, hash 3A572E7C + sample 13: + time = 312000 + flags = 1 + data = length 384, hash 240316E1 + sample 14: + time = 336000 + flags = 1 + data = length 384, hash 9EDA9AA0 + sample 15: + time = 360000 + flags = 1 + data = length 384, hash E31AB44F + sample 16: + time = 384000 + flags = 1 + data = length 384, hash A12497D6 + sample 17: + time = 408000 + flags = 1 + data = length 384, hash 8A179B75 + sample 18: + time = 432000 + flags = 1 + data = length 384, hash FCE9E107 + sample 19: + time = 456000 + flags = 1 + data = length 384, hash 52CA9665 + sample 20: + time = 480000 + flags = 1 + data = length 384, hash 9935EC4C + sample 21: + time = 504000 + flags = 1 + data = length 384, hash 33CA710A + sample 22: + time = 528000 + flags = 1 + data = length 384, hash 45B5D69 + sample 23: + time = 552000 + flags = 1 + data = length 384, hash 7CEC655D + sample 24: + time = 576000 + flags = 1 + data = length 384, hash 3B5D8310 + sample 25: + time = 600000 + flags = 1 + data = length 384, hash 3EB640F8 + sample 26: + time = 624000 + flags = 1 + data = length 384, hash FAEC53B4 + sample 27: + time = 648000 + flags = 1 + data = length 384, hash 92C8A6EE + sample 28: + time = 672000 + flags = 1 + data = length 384, hash 7CBAAE91 + sample 29: + time = 696000 + flags = 1 + data = length 384, hash 74AC754E + sample 30: + time = 720000 + flags = 1 + data = length 384, hash 8242C434 + sample 31: + time = 744000 + flags = 1 + data = length 384, hash 686C06FB + sample 32: + time = 768000 + flags = 1 + data = length 384, hash 1D872A3F + sample 33: + time = 792000 + flags = 1 + data = length 384, hash 900A20BC + sample 34: + time = 816000 + flags = 1 + data = length 384, hash B72FD8E7 + sample 35: + time = 840000 + flags = 1 + data = length 384, hash 85C9A1FB + sample 36: + time = 864000 + flags = 1 + data = length 384, hash 1600DF3 + sample 37: + time = 888000 + flags = 1 + data = length 384, hash D6C2138A + sample 38: + time = 912000 + flags = 1 + data = length 384, hash 737BA69E + sample 39: + time = 936000 + flags = 1 + data = length 384, hash F7E344F4 + sample 40: + time = 960000 + flags = 1 + data = length 384, hash 14EF6AFD + sample 41: + time = 984000 + flags = 1 + data = length 384, hash 61C9B92C + sample 42: + time = 1008000 + flags = 1 + data = length 384, hash ABE1368 + sample 43: + time = 1032000 + flags = 1 + data = length 384, hash 6A3B8547 + sample 44: + time = 1056000 + flags = 1 + data = length 384, hash 30E905FA + sample 45: + time = 1080000 + flags = 1 + data = length 384, hash 21A267CD + sample 46: + time = 1104000 + flags = 1 + data = length 384, hash D96A2651 + sample 47: + time = 1128000 + flags = 1 + data = length 384, hash 72340177 + sample 48: + time = 1152000 + flags = 1 + data = length 384, hash 9345E744 + sample 49: + time = 1176000 + flags = 1 + data = length 384, hash FDE39E3A + sample 50: + time = 1200000 + flags = 1 + data = length 384, hash F0B7465 + sample 51: + time = 1224000 + flags = 1 + data = length 384, hash 3693AB86 + sample 52: + time = 1248000 + flags = 1 + data = length 384, hash F39719B1 + sample 53: + time = 1272000 + flags = 1 + data = length 384, hash DA3958DC + sample 54: + time = 1296000 + flags = 1 + data = length 384, hash FDC7599F + sample 55: + time = 1320000 + flags = 1 + data = length 384, hash AEFF8471 + sample 56: + time = 1344000 + flags = 1 + data = length 384, hash 89C92C19 + sample 57: + time = 1368000 + flags = 1 + data = length 384, hash 5C786A4B + sample 58: + time = 1392000 + flags = 1 + data = length 384, hash 5ACA8B + sample 59: + time = 1416000 + flags = 1 + data = length 384, hash 7755974C + sample 60: + time = 1440000 + flags = 1 + data = length 384, hash 3934B73C + sample 61: + time = 1464000 + flags = 1 + data = length 384, hash DDD70A2F + sample 62: + time = 1488000 + flags = 1 + data = length 384, hash 8FACE2EF + sample 63: + time = 1512000 + flags = 1 + data = length 384, hash 4A602591 + sample 64: + time = 1536000 + flags = 1 + data = length 384, hash D019AA2D + sample 65: + time = 1560000 + flags = 1 + data = length 384, hash 8A680B9D + sample 66: + time = 1584000 + flags = 1 + data = length 384, hash B655C959 + sample 67: + time = 1608000 + flags = 1 + data = length 384, hash 2168336B + sample 68: + time = 1632000 + flags = 1 + data = length 384, hash D77F6D31 + sample 69: + time = 1656000 + flags = 1 + data = length 384, hash 524B4B2F + sample 70: + time = 1680000 + flags = 1 + data = length 384, hash 4752DDFC + sample 71: + time = 1704000 + flags = 1 + data = length 384, hash E786727F + sample 72: + time = 1728000 + flags = 1 + data = length 384, hash 5DA6FB8C + sample 73: + time = 1752000 + flags = 1 + data = length 384, hash 92F24269 + sample 74: + time = 1776000 + flags = 1 + data = length 384, hash CD0A3BA1 + sample 75: + time = 1800000 + flags = 1 + data = length 384, hash 7D00409F + sample 76: + time = 1824000 + flags = 1 + data = length 384, hash D7ADB5FA + sample 77: + time = 1848000 + flags = 1 + data = length 384, hash 4A140209 + sample 78: + time = 1872000 + flags = 1 + data = length 384, hash E801184A + sample 79: + time = 1896000 + flags = 1 + data = length 384, hash 53C6CF9C + sample 80: + time = 1920000 + flags = 1 + data = length 384, hash 19A8D99F + sample 81: + time = 1944000 + flags = 1 + data = length 384, hash E47EB43F + sample 82: + time = 1968000 + flags = 1 + data = length 384, hash 4EA329E7 + sample 83: + time = 1992000 + flags = 1 + data = length 384, hash 1CCAAE62 + sample 84: + time = 2016000 + flags = 1 + data = length 384, hash ED3F8C66 + sample 85: + time = 2040000 + flags = 1 + data = length 384, hash D3D646B6 + sample 86: + time = 2064000 + flags = 1 + data = length 384, hash 68CD1574 + sample 87: + time = 2088000 + flags = 1 + data = length 384, hash 8CEAB382 + sample 88: + time = 2112000 + flags = 1 + data = length 384, hash D54B1C48 + sample 89: + time = 2136000 + flags = 1 + data = length 384, hash FFE2EE90 + sample 90: + time = 2160000 + flags = 1 + data = length 384, hash BFE8A673 + sample 91: + time = 2184000 + flags = 1 + data = length 384, hash 978B1C92 + sample 92: + time = 2208000 + flags = 1 + data = length 384, hash 810CC71E + sample 93: + time = 2232000 + flags = 1 + data = length 384, hash 44FE42D9 + sample 94: + time = 2256000 + flags = 1 + data = length 384, hash 2F5BB02C + sample 95: + time = 2280000 + flags = 1 + data = length 384, hash 77DDB90 + sample 96: + time = 2304000 + flags = 1 + data = length 384, hash 24FB5EDA + sample 97: + time = 2328000 + flags = 1 + data = length 384, hash E73203C6 + sample 98: + time = 2352000 + flags = 1 + data = length 384, hash 14B525F1 + sample 99: + time = 2376000 + flags = 1 + data = length 384, hash 5E0F4E2E + sample 100: + time = 2400000 + flags = 1 + data = length 384, hash 67EE4E31 + sample 101: + time = 2424000 + flags = 1 + data = length 384, hash 2E04EC4C + sample 102: + time = 2448000 + flags = 1 + data = length 384, hash 852CABA7 + sample 103: + time = 2472000 + flags = 1 + data = length 384, hash 19928903 + sample 104: + time = 2496000 + flags = 1 + data = length 384, hash 5DA42021 + sample 105: + time = 2520000 + flags = 1 + data = length 384, hash 45B20B7C + sample 106: + time = 2544000 + flags = 1 + data = length 384, hash D108A215 + sample 107: + time = 2568000 + flags = 1 + data = length 384, hash BD25DB7C + sample 108: + time = 2592000 + flags = 1 + data = length 384, hash DA7F9861 + sample 109: + time = 2616000 + flags = 1 + data = length 384, hash CCD576F + sample 110: + time = 2640000 + flags = 1 + data = length 384, hash 405C1EB5 + sample 111: + time = 2664000 + flags = 1 + data = length 384, hash 6640B74E + sample 112: + time = 2688000 + flags = 1 + data = length 384, hash B4E5937A + sample 113: + time = 2712000 + flags = 1 + data = length 384, hash CEE17733 + sample 114: + time = 2736000 + flags = 1 + data = length 384, hash 2A0DA733 + sample 115: + time = 2760000 + flags = 1 + data = length 384, hash 97F4129B +tracksEnded = true diff --git a/library/src/androidTest/java/com/google/android/exoplayer/extractor/mp3/Mp3ExtractorTest.java b/library/src/androidTest/java/com/google/android/exoplayer/extractor/mp3/Mp3ExtractorTest.java new file mode 100644 index 0000000000..95dc9de932 --- /dev/null +++ b/library/src/androidTest/java/com/google/android/exoplayer/extractor/mp3/Mp3ExtractorTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer.extractor.mp3; + +import com.google.android.exoplayer.extractor.Extractor; +import com.google.android.exoplayer.testutil.TestUtil; + +import android.test.InstrumentationTestCase; + +/** + * Unit test for {@link Mp3Extractor}. + */ +public final class Mp3ExtractorTest extends InstrumentationTestCase { + + public void testMp3Sample() throws Exception { + TestUtil.assertOutput(new TestUtil.ExtractorFactory() { + @Override + public Extractor create() { + return new Mp3Extractor(); + } + }, "mp3/bear.mp3", getInstrumentation()); + } + +} diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java index 6a9092ea7b..703a935ea5 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java @@ -123,7 +123,7 @@ public final class Mp3Extractor implements Extractor { return RESULT_END_OF_INPUT; } if (seeker == null) { - setupSeeker(input); + seeker = setupSeeker(input); extractorOutput.seekMap(seeker); trackOutput.format(Format.createAudioSampleFormat(null, synchronizedHeader.mimeType, Format.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, synchronizedHeader.channels, @@ -263,17 +263,18 @@ public final class Mp3Extractor implements Extractor { } /** - * Sets {@link #seeker} to seek using metadata read from {@code input}, which should provide data - * from the start of the first frame in the stream. On returning, the input's position will be set - * to the start of the first frame of audio. + * Returns a {@link Seeker} to seek using metadata read from {@code input}, which should provide + * data from the start of the first frame in the stream. On returning, the input's position will + * be set to the start of the first frame of audio. * * @param input The {@link ExtractorInput} from which to read. * @throws IOException Thrown if there was an error reading from the stream. Not expected if the * next two frames were already peeked during synchronization. * @throws InterruptedException Thrown if reading from the stream was interrupted. Not expected if * the next two frames were already peeked during synchronization. + * @return a {@link Seeker}. */ - private void setupSeeker(ExtractorInput input) throws IOException, InterruptedException { + private Seeker setupSeeker(ExtractorInput input) throws IOException, InterruptedException { // Read the first frame which may contain a Xing or VBRI header with seeking metadata. ParsableByteArray frame = new ParsableByteArray(synchronizedHeader.frameSize); input.peekFully(frame.data, 0, synchronizedHeader.frameSize); @@ -287,6 +288,7 @@ public final class Mp3Extractor implements Extractor { : (synchronizedHeader.channels != 1 ? 21 : 13); // MPEG 2 or 2.5 frame.setPosition(xingBase); int headerData = frame.readInt(); + Seeker seeker = null; if (headerData == XING_HEADER || headerData == INFO_HEADER) { seeker = XingSeeker.create(synchronizedHeader, frame, position, length); if (seeker != null && !gaplessInfoHolder.hasGaplessInfo()) { @@ -317,6 +319,8 @@ public final class Mp3Extractor implements Extractor { MpegAudioHeader.populateHeader(scratch.readInt(), synchronizedHeader); seeker = new ConstantBitrateSeeker(input.getPosition(), synchronizedHeader.bitrate, length); } + + return seeker; } /**