MP3: Add test CBR sample with 'too small' PCUT frame

This shows ExoPlayer currently wrongly reports the duration of this
sample, because it assumes every frame is 32kbps (104 bytes) due to the
`PCUT` frame immediately after the `Info` frame.

A follow-up change will modify `Info` frame handling to resolve this
issue.

This sample was crafted using a hex editor to insert the additional
`PCUT` frame (the pattern of `null` and `x` is taken from the sample
file in Issue: androidx/media#1376, the header is modified to set the channel count
to 1 to match the rest of the file), and then update the frame count
and data size of the `Info` header to match.

Issue: androidx/media#1376
PiperOrigin-RevId: 635772837
This commit is contained in:
ibaker 2024-05-21 05:28:34 -07:00 committed by Copybara-Service
parent 8e4d82b012
commit 17bf47ed24
7 changed files with 600 additions and 0 deletions

View File

@ -47,6 +47,13 @@ public final class Mp3ExtractorTest {
Mp3Extractor::new, "media/mp3/test-cbr-info-header.mp3", simulationConfig);
}
// https://github.com/androidx/media/issues/1376#issuecomment-2117393653
@Test
public void mp3SampleWithInfoHeaderAndPcutFrame() throws Exception {
ExtractorAsserts.assertBehavior(
Mp3Extractor::new, "media/mp3/test-cbr-info-header-pcut-frame.mp3", simulationConfig);
}
@Test
public void mp3SampleWithCbrSeeker() throws Exception {
ExtractorAsserts.assertBehavior(

View File

@ -0,0 +1,185 @@
seekMap:
isSeekable = true
duration = 2115750
getPosition(0) = [[timeUs=0, position=227]]
getPosition(1) = [[timeUs=0, position=227], [timeUs=26000, position=331]]
getPosition(1057875) = [[timeUs=1040000, position=4387], [timeUs=1066000, position=4491]]
getPosition(2115750) = [[timeUs=2089750, position=8586]]
numberOfTracks = 1
track 0:
total output bytes = 8463
sample count = 41
format 0:
averageBitrate = 32000
sampleMimeType = audio/mpeg
maxInputSize = 4096
channelCount = 1
sampleRate = 44100
encoderDelay = 576
encoderPadding = 1404
metadata = entries=[TSSE: description=null: values=[Lavf58.45.100]]
sample 0:
time = 0
flags = 1
data = length 104, hash BF3B0C83
sample 1:
time = 26122
flags = 1
data = length 208, hash 5E56C6DF
sample 2:
time = 52244
flags = 1
data = length 209, hash 4FA4483
sample 3:
time = 78367
flags = 1
data = length 209, hash E1201788
sample 4:
time = 104489
flags = 1
data = length 209, hash FDB8052B
sample 5:
time = 130612
flags = 1
data = length 209, hash A8FF2C9
sample 6:
time = 156734
flags = 1
data = length 209, hash FD4AE506
sample 7:
time = 182857
flags = 1
data = length 209, hash EA0AC2FE
sample 8:
time = 208979
flags = 1
data = length 209, hash 84B9DDE0
sample 9:
time = 235102
flags = 1
data = length 209, hash 796A4F65
sample 10:
time = 261224
flags = 1
data = length 209, hash 4DE92719
sample 11:
time = 287346
flags = 1
data = length 209, hash 458A4711
sample 12:
time = 313469
flags = 1
data = length 209, hash 27954F2B
sample 13:
time = 339591
flags = 1
data = length 209, hash 1A5042B0
sample 14:
time = 365714
flags = 1
data = length 209, hash 6CCBBB3B
sample 15:
time = 391836
flags = 1
data = length 209, hash 34191E1
sample 16:
time = 417959
flags = 1
data = length 209, hash 57323ED7
sample 17:
time = 444081
flags = 1
data = length 209, hash 75618CF3
sample 18:
time = 470204
flags = 1
data = length 209, hash 784C973B
sample 19:
time = 496326
flags = 1
data = length 209, hash 49106390
sample 20:
time = 522448
flags = 1
data = length 209, hash 70F6A563
sample 21:
time = 548571
flags = 1
data = length 209, hash 721882B0
sample 22:
time = 574693
flags = 1
data = length 209, hash 81C62AEE
sample 23:
time = 600816
flags = 1
data = length 209, hash 16D22463
sample 24:
time = 626938
flags = 1
data = length 209, hash 47033534
sample 25:
time = 653061
flags = 1
data = length 209, hash CECB37A6
sample 26:
time = 679183
flags = 1
data = length 209, hash 6C9C307B
sample 27:
time = 705306
flags = 1
data = length 209, hash 3EB1A364
sample 28:
time = 731428
flags = 1
data = length 209, hash 30962500
sample 29:
time = 757551
flags = 1
data = length 209, hash 2C5CCBB7
sample 30:
time = 783673
flags = 1
data = length 209, hash F9CB9E37
sample 31:
time = 809795
flags = 1
data = length 209, hash F75BC8C0
sample 32:
time = 835918
flags = 1
data = length 209, hash D00ED607
sample 33:
time = 862040
flags = 1
data = length 209, hash B4338395
sample 34:
time = 888163
flags = 1
data = length 209, hash E3E838A0
sample 35:
time = 914285
flags = 1
data = length 209, hash 2B0CF78
sample 36:
time = 940408
flags = 1
data = length 209, hash 31906FA9
sample 37:
time = 966530
flags = 1
data = length 209, hash C92FC08F
sample 38:
time = 992653
flags = 1
data = length 209, hash 7C89994
sample 39:
time = 1018775
flags = 1
data = length 209, hash EC37743B
sample 40:
time = 1044897
flags = 1
data = length 209, hash C974F6FB
tracksEnded = true

View File

@ -0,0 +1,129 @@
seekMap:
isSeekable = true
duration = 2115750
getPosition(0) = [[timeUs=0, position=227]]
getPosition(1) = [[timeUs=0, position=227], [timeUs=26000, position=331]]
getPosition(1057875) = [[timeUs=1040000, position=4387], [timeUs=1066000, position=4491]]
getPosition(2115750) = [[timeUs=2089750, position=8586]]
numberOfTracks = 1
track 0:
total output bytes = 5643
sample count = 27
format 0:
averageBitrate = 32000
sampleMimeType = audio/mpeg
maxInputSize = 4096
channelCount = 1
sampleRate = 44100
encoderDelay = 576
encoderPadding = 1404
metadata = entries=[TSSE: description=null: values=[Lavf58.45.100]]
sample 0:
time = 705000
flags = 1
data = length 209, hash 6CCBBB3B
sample 1:
time = 731122
flags = 1
data = length 209, hash 34191E1
sample 2:
time = 757244
flags = 1
data = length 209, hash 57323ED7
sample 3:
time = 783367
flags = 1
data = length 209, hash 75618CF3
sample 4:
time = 809489
flags = 1
data = length 209, hash 784C973B
sample 5:
time = 835612
flags = 1
data = length 209, hash 49106390
sample 6:
time = 861734
flags = 1
data = length 209, hash 70F6A563
sample 7:
time = 887857
flags = 1
data = length 209, hash 721882B0
sample 8:
time = 913979
flags = 1
data = length 209, hash 81C62AEE
sample 9:
time = 940102
flags = 1
data = length 209, hash 16D22463
sample 10:
time = 966224
flags = 1
data = length 209, hash 47033534
sample 11:
time = 992346
flags = 1
data = length 209, hash CECB37A6
sample 12:
time = 1018469
flags = 1
data = length 209, hash 6C9C307B
sample 13:
time = 1044591
flags = 1
data = length 209, hash 3EB1A364
sample 14:
time = 1070714
flags = 1
data = length 209, hash 30962500
sample 15:
time = 1096836
flags = 1
data = length 209, hash 2C5CCBB7
sample 16:
time = 1122959
flags = 1
data = length 209, hash F9CB9E37
sample 17:
time = 1149081
flags = 1
data = length 209, hash F75BC8C0
sample 18:
time = 1175204
flags = 1
data = length 209, hash D00ED607
sample 19:
time = 1201326
flags = 1
data = length 209, hash B4338395
sample 20:
time = 1227448
flags = 1
data = length 209, hash E3E838A0
sample 21:
time = 1253571
flags = 1
data = length 209, hash 2B0CF78
sample 22:
time = 1279693
flags = 1
data = length 209, hash 31906FA9
sample 23:
time = 1305816
flags = 1
data = length 209, hash C92FC08F
sample 24:
time = 1331938
flags = 1
data = length 209, hash 7C89994
sample 25:
time = 1358061
flags = 1
data = length 209, hash EC37743B
sample 26:
time = 1384183
flags = 1
data = length 209, hash C974F6FB
tracksEnded = true

View File

@ -0,0 +1,73 @@
seekMap:
isSeekable = true
duration = 2115750
getPosition(0) = [[timeUs=0, position=227]]
getPosition(1) = [[timeUs=0, position=227], [timeUs=26000, position=331]]
getPosition(1057875) = [[timeUs=1040000, position=4387], [timeUs=1066000, position=4491]]
getPosition(2115750) = [[timeUs=2089750, position=8586]]
numberOfTracks = 1
track 0:
total output bytes = 2717
sample count = 13
format 0:
averageBitrate = 32000
sampleMimeType = audio/mpeg
maxInputSize = 4096
channelCount = 1
sampleRate = 44100
encoderDelay = 576
encoderPadding = 1404
metadata = entries=[TSSE: description=null: values=[Lavf58.45.100]]
sample 0:
time = 1436500
flags = 1
data = length 209, hash 30962500
sample 1:
time = 1462622
flags = 1
data = length 209, hash 2C5CCBB7
sample 2:
time = 1488744
flags = 1
data = length 209, hash F9CB9E37
sample 3:
time = 1514867
flags = 1
data = length 209, hash F75BC8C0
sample 4:
time = 1540989
flags = 1
data = length 209, hash D00ED607
sample 5:
time = 1567112
flags = 1
data = length 209, hash B4338395
sample 6:
time = 1593234
flags = 1
data = length 209, hash E3E838A0
sample 7:
time = 1619357
flags = 1
data = length 209, hash 2B0CF78
sample 8:
time = 1645479
flags = 1
data = length 209, hash 31906FA9
sample 9:
time = 1671602
flags = 1
data = length 209, hash C92FC08F
sample 10:
time = 1697724
flags = 1
data = length 209, hash 7C89994
sample 11:
time = 1723846
flags = 1
data = length 209, hash EC37743B
sample 12:
time = 1749969
flags = 1
data = length 209, hash C974F6FB
tracksEnded = true

View File

@ -0,0 +1,21 @@
seekMap:
isSeekable = true
duration = 2115750
getPosition(0) = [[timeUs=0, position=227]]
getPosition(1) = [[timeUs=0, position=227], [timeUs=26000, position=331]]
getPosition(1057875) = [[timeUs=1040000, position=4387], [timeUs=1066000, position=4491]]
getPosition(2115750) = [[timeUs=2089750, position=8586]]
numberOfTracks = 1
track 0:
total output bytes = 0
sample count = 0
format 0:
averageBitrate = 32000
sampleMimeType = audio/mpeg
maxInputSize = 4096
channelCount = 1
sampleRate = 44100
encoderDelay = 576
encoderPadding = 1404
metadata = entries=[TSSE: description=null: values=[Lavf58.45.100]]
tracksEnded = true

View File

@ -0,0 +1,185 @@
seekMap:
isSeekable = true
duration = 2115750
getPosition(0) = [[timeUs=0, position=227]]
getPosition(1) = [[timeUs=0, position=227], [timeUs=26000, position=331]]
getPosition(1057875) = [[timeUs=1040000, position=4387], [timeUs=1066000, position=4491]]
getPosition(2115750) = [[timeUs=2089750, position=8586]]
numberOfTracks = 1
track 0:
total output bytes = 8463
sample count = 41
format 0:
averageBitrate = 32000
sampleMimeType = audio/mpeg
maxInputSize = 4096
channelCount = 1
sampleRate = 44100
encoderDelay = 576
encoderPadding = 1404
metadata = entries=[TSSE: description=null: values=[Lavf58.45.100]]
sample 0:
time = 0
flags = 1
data = length 104, hash BF3B0C83
sample 1:
time = 26122
flags = 1
data = length 208, hash 5E56C6DF
sample 2:
time = 52244
flags = 1
data = length 209, hash 4FA4483
sample 3:
time = 78367
flags = 1
data = length 209, hash E1201788
sample 4:
time = 104489
flags = 1
data = length 209, hash FDB8052B
sample 5:
time = 130612
flags = 1
data = length 209, hash A8FF2C9
sample 6:
time = 156734
flags = 1
data = length 209, hash FD4AE506
sample 7:
time = 182857
flags = 1
data = length 209, hash EA0AC2FE
sample 8:
time = 208979
flags = 1
data = length 209, hash 84B9DDE0
sample 9:
time = 235102
flags = 1
data = length 209, hash 796A4F65
sample 10:
time = 261224
flags = 1
data = length 209, hash 4DE92719
sample 11:
time = 287346
flags = 1
data = length 209, hash 458A4711
sample 12:
time = 313469
flags = 1
data = length 209, hash 27954F2B
sample 13:
time = 339591
flags = 1
data = length 209, hash 1A5042B0
sample 14:
time = 365714
flags = 1
data = length 209, hash 6CCBBB3B
sample 15:
time = 391836
flags = 1
data = length 209, hash 34191E1
sample 16:
time = 417959
flags = 1
data = length 209, hash 57323ED7
sample 17:
time = 444081
flags = 1
data = length 209, hash 75618CF3
sample 18:
time = 470204
flags = 1
data = length 209, hash 784C973B
sample 19:
time = 496326
flags = 1
data = length 209, hash 49106390
sample 20:
time = 522448
flags = 1
data = length 209, hash 70F6A563
sample 21:
time = 548571
flags = 1
data = length 209, hash 721882B0
sample 22:
time = 574693
flags = 1
data = length 209, hash 81C62AEE
sample 23:
time = 600816
flags = 1
data = length 209, hash 16D22463
sample 24:
time = 626938
flags = 1
data = length 209, hash 47033534
sample 25:
time = 653061
flags = 1
data = length 209, hash CECB37A6
sample 26:
time = 679183
flags = 1
data = length 209, hash 6C9C307B
sample 27:
time = 705306
flags = 1
data = length 209, hash 3EB1A364
sample 28:
time = 731428
flags = 1
data = length 209, hash 30962500
sample 29:
time = 757551
flags = 1
data = length 209, hash 2C5CCBB7
sample 30:
time = 783673
flags = 1
data = length 209, hash F9CB9E37
sample 31:
time = 809795
flags = 1
data = length 209, hash F75BC8C0
sample 32:
time = 835918
flags = 1
data = length 209, hash D00ED607
sample 33:
time = 862040
flags = 1
data = length 209, hash B4338395
sample 34:
time = 888163
flags = 1
data = length 209, hash E3E838A0
sample 35:
time = 914285
flags = 1
data = length 209, hash 2B0CF78
sample 36:
time = 940408
flags = 1
data = length 209, hash 31906FA9
sample 37:
time = 966530
flags = 1
data = length 209, hash C92FC08F
sample 38:
time = 992653
flags = 1
data = length 209, hash 7C89994
sample 39:
time = 1018775
flags = 1
data = length 209, hash EC37743B
sample 40:
time = 1044897
flags = 1
data = length 209, hash C974F6FB
tracksEnded = true