Merge pull request #1117 from loliball:dev_wav_align_fix

PiperOrigin-RevId: 615820438
(cherry picked from commit e9a28beb44)
This commit is contained in:
Copybara-Service 2024-03-14 10:17:49 -07:00 committed by SheenaChhabra
parent 6f0b70ea78
commit 8a169d104f
4 changed files with 19 additions and 1 deletions

View file

@ -19,7 +19,10 @@
the player selects the 'real' video track in MP4s extracted from motion the player selects the 'real' video track in MP4s extracted from motion
photos that can contain two HEVC tracks where one has a higher photos that can contain two HEVC tracks where one has a higher
resolution but a very small number of frames resolution but a very small number of frames
([#1051](https://github.com/androidx/media/issues/1051)). ([#1051](https://github.com/androidx/media/issues/1051)).
* Extractors:
* Fix issue where padding was not skipped when reading odd-sized chunks
from WAV files ([#1117](https://github.com/androidx/media/pull/1117)).
* Audio: * Audio:
* Allow renderer recovery by disabling offload if audio track fails to * Allow renderer recovery by disabling offload if audio track fails to
initialize in offload mode. initialize in offload mode.

View file

@ -172,6 +172,12 @@ import java.io.IOException;
while (chunkHeader.id != chunkId) { while (chunkHeader.id != chunkId) {
Log.w(TAG, "Ignoring unknown WAV chunk: " + chunkHeader.id); Log.w(TAG, "Ignoring unknown WAV chunk: " + chunkHeader.id);
long bytesToSkip = ChunkHeader.SIZE_IN_BYTES + chunkHeader.size; long bytesToSkip = ChunkHeader.SIZE_IN_BYTES + chunkHeader.size;
// According to the RIFF specification, if a chunk's body size is odd, it's followed by a
// padding byte of value 0. This ensures each chunk occupies an even number of bytes in the
// file. The padding byte isn't included in the size field.
if (chunkHeader.size % 2 != 0) {
bytesToSkip++; // padding present if size is odd, skip it.
}
if (bytesToSkip > Integer.MAX_VALUE) { if (bytesToSkip > Integer.MAX_VALUE) {
throw ParserException.createForUnsupportedContainerFeature( throw ParserException.createForUnsupportedContainerFeature(
"Chunk is too large (~2GB+) to skip; id: " + chunkHeader.id); "Chunk is too large (~2GB+) to skip; id: " + chunkHeader.id);

View file

@ -48,6 +48,15 @@ public final class WavExtractorTest {
simulationConfig); simulationConfig);
} }
@Test
public void sample_withOddMetadataChunkSize_extractsSameData() throws Exception {
ExtractorAsserts.assertBehavior(
WavExtractor::new,
"media/wav/sample_with_odd_metadata_chunk_size.wav",
new AssertionConfig.Builder().setDumpFilesPrefix("extractordumps/wav/sample.wav").build(),
simulationConfig);
}
@Test @Test
public void sample_imaAdpcm() throws Exception { public void sample_imaAdpcm() throws Exception {
ExtractorAsserts.assertBehavior( ExtractorAsserts.assertBehavior(