fix: correct MP3 frame header values in tests

Made-with: Cursor
This commit is contained in:
cottongin
2026-03-10 02:01:46 -04:00
parent 3d4d163508
commit fd73caf181

View File

@@ -15,8 +15,8 @@ class Mp3FrameSyncTest {
sampleRateIndex: Int, sampleRateIndex: Int,
padding: Boolean padding: Boolean
): ByteArray { ): ByteArray {
// Byte 0: sync. Byte 1: 0xF9 = sync + MPEG1(11) + LayerIII(01) + noCRC(1) // Byte 0: sync. Byte 1: 0xFB = sync + MPEG1(11) + LayerIII(01) + noCRC(1)
val byte1 = 0xF9.toByte() val byte1 = 0xFB.toByte()
// Byte 2: bitrate(4) | sample(2) | padding(1) | private(1) // Byte 2: bitrate(4) | sample(2) | padding(1) | private(1)
val byte2 = ((bitrateIndex shl 4) or (sampleRateIndex shl 2) or (if (padding) 2 else 0)).toByte() val byte2 = ((bitrateIndex shl 4) or (sampleRateIndex shl 2) or (if (padding) 2 else 0)).toByte()
return byteArrayOf(0xFF.toByte(), byte1, byte2, 0x00) return byteArrayOf(0xFF.toByte(), byte1, byte2, 0x00)
@@ -30,8 +30,8 @@ class Mp3FrameSyncTest {
sampleRateIndex: Int, sampleRateIndex: Int,
padding: Boolean padding: Boolean
): ByteArray { ): ByteArray {
// Byte 1: 0xF5 = sync + MPEG2(10) + LayerIII(01) + noCRC(1) // Byte 1: 0xF3 = sync + MPEG2(10) + LayerIII(01) + noCRC(1)
val byte1 = 0xF5.toByte() val byte1 = 0xF3.toByte()
val byte2 = ((bitrateIndex shl 4) or (sampleRateIndex shl 2) or (if (padding) 2 else 0)).toByte() val byte2 = ((bitrateIndex shl 4) or (sampleRateIndex shl 2) or (if (padding) 2 else 0)).toByte()
return byteArrayOf(0xFF.toByte(), byte1, byte2, 0x00) return byteArrayOf(0xFF.toByte(), byte1, byte2, 0x00)
} }
@@ -61,7 +61,7 @@ class Mp3FrameSyncTest {
@Test @Test
fun resyncsAfterGarbageBytes() { fun resyncsAfterGarbageBytes() {
val garbage = ByteArray(100) { 0x42 } val garbage = ByteArray(100) { 0x42 }
val header = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x80.toByte(), 0x00) val header = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x90.toByte(), 0x00)
val bodySize = 417 - 4 val bodySize = 417 - 4
val frame = buildFrame(header, bodySize) val frame = buildFrame(header, bodySize)
// Need second frame for two-frame validation // Need second frame for two-frame validation
@@ -79,8 +79,8 @@ class Mp3FrameSyncTest {
fun calculatesFrameSizeCorrectlyForVariousBitrates() { fun calculatesFrameSizeCorrectlyForVariousBitrates() {
// MPEG1 Layer3: 128kbps/44100Hz = 417, 192kbps/44100Hz = 626, 320kbps/44100Hz = 1044 // MPEG1 Layer3: 128kbps/44100Hz = 417, 192kbps/44100Hz = 626, 320kbps/44100Hz = 1044
val configs = listOf( val configs = listOf(
Triple(8, 0, 417), // 128kbps, 44100Hz Triple(9, 0, 417), // 128kbps, 44100Hz
Triple(12, 0, 626), // 192kbps, 44100Hz Triple(11, 0, 626), // 192kbps, 44100Hz
Triple(14, 0, 1044) // 320kbps, 44100Hz Triple(14, 0, 1044) // 320kbps, 44100Hz
) )
for ((bitrateIdx, sampleIdx, expectedSize) in configs) { for ((bitrateIdx, sampleIdx, expectedSize) in configs) {
@@ -94,18 +94,19 @@ class Mp3FrameSyncTest {
val frames = mutableListOf<ByteArray>() val frames = mutableListOf<ByteArray>()
Mp3FrameSync { frames.add(it) }.feed(data) Mp3FrameSync { frames.add(it) }.feed(data)
assertEquals("bitrateIndex=$bitrateIdx", 1, frames.size) assertEquals("bitrateIndex=$bitrateIdx", 2, frames.size)
assertEquals("bitrateIndex=$bitrateIdx", expectedSize, frames[0].size) assertEquals("bitrateIndex=$bitrateIdx", expectedSize, frames[0].size)
assertEquals("bitrateIndex=$bitrateIdx", expectedSize, frames[1].size)
} }
} }
@Test @Test
fun handlesPaddingBit() { fun handlesPaddingBit() {
// MPEG1 Layer3, 128kbps, 44100Hz, WITH padding → frameSize = 418. 0x92 = bitrate 8, padding. // MPEG1 Layer3, 128kbps, 44100Hz, WITH padding → frameSize = 418. 0x92 = bitrate 9, padding.
val header = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x92.toByte(), 0x00) // padding bit set val header = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x92.toByte(), 0x00) // padding bit set
val bodySize = 418 - 4 val bodySize = 418 - 4
val frame = buildFrame(header, bodySize) val frame = buildFrame(header, bodySize)
val nextHeader = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x92.toByte(), 0x00) val nextHeader = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x92.toByte(), 0x00)
val nextFrame = buildFrame(nextHeader, 418 - 4) val nextFrame = buildFrame(nextHeader, 418 - 4)
val data = frame + nextFrame val data = frame + nextFrame
@@ -118,7 +119,7 @@ class Mp3FrameSyncTest {
@Test @Test
fun emitsCompleteFramesViaCallback() { fun emitsCompleteFramesViaCallback() {
val header = buildMpeg1Layer3Header(8, 0, false) val header = buildMpeg1Layer3Header(9, 0, false)
val frame1 = buildFrame(header, 417 - 4) val frame1 = buildFrame(header, 417 - 4)
val frame2 = buildFrame(header, 417 - 4) val frame2 = buildFrame(header, 417 - 4)
val data = frame1 + frame2 val data = frame1 + frame2
@@ -133,7 +134,7 @@ class Mp3FrameSyncTest {
@Test @Test
fun handlesTruncatedFrameAtEnd() { fun handlesTruncatedFrameAtEnd() {
val header = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x80.toByte(), 0x00) val header = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x90.toByte(), 0x00)
// Only half the body (413/2 ≈ 206 bytes instead of 413) // Only half the body (413/2 ≈ 206 bytes instead of 413)
val truncatedBody = ByteArray(206) { 0 } val truncatedBody = ByteArray(206) { 0 }
val data = header + truncatedBody val data = header + truncatedBody
@@ -169,7 +170,7 @@ class Mp3FrameSyncTest {
@Test @Test
fun handlesIncrementalFeeding() { fun handlesIncrementalFeeding() {
val header = buildMpeg1Layer3Header(8, 0, false) val header = buildMpeg1Layer3Header(9, 0, false)
val frame = buildFrame(header, 417 - 4) val frame = buildFrame(header, 417 - 4)
val nextFrame = buildFrame(header, 417 - 4) val nextFrame = buildFrame(header, 417 - 4)
val data = frame + nextFrame val data = frame + nextFrame
@@ -193,7 +194,7 @@ class Mp3FrameSyncTest {
fun handlesMpeg2Frames() { fun handlesMpeg2Frames() {
// MPEG2 Layer3, 128kbps, 22050Hz → frameSize = (72 * 128000 / 22050) + padding // MPEG2 Layer3, 128kbps, 22050Hz → frameSize = (72 * 128000 / 22050) + padding
// 72 * 128000 / 22050 = 417.95... → 417 without padding, 418 with // 72 * 128000 / 22050 = 417.95... → 417 without padding, 418 with
val header = buildMpeg2Layer3Header(9, 0, false) // index 9 = 128kbps for MPEG2 val header = buildMpeg2Layer3Header(12, 0, false) // index 12 = 128kbps for MPEG2
val expectedSize = (72 * 128 * 1000 / 22050) // = 417 val expectedSize = (72 * 128 * 1000 / 22050) // = 417
val bodySize = expectedSize - 4 val bodySize = expectedSize - 4
val frame = buildFrame(header, bodySize) val frame = buildFrame(header, bodySize)