diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java index f0cf41a68e..a5da6ba6ae 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java @@ -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() @@ -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(); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java index 3504bdd499..905e74b9c6 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java @@ -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()); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java index e74a76a04e..cc328e9007 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/SilentAudioGeneratorTest.java @@ -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); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java index 46dea07e2d..cc2bd27a31 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java @@ -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) {