From b9ec24a2696b79d3b5f56d08dd9a90ae807d530b Mon Sep 17 00:00:00 2001 From: dancho Date: Fri, 17 May 2024 06:52:12 -0700 Subject: [PATCH] Fix AV sync for sequences with audio track shorter than video For each item, AudioGraphInput now pads the input audio track with silence to the duration given in onMediaItemChanged. Possibly resolves Issue: androidx/media#921 . PiperOrigin-RevId: 634753721 --- RELEASENOTES.md | 1 + .../src/main/res/values/arrays.xml | 3 + .../assets/media/mp4/sample_shorter_audio.mp4 | Bin 0 -> 92634 bytes .../mp4/sample_twos_pcm.mp4/toInt16.dump | 9 +- .../media3/transformer/AndroidTestUtil.java | 12 + .../transformer/TransformerEndToEndTest.java | 206 +++++++++++++++++- .../media3/transformer/AudioGraphInput.java | 87 +++++++- .../transformer/AudioGraphInputAudioSink.java | 4 +- .../transformer/SequenceAssetLoader.java | 11 +- .../VideoFrameProcessingWrapper.java | 1 + .../transformer/AudioGraphInputTest.java | 118 +++++++++- .../androidx/media3/transformer/TestUtil.java | 6 + 12 files changed, 434 insertions(+), 24 deletions(-) create mode 100644 libraries/test_data/src/test/assets/media/mp4/sample_shorter_audio.mp4 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 47d304387a..12d512bd7a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -45,6 +45,7 @@ `androidx.media3.transformer.Muxer`. * Fix HEIC image loading from content URI schemes. ([#1373](https://github.com/androidx/media/issues/1373)). + * Adjust audio track duration in `AudioGraphInput` to improve AV sync. * Track Selection: * Extractors: * MPEG-TS: Roll forward the change ensuring the last frame is rendered by diff --git a/demos/composition/src/main/res/values/arrays.xml b/demos/composition/src/main/res/values/arrays.xml index b9e79f087d..780eeb5635 100644 --- a/demos/composition/src/main/res/values/arrays.xml +++ b/demos/composition/src/main/res/values/arrays.xml @@ -32,6 +32,7 @@ 720p H264 video with no audio London JPG image (plays for 5 secs at 30 fps) Tokyo JPG image (portrait, plays for 5 secs at 30 fps) + Pixel 7 shorter audio track https://storage.googleapis.com/exoplayer-test-media-1/mp4/android-screens-10s.mp4 @@ -51,6 +52,7 @@ https://storage.googleapis.com/exoplayer-test-media-1/mp4/sample_video_track_only.mp4 https://storage.googleapis.com/exoplayer-test-media-1/jpg/london.jpg https://storage.googleapis.com/exoplayer-test-media-1/jpg/tokyo.jpg + https://storage.googleapis.com/exoplayer-temp/audio-blip/metronome_selfie_pixel.mp4 10024000 @@ -70,5 +72,6 @@ 1001000 5000000 5000000 + 2170000 diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_shorter_audio.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_shorter_audio.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f31c945003b7461f84357e183afb855b766d5e46 GIT binary patch literal 92634 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Р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%0Ax0e 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

90=I&wi3c1N<`Z4i&0z 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 31); + Context context = ApplicationProvider.getApplicationContext(); + Transformer transformer = new Transformer.Builder(context).build(); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_SHORTER_AUDIO_URI_STRING)); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); + + Composition composition = + new Composition.Builder(new EditedMediaItemSequence(editedMediaItem, editedMediaItem)) + .build(); + ExportTestResult exportTestResult = + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, composition); + + Mp4Extractor mp4Extractor = new Mp4Extractor(new DefaultSubtitleParserFactory()); + FakeExtractorOutput fakeExtractorOutput = + TestUtil.extractAllSamplesFromFilePath(mp4Extractor, exportTestResult.filePath); + assertThat(fakeExtractorOutput.seekMap.getDurationUs()).isEqualTo(2_400_000); + assertThat(fakeExtractorOutput.numberOfTracks).isEqualTo(2); + // Check that both video and audio tracks have duration close to 1 second. + for (int i = 0; i < fakeExtractorOutput.numberOfTracks; ++i) { + FakeTrackOutput trackOutput = fakeExtractorOutput.trackOutputs.get(i); + int sampleCount = trackOutput.getSampleCount(); + assertThat(trackOutput.getSampleTimeUs(/* index= */ 0)).isEqualTo(0); + if (MimeTypes.isVideo(trackOutput.lastFormat.sampleMimeType)) { + assertThat(trackOutput.getSampleTimeUs(/* index= */ sampleCount - 1)).isEqualTo(2_383_333); + } else { + // Input has 800ms audio. Output should be closer to 2.4s. + // Audio encoders on different API levels output different audio durations for the same + // input. + // On emulator, API 26 always outputs one access unit (23ms) of audio more than API 33. + assertThat(trackOutput.getSampleTimeUs(/* index= */ sampleCount - 1)).isAtLeast(2_300_000); + assertThat(trackOutput.getSampleTimeUs(/* index= */ sampleCount - 1)).isAtMost(2_400_000); + } + } + } + + @Test + public void speedAdjustedMedia_shorterAudioTrack_completesWithCorrectDuration() throws Exception { + assumeFormatsSupported( + context, + testId, + /* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT, + /* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT); + Transformer transformer = new Transformer.Builder(context).build(); + SpeedProvider speedProvider = + TestSpeedProvider.createWithStartTimes( + new long[] {0L, 1L * C.MICROS_PER_SECOND}, new float[] {1f, 0.5f}); + Pair speedEffect = + Effects.createExperimentalSpeedChangingEffect(speedProvider); + Effects effects = + new Effects( + /* audioProcessors= */ ImmutableList.of(speedEffect.first), + /* videoEffects= */ ImmutableList.of(speedEffect.second)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_WITH_SHORTER_AUDIO_URI_STRING)) + .setEffects(effects) + .build(); + ExportTestResult result = + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, editedMediaItem); + + // Last video frame PTS is 1.18333 + // (1.183333 - 1) * 2 + 1 = 1.36667 + // Audio encoders on different API levels output different audio durations for the same input. + // On emulator, API 26 always outputs one access unit (23ms) of audio more than API 33. + // If the video track is a lot longer than the audio track, then this API difference wouldn't be + // seen in this check as the duration is determined by the last video frame. + // However, if the audio track is roughly as long as the video track, this API difference + // will be seen in result.exportResult.durationMs. + assertThat(result.exportResult.durationMs).isAtLeast(1_360); + assertThat(result.exportResult.durationMs).isAtMost(1_400); + } + private static AudioProcessor createSonic(float pitch) { SonicAudioProcessor sonic = new SonicAudioProcessor(); sonic.setPitch(pitch); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInput.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInput.java index b75363426c..160b4703d5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInput.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInput.java @@ -37,6 +37,7 @@ import androidx.media3.common.audio.ChannelMixingMatrix; import androidx.media3.common.audio.SonicAudioProcessor; import androidx.media3.common.audio.SpeedChangingAudioProcessor; import androidx.media3.common.util.NullableType; +import androidx.media3.common.util.Util; import androidx.media3.decoder.DecoderInputBuffer; import com.google.common.collect.ImmutableList; import java.nio.ByteBuffer; @@ -57,22 +58,27 @@ import java.util.concurrent.atomic.AtomicReference; * "processing" thread. */ /* package */ final class AudioGraphInput implements GraphInput { + private static final long MAX_AUDIO_DRIFT_ALLOWED_US = 2000; private static final int MAX_INPUT_BUFFER_COUNT = 10; private final AudioFormat outputAudioFormat; - // TODO(b/260618558): Move silent audio generation upstream of this component. - private final SilentAudioGenerator silentAudioGenerator; private final Queue availableInputBuffers; private final Queue pendingInputBuffers; private final AtomicReference<@NullableType MediaItemChange> pendingMediaItemChange; private final AtomicLong startTimeUs; + // silentAudioGenerator.audioFormat must match the current media item's input format. + private SilentAudioGenerator silentAudioGenerator; @Nullable private DecoderInputBuffer currentInputBufferBeingOutput; private AudioProcessingPipeline audioProcessingPipeline; private boolean processedFirstMediaItemChange; private boolean receivedEndOfStreamFromInput; private boolean queueEndOfStreamAfterSilence; private boolean inputBlocked; + private long currentItemExpectedInputDurationUs; + private long currentItemInputBytesRead; + private boolean currentItemSilenceAppended; + private boolean isCurrentItemLast; /** * Creates an instance. @@ -108,6 +114,7 @@ import java.util.concurrent.atomic.AtomicReference; checkArgument( outputAudioFormat.encoding == C.ENCODING_PCM_16BIT, /* errorMessage= */ outputAudioFormat); startTimeUs = new AtomicLong(C.TIME_UNSET); + currentItemExpectedInputDurationUs = C.TIME_UNSET; } /** Returns the {@link AudioFormat} of {@linkplain #getOutput() output buffers}. */ @@ -141,6 +148,8 @@ import java.util.concurrent.atomic.AtomicReference; /** * {@inheritDoc} * + *

When durationUs is {@link C#TIME_UNSET}, silence generation is disabled. + * *

Should only be called by the input thread. */ @Override @@ -246,6 +255,10 @@ import java.util.concurrent.atomic.AtomicReference; receivedEndOfStreamFromInput = false; queueEndOfStreamAfterSilence = false; startTimeUs.set(C.TIME_UNSET); + currentItemExpectedInputDurationUs = C.TIME_UNSET; + currentItemInputBytesRead = 0; + currentItemSilenceAppended = false; + isCurrentItemLast = false; } /** @@ -303,12 +316,21 @@ import java.util.concurrent.atomic.AtomicReference; @Nullable DecoderInputBuffer pendingInputBuffer = pendingInputBuffers.peek(); if (pendingInputBuffer == null) { if (pendingMediaItemChange.get() != null) { + if (shouldAppendSilence()) { + appendSilence(); + return true; + } audioProcessingPipeline.queueEndOfStream(); } return false; } if (pendingInputBuffer.isEndOfStream()) { + if (shouldAppendSilence()) { + appendSilence(); + clearAndAddToAvailableBuffers(pendingInputBuffers.remove()); + return true; + } audioProcessingPipeline.queueEndOfStream(); receivedEndOfStreamFromInput = true; clearAndAddToAvailableBuffers(pendingInputBuffers.remove()); @@ -316,7 +338,10 @@ import java.util.concurrent.atomic.AtomicReference; } ByteBuffer inputData = checkNotNull(pendingInputBuffer.data); + long bytesRemaining = inputData.remaining(); audioProcessingPipeline.queueInput(inputData); + long bytesConsumed = bytesRemaining - inputData.remaining(); + currentItemInputBytesRead += bytesConsumed; if (inputData.hasRemaining()) { return false; } @@ -332,19 +357,21 @@ import java.util.concurrent.atomic.AtomicReference; // When output is fed directly from input, the output ByteBuffer is linked to a specific // DecoderInputBuffer. Therefore it must be consumed by the downstream component before it can // be used for fresh input. - @Nullable DecoderInputBuffer previousOutputBuffer = currentInputBufferBeingOutput; - if (previousOutputBuffer != null) { - ByteBuffer data = checkStateNotNull(previousOutputBuffer.data); + if (currentInputBufferBeingOutput != null) { + ByteBuffer data = checkStateNotNull(currentInputBufferBeingOutput.data); if (data.hasRemaining()) { // Currently output data has not been consumed, return it. return data; } - clearAndAddToAvailableBuffers(previousOutputBuffer); + clearAndAddToAvailableBuffers(checkStateNotNull(currentInputBufferBeingOutput)); currentInputBufferBeingOutput = null; } @Nullable DecoderInputBuffer currentInputBuffer = pendingInputBuffers.poll(); if (currentInputBuffer == null) { + if (pendingMediaItemChange.get() != null && shouldAppendSilence()) { + appendSilence(); + } return EMPTY_BUFFER; } @Nullable ByteBuffer currentInputBufferData = currentInputBuffer.data; @@ -356,10 +383,16 @@ import java.util.concurrent.atomic.AtomicReference; || !currentInputBufferData.hasRemaining() || receivedEndOfStreamFromInput) { clearAndAddToAvailableBuffers(currentInputBuffer); + if (receivedEndOfStreamFromInput && shouldAppendSilence()) { + appendSilence(); + } return EMPTY_BUFFER; } currentInputBufferBeingOutput = currentInputBuffer; + // Bytes from currentInputBufferBeingOutput will be read over multiple calls to this method. + // Add all bytes now, this line will be reached only once per input buffer. + currentItemInputBytesRead += currentInputBufferData.remaining(); return currentInputBufferData; } @@ -400,16 +433,29 @@ import java.util.concurrent.atomic.AtomicReference; private void configureForPendingMediaItemChange() throws UnhandledAudioFormatException { MediaItemChange pendingChange = checkStateNotNull(pendingMediaItemChange.get()); + currentItemInputBytesRead = 0; + isCurrentItemLast = pendingChange.isLast; + currentItemSilenceAppended = false; AudioFormat pendingAudioFormat; if (pendingChange.format != null) { + currentItemExpectedInputDurationUs = pendingChange.durationUs; pendingAudioFormat = new AudioFormat(pendingChange.format); + silentAudioGenerator = new SilentAudioGenerator(pendingAudioFormat); } else { // Generating silence + // No audio track. Generate silence based on video track duration after applying effects. + if (pendingChange.editedMediaItem.effects.audioProcessors.isEmpty()) { + // No audio track and no effects. + // Generate silence based on video track duration after applying effects. + currentItemExpectedInputDurationUs = + pendingChange.editedMediaItem.getDurationAfterEffectsApplied(pendingChange.durationUs); + } else { + // No audio track, but effects are present. + // Generate audio track based on video duration, and apply effects. + currentItemExpectedInputDurationUs = pendingChange.durationUs; + } pendingAudioFormat = silentAudioGenerator.audioFormat; startTimeUs.compareAndSet(/* expectedValue= */ C.TIME_UNSET, /* newValue= */ 0); - silentAudioGenerator.addSilence(pendingChange.durationUs); - if (pendingChange.isLast) { - queueEndOfStreamAfterSilence = true; - } + appendSilence(); } if (processedFirstMediaItemChange) { @@ -427,6 +473,27 @@ import java.util.concurrent.atomic.AtomicReference; processedFirstMediaItemChange = true; } + private boolean shouldAppendSilence() { + return !currentItemSilenceAppended + && currentItemExpectedInputDurationUs != C.TIME_UNSET + && currentItemExpectedInputDurationUs - currentItemActualInputDurationUs() + > MAX_AUDIO_DRIFT_ALLOWED_US; + } + + private void appendSilence() { + silentAudioGenerator.addSilence( + currentItemExpectedInputDurationUs - currentItemActualInputDurationUs()); + currentItemSilenceAppended = true; + if (isCurrentItemLast) { + queueEndOfStreamAfterSilence = true; + } + } + + private long currentItemActualInputDurationUs() { + long samplesOutput = currentItemInputBytesRead / silentAudioGenerator.audioFormat.bytesPerFrame; + return Util.sampleCountToDurationUs(samplesOutput, silentAudioGenerator.audioFormat.sampleRate); + } + /** * Returns a new configured {@link AudioProcessingPipeline}. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInputAudioSink.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInputAudioSink.java index 10902254e3..1c389d126f 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInputAudioSink.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraphInputAudioSink.java @@ -131,8 +131,10 @@ import java.util.Objects; } } + // During playback, AudioGraphInput doesn't know the full media duration upfront due to seeking. + // Pass in C.TIME_UNSET to AudioGraphInput.onMediaItemChanged. outputGraphInput.onMediaItemChanged( - editedMediaItem, editedMediaItem.durationUs, currentInputFormat, /* isLast= */ false); + editedMediaItem, C.TIME_UNSET, currentInputFormat, /* isLast= */ false); } @Override diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java index c373234376..14ef0dc0f1 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java @@ -102,6 +102,7 @@ import java.util.concurrent.atomic.AtomicInteger; private volatile boolean released; private volatile long currentAssetDurationUs; + private volatile long currentAssetDurationAfterEffectsAppliedUs; private volatile long maxSequenceDurationUs; private volatile boolean isMaxSequenceDurationUsFinal; @@ -334,7 +335,9 @@ import java.util.concurrent.atomic.AtomicInteger; onMediaItemChangedListener.onMediaItemChanged( editedMediaItems.get(currentMediaItemIndex), - currentAssetDurationUs, + /* durationUs= */ (trackType == C.TRACK_TYPE_AUDIO && isLooping && decodeAudio) + ? C.TIME_UNSET + : currentAssetDurationUs, /* decodedFormat= */ outputFormat, /* isLast= */ currentMediaItemIndex == editedMediaItems.size() - 1); } @@ -364,11 +367,11 @@ import java.util.concurrent.atomic.AtomicInteger; checkArgument( durationUs != C.TIME_UNSET || currentMediaItemIndex == editedMediaItems.size() - 1, "Could not retrieve required duration for EditedMediaItem " + currentMediaItemIndex); - durationUs = + currentAssetDurationAfterEffectsAppliedUs = editedMediaItems.get(currentMediaItemIndex).getDurationAfterEffectsApplied(durationUs); currentAssetDurationUs = durationUs; if (editedMediaItems.size() == 1 && !isLooping) { - sequenceAssetLoaderListener.onDurationUs(durationUs); + sequenceAssetLoaderListener.onDurationUs(currentAssetDurationAfterEffectsAppliedUs); } } @@ -528,7 +531,7 @@ import java.util.concurrent.atomic.AtomicInteger; return; } addCurrentProcessedInput(); - totalDurationUs += currentAssetDurationUs; + totalDurationUs += currentAssetDurationAfterEffectsAppliedUs; currentAssetLoader.release(); isCurrentAssetFirstAsset = false; currentMediaItemIndex++; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoFrameProcessingWrapper.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoFrameProcessingWrapper.java index 03309ec6df..493b2ef6aa 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoFrameProcessingWrapper.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoFrameProcessingWrapper.java @@ -60,6 +60,7 @@ import java.util.concurrent.atomic.AtomicLong; long durationUs, @Nullable Format decodedFormat, boolean isLast) { + durationUs = editedMediaItem.getDurationAfterEffectsApplied(durationUs); if (decodedFormat != null) { Size decodedSize = getDecodedSize(decodedFormat); videoFrameProcessor.registerInputStream( diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/AudioGraphInputTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/AudioGraphInputTest.java index 36c5e46c1e..f425b37d85 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/AudioGraphInputTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/AudioGraphInputTest.java @@ -18,7 +18,10 @@ package androidx.media3.transformer; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Util.getPcmFormat; +import static androidx.media3.transformer.TestUtil.createSpeedChangingAudioProcessor; import static com.google.common.truth.Truth.assertThat; +import static java.util.Collections.max; +import static java.util.Collections.min; import androidx.media3.common.C; import androidx.media3.common.Format; @@ -28,6 +31,7 @@ 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 com.google.common.collect.ImmutableList; import com.google.common.primitives.Bytes; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -40,6 +44,12 @@ import org.junit.runner.RunWith; public class AudioGraphInputTest { private static final EditedMediaItem FAKE_ITEM = new EditedMediaItem.Builder(MediaItem.EMPTY).build(); + private static final EditedMediaItem FAKE_ITEM_WITH_DOUBLE_SPEED = + new EditedMediaItem.Builder(MediaItem.EMPTY) + .setEffects( + new Effects( + ImmutableList.of(createSpeedChangingAudioProcessor(2)), ImmutableList.of())) + .build(); private static final AudioFormat MONO_44100 = new AudioFormat(/* sampleRate= */ 44_100, /* channelCount= */ 1, C.ENCODING_PCM_16BIT); private static final AudioFormat MONO_48000 = @@ -250,10 +260,10 @@ public class AudioGraphInputTest { /* editedMediaItem= */ FAKE_ITEM, /* inputFormat= */ getPcmFormat(STEREO_44100)); byte[] inputData = TestUtil.buildTestData(/* length= */ 100 * STEREO_44100.bytesPerFrame); - + // Pass in duration approximately equal to raw data duration ~ 100 / 44100 ~ 2267us. audioGraphInput.onMediaItemChanged( /* editedMediaItem= */ FAKE_ITEM, - /* durationUs= */ 1_000_000, + /* durationUs= */ 2267, /* decodedFormat= */ getPcmFormat(STEREO_44100), /* isLast= */ true); @@ -274,6 +284,90 @@ public class AudioGraphInputTest { assertThat(outputBytes).containsExactlyElementsIn(Bytes.asList(inputData)); } + @Test + public void getOutput_withNoEffects_returnsInputDataAndSilence() 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: 100 * STEREO_44100.bytesPerFrame bytes = 100 PCM samples. + // Audio duration is 100 / 44100 seconds ~ 2_268us. + DecoderInputBuffer inputBuffer = audioGraphInput.getInputBuffer(); + inputBuffer.ensureSpaceForWrite(inputData.length); + inputBuffer.data.put(inputData).flip(); + checkState(audioGraphInput.queueInputBuffer()); + + // Queue EOS. Input audio track ends before onMediaItemChanged durationUs = 1_000_000. + // AudioGraphInput will append generated silence up to target durationUs of 1s (~997_732us). + audioGraphInput.getInputBuffer().setFlags(C.BUFFER_FLAG_END_OF_STREAM); + checkState(audioGraphInput.queueInputBuffer()); + + List outputBytes = drainAudioGraphInputUntilEnded(audioGraphInput); + long expectedSampleCount = Util.durationUsToSampleCount(1_000_000, STEREO_44100.sampleRate); + // Silent audio generator rounds up duration. + assertThat(outputBytes.size()) + .isEqualTo((expectedSampleCount + 1) * STEREO_44100.bytesPerFrame); + assertThat(outputBytes.subList(0, inputData.length)) + .containsExactlyElementsIn(Bytes.asList(inputData)) + .inOrder(); + assertThat(min(outputBytes.subList(inputData.length, outputBytes.size()))).isEqualTo(0); + assertThat(max(outputBytes.subList(inputData.length, outputBytes.size()))).isEqualTo(0); + } + + @Test + public void getOutput_withEffects_returnsInputDataAndSilence() throws Exception { + AudioGraphInput audioGraphInput = + new AudioGraphInput( + /* requestedOutputAudioFormat= */ AudioFormat.NOT_SET, + /* editedMediaItem= */ FAKE_ITEM_WITH_DOUBLE_SPEED, + /* inputFormat= */ getPcmFormat(STEREO_44100)); + byte[] inputData = TestUtil.buildTestData(/* length= */ 4096 * STEREO_44100.bytesPerFrame); + + audioGraphInput.onMediaItemChanged( + /* editedMediaItem= */ FAKE_ITEM_WITH_DOUBLE_SPEED, + /* durationUs= */ 1_000_000, + /* decodedFormat= */ getPcmFormat(STEREO_44100), + /* isLast= */ true); + + // Force the media item change to be processed. + checkState(!audioGraphInput.getOutput().hasRemaining()); + + // Queue inputData: 4096 * STEREO_44100.bytesPerFrame bytes = 100 PCM samples. + // Audio duration is 4096 / 44100 seconds ~ 92_880us. + DecoderInputBuffer inputBuffer = audioGraphInput.getInputBuffer(); + inputBuffer.ensureSpaceForWrite(inputData.length); + inputBuffer.data.put(inputData).flip(); + checkState(audioGraphInput.queueInputBuffer()); + + // Queue EOS. Input audio track ends before onMediaItemChanged durationUs = 1_000_000. + // AudioGraphInput will append generated silence up to target durationUs of 1s (~907_120us). + audioGraphInput.getInputBuffer().setFlags(C.BUFFER_FLAG_END_OF_STREAM); + checkState(audioGraphInput.queueInputBuffer()); + + List outputBytes = drainAudioGraphInputUntilEnded(audioGraphInput); + long expectedSampleCount = Util.durationUsToSampleCount(500_000, STEREO_44100.sampleRate); + // Silent audio generator rounds up duration. + assertThat(outputBytes.size()) + .isEqualTo((expectedSampleCount + 1) * STEREO_44100.bytesPerFrame); + // Sonic takes a while to zero-out the input. + assertThat(min(outputBytes.subList(inputData.length * 6 / 10, outputBytes.size()))) + .isEqualTo(0); + assertThat(max(outputBytes.subList(inputData.length * 6 / 10, outputBytes.size()))) + .isEqualTo(0); + } + @Test public void getOutput_withSilentMediaItemChange_outputsCorrectAmountOfSilentBytes() throws Exception { @@ -294,6 +388,26 @@ public class AudioGraphInputTest { assertThat(bytesOutput).isEqualTo(expectedSampleCount * STEREO_44100.bytesPerFrame); } + @Test + public void getOutput_withSilentMediaItemAndEffectsChange_outputsCorrectAmountOfSilentBytes() + throws Exception { + AudioGraphInput audioGraphInput = + new AudioGraphInput( + /* requestedOutputAudioFormat= */ AudioFormat.NOT_SET, + /* editedMediaItem= */ FAKE_ITEM_WITH_DOUBLE_SPEED, + /* inputFormat= */ getPcmFormat(STEREO_44100)); + + audioGraphInput.onMediaItemChanged( + /* editedMediaItem= */ FAKE_ITEM_WITH_DOUBLE_SPEED, + /* durationUs= */ 1_000_000, + /* decodedFormat= */ null, + /* isLast= */ true); + + int bytesOutput = drainAudioGraphInputUntilEnded(audioGraphInput).size(); + long expectedSampleCount = Util.durationUsToSampleCount(500_000, STEREO_44100.sampleRate); + assertThat(bytesOutput).isEqualTo(expectedSampleCount * STEREO_44100.bytesPerFrame); + } + @Test public void getOutput_afterFlush_returnsEmptyBuffer() throws Exception { AudioGraphInput audioGraphInput = 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 e8147a22e3..8477c798fc 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java @@ -84,6 +84,12 @@ public final class TestUtil { return sonicAudioProcessor; } + public static SonicAudioProcessor createSpeedChangingAudioProcessor(float speed) { + SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor(); + sonicAudioProcessor.setSpeed(speed); + return sonicAudioProcessor; + } + public static ChannelMixingAudioProcessor createVolumeScalingAudioProcessor(float scale) { ChannelMixingAudioProcessor audioProcessor = new ChannelMixingAudioProcessor(); for (int channel = 1; channel <= 6; channel++) {