WAV: Don't read past data end position

Issue: #7129
PiperOrigin-RevId: 302660343
This commit is contained in:
olly 2020-03-24 14:24:36 +00:00 committed by Oliver Woodman
parent 134df9fb71
commit 05fb211121
4 changed files with 17 additions and 5 deletions

View file

@ -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.

View file

@ -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;
}
}

View file

@ -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");
}
}

Binary file not shown.