Use AudioFormat in SilentAudioGenerator.

PiperOrigin-RevId: 521790733
This commit is contained in:
samrobinson 2023-04-04 17:52:43 +01:00 committed by Marc Baechinger
parent ff919fe74d
commit c3f25651bd
4 changed files with 24 additions and 40 deletions

View File

@ -16,11 +16,11 @@
package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkArgument;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT;
import static androidx.media3.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED;
import static androidx.media3.transformer.DefaultCodec.DEFAULT_PCM_ENCODING;
import static java.lang.Math.min;
import androidx.annotation.Nullable;
@ -71,7 +71,6 @@ import org.checkerframework.dataflow.qual.Pure;
throws ExportException {
super(firstAssetLoaderInputFormat, muxerWrapper);
silentAudioGenerator = new SilentAudioGenerator(firstPipelineInputFormat);
availableInputBuffers = new ConcurrentLinkedDeque<>();
ByteBuffer emptyBuffer = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
for (int i = 0; i < MAX_INPUT_BUFFER_COUNT; i++) {
@ -84,6 +83,15 @@ import org.checkerframework.dataflow.qual.Pure;
encoderInputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
encoderOutputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
checkArgument(firstPipelineInputFormat.pcmEncoding != Format.NO_VALUE);
AudioFormat inputAudioFormat =
new AudioFormat(
firstPipelineInputFormat.sampleRate,
firstPipelineInputFormat.channelCount,
firstPipelineInputFormat.pcmEncoding);
silentAudioGenerator = new SilentAudioGenerator(inputAudioFormat);
if (flattenForSlowMotion && firstAssetLoaderInputFormat.metadata != null) {
audioProcessors =
new ImmutableList.Builder<AudioProcessor>()
@ -95,20 +103,12 @@ import org.checkerframework.dataflow.qual.Pure;
}
audioProcessingPipeline = new AudioProcessingPipeline(audioProcessors);
// TODO(b/267301878): Once decoder format propagated, remove setting default PCM encoding.
AudioFormat pipelineInputAudioFormat =
new AudioFormat(
firstPipelineInputFormat.sampleRate,
firstPipelineInputFormat.channelCount,
firstPipelineInputFormat.pcmEncoding != Format.NO_VALUE
? firstPipelineInputFormat.pcmEncoding
: DEFAULT_PCM_ENCODING);
try {
encoderInputAudioFormat = audioProcessingPipeline.configure(pipelineInputAudioFormat);
encoderInputAudioFormat = audioProcessingPipeline.configure(inputAudioFormat);
} catch (AudioProcessor.UnhandledAudioFormatException unhandledAudioFormatException) {
throw ExportException.createForAudioProcessing(
unhandledAudioFormatException, pipelineInputAudioFormat);
unhandledAudioFormatException, inputAudioFormat);
}
audioProcessingPipeline.flush();

View File

@ -17,7 +17,7 @@
package androidx.media3.transformer;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.audio.AudioProcessor.AudioFormat;
import androidx.media3.common.util.Util;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@ -31,12 +31,9 @@ import java.util.concurrent.atomic.AtomicLong;
private final ByteBuffer internalBuffer;
private final AtomicLong remainingBytesToOutput;
public SilentAudioGenerator(Format format) {
public SilentAudioGenerator(AudioFormat format) {
sampleRate = format.sampleRate;
frameSize =
Util.getPcmFrameSize(
format.pcmEncoding == Format.NO_VALUE ? C.ENCODING_PCM_16BIT : format.pcmEncoding,
format.channelCount);
frameSize = Util.getPcmFrameSize(format.encoding, format.channelCount);
internalBuffer =
ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE_FRAMES * frameSize)
.order(ByteOrder.nativeOrder());

View File

@ -18,7 +18,7 @@ package androidx.media3.transformer;
import static com.google.common.truth.Truth.assertThat;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.audio.AudioProcessor.AudioFormat;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.nio.ByteBuffer;
import org.junit.Test;
@ -32,11 +32,7 @@ public class SilentAudioGeneratorTest {
public void addSilenceOnce_numberOfBytesProduced_isCorrect() {
SilentAudioGenerator generator =
new SilentAudioGenerator(
new Format.Builder()
.setSampleRate(88_200)
.setPcmEncoding(C.ENCODING_PCM_16BIT)
.setChannelCount(6)
.build());
new AudioFormat(/* sampleRate= */ 88_200, /* channelCount= */ 6, C.ENCODING_PCM_16BIT));
generator.addSilence(/* durationUs= */ 3_000_000);
int bytesOutput = drainGenerator(generator);
@ -49,11 +45,7 @@ public class SilentAudioGeneratorTest {
public void addSilenceTwice_numberOfBytesProduced_isCorrect() {
SilentAudioGenerator generator =
new SilentAudioGenerator(
new Format.Builder()
.setSampleRate(88_200)
.setPcmEncoding(C.ENCODING_PCM_16BIT)
.setChannelCount(6)
.build());
new AudioFormat(/* sampleRate= */ 88_200, /* channelCount= */ 6, C.ENCODING_PCM_16BIT));
generator.addSilence(/* durationUs= */ 3_000_000);
int bytesOutput = drainGenerator(generator);
@ -68,11 +60,8 @@ public class SilentAudioGeneratorTest {
public void lastBufferProduced_isCorrectSize() {
SilentAudioGenerator generator =
new SilentAudioGenerator(
new Format.Builder()
.setSampleRate(44_100)
.setPcmEncoding(C.ENCODING_PCM_16BIT)
.setChannelCount(2)
.build());
new AudioFormat(/* sampleRate= */ 44_100, /* channelCount= */ 2, C.ENCODING_PCM_16BIT));
generator.addSilence(/* durationUs= */ 1_000_000);
int currentBufferSize = 0;
@ -92,11 +81,7 @@ public class SilentAudioGeneratorTest {
public void totalBytesLowerThanDefaultBufferSize_smallBufferProduced() {
SilentAudioGenerator generator =
new SilentAudioGenerator(
new Format.Builder()
.setSampleRate(48_000)
.setPcmEncoding(C.ENCODING_PCM_16BIT)
.setChannelCount(2)
.build());
new AudioFormat(/* sampleRate= */ 48_000, /* channelCount= */ 2, C.ENCODING_PCM_16BIT));
generator.addSilence(/* durationUs= */ 5_000);

View File

@ -117,7 +117,9 @@ public final class TestUtil {
.setChannelCount(2)
.build();
try {
listener.onTrackAdded(format, supportedOutputTypes);
if (listener.onTrackAdded(format, supportedOutputTypes)) {
format = format.buildUpon().setPcmEncoding(C.ENCODING_PCM_16BIT).build();
}
SampleConsumer sampleConsumer = listener.onOutputFormat(format);
if (sampleConsumerRef != null) {