Use AudioFormat in SilentAudioGenerator.
PiperOrigin-RevId: 521790733
This commit is contained in:
parent
ff919fe74d
commit
c3f25651bd
@ -16,11 +16,11 @@
|
|||||||
|
|
||||||
package androidx.media3.transformer;
|
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.checkNotNull;
|
||||||
import static androidx.media3.common.util.Assertions.checkState;
|
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_DIRECT;
|
||||||
import static androidx.media3.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED;
|
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 static java.lang.Math.min;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@ -71,7 +71,6 @@ import org.checkerframework.dataflow.qual.Pure;
|
|||||||
throws ExportException {
|
throws ExportException {
|
||||||
super(firstAssetLoaderInputFormat, muxerWrapper);
|
super(firstAssetLoaderInputFormat, muxerWrapper);
|
||||||
|
|
||||||
silentAudioGenerator = new SilentAudioGenerator(firstPipelineInputFormat);
|
|
||||||
availableInputBuffers = new ConcurrentLinkedDeque<>();
|
availableInputBuffers = new ConcurrentLinkedDeque<>();
|
||||||
ByteBuffer emptyBuffer = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
|
ByteBuffer emptyBuffer = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
|
||||||
for (int i = 0; i < MAX_INPUT_BUFFER_COUNT; i++) {
|
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);
|
encoderInputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
|
||||||
encoderOutputBuffer = 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) {
|
if (flattenForSlowMotion && firstAssetLoaderInputFormat.metadata != null) {
|
||||||
audioProcessors =
|
audioProcessors =
|
||||||
new ImmutableList.Builder<AudioProcessor>()
|
new ImmutableList.Builder<AudioProcessor>()
|
||||||
@ -95,20 +103,12 @@ import org.checkerframework.dataflow.qual.Pure;
|
|||||||
}
|
}
|
||||||
|
|
||||||
audioProcessingPipeline = new AudioProcessingPipeline(audioProcessors);
|
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 {
|
try {
|
||||||
encoderInputAudioFormat = audioProcessingPipeline.configure(pipelineInputAudioFormat);
|
encoderInputAudioFormat = audioProcessingPipeline.configure(inputAudioFormat);
|
||||||
} catch (AudioProcessor.UnhandledAudioFormatException unhandledAudioFormatException) {
|
} catch (AudioProcessor.UnhandledAudioFormatException unhandledAudioFormatException) {
|
||||||
throw ExportException.createForAudioProcessing(
|
throw ExportException.createForAudioProcessing(
|
||||||
unhandledAudioFormatException, pipelineInputAudioFormat);
|
unhandledAudioFormatException, inputAudioFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
audioProcessingPipeline.flush();
|
audioProcessingPipeline.flush();
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.audio.AudioProcessor.AudioFormat;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
@ -31,12 +31,9 @@ import java.util.concurrent.atomic.AtomicLong;
|
|||||||
private final ByteBuffer internalBuffer;
|
private final ByteBuffer internalBuffer;
|
||||||
private final AtomicLong remainingBytesToOutput;
|
private final AtomicLong remainingBytesToOutput;
|
||||||
|
|
||||||
public SilentAudioGenerator(Format format) {
|
public SilentAudioGenerator(AudioFormat format) {
|
||||||
sampleRate = format.sampleRate;
|
sampleRate = format.sampleRate;
|
||||||
frameSize =
|
frameSize = Util.getPcmFrameSize(format.encoding, format.channelCount);
|
||||||
Util.getPcmFrameSize(
|
|
||||||
format.pcmEncoding == Format.NO_VALUE ? C.ENCODING_PCM_16BIT : format.pcmEncoding,
|
|
||||||
format.channelCount);
|
|
||||||
internalBuffer =
|
internalBuffer =
|
||||||
ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE_FRAMES * frameSize)
|
ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE_FRAMES * frameSize)
|
||||||
.order(ByteOrder.nativeOrder());
|
.order(ByteOrder.nativeOrder());
|
||||||
|
@ -18,7 +18,7 @@ package androidx.media3.transformer;
|
|||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import androidx.media3.common.C;
|
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 androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -32,11 +32,7 @@ public class SilentAudioGeneratorTest {
|
|||||||
public void addSilenceOnce_numberOfBytesProduced_isCorrect() {
|
public void addSilenceOnce_numberOfBytesProduced_isCorrect() {
|
||||||
SilentAudioGenerator generator =
|
SilentAudioGenerator generator =
|
||||||
new SilentAudioGenerator(
|
new SilentAudioGenerator(
|
||||||
new Format.Builder()
|
new AudioFormat(/* sampleRate= */ 88_200, /* channelCount= */ 6, C.ENCODING_PCM_16BIT));
|
||||||
.setSampleRate(88_200)
|
|
||||||
.setPcmEncoding(C.ENCODING_PCM_16BIT)
|
|
||||||
.setChannelCount(6)
|
|
||||||
.build());
|
|
||||||
|
|
||||||
generator.addSilence(/* durationUs= */ 3_000_000);
|
generator.addSilence(/* durationUs= */ 3_000_000);
|
||||||
int bytesOutput = drainGenerator(generator);
|
int bytesOutput = drainGenerator(generator);
|
||||||
@ -49,11 +45,7 @@ public class SilentAudioGeneratorTest {
|
|||||||
public void addSilenceTwice_numberOfBytesProduced_isCorrect() {
|
public void addSilenceTwice_numberOfBytesProduced_isCorrect() {
|
||||||
SilentAudioGenerator generator =
|
SilentAudioGenerator generator =
|
||||||
new SilentAudioGenerator(
|
new SilentAudioGenerator(
|
||||||
new Format.Builder()
|
new AudioFormat(/* sampleRate= */ 88_200, /* channelCount= */ 6, C.ENCODING_PCM_16BIT));
|
||||||
.setSampleRate(88_200)
|
|
||||||
.setPcmEncoding(C.ENCODING_PCM_16BIT)
|
|
||||||
.setChannelCount(6)
|
|
||||||
.build());
|
|
||||||
|
|
||||||
generator.addSilence(/* durationUs= */ 3_000_000);
|
generator.addSilence(/* durationUs= */ 3_000_000);
|
||||||
int bytesOutput = drainGenerator(generator);
|
int bytesOutput = drainGenerator(generator);
|
||||||
@ -68,11 +60,8 @@ public class SilentAudioGeneratorTest {
|
|||||||
public void lastBufferProduced_isCorrectSize() {
|
public void lastBufferProduced_isCorrectSize() {
|
||||||
SilentAudioGenerator generator =
|
SilentAudioGenerator generator =
|
||||||
new SilentAudioGenerator(
|
new SilentAudioGenerator(
|
||||||
new Format.Builder()
|
new AudioFormat(/* sampleRate= */ 44_100, /* channelCount= */ 2, C.ENCODING_PCM_16BIT));
|
||||||
.setSampleRate(44_100)
|
|
||||||
.setPcmEncoding(C.ENCODING_PCM_16BIT)
|
|
||||||
.setChannelCount(2)
|
|
||||||
.build());
|
|
||||||
generator.addSilence(/* durationUs= */ 1_000_000);
|
generator.addSilence(/* durationUs= */ 1_000_000);
|
||||||
|
|
||||||
int currentBufferSize = 0;
|
int currentBufferSize = 0;
|
||||||
@ -92,11 +81,7 @@ public class SilentAudioGeneratorTest {
|
|||||||
public void totalBytesLowerThanDefaultBufferSize_smallBufferProduced() {
|
public void totalBytesLowerThanDefaultBufferSize_smallBufferProduced() {
|
||||||
SilentAudioGenerator generator =
|
SilentAudioGenerator generator =
|
||||||
new SilentAudioGenerator(
|
new SilentAudioGenerator(
|
||||||
new Format.Builder()
|
new AudioFormat(/* sampleRate= */ 48_000, /* channelCount= */ 2, C.ENCODING_PCM_16BIT));
|
||||||
.setSampleRate(48_000)
|
|
||||||
.setPcmEncoding(C.ENCODING_PCM_16BIT)
|
|
||||||
.setChannelCount(2)
|
|
||||||
.build());
|
|
||||||
|
|
||||||
generator.addSilence(/* durationUs= */ 5_000);
|
generator.addSilence(/* durationUs= */ 5_000);
|
||||||
|
|
||||||
|
@ -117,7 +117,9 @@ public final class TestUtil {
|
|||||||
.setChannelCount(2)
|
.setChannelCount(2)
|
||||||
.build();
|
.build();
|
||||||
try {
|
try {
|
||||||
listener.onTrackAdded(format, supportedOutputTypes);
|
if (listener.onTrackAdded(format, supportedOutputTypes)) {
|
||||||
|
format = format.buildUpon().setPcmEncoding(C.ENCODING_PCM_16BIT).build();
|
||||||
|
}
|
||||||
|
|
||||||
SampleConsumer sampleConsumer = listener.onOutputFormat(format);
|
SampleConsumer sampleConsumer = listener.onOutputFormat(format);
|
||||||
if (sampleConsumerRef != null) {
|
if (sampleConsumerRef != null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user