From a0312615f26dc7517568f33a64401d7fca2bc1c5 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 13 Jun 2024 06:17:12 -0700 Subject: [PATCH] Fix AVI extractor WAVE format extraction Allow `WAVEFORMAT` (in addition to `WAVEFORMATEX`), which omits initialization data. Fix reading of bits per sample to use little endian byte order like the other reads. See also the wave format docs linked from https://learn.microsoft.com/en-us/windows/win32/directshow/avi-riff-file-reference#avi-stream-headers. PiperOrigin-RevId: 642962893 --- RELEASENOTES.md | 1 + .../java/androidx/media3/extractor/avi/StreamFormatChunk.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 12530e32bf..c620ea708e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -13,6 +13,7 @@ `ExportException.codecInfo`. * Track Selection: * Extractors: + * Fix PCM audio format extraction in AVI containers. * Audio: * Video: * Text: diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/avi/StreamFormatChunk.java b/libraries/extractor/src/main/java/androidx/media3/extractor/avi/StreamFormatChunk.java index 7ecdcd2816..08e8a77476 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/avi/StreamFormatChunk.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/avi/StreamFormatChunk.java @@ -83,9 +83,9 @@ import com.google.common.collect.ImmutableList; int channelCount = body.readLittleEndianUnsignedShort(); int samplesPerSecond = body.readLittleEndianInt(); body.skipBytes(6); // averageBytesPerSecond (4 bytes), nBlockAlign (2 bytes). - int bitsPerSample = body.readUnsignedShort(); + int bitsPerSample = body.readLittleEndianUnsignedShort(); int pcmEncoding = Util.getPcmEncoding(bitsPerSample); - int cbSize = body.readLittleEndianUnsignedShort(); + int cbSize = body.bytesLeft() > 0 ? body.readLittleEndianUnsignedShort() : 0; byte[] codecData = new byte[cbSize]; body.readBytes(codecData, /* offset= */ 0, codecData.length);