Add 32-bit FLAC test files, and use them in some tests

The matroska file works without further changes. The FLAC container
file works with `lib-flac-decoder` depending on a bundled `libflac`
implementation, but not when using
`androidx.media3.extractor.flac.FlacExtractor` with a `MediaCodec` FLAC
decoder because the media3 extractor doesn't support 32-bit FLAC yet.
The fix for that is in a follow-up change.

`bear_32bit.flac` was generated from `bear.flac` with `ffmpeg`:

```shell
$ ffmpeg \
    -i bear.flac \
    -c:a flac \
    -sample_fmt s32 \
    -strict experimental \
    bear_32bit.flac
```

`bear-flac-32bit.mka` was generated by re-muxing `bear_32bit.flac`,
also with `ffmpeg` (trying to convert `bear-flac-24bit.mka` to 32-bit
didn't work, the resulting file was still 24-bit):

```shell
$ ffmpeg \
    -i ../flac/bear_32bit.flac \
    -c:a copy \
    bear-flac-32bit.mka
```

Issue: androidx/media#2197
PiperOrigin-RevId: 736552251
(cherry picked from commit dfebe72b6a175ed92420c1946bd06b952d85132d)
This commit is contained in:
ibaker 2025-03-13 10:19:32 -07:00 committed by tonihei
parent fa71bf229e
commit 5c1e0d964a
12 changed files with 882 additions and 0 deletions

View File

@ -44,6 +44,14 @@ public class FlacExtractorTest {
/* dumpFilesPrefix= */ "extractordumps/flac/bear_raw");
}
@Test
public void sample32bit() throws Exception {
ExtractorAsserts.assertAllBehaviors(
FlacExtractor::new,
/* file= */ "media/flac/bear_32bit.flac",
/* dumpFilesPrefix= */ "extractordumps/flac/bear_32bit_raw");
}
@Test
public void sampleWithId3HeaderAndId3Enabled() throws Exception {
ExtractorAsserts.assertAllBehaviors(

View File

@ -48,6 +48,7 @@ public class FlacPlaybackTest {
private static final String BEAR_FLAC_16BIT = "mka/bear-flac-16bit.mka";
private static final String BEAR_FLAC_24BIT = "mka/bear-flac-24bit.mka";
private static final String BEAR_FLAC_32BIT = "mka/bear-flac-32bit.mka";
@Before
public void setUp() {
@ -66,6 +67,11 @@ public class FlacPlaybackTest {
playAndAssertAudioSinkInput(BEAR_FLAC_24BIT);
}
@Test
public void test32BitPlayback() throws Exception {
playAndAssertAudioSinkInput(BEAR_FLAC_32BIT);
}
private static void playAndAssertAudioSinkInput(String fileName) throws Exception {
CapturingAudioSink audioSink =
new CapturingAudioSink(

View File

@ -41,6 +41,7 @@ public final class MkaPlaybackTest {
return ImmutableList.of(
"bear-flac-16bit.mka",
"bear-flac-24bit.mka",
"bear-flac-32bit.mka",
"bear-opus.mka",
"bear-opus-negative-gain.mka");
}

View File

@ -0,0 +1,94 @@
AudioSink:
buffer count = 29
discontinuity:
config:
pcmEncoding = 22
channelCount = 2
sampleRate = 48000
buffer #0:
time = 1000000000000
data = -746929509
buffer #1:
time = 1000000096000
data = 1843221663
buffer #2:
time = 1000000192000
data = -753315018
buffer #3:
time = 1000000288000
data = -987395536
buffer #4:
time = 1000000384000
data = -301290316
buffer #5:
time = 1000000480000
data = -1165200562
buffer #6:
time = 1000000576000
data = 650616491
buffer #7:
time = 1000000672000
data = -1758005883
buffer #8:
time = 1000000768000
data = -1749269438
buffer #9:
time = 1000000864000
data = -1167887824
buffer #10:
time = 1000000960000
data = -1159777940
buffer #11:
time = 1000001056000
data = 94231483
buffer #12:
time = 1000001152000
data = 1164961407
buffer #13:
time = 1000001248000
data = -667334254
buffer #14:
time = 1000001344000
data = 353133318
buffer #15:
time = 1000001440000
data = -979797234
buffer #16:
time = 1000001536000
data = -420363394
buffer #17:
time = 1000001632000
data = 55072236
buffer #18:
time = 1000001728000
data = 1205528859
buffer #19:
time = 1000001824000
data = 1645315121
buffer #20:
time = 1000001920000
data = -1077485570
buffer #21:
time = 1000002016000
data = 110538032
buffer #22:
time = 1000002112000
data = 902882525
buffer #23:
time = 1000002208000
data = -1559538454
buffer #24:
time = 1000002304000
data = -1297310517
buffer #25:
time = 1000002400000
data = 608958818
buffer #26:
time = 1000002496000
data = 402297267
buffer #27:
time = 1000002592000
data = -546536196
buffer #28:
time = 1000002688000
data = -1541360306

View File

@ -0,0 +1,139 @@
seekMap:
isSeekable = true
duration = 2741000
getPosition(0) = [[timeUs=0, position=8286]]
getPosition(1) = [[timeUs=1, position=8286]]
getPosition(1370500) = [[timeUs=1370500, position=83950]]
getPosition(2741000) = [[timeUs=2741000, position=163626]]
numberOfTracks = 1
track 0:
total output bytes = 1052544
sample count = 29
track duration = 2741000
format 0:
averageBitrate = 3072000
peakBitrate = 3072000
containerMimeType = audio/flac
sampleMimeType = audio/raw
maxInputSize = 36864
channelCount = 2
sampleRate = 48000
pcmEncoding = 22
metadata = entries=[VC: ENCODER=Lavf61.7.100]
sample 0:
time = 0
flags = 1
data = length 36864, hash BD8DA71B
sample 1:
time = 96000
flags = 1
data = length 36864, hash 421F769F
sample 2:
time = 192000
flags = 1
data = length 36864, hash AD186736
sample 3:
time = 288000
flags = 1
data = length 36864, hash 4D965FB0
sample 4:
time = 384000
flags = 1
data = length 36864, hash AE3AFFB4
sample 5:
time = 480000
flags = 1
data = length 36864, hash B442274E
sample 6:
time = 576000
flags = 1
data = length 36864, hash 9E8889EB
sample 7:
time = 672000
flags = 1
data = length 36864, hash CC9ED245
sample 8:
time = 768000
flags = 1
data = length 36864, hash CDCA3B02
sample 9:
time = 864000
flags = 1
data = length 36864, hash 3E7EF3F0
sample 10:
time = 960000
flags = 1
data = length 36864, hash AABD286C
sample 11:
time = 1056000
flags = 1
data = length 36864, hash 8848FDFB
sample 12:
time = 1152000
flags = 1
data = length 36864, hash FA880EFF
sample 13:
time = 1248000
flags = 1
data = length 36864, hash 597D7692
sample 14:
time = 1344000
flags = 1
data = length 36864, hash BEFF9B86
sample 15:
time = 1440000
flags = 1
data = length 36864, hash 1D2B3E4E
sample 16:
time = 1536000
flags = 1
data = length 36864, hash 33A272FE
sample 17:
time = 1632000
flags = 1
data = length 36864, hash 756B9E6C
sample 18:
time = 1728000
flags = 1
data = length 36864, hash A7C3DC9B
sample 19:
time = 1824000
flags = 1
data = length 36864, hash B4C9DEB1
sample 20:
time = 1920000
flags = 1
data = length 36864, hash D2F72F7E
sample 21:
time = 2016000
flags = 1
data = length 36864, hash 93F6F570
sample 22:
time = 2112000
flags = 1
data = length 36864, hash D49823DD
sample 23:
time = 2208000
flags = 1
data = length 36864, hash 129FF62A
sample 24:
time = 2304000
flags = 1
data = length 36864, hash AC17044B
sample 25:
time = 2400000
flags = 1
data = length 36864, hash 92429562
sample 26:
time = 2496000
flags = 1
data = length 36864, hash EC7AE33
sample 27:
time = 2592000
flags = 1
data = length 36864, hash 98FEA2FC
sample 28:
time = 2688000
flags = 1
data = length 20352, hash 89878FCE
tracksEnded = true

View File

@ -0,0 +1,103 @@
seekMap:
isSeekable = true
duration = 2741000
getPosition(0) = [[timeUs=0, position=8286]]
getPosition(1) = [[timeUs=1, position=8286]]
getPosition(1370500) = [[timeUs=1370500, position=83950]]
getPosition(2741000) = [[timeUs=2741000, position=163626]]
numberOfTracks = 1
track 0:
total output bytes = 720768
sample count = 20
track duration = 2741000
format 0:
averageBitrate = 3072000
peakBitrate = 3072000
containerMimeType = audio/flac
sampleMimeType = audio/raw
maxInputSize = 36864
channelCount = 2
sampleRate = 48000
pcmEncoding = 22
metadata = entries=[VC: ENCODER=Lavf61.7.100]
sample 0:
time = 864000
flags = 1
data = length 36864, hash 3E7EF3F0
sample 1:
time = 960000
flags = 1
data = length 36864, hash AABD286C
sample 2:
time = 1056000
flags = 1
data = length 36864, hash 8848FDFB
sample 3:
time = 1152000
flags = 1
data = length 36864, hash FA880EFF
sample 4:
time = 1248000
flags = 1
data = length 36864, hash 597D7692
sample 5:
time = 1344000
flags = 1
data = length 36864, hash BEFF9B86
sample 6:
time = 1440000
flags = 1
data = length 36864, hash 1D2B3E4E
sample 7:
time = 1536000
flags = 1
data = length 36864, hash 33A272FE
sample 8:
time = 1632000
flags = 1
data = length 36864, hash 756B9E6C
sample 9:
time = 1728000
flags = 1
data = length 36864, hash A7C3DC9B
sample 10:
time = 1824000
flags = 1
data = length 36864, hash B4C9DEB1
sample 11:
time = 1920000
flags = 1
data = length 36864, hash D2F72F7E
sample 12:
time = 2016000
flags = 1
data = length 36864, hash 93F6F570
sample 13:
time = 2112000
flags = 1
data = length 36864, hash D49823DD
sample 14:
time = 2208000
flags = 1
data = length 36864, hash 129FF62A
sample 15:
time = 2304000
flags = 1
data = length 36864, hash AC17044B
sample 16:
time = 2400000
flags = 1
data = length 36864, hash 92429562
sample 17:
time = 2496000
flags = 1
data = length 36864, hash EC7AE33
sample 18:
time = 2592000
flags = 1
data = length 36864, hash 98FEA2FC
sample 19:
time = 2688000
flags = 1
data = length 20352, hash 89878FCE
tracksEnded = true

View File

@ -0,0 +1,63 @@
seekMap:
isSeekable = true
duration = 2741000
getPosition(0) = [[timeUs=0, position=8286]]
getPosition(1) = [[timeUs=1, position=8286]]
getPosition(1370500) = [[timeUs=1370500, position=83950]]
getPosition(2741000) = [[timeUs=2741000, position=163626]]
numberOfTracks = 1
track 0:
total output bytes = 352128
sample count = 10
track duration = 2741000
format 0:
averageBitrate = 3072000
peakBitrate = 3072000
containerMimeType = audio/flac
sampleMimeType = audio/raw
maxInputSize = 36864
channelCount = 2
sampleRate = 48000
pcmEncoding = 22
metadata = entries=[VC: ENCODER=Lavf61.7.100]
sample 0:
time = 1824000
flags = 1
data = length 36864, hash B4C9DEB1
sample 1:
time = 1920000
flags = 1
data = length 36864, hash D2F72F7E
sample 2:
time = 2016000
flags = 1
data = length 36864, hash 93F6F570
sample 3:
time = 2112000
flags = 1
data = length 36864, hash D49823DD
sample 4:
time = 2208000
flags = 1
data = length 36864, hash 129FF62A
sample 5:
time = 2304000
flags = 1
data = length 36864, hash AC17044B
sample 6:
time = 2400000
flags = 1
data = length 36864, hash 92429562
sample 7:
time = 2496000
flags = 1
data = length 36864, hash EC7AE33
sample 8:
time = 2592000
flags = 1
data = length 36864, hash 98FEA2FC
sample 9:
time = 2688000
flags = 1
data = length 20352, hash 89878FCE
tracksEnded = true

View File

@ -0,0 +1,27 @@
seekMap:
isSeekable = true
duration = 2741000
getPosition(0) = [[timeUs=0, position=8286]]
getPosition(1) = [[timeUs=1, position=8286]]
getPosition(1370500) = [[timeUs=1370500, position=83950]]
getPosition(2741000) = [[timeUs=2741000, position=163626]]
numberOfTracks = 1
track 0:
total output bytes = 20352
sample count = 1
track duration = 2741000
format 0:
averageBitrate = 3072000
peakBitrate = 3072000
containerMimeType = audio/flac
sampleMimeType = audio/raw
maxInputSize = 36864
channelCount = 2
sampleRate = 48000
pcmEncoding = 22
metadata = entries=[VC: ENCODER=Lavf61.7.100]
sample 0:
time = 2688000
flags = 1
data = length 20352, hash 89878FCE
tracksEnded = true

View File

@ -0,0 +1,136 @@
seekMap:
isSeekable = false
duration = 2741000
getPosition(0) = [[timeUs=0, position=0]]
numberOfTracks = 1
track 0:
total output bytes = 1052544
sample count = 29
track duration = 2741000
format 0:
averageBitrate = 3072000
peakBitrate = 3072000
containerMimeType = audio/flac
sampleMimeType = audio/raw
maxInputSize = 36864
channelCount = 2
sampleRate = 48000
pcmEncoding = 22
metadata = entries=[VC: ENCODER=Lavf61.7.100]
sample 0:
time = 0
flags = 1
data = length 36864, hash BD8DA71B
sample 1:
time = 96000
flags = 1
data = length 36864, hash 421F769F
sample 2:
time = 192000
flags = 1
data = length 36864, hash AD186736
sample 3:
time = 288000
flags = 1
data = length 36864, hash 4D965FB0
sample 4:
time = 384000
flags = 1
data = length 36864, hash AE3AFFB4
sample 5:
time = 480000
flags = 1
data = length 36864, hash B442274E
sample 6:
time = 576000
flags = 1
data = length 36864, hash 9E8889EB
sample 7:
time = 672000
flags = 1
data = length 36864, hash CC9ED245
sample 8:
time = 768000
flags = 1
data = length 36864, hash CDCA3B02
sample 9:
time = 864000
flags = 1
data = length 36864, hash 3E7EF3F0
sample 10:
time = 960000
flags = 1
data = length 36864, hash AABD286C
sample 11:
time = 1056000
flags = 1
data = length 36864, hash 8848FDFB
sample 12:
time = 1152000
flags = 1
data = length 36864, hash FA880EFF
sample 13:
time = 1248000
flags = 1
data = length 36864, hash 597D7692
sample 14:
time = 1344000
flags = 1
data = length 36864, hash BEFF9B86
sample 15:
time = 1440000
flags = 1
data = length 36864, hash 1D2B3E4E
sample 16:
time = 1536000
flags = 1
data = length 36864, hash 33A272FE
sample 17:
time = 1632000
flags = 1
data = length 36864, hash 756B9E6C
sample 18:
time = 1728000
flags = 1
data = length 36864, hash A7C3DC9B
sample 19:
time = 1824000
flags = 1
data = length 36864, hash B4C9DEB1
sample 20:
time = 1920000
flags = 1
data = length 36864, hash D2F72F7E
sample 21:
time = 2016000
flags = 1
data = length 36864, hash 93F6F570
sample 22:
time = 2112000
flags = 1
data = length 36864, hash D49823DD
sample 23:
time = 2208000
flags = 1
data = length 36864, hash 129FF62A
sample 24:
time = 2304000
flags = 1
data = length 36864, hash AC17044B
sample 25:
time = 2400000
flags = 1
data = length 36864, hash 92429562
sample 26:
time = 2496000
flags = 1
data = length 36864, hash EC7AE33
sample 27:
time = 2592000
flags = 1
data = length 36864, hash 98FEA2FC
sample 28:
time = 2688000
flags = 1
data = length 20352, hash 89878FCE
tracksEnded = true

View File

@ -0,0 +1,305 @@
MediaCodecAdapter (exotest.audio.flac):
inputBuffers:
count = 30
input buffer #0:
timeUs = 1000000000000
contents = length 5806, hash E8370E2C
input buffer #1:
timeUs = 1000000096000
contents = length 5831, hash 4F0743B0
input buffer #2:
timeUs = 1000000192000
contents = length 5901, hash D725EF12
input buffer #3:
timeUs = 1000000288000
contents = length 5731, hash 14B1EFE
input buffer #4:
timeUs = 1000000384000
contents = length 5924, hash 481A7FC1
input buffer #5:
timeUs = 1000000480000
contents = length 5900, hash 4D715F5C
input buffer #6:
timeUs = 1000000576000
contents = length 5977, hash 59E98D91
input buffer #7:
timeUs = 1000000672000
contents = length 5888, hash 9B855417
input buffer #8:
timeUs = 1000000768000
contents = length 5880, hash F853FBB8
input buffer #9:
timeUs = 1000000864000
contents = length 5829, hash BFD59D6F
input buffer #10:
timeUs = 1000000960000
contents = length 5908, hash B38E101B
input buffer #11:
timeUs = 1000001056000
contents = length 6223, hash BD01CA3C
input buffer #12:
timeUs = 1000001152000
contents = length 6040, hash ABBAE87B
input buffer #13:
timeUs = 1000001248000
contents = length 5974, hash 9A589524
input buffer #14:
timeUs = 1000001344000
contents = length 6466, hash 38D2EF0A
input buffer #15:
timeUs = 1000001440000
contents = length 6234, hash 32D84C24
input buffer #16:
timeUs = 1000001536000
contents = length 5959, hash 8638233C
input buffer #17:
timeUs = 1000001632000
contents = length 6063, hash 5E21728E
input buffer #18:
timeUs = 1000001728000
contents = length 5935, hash AFB43AE0
input buffer #19:
timeUs = 1000001824000
contents = length 5822, hash 21F8ABEF
input buffer #20:
timeUs = 1000001920000
contents = length 5927, hash 3FDE7E9E
input buffer #21:
timeUs = 1000002016000
contents = length 6030, hash 9AC6FD0E
input buffer #22:
timeUs = 1000002112000
contents = length 5926, hash A3C067A1
input buffer #23:
timeUs = 1000002208000
contents = length 6019, hash BDA32275
input buffer #24:
timeUs = 1000002304000
contents = length 5979, hash CFF22F6E
input buffer #25:
timeUs = 1000002400000
contents = length 5976, hash D185E6C5
input buffer #26:
timeUs = 1000002496000
contents = length 6023, hash 9E1F037B
input buffer #27:
timeUs = 1000002592000
contents = length 5012, hash 2ACC9CC4
input buffer #28:
timeUs = 1000002688000
contents = length 1558, hash 94FFBE4D
input buffer #29:
timeUs = 0
flags = 4
contents = length 0, hash 1
outputBuffers:
count = 29
output buffer #0:
timeUs = 1000000000000
size = 0
rendered = false
output buffer #1:
timeUs = 1000000096000
size = 0
rendered = false
output buffer #2:
timeUs = 1000000192000
size = 0
rendered = false
output buffer #3:
timeUs = 1000000288000
size = 0
rendered = false
output buffer #4:
timeUs = 1000000384000
size = 0
rendered = false
output buffer #5:
timeUs = 1000000480000
size = 0
rendered = false
output buffer #6:
timeUs = 1000000576000
size = 0
rendered = false
output buffer #7:
timeUs = 1000000672000
size = 0
rendered = false
output buffer #8:
timeUs = 1000000768000
size = 0
rendered = false
output buffer #9:
timeUs = 1000000864000
size = 0
rendered = false
output buffer #10:
timeUs = 1000000960000
size = 0
rendered = false
output buffer #11:
timeUs = 1000001056000
size = 0
rendered = false
output buffer #12:
timeUs = 1000001152000
size = 0
rendered = false
output buffer #13:
timeUs = 1000001248000
size = 0
rendered = false
output buffer #14:
timeUs = 1000001344000
size = 0
rendered = false
output buffer #15:
timeUs = 1000001440000
size = 0
rendered = false
output buffer #16:
timeUs = 1000001536000
size = 0
rendered = false
output buffer #17:
timeUs = 1000001632000
size = 0
rendered = false
output buffer #18:
timeUs = 1000001728000
size = 0
rendered = false
output buffer #19:
timeUs = 1000001824000
size = 0
rendered = false
output buffer #20:
timeUs = 1000001920000
size = 0
rendered = false
output buffer #21:
timeUs = 1000002016000
size = 0
rendered = false
output buffer #22:
timeUs = 1000002112000
size = 0
rendered = false
output buffer #23:
timeUs = 1000002208000
size = 0
rendered = false
output buffer #24:
timeUs = 1000002304000
size = 0
rendered = false
output buffer #25:
timeUs = 1000002400000
size = 0
rendered = false
output buffer #26:
timeUs = 1000002496000
size = 0
rendered = false
output buffer #27:
timeUs = 1000002592000
size = 0
rendered = false
output buffer #28:
timeUs = 1000002688000
size = 0
rendered = false
AudioSink:
buffer count = 29
config:
pcmEncoding = 2
channelCount = 2
sampleRate = 48000
buffer #0:
time = 1000000000000
data = 1
buffer #1:
time = 1000000096000
data = 1
buffer #2:
time = 1000000192000
data = 1
buffer #3:
time = 1000000288000
data = 1
buffer #4:
time = 1000000384000
data = 1
buffer #5:
time = 1000000480000
data = 1
buffer #6:
time = 1000000576000
data = 1
buffer #7:
time = 1000000672000
data = 1
buffer #8:
time = 1000000768000
data = 1
buffer #9:
time = 1000000864000
data = 1
buffer #10:
time = 1000000960000
data = 1
buffer #11:
time = 1000001056000
data = 1
buffer #12:
time = 1000001152000
data = 1
buffer #13:
time = 1000001248000
data = 1
buffer #14:
time = 1000001344000
data = 1
buffer #15:
time = 1000001440000
data = 1
buffer #16:
time = 1000001536000
data = 1
buffer #17:
time = 1000001632000
data = 1
buffer #18:
time = 1000001728000
data = 1
buffer #19:
time = 1000001824000
data = 1
buffer #20:
time = 1000001920000
data = 1
buffer #21:
time = 1000002016000
data = 1
buffer #22:
time = 1000002112000
data = 1
buffer #23:
time = 1000002208000
data = 1
buffer #24:
time = 1000002304000
data = 1
buffer #25:
time = 1000002400000
data = 1
buffer #26:
time = 1000002496000
data = 1
buffer #27:
time = 1000002592000
data = 1
buffer #28:
time = 1000002688000
data = 1