Commit 54c60848 by olly Committed by Oliver Woodman

Support 32-bit FP to 16-bit Int audio resampling

This is a no-op for DefaultAudioSink for now, because DefaultAudioSink
currently disables processing anyway if the input uses ENCODING_PCM_FLOAT.

Issue: #7134
PiperOrigin-RevId: 302670534
parent 2094c749
...@@ -20,8 +20,17 @@ import com.google.android.exoplayer2.Format; ...@@ -20,8 +20,17 @@ import com.google.android.exoplayer2.Format;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
/** /**
* An {@link AudioProcessor} that converts 8-bit, 24-bit and 32-bit integer PCM audio to 16-bit * An {@link AudioProcessor} that converts different PCM audio encodings to 16-bit integer PCM. The
* integer PCM audio. * following encodings are supported as input:
*
* <ul>
* <li>{@link C#ENCODING_PCM_8BIT}
* <li>{@link C#ENCODING_PCM_16BIT} ({@link #isActive()} will return {@code false})
* <li>{@link C#ENCODING_PCM_16BIT_BIG_ENDIAN}
* <li>{@link C#ENCODING_PCM_24BIT}
* <li>{@link C#ENCODING_PCM_32BIT}
* <li>{@link C#ENCODING_PCM_FLOAT}
* </ul>
*/ */
/* package */ final class ResamplingAudioProcessor extends BaseAudioProcessor { /* package */ final class ResamplingAudioProcessor extends BaseAudioProcessor {
...@@ -33,7 +42,8 @@ import java.nio.ByteBuffer; ...@@ -33,7 +42,8 @@ import java.nio.ByteBuffer;
&& encoding != C.ENCODING_PCM_16BIT && encoding != C.ENCODING_PCM_16BIT
&& encoding != C.ENCODING_PCM_16BIT_BIG_ENDIAN && encoding != C.ENCODING_PCM_16BIT_BIG_ENDIAN
&& encoding != C.ENCODING_PCM_24BIT && encoding != C.ENCODING_PCM_24BIT
&& encoding != C.ENCODING_PCM_32BIT) { && encoding != C.ENCODING_PCM_32BIT
&& encoding != C.ENCODING_PCM_FLOAT) {
throw new UnhandledAudioFormatException(inputAudioFormat); throw new UnhandledAudioFormatException(inputAudioFormat);
} }
return encoding != C.ENCODING_PCM_16BIT return encoding != C.ENCODING_PCM_16BIT
...@@ -60,10 +70,10 @@ import java.nio.ByteBuffer; ...@@ -60,10 +70,10 @@ import java.nio.ByteBuffer;
resampledSize = (size / 3) * 2; resampledSize = (size / 3) * 2;
break; break;
case C.ENCODING_PCM_32BIT: case C.ENCODING_PCM_32BIT:
case C.ENCODING_PCM_FLOAT:
resampledSize = size / 2; resampledSize = size / 2;
break; break;
case C.ENCODING_PCM_16BIT: case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_FLOAT:
case C.ENCODING_INVALID: case C.ENCODING_INVALID:
case Format.NO_VALUE: case Format.NO_VALUE:
default: default:
...@@ -101,8 +111,16 @@ import java.nio.ByteBuffer; ...@@ -101,8 +111,16 @@ import java.nio.ByteBuffer;
buffer.put(inputBuffer.get(i + 3)); buffer.put(inputBuffer.get(i + 3));
} }
break; break;
case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_FLOAT: case C.ENCODING_PCM_FLOAT:
// 32 bit floating point -> 16 bit resampling. Floating point values are in the range
// [-1.0, 1.0], so need to be scaled by Short.MAX_VALUE.
for (int i = position; i < limit; i += 4) {
short value = (short) (inputBuffer.getFloat(i) * Short.MAX_VALUE);
buffer.put((byte) (value & 0xFF));
buffer.put((byte) ((value >> 8) & 0xFF));
}
break;
case C.ENCODING_PCM_16BIT:
case C.ENCODING_INVALID: case C.ENCODING_INVALID:
case Format.NO_VALUE: case Format.NO_VALUE:
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment