From eec8d315444b87e47adc2238df8a44b4866dc9a1 Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 11 Nov 2021 10:21:29 +0000 Subject: [PATCH] Merge pull request #9543 from KasemJaffer:rf64 PiperOrigin-RevId: 408816643 --- RELEASENOTES.md | 3 + .../android/exoplayer2/audio/WavUtil.java | 4 ++ .../extractor/wav/WavExtractor.java | 34 +++++++++-- .../extractor/wav/WavHeaderReader.java | 57 ++++++++++++------ .../extractor/wav/WavExtractorTest.java | 6 ++ .../extractordumps/wav/sample_rf64.wav.0.dump | 36 +++++++++++ .../extractordumps/wav/sample_rf64.wav.1.dump | 32 ++++++++++ .../extractordumps/wav/sample_rf64.wav.2.dump | 28 +++++++++ .../extractordumps/wav/sample_rf64.wav.3.dump | 24 ++++++++ .../wav/sample_rf64.wav.unknown_length.dump | 36 +++++++++++ .../src/test/assets/media/wav/sample_rf64.wav | Bin 0 -> 67016 bytes 11 files changed, 237 insertions(+), 23 deletions(-) create mode 100644 testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.0.dump create mode 100644 testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.1.dump create mode 100644 testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.2.dump create mode 100644 testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.3.dump create mode 100644 testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.unknown_length.dump create mode 100644 testdata/src/test/assets/media/wav/sample_rf64.wav diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7c278fa1148..8c770912c45 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,9 @@ `buildVideoRenderers()` or `buildAudioRenderers()` can access the codec adapter factory and pass it to `MediaCodecRenderer` instances they create. +* Extractors: + * WAV: Add support for RF64 streams + ([#9543](https://github.com/google/ExoPlayer/issues/9543). ### 2.16.0 (2021-11-04) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java index 208989124a1..c0f4b4c2d51 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java @@ -30,6 +30,10 @@ public final class WavUtil { public static final int FMT_FOURCC = 0x666d7420; /** Four character code for "data". */ public static final int DATA_FOURCC = 0x64617461; + /** Four character code for "RF64". */ + public static final int RF64_FOURCC = 0x52463634; + /** Four character code for "ds64". */ + public static final int DS64_FOURCC = 0x64733634; /** WAVE type value for integer PCM audio data. */ public static final int TYPE_PCM = 0x0001; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java index 6d3fc254b17..69d10f16a1f 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java @@ -31,6 +31,7 @@ import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; @@ -47,6 +48,8 @@ /** Extracts data from WAV byte streams. */ public final class WavExtractor implements Extractor { + private static final String TAG = "WavExtractor"; + /** * When outputting PCM data to a {@link TrackOutput}, we can choose how many frames are grouped * into each sample, and hence each sample's duration. This is the target number of samples to @@ -63,6 +66,7 @@ public final class WavExtractor implements Extractor { @Target({ElementType.TYPE_USE}) @IntDef({ STATE_READING_FILE_TYPE, + STATE_READING_RF64_SAMPLE_DATA_SIZE, STATE_READING_FORMAT, STATE_SKIPPING_TO_SAMPLE_DATA, STATE_READING_SAMPLE_DATA @@ -70,19 +74,22 @@ public final class WavExtractor implements Extractor { private @interface State {} private static final int STATE_READING_FILE_TYPE = 0; - private static final int STATE_READING_FORMAT = 1; - private static final int STATE_SKIPPING_TO_SAMPLE_DATA = 2; - private static final int STATE_READING_SAMPLE_DATA = 3; + private static final int STATE_READING_RF64_SAMPLE_DATA_SIZE = 1; + private static final int STATE_READING_FORMAT = 2; + private static final int STATE_SKIPPING_TO_SAMPLE_DATA = 3; + private static final int STATE_READING_SAMPLE_DATA = 4; private @MonotonicNonNull ExtractorOutput extractorOutput; private @MonotonicNonNull TrackOutput trackOutput; private @State int state; + private long rf64SampleDataSize; private @MonotonicNonNull OutputWriter outputWriter; private int dataStartPosition; private long dataEndPosition; public WavExtractor() { state = STATE_READING_FILE_TYPE; + rf64SampleDataSize = C.LENGTH_UNSET; dataStartPosition = C.POSITION_UNSET; dataEndPosition = C.POSITION_UNSET; } @@ -120,6 +127,9 @@ public int read(ExtractorInput input, PositionHolder seekPosition) throws IOExce case STATE_READING_FILE_TYPE: readFileType(input); return Extractor.RESULT_CONTINUE; + case STATE_READING_RF64_SAMPLE_DATA_SIZE: + readRf64SampleDataSize(input); + return Extractor.RESULT_CONTINUE; case STATE_READING_FORMAT: readFormat(input); return Extractor.RESULT_CONTINUE; @@ -152,6 +162,11 @@ private void readFileType(ExtractorInput input) throws IOException { "Unsupported or unrecognized wav file type.", /* cause= */ null); } input.skipFully((int) (input.getPeekPosition() - input.getPosition())); + state = STATE_READING_RF64_SAMPLE_DATA_SIZE; + } + + private void readRf64SampleDataSize(ExtractorInput input) throws IOException { + rf64SampleDataSize = WavHeaderReader.readRf64SampleDataSize(input); state = STATE_READING_FORMAT; } @@ -194,7 +209,18 @@ private void readFormat(ExtractorInput input) throws IOException { private void skipToSampleData(ExtractorInput input) throws IOException { Pair dataBounds = WavHeaderReader.skipToSampleData(input); dataStartPosition = dataBounds.first.intValue(); - dataEndPosition = dataBounds.second; + long dataSize = dataBounds.second; + if (rf64SampleDataSize != C.LENGTH_UNSET && dataSize == 0xFFFFFFFFL) { + // Following EBU - Tech 3306-2007, the data size indicated in the ds64 chunk should only be + // used if the size of the data chunk is unset. + dataSize = rf64SampleDataSize; + } + dataEndPosition = dataStartPosition + dataSize; + long inputLength = input.getLength(); + if (inputLength != C.LENGTH_UNSET && dataEndPosition > inputLength) { + Log.w(TAG, "Data exceeds input length: " + dataEndPosition + ", " + inputLength); + dataEndPosition = inputLength; + } Assertions.checkNotNull(outputWriter).init(dataStartPosition, dataEndPosition); state = STATE_READING_SAMPLE_DATA; } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java index f05a5101911..03cbb9645af 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java @@ -32,20 +32,19 @@ private static final String TAG = "WavHeaderReader"; /** - * Returns whether the given {@code input} starts with a RIFF chunk header, followed by a WAVE - * tag. + * Returns whether the given {@code input} starts with a RIFF or RF64 chunk header, followed by a + * WAVE tag. * * @param input The input stream to peek from. The position should point to the start of the * stream. - * @return Whether the given {@code input} starts with a RIFF chunk header, followed by a WAVE - * tag. + * @return Whether the given {@code input} starts with a RIFF or RF64 chunk header, followed by a + * WAVE tag. * @throws IOException If peeking from the input fails. */ public static boolean checkFileType(ExtractorInput input) throws IOException { ParsableByteArray scratch = new ParsableByteArray(ChunkHeader.SIZE_IN_BYTES); - // Attempt to read the RIFF chunk. ChunkHeader chunkHeader = ChunkHeader.peek(input, scratch); - if (chunkHeader.id != WavUtil.RIFF_FOURCC) { + if (chunkHeader.id != WavUtil.RIFF_FOURCC && chunkHeader.id != WavUtil.RF64_FOURCC) { return false; } @@ -60,11 +59,36 @@ public static boolean checkFileType(ExtractorInput input) throws IOException { return true; } + /** + * Reads the ds64 chunk defined in EBU - TECH 3306-2007, if present. If there is no such chunk, + * the input's position is left unchanged. + * + * @param input Input stream to read from. The position should point to the byte following the + * WAVE tag. + * @throws IOException If reading from the input fails. + * @return The value of the data size field in the ds64 chunk, or {@link C#LENGTH_UNSET} if there + * is no such chunk. + */ + public static long readRf64SampleDataSize(ExtractorInput input) throws IOException { + ParsableByteArray scratch = new ParsableByteArray(ChunkHeader.SIZE_IN_BYTES); + ChunkHeader chunkHeader = ChunkHeader.peek(input, scratch); + if (chunkHeader.id != WavUtil.DS64_FOURCC) { + input.resetPeekPosition(); + return C.LENGTH_UNSET; + } + input.advancePeekPosition(8); // RIFF size + scratch.setPosition(0); + input.peekFully(scratch.getData(), 0, 8); + long sampleDataSize = scratch.readLittleEndianLong(); + input.skipFully(ChunkHeader.SIZE_IN_BYTES + (int) chunkHeader.size); + return sampleDataSize; + } + /** * Reads and returns a {@code WavFormat}. * * @param input Input stream to read the WAV format from. The position should point to the byte - * following the WAVE tag. + * following the ds64 chunk if present, or to the byte following the WAVE tag otherwise. * @throws IOException If reading from the input fails. * @return A new {@code WavFormat} read from {@code input}. */ @@ -104,13 +128,14 @@ public static WavFormat readFormat(ExtractorInput input) throws IOException { } /** - * Skips to the data in the given WAV input stream, and returns its bounds. After calling, the - * input stream's position will point to the start of sample data in the WAV. If an exception is - * thrown, the input position will be left pointing to a chunk header (that may not be the data - * chunk header). + * Skips to the data in the given WAV input stream, and returns its start position and size. After + * calling, the input stream's position will point to the start of sample data in the WAV. If an + * exception is thrown, the input position will be left pointing to a chunk header (that may not + * be the data chunk header). * * @param input The input stream, whose read position must be pointing to a valid chunk header. - * @return The byte positions at which the data starts (inclusive) and ends (exclusive). + * @return The byte positions at which the data starts (inclusive) and the size of the data, in + * bytes. * @throws ParserException If an error occurs parsing chunks. * @throws IOException If reading from the input fails. */ @@ -125,13 +150,7 @@ public static Pair skipToSampleData(ExtractorInput input) throws IOE input.skipFully(ChunkHeader.SIZE_IN_BYTES); long dataStartPosition = input.getPosition(); - long dataEndPosition = dataStartPosition + chunkHeader.size; - long inputLength = input.getLength(); - if (inputLength != C.LENGTH_UNSET && dataEndPosition > inputLength) { - Log.w(TAG, "Data exceeds input length: " + dataEndPosition + ", " + inputLength); - dataEndPosition = inputLength; - } - return Pair.create(dataStartPosition, dataEndPosition); + return Pair.create(dataStartPosition, chunkHeader.size); } /** diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java index 4217a1528a3..976ef3e82ed 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java @@ -53,4 +53,10 @@ public void sample_imaAdpcm() throws Exception { ExtractorAsserts.assertBehavior( WavExtractor::new, "media/wav/sample_ima_adpcm.wav", simulationConfig); } + + @Test + public void sample_rf64() throws Exception { + ExtractorAsserts.assertBehavior( + WavExtractor::new, "media/wav/sample_rf64.wav", simulationConfig); + } } diff --git a/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.0.dump b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.0.dump new file mode 100644 index 00000000000..1e129acd707 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.0.dump @@ -0,0 +1,36 @@ +seekMap: + isSeekable = true + duration = 348625 + getPosition(0) = [[timeUs=0, position=80]] + getPosition(1) = [[timeUs=0, position=80], [timeUs=20, position=84]] + getPosition(174312) = [[timeUs=174291, position=33544], [timeUs=174312, position=33548]] + getPosition(348625) = [[timeUs=348604, position=67012]] +numberOfTracks = 1 +track 0: + total output bytes = 66936 + sample count = 4 + format 0: + averageBitrate = 1536000 + peakBitrate = 1536000 + sampleMimeType = audio/raw + maxInputSize = 19200 + channelCount = 2 + sampleRate = 48000 + pcmEncoding = 2 + sample 0: + time = 0 + flags = 1 + data = length 19200, hash EF6C7C27 + sample 1: + time = 100000 + flags = 1 + data = length 19200, hash 5AB97AFC + sample 2: + time = 200000 + flags = 1 + data = length 19200, hash 37920F33 + sample 3: + time = 300000 + flags = 1 + data = length 9336, hash 135F1C30 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.1.dump b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.1.dump new file mode 100644 index 00000000000..f4d925bad31 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.1.dump @@ -0,0 +1,32 @@ +seekMap: + isSeekable = true + duration = 348625 + getPosition(0) = [[timeUs=0, position=80]] + getPosition(1) = [[timeUs=0, position=80], [timeUs=20, position=84]] + getPosition(174312) = [[timeUs=174291, position=33544], [timeUs=174312, position=33548]] + getPosition(348625) = [[timeUs=348604, position=67012]] +numberOfTracks = 1 +track 0: + total output bytes = 44628 + sample count = 3 + format 0: + averageBitrate = 1536000 + peakBitrate = 1536000 + sampleMimeType = audio/raw + maxInputSize = 19200 + channelCount = 2 + sampleRate = 48000 + pcmEncoding = 2 + sample 0: + time = 116208 + flags = 1 + data = length 19200, hash E4B962ED + sample 1: + time = 216208 + flags = 1 + data = length 19200, hash 4F13D6CF + sample 2: + time = 316208 + flags = 1 + data = length 6228, hash 3FB5F446 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.2.dump b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.2.dump new file mode 100644 index 00000000000..2b42e93b5a9 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.2.dump @@ -0,0 +1,28 @@ +seekMap: + isSeekable = true + duration = 348625 + getPosition(0) = [[timeUs=0, position=80]] + getPosition(1) = [[timeUs=0, position=80], [timeUs=20, position=84]] + getPosition(174312) = [[timeUs=174291, position=33544], [timeUs=174312, position=33548]] + getPosition(348625) = [[timeUs=348604, position=67012]] +numberOfTracks = 1 +track 0: + total output bytes = 22316 + sample count = 2 + format 0: + averageBitrate = 1536000 + peakBitrate = 1536000 + sampleMimeType = audio/raw + maxInputSize = 19200 + channelCount = 2 + sampleRate = 48000 + pcmEncoding = 2 + sample 0: + time = 232416 + flags = 1 + data = length 19200, hash F82E494B + sample 1: + time = 332416 + flags = 1 + data = length 3116, hash 93C99CFD +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.3.dump b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.3.dump new file mode 100644 index 00000000000..2a6345d4a8f --- /dev/null +++ b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.3.dump @@ -0,0 +1,24 @@ +seekMap: + isSeekable = true + duration = 348625 + getPosition(0) = [[timeUs=0, position=80]] + getPosition(1) = [[timeUs=0, position=80], [timeUs=20, position=84]] + getPosition(174312) = [[timeUs=174291, position=33544], [timeUs=174312, position=33548]] + getPosition(348625) = [[timeUs=348604, position=67012]] +numberOfTracks = 1 +track 0: + total output bytes = 4 + sample count = 1 + format 0: + averageBitrate = 1536000 + peakBitrate = 1536000 + sampleMimeType = audio/raw + maxInputSize = 19200 + channelCount = 2 + sampleRate = 48000 + pcmEncoding = 2 + sample 0: + time = 348625 + flags = 1 + data = length 4, hash FFD4C53F +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.unknown_length.dump b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.unknown_length.dump new file mode 100644 index 00000000000..1e129acd707 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/wav/sample_rf64.wav.unknown_length.dump @@ -0,0 +1,36 @@ +seekMap: + isSeekable = true + duration = 348625 + getPosition(0) = [[timeUs=0, position=80]] + getPosition(1) = [[timeUs=0, position=80], [timeUs=20, position=84]] + getPosition(174312) = [[timeUs=174291, position=33544], [timeUs=174312, position=33548]] + getPosition(348625) = [[timeUs=348604, position=67012]] +numberOfTracks = 1 +track 0: + total output bytes = 66936 + sample count = 4 + format 0: + averageBitrate = 1536000 + peakBitrate = 1536000 + sampleMimeType = audio/raw + maxInputSize = 19200 + channelCount = 2 + sampleRate = 48000 + pcmEncoding = 2 + sample 0: + time = 0 + flags = 1 + data = length 19200, hash EF6C7C27 + sample 1: + time = 100000 + flags = 1 + data = length 19200, hash 5AB97AFC + sample 2: + time = 200000 + flags = 1 + data = length 19200, hash 37920F33 + sample 3: + time = 300000 + flags = 1 + data = length 9336, hash 135F1C30 +tracksEnded = true diff --git a/testdata/src/test/assets/media/wav/sample_rf64.wav b/testdata/src/test/assets/media/wav/sample_rf64.wav new file mode 100644 index 0000000000000000000000000000000000000000..b2dd53c687267d970199d63cba3aa6df98b7e9f0 GIT binary patch literal 67016 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

$*;Exa$j;#{{pW=2 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

N!H@pSCpG2buDxf5k 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 literal 0 HcmV?d00001