From 4ff75f0247e19bff1f4da93f68060569cff7cd44 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 7 Feb 2022 23:10:33 +0000 Subject: [PATCH] Fix For Sample-To-Bytes Calculation In OpusDecoder Aligning the byte size calculation with the sizes defined in opus_jni.cc for the `outputFloat=true` case #minor-release PiperOrigin-RevId: 427028982 --- .../google/android/exoplayer2/ext/opus/OpusDecoder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index b6b7567d81..9fd0346b04 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -211,7 +211,7 @@ public final class OpusDecoder outputData.position(0); outputData.limit(result); if (skipSamples > 0) { - int bytesPerSample = channelCount * 2; + int bytesPerSample = samplesToBytes(1, channelCount, outputFloat); int skipBytes = skipSamples * bytesPerSample; if (result <= skipBytes) { skipSamples -= result / bytesPerSample; @@ -278,6 +278,12 @@ public final class OpusDecoder return DEFAULT_SEEK_PRE_ROLL_SAMPLES; } + /** Returns number of bytes to represent {@code samples}. */ + private static int samplesToBytes(int samples, int channelCount, boolean outputFloat) { + int bytesPerChannel = outputFloat ? 4 : 2; + return samples * channelCount * bytesPerChannel; + } + private static int readSignedLittleEndian16(byte[] input, int offset) { int value = input[offset] & 0xFF; value |= (input[offset + 1] & 0xFF) << 8;