Add AudioGraphInput tests around getOutput behaviour.

PiperOrigin-RevId: 604297126
This commit is contained in:
samrobinson 2024-02-05 06:15:33 -08:00 committed by Copybara-Service
parent 49c6d25106
commit f8352580cb

View file

@ -16,6 +16,7 @@
package androidx.media3.transformer; package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Util.getPcmFormat; import static androidx.media3.common.util.Util.getPcmFormat;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@ -24,8 +25,13 @@ import androidx.media3.common.Format;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.audio.AudioProcessor.AudioFormat; import androidx.media3.common.audio.AudioProcessor.AudioFormat;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.decoder.DecoderInputBuffer;
import androidx.media3.test.utils.TestUtil;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.primitives.Bytes;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -101,6 +107,67 @@ public class AudioGraphInputTest {
assertThat(audioGraphInput.getOutputAudioFormat()).isEqualTo(STEREO_44100); assertThat(audioGraphInput.getOutputAudioFormat()).isEqualTo(STEREO_44100);
} }
@Test
public void getOutput_withoutMediaItemChange_returnsEmptyBuffer() throws Exception {
AudioGraphInput audioGraphInput =
new AudioGraphInput(
/* requestedOutputAudioFormat= */ AudioFormat.NOT_SET,
/* editedMediaItem= */ FAKE_ITEM,
/* inputFormat= */ getPcmFormat(STEREO_44100));
byte[] inputData = TestUtil.buildTestData(/* length= */ 100 * STEREO_44100.bytesPerFrame);
// Force processing side to progress.
checkState(!audioGraphInput.getOutput().hasRemaining());
// Queue inputData.
DecoderInputBuffer inputBuffer = audioGraphInput.getInputBuffer();
inputBuffer.ensureSpaceForWrite(inputData.length);
inputBuffer.data.put(inputData).flip();
checkState(audioGraphInput.queueInputBuffer());
// Queue EOS.
audioGraphInput.getInputBuffer().setFlags(C.BUFFER_FLAG_END_OF_STREAM);
checkState(audioGraphInput.queueInputBuffer());
assertThat(audioGraphInput.getOutput().hasRemaining()).isFalse();
assertThat(audioGraphInput.getOutput().hasRemaining()).isFalse();
assertThat(audioGraphInput.getOutput().hasRemaining()).isFalse();
assertThat(audioGraphInput.getOutput().hasRemaining()).isFalse();
assertThat(audioGraphInput.getOutput().hasRemaining()).isFalse();
assertThat(audioGraphInput.isEnded()).isFalse();
}
@Test
public void getOutput_withNoEffects_returnsInputData() throws Exception {
AudioGraphInput audioGraphInput =
new AudioGraphInput(
/* requestedOutputAudioFormat= */ AudioFormat.NOT_SET,
/* editedMediaItem= */ FAKE_ITEM,
/* inputFormat= */ getPcmFormat(STEREO_44100));
byte[] inputData = TestUtil.buildTestData(/* length= */ 100 * STEREO_44100.bytesPerFrame);
audioGraphInput.onMediaItemChanged(
/* editedMediaItem= */ FAKE_ITEM,
/* durationUs= */ 1_000_000,
/* decodedFormat= */ getPcmFormat(STEREO_44100),
/* isLast= */ true);
// Force the media item change to be processed.
checkState(!audioGraphInput.getOutput().hasRemaining());
// Queue inputData.
DecoderInputBuffer inputBuffer = audioGraphInput.getInputBuffer();
inputBuffer.ensureSpaceForWrite(inputData.length);
inputBuffer.data.put(inputData).flip();
checkState(audioGraphInput.queueInputBuffer());
// Queue EOS.
audioGraphInput.getInputBuffer().setFlags(C.BUFFER_FLAG_END_OF_STREAM);
checkState(audioGraphInput.queueInputBuffer());
List<Byte> outputBytes = drainAudioGraphInputUntilEnded(audioGraphInput);
assertThat(outputBytes).containsExactlyElementsIn(Bytes.asList(inputData));
}
@Test @Test
public void getOutput_withSilentMediaItemChange_outputsCorrectAmountOfSilentBytes() public void getOutput_withSilentMediaItemChange_outputsCorrectAmountOfSilentBytes()
throws Exception { throws Exception {
@ -115,20 +182,23 @@ public class AudioGraphInputTest {
/* durationUs= */ 1_000_000, /* durationUs= */ 1_000_000,
/* decodedFormat= */ null, /* decodedFormat= */ null,
/* isLast= */ true); /* isLast= */ true);
int bytesOutput = drainAudioGraphInput(audioGraphInput);
int bytesOutput = drainAudioGraphInputUntilEnded(audioGraphInput).size();
long expectedSampleCount = Util.durationUsToSampleCount(1_000_000, STEREO_44100.sampleRate); long expectedSampleCount = Util.durationUsToSampleCount(1_000_000, STEREO_44100.sampleRate);
assertThat(bytesOutput).isEqualTo(expectedSampleCount * STEREO_44100.bytesPerFrame); assertThat(bytesOutput).isEqualTo(expectedSampleCount * STEREO_44100.bytesPerFrame);
} }
/** Drains the graph and returns the number of bytes output. */ /** Drains the graph and returns the bytes output. */
private static int drainAudioGraphInput(AudioGraphInput audioGraphInput) throws Exception { private static List<Byte> drainAudioGraphInputUntilEnded(AudioGraphInput audioGraphInput)
int bytesOutput = 0; throws Exception {
ArrayList<Byte> outputBytes = new ArrayList<>();
ByteBuffer output; ByteBuffer output;
while ((output = audioGraphInput.getOutput()).hasRemaining() || !audioGraphInput.isEnded()) { while (!audioGraphInput.isEnded()) {
bytesOutput += output.remaining(); output = audioGraphInput.getOutput();
output.position(output.limit()); while (output.hasRemaining()) {
} outputBytes.add(output.get());
return bytesOutput; }
}
return outputBytes;
} }
} }