diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerGapsTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerGapsTest.java index 7c4f9918c3..235047a9c8 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerGapsTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerGapsTest.java @@ -135,29 +135,6 @@ public class TransformerGapsTest { .isEqualTo(2 * MP4_ASSET.videoFrameCount + expectedBlankFrames); } - // TODO: b/391111085 - Change test when gaps at the start of the sequence are supported. - @Test - public void export_withTwoVideoOnlyMediaItemsAndGapAtStart_throws() { - Transformer transformer = new Transformer.Builder(context).build(); - Composition composition = - new Composition.Builder( - new EditedMediaItemSequence.Builder() - .addGap(/* durationUs= */ 1_000_000) - .addItem(VIDEO_ONLY_MEDIA_ITEM) - .addItem(VIDEO_ONLY_MEDIA_ITEM) - .build()) - .build(); - TransformerAndroidTestRunner transformerAndroidTestRunner = - new TransformerAndroidTestRunner.Builder(context, transformer).build(); - - // An IllegalStateException is thrown instead of an ExportException because the exception is - // thrown very early in the setup phase and its not caught. - // TODO: b/391111085 - Throw exception when the sequence without force audio/video flag is - // built. - assertThrows( - IllegalStateException.class, () -> transformerAndroidTestRunner.run(testId, composition)); - } - @Test public void export_withTwoVideoOnlyMediaItemsAndGapInMiddle_insertsBlankFramesForGap() throws Exception { @@ -224,27 +201,15 @@ public class TransformerGapsTest { .isEqualTo(2 * MP4_ASSET.videoFrameCount + expectedBlankFrames); } - // TODO: b/391111085 - Change test when gaps at the start of the sequence are supported. @Test - public void export_withTwoMediaItemsAndGapAtStart_throws() { - Transformer transformer = new Transformer.Builder(context).build(); - Composition composition = - new Composition.Builder( - new EditedMediaItemSequence.Builder() - .addGap(/* durationUs= */ 1_000_000) - .addItem(AUDIO_VIDEO_MEDIA_ITEM) - .addItem(AUDIO_VIDEO_MEDIA_ITEM) - .build()) - .build(); - TransformerAndroidTestRunner transformerAndroidTestRunner = - new TransformerAndroidTestRunner.Builder(context, transformer).build(); + public void buildSequence_withTwoMediaItemsAndGapAtStart_throws() { + EditedMediaItemSequence.Builder sequenceBuilder = + new EditedMediaItemSequence.Builder() + .addGap(/* durationUs= */ 1_000_000) + .addItem(AUDIO_VIDEO_MEDIA_ITEM) + .addItem(AUDIO_VIDEO_MEDIA_ITEM); - // An IllegalStateException is thrown instead of an ExportException because the exception is - // thrown very early in the setup phase and its not caught. - // TODO: b/391111085 - Throw exception when the sequence without force audio/video flag is - // built. - assertThrows( - IllegalStateException.class, () -> transformerAndroidTestRunner.run(testId, composition)); + assertThrows(IllegalArgumentException.class, sequenceBuilder::build); } @Test diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java index ffa9d7819d..02b9bf405b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItemSequence.java @@ -98,6 +98,9 @@ public final class EditedMediaItemSequence { * *

A gap is a period of time with no media. * + *

If the gap is at the start of the sequence then {@linkplain #setForceAudioTrack(boolean) + * force audio track} flag must be set to force silent audio. + * *

Gaps at the start of the sequence are not supported if the sequence has video. * * @param durationUs The duration of the gap, in milliseconds. @@ -230,6 +233,9 @@ public final class EditedMediaItemSequence { this.editedMediaItems = builder.items.build(); checkArgument( !editedMediaItems.isEmpty(), "The sequence must contain at least one EditedMediaItem."); + checkArgument( + !editedMediaItems.get(0).isGap() || builder.forceAudioTrack, + "If the first item in the sequence is a Gap, then forceAudioTrack flag must be set"); this.isLooping = builder.isLooping; this.forceAudioTrack = builder.forceAudioTrack; }