Skip to content

Commit 4e6f4ab

Browse files
committed
Simplify Mp3ExtractorTest with Guava & ByteBuffer
1 parent 040a7d4 commit 4e6f4ab

1 file changed

Lines changed: 14 additions & 38 deletions

File tree

libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java

Lines changed: 14 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package androidx.media3.extractor.mp3;
1717

18+
import static com.google.common.base.Preconditions.checkState;
1819
import static com.google.common.collect.ImmutableList.toImmutableList;
1920
import static com.google.common.truth.Truth.assertThat;
2021
import static org.junit.Assume.assumeFalse;
@@ -23,6 +24,7 @@
2324
import androidx.media3.common.C;
2425
import androidx.media3.common.Format;
2526
import androidx.media3.common.Metadata;
27+
import androidx.media3.common.util.Util;
2628
import androidx.media3.extractor.Extractor;
2729
import androidx.media3.extractor.MpegAudioUtil;
2830
import androidx.media3.extractor.PositionHolder;
@@ -37,8 +39,10 @@
3739
import androidx.test.core.app.ApplicationProvider;
3840
import com.google.common.base.Ascii;
3941
import com.google.common.collect.ImmutableList;
42+
import com.google.common.primitives.Bytes;
4043
import com.google.testing.junit.testparameterinjector.TestParameter;
4144
import com.google.testing.junit.testparameterinjector.TestParameterValuesProvider;
45+
import java.nio.ByteBuffer;
4246
import org.junit.Test;
4347
import org.junit.runner.RunWith;
4448
import org.robolectric.RobolectricTestParameterInjector;
@@ -129,14 +133,13 @@ public void mp3SampleWithInfoHeader_invalidDataSizeFallsBackToFrameBitrate() thr
129133
byte[] fileBytes =
130134
TestUtil.getByteArray(
131135
ApplicationProvider.getApplicationContext(), "media/mp3/test-cbr-info-header.mp3");
132-
int infoTagOffset = indexOf(fileBytes, new byte[] {'I', 'n', 'f', 'o'});
133-
assertThat(infoTagOffset).isAtLeast(0);
134-
int infoFramePosition = findMpegFramePositionBeforeTag(fileBytes, infoTagOffset);
135-
assertThat(infoFramePosition).isNotEqualTo(C.INDEX_UNSET);
136+
int infoTagOffset = Bytes.indexOf(fileBytes, new byte[]{'I', 'n', 'f', 'o'});
137+
checkState(infoTagOffset >= 0);
138+
ByteBuffer fileBytesBuffer = ByteBuffer.wrap(fileBytes);
139+
int infoFramePosition = findMpegFramePositionBeforeTag(fileBytesBuffer, infoTagOffset);
136140
MpegAudioUtil.Header infoFrameHeader = new MpegAudioUtil.Header();
137-
assertThat(infoFrameHeader.setForHeaderData(readBigEndianInt(fileBytes, infoFramePosition)))
138-
.isTrue();
139-
writeBigEndianInt(fileBytes, infoTagOffset + 12, infoFrameHeader.frameSize);
141+
checkState(infoFrameHeader.setForHeaderData(fileBytesBuffer.getInt(infoFramePosition)));
142+
fileBytesBuffer.putInt(infoTagOffset + 12, infoFrameHeader.frameSize);
140143

141144
FakeExtractorOutput output =
142145
extractUntilSeekMap(new Mp3Extractor(), fileBytes, /* simulateUnknownLength= */ false);
@@ -458,42 +461,15 @@ private static FakeExtractorOutput extractUntilSeekMap(
458461
return output;
459462
}
460463

461-
private static int findMpegFramePositionBeforeTag(byte[] data, int tagOffset) {
464+
private static int findMpegFramePositionBeforeTag(ByteBuffer data, int tagOffset) {
462465
for (int tagOffsetFromFrameStart : new int[] {13, 21, 36}) {
463466
int framePosition = tagOffset - tagOffsetFromFrameStart;
464467
if (framePosition >= 0
465-
&& framePosition + 4 <= data.length
466-
&& new MpegAudioUtil.Header().setForHeaderData(readBigEndianInt(data, framePosition))) {
468+
&& framePosition + 4 <= data.remaining()
469+
&& new MpegAudioUtil.Header().setForHeaderData(data.getInt(framePosition))) {
467470
return framePosition;
468471
}
469472
}
470-
return C.INDEX_UNSET;
471-
}
472-
473-
private static int indexOf(byte[] data, byte[] target) {
474-
for (int i = 0; i <= data.length - target.length; i++) {
475-
boolean matches = true;
476-
for (int j = 0; j < target.length; j++) {
477-
matches &= data[i + j] == target[j];
478-
}
479-
if (matches) {
480-
return i;
481-
}
482-
}
483-
return C.INDEX_UNSET;
484-
}
485-
486-
private static int readBigEndianInt(byte[] data, int offset) {
487-
return ((data[offset] & 0xFF) << 24)
488-
| ((data[offset + 1] & 0xFF) << 16)
489-
| ((data[offset + 2] & 0xFF) << 8)
490-
| (data[offset + 3] & 0xFF);
491-
}
492-
493-
private static void writeBigEndianInt(byte[] data, int offset, int value) {
494-
data[offset] = (byte) (value >> 24);
495-
data[offset + 1] = (byte) (value >> 16);
496-
data[offset + 2] = (byte) (value >> 8);
497-
data[offset + 3] = (byte) value;
473+
throw new IllegalArgumentException("No tag found in " + Util.toHexString(data.array()));
498474
}
499475
}

0 commit comments

Comments
 (0)