Commit c5c171be by kimvde Committed by Andrew Lewis

Add unit tests for audio track dis(appearing) during export

PiperOrigin-RevId: 511764841
parent 4c9b8cb6
...@@ -47,7 +47,6 @@ import com.google.android.exoplayer2.C; ...@@ -47,7 +47,6 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor;
import com.google.android.exoplayer2.audio.SonicAudioProcessor; import com.google.android.exoplayer2.audio.SonicAudioProcessor;
import com.google.android.exoplayer2.effect.Presentation; import com.google.android.exoplayer2.effect.Presentation;
import com.google.android.exoplayer2.effect.ScaleAndRotateTransformation; import com.google.android.exoplayer2.effect.ScaleAndRotateTransformation;
...@@ -397,8 +396,7 @@ public final class TransformerEndToEndTest { ...@@ -397,8 +396,7 @@ public final class TransformerEndToEndTest {
public void start_concatenateMediaItemsWithSameFormat_completesSuccessfully() throws Exception { public void start_concatenateMediaItemsWithSameFormat_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
new EditedMediaItem.Builder(mediaItem).setEffects(Effects.EMPTY).build();
EditedMediaItemSequence editedMediaItemSequence = EditedMediaItemSequence editedMediaItemSequence =
new EditedMediaItemSequence(ImmutableList.of(editedMediaItem, editedMediaItem)); new EditedMediaItemSequence(ImmutableList.of(editedMediaItem, editedMediaItem));
Composition composition = Composition composition =
...@@ -419,14 +417,15 @@ public final class TransformerEndToEndTest { ...@@ -419,14 +417,15 @@ public final class TransformerEndToEndTest {
throws Exception { throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
AudioProcessor audioProcessor = new SilenceSkippingAudioProcessor(); SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setPitch(2f);
Effects effects = Effects effects =
new Effects(ImmutableList.of(audioProcessor), /* videoEffects= */ ImmutableList.of()); new Effects(ImmutableList.of(sonicAudioProcessor), /* videoEffects= */ ImmutableList.of());
// The video track must be removed in order for the export to end. Indeed, the // The video track must be removed in order for the export to end. Indeed, the
// Robolectric decoder just copies the input buffers to the output and the audio timestamps are // Robolectric decoder just copies the input buffers to the output and the audio timestamps are
// therefore computed based on the encoded samples. As a result, the audio timestamps are much // therefore computed based on the encoded samples (see [internal: b/178685617]). As a result,
// smaller than they should be and the muxer waits for more audio samples before writing video // the audio timestamps are much smaller than they should be and the muxer waits for more audio
// samples. // samples before writing video samples.
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).setRemoveVideo(true).build(); new EditedMediaItem.Builder(mediaItem).setEffects(effects).setRemoveVideo(true).build();
EditedMediaItemSequence editedMediaItemSequence = EditedMediaItemSequence editedMediaItemSequence =
...@@ -438,7 +437,58 @@ public final class TransformerEndToEndTest { ...@@ -438,7 +437,58 @@ public final class TransformerEndToEndTest {
TransformerTestRunner.runLooper(transformer); TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".silence_skipped_concatenated")); context,
testMuxer,
getDumpFileName(FILE_AUDIO_VIDEO + ".concatenated_with_high_pitch_and_no_video"));
}
@Test
public void start_concatenateSilenceAndAudio_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
EditedMediaItem noAudioEditedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
EditedMediaItem audioEditedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence(ImmutableList.of(noAudioEditedMediaItem, audioEditedMediaItem));
Composition composition =
new Composition.Builder(ImmutableList.of(sequence))
.experimentalSetForceAudioTrack(true)
.setTransmuxVideo(true)
.build();
transformer.start(composition, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".silence_then_audio"));
}
@Test
public void start_concatenateSilenceAndAudioWithEffects_completesSuccessfully() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setPitch(2f);
Effects effects =
new Effects(ImmutableList.of(sonicAudioProcessor), /* videoEffects= */ ImmutableList.of());
EditedMediaItem noAudioEditedMediaItem =
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).setEffects(effects).build();
EditedMediaItem audioEditedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
EditedMediaItemSequence sequence =
new EditedMediaItemSequence(ImmutableList.of(noAudioEditedMediaItem, audioEditedMediaItem));
Composition composition =
new Composition.Builder(ImmutableList.of(sequence))
.experimentalSetForceAudioTrack(true)
.setTransmuxVideo(true)
.build();
transformer.start(composition, outputPath);
TransformerTestRunner.runLooper(transformer);
DumpFileAsserts.assertOutput(
context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".silence_then_audio_with_effects"));
} }
@Test @Test
...@@ -469,9 +519,10 @@ public final class TransformerEndToEndTest { ...@@ -469,9 +519,10 @@ public final class TransformerEndToEndTest {
public void start_multipleMediaItemsWithEffectsAndTransmux_ignoresTransmux() throws Exception { public void start_multipleMediaItemsWithEffectsAndTransmux_ignoresTransmux() throws Exception {
Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build();
MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO);
AudioProcessor audioProcessor = new SilenceSkippingAudioProcessor(); SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();
sonicAudioProcessor.setPitch(2f);
Effects effects = Effects effects =
new Effects(ImmutableList.of(audioProcessor), /* videoEffects= */ ImmutableList.of()); new Effects(ImmutableList.of(sonicAudioProcessor), /* videoEffects= */ ImmutableList.of());
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).setRemoveVideo(true).build(); new EditedMediaItem.Builder(mediaItem).setEffects(effects).setRemoveVideo(true).build();
EditedMediaItemSequence editedMediaItemSequence = EditedMediaItemSequence editedMediaItemSequence =
...@@ -489,7 +540,9 @@ public final class TransformerEndToEndTest { ...@@ -489,7 +540,9 @@ public final class TransformerEndToEndTest {
// audio effects have been added to the first MediaItem in the sequence, so the transcoding // audio effects have been added to the first MediaItem in the sequence, so the transcoding
// audio sample pipeline should be picked to apply these effects. // audio sample pipeline should be picked to apply these effects.
DumpFileAsserts.assertOutput( DumpFileAsserts.assertOutput(
context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".silence_skipped_concatenated")); context,
testMuxer,
getDumpFileName(FILE_AUDIO_VIDEO + ".concatenated_with_high_pitch_and_no_video"));
} }
@Test @Test
......
format 0:
sampleMimeType = audio/mp4a-latm
channelCount = 1
sampleRate = 44100
pcmEncoding = 2
sample:
trackIndex = 0
dataHashCode = 915609509
size = 792
isKeyFrame = true
presentationTimeUs = 0
sample:
trackIndex = 0
dataHashCode = -1580893866
size = 678
isKeyFrame = true
presentationTimeUs = 8980
sample:
trackIndex = 0
dataHashCode = -31547651
size = 304
isKeyFrame = true
presentationTimeUs = 16667
sample:
trackIndex = 0
dataHashCode = 1415140636
size = 460
isKeyFrame = true
presentationTimeUs = 20114
sample:
trackIndex = 0
dataHashCode = 1721060815
size = 850
isKeyFrame = true
presentationTimeUs = 25329
sample:
trackIndex = 0
dataHashCode = 1707913464
size = 446
isKeyFrame = true
presentationTimeUs = 34966
sample:
trackIndex = 0
dataHashCode = -776771764
size = 852
isKeyFrame = true
presentationTimeUs = 40023
sample:
trackIndex = 0
dataHashCode = -609146892
size = 368
isKeyFrame = true
presentationTimeUs = 49683
sample:
trackIndex = 0
dataHashCode = -2044977387
size = 1166
isKeyFrame = true
presentationTimeUs = 53855
sample:
trackIndex = 0
dataHashCode = -753877175
size = 506
isKeyFrame = true
presentationTimeUs = 67075
sample:
trackIndex = 0
dataHashCode = 1491046836
size = 578
isKeyFrame = true
presentationTimeUs = 72812
sample:
trackIndex = 0
dataHashCode = 621394572
size = 668
isKeyFrame = true
presentationTimeUs = 79366
sample:
trackIndex = 0
dataHashCode = -58393202
size = 268
isKeyFrame = true
presentationTimeUs = 86939
sample:
trackIndex = 0
dataHashCode = 1253593269
size = 318
isKeyFrame = true
presentationTimeUs = 89978
sample:
trackIndex = 0
dataHashCode = -1544714160
size = 424
isKeyFrame = true
presentationTimeUs = 93583
sample:
trackIndex = 0
dataHashCode = -2038565545
size = 294
isKeyFrame = true
presentationTimeUs = 98391
sample:
trackIndex = 0
dataHashCode = 803611858
size = 394
isKeyFrame = true
presentationTimeUs = 101724
sample:
trackIndex = 0
dataHashCode = 890682839
size = 812
isKeyFrame = true
presentationTimeUs = 106191
sample:
trackIndex = 0
dataHashCode = 1798765816
size = 332
isKeyFrame = true
presentationTimeUs = 115397
sample:
trackIndex = 0
dataHashCode = -155329417
size = 250
isKeyFrame = true
presentationTimeUs = 119161
sample:
trackIndex = 0
dataHashCode = 2061435630
size = 304
isKeyFrame = true
presentationTimeUs = 121996
sample:
trackIndex = 0
dataHashCode = -667770092
size = 1318
isKeyFrame = true
presentationTimeUs = 125443
sample:
trackIndex = 0
dataHashCode = 1947321516
size = 224
isKeyFrame = true
presentationTimeUs = 140386
sample:
trackIndex = 0
dataHashCode = 1744495738
size = 446
isKeyFrame = true
presentationTimeUs = 142926
sample:
trackIndex = 0
dataHashCode = 801488010
size = 838
isKeyFrame = true
presentationTimeUs = 147982
sample:
trackIndex = 0
dataHashCode = -867204691
size = 520
isKeyFrame = true
presentationTimeUs = 157483
sample:
trackIndex = 0
dataHashCode = 1994555264
size = 230
isKeyFrame = true
presentationTimeUs = 163379
sample:
trackIndex = 0
dataHashCode = -748724753
size = 380
isKeyFrame = true
presentationTimeUs = 165987
sample:
trackIndex = 0
dataHashCode = -1557661843
size = 692
isKeyFrame = true
presentationTimeUs = 170295
sample:
trackIndex = 0
dataHashCode = 461522726
size = 270
isKeyFrame = true
presentationTimeUs = 178141
sample:
trackIndex = 0
dataHashCode = 1058760091
size = 238
isKeyFrame = true
presentationTimeUs = 181202
sample:
trackIndex = 0
dataHashCode = 1541647596
size = 722
isKeyFrame = true
presentationTimeUs = 183901
sample:
trackIndex = 0
dataHashCode = -2107816707
size = 2062
isKeyFrame = true
presentationTimeUs = 192087
released = true
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment