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
This commit is contained in:
parent
05fb211121
commit
9ed471651e
@ -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;
|
|||||||
&& 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;
|
|||||||
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;
|
|||||||
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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user