fix: correct MP3 frame header values in tests
Made-with: Cursor
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user