diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 387a3217d4..566f362a2d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -99,6 +99,8 @@ costly on large files. * MP4: Store the Android capture frame rate only in `Format.metadata`. `Format.frameRate` now stores the calculated frame rate. +* WAV: Fix failure to play WAV files that contain trailing non-media bytes + ([#7129](https://github.com/google/ExoPlayer/issues/7129)) * Testing * Upgrade Truth dependency from 0.44 to 1.0. * Upgrade to JUnit 4.13-rc-2. 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 5ba550047b..1d7b6b9c6e 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 @@ -252,14 +252,14 @@ public final class WavExtractor implements Extractor { @Override public boolean sampleData(ExtractorInput input, long bytesLeft) throws IOException { // Write sample data until we've reached the target sample size, or the end of the data. - boolean endOfSampleData = bytesLeft == 0; - while (!endOfSampleData && pendingOutputBytes < targetSampleSizeBytes) { + while (bytesLeft > 0 && pendingOutputBytes < targetSampleSizeBytes) { int bytesToRead = (int) Math.min(targetSampleSizeBytes - pendingOutputBytes, bytesLeft); int bytesAppended = trackOutput.sampleData(input, bytesToRead, true); if (bytesAppended == RESULT_END_OF_INPUT) { - endOfSampleData = true; + bytesLeft = 0; } else { pendingOutputBytes += bytesAppended; + bytesLeft -= bytesAppended; } } @@ -281,7 +281,7 @@ public final class WavExtractor implements Extractor { pendingOutputBytes = offset; } - return endOfSampleData; + return bytesLeft <= 0; } } 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 5b3753b42f..9287c68423 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 @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.extractor.wav; +import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.testutil.ExtractorAsserts; import org.junit.Test; @@ -30,7 +31,16 @@ public final class WavExtractorTest { } @Test - public void sampleImaAdpcm() throws Exception { + public void sample_withTrailingBytes_extractsSameData() throws Exception { + ExtractorAsserts.assertBehavior( + WavExtractor::new, + "wav/sample_with_trailing_bytes.wav", + ApplicationProvider.getApplicationContext(), + /* dumpFilesPrefix= */ "wav/sample.wav"); + } + + @Test + public void sample_imaAdpcm() throws Exception { ExtractorAsserts.assertBehavior(WavExtractor::new, "wav/sample_ima_adpcm.wav"); } } diff --git a/testdata/src/test/assets/wav/sample_with_trailing_bytes.wav b/testdata/src/test/assets/wav/sample_with_trailing_bytes.wav new file mode 100644 index 0000000000..0b06efcf09 Binary files /dev/null and b/testdata/src/test/assets/wav/sample_with_trailing_bytes.wav differ