From e8ffc7b6f875c3a084baeb011de4ab52a522c19d Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 25 Jan 2023 17:50:36 +0000 Subject: [PATCH] Move removeAudio/Video to EditedMediaItem Also add a Builder to EditedMediaItem to avoid having a constructor with many optional parameters, or a chain of constructors. PiperOrigin-RevId: 504588544 --- .../demo/transformer/TransformerActivity.java | 13 +- .../TransformerAndroidTestRunner.java | 13 -- .../transformer/TransformerEndToEndTest.java | 15 ++- .../mh/ForceInterpretHdrVideoAsSdrTest.java | 11 +- .../media3/transformer/mh/HdrEditingTest.java | 29 ++-- .../transformer/mh/RepeatedTranscodeTest.java | 14 +- .../ToneMapHdrToSdrUsingMediaCodecTest.java | 16 ++- .../mh/ToneMapHdrToSdrUsingOpenGlTest.java | 11 +- .../transformer/mh/TranscodeQualityTest.java | 37 +++--- .../transformer/mh/TransformationTest.java | 45 +++++-- .../mh/analysis/BitrateAnalysisTest.java | 8 +- .../EncoderPerformanceAnalysisTest.java | 8 +- .../mh/analysis/SsimMapperTest.java | 8 +- .../media3/transformer/EditedMediaItem.java | 104 ++++++++++++--- .../media3/transformer/Transformer.java | 46 +++---- .../transformer/TransformerInternal.java | 6 +- .../EditedMediaItemBuilderTest.java | 41 ++++++ .../transformer/TransformerBuilderTest.java | 9 -- .../transformer/TransformerEndToEndTest.java | 125 +++++++++--------- 19 files changed, 365 insertions(+), 194 deletions(-) create mode 100644 libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java diff --git a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java index ceeb0e8f12..e2df0f4fd5 100644 --- a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java +++ b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java @@ -286,8 +286,6 @@ public final class TransformerActivity extends AppCompatActivity { transformerBuilder.setTransformationRequest(requestBuilder.build()); transformerBuilder - .setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO)) - .setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO)) .experimentalSetGenerateSilentAudio( bundle.getBoolean(ConfigurationActivity.GENERATE_SILENT_AUDIO)) .setEncoderFactory( @@ -345,14 +343,17 @@ public final class TransformerActivity extends AppCompatActivity { }) private EditedMediaItem createEditedMediaItem(MediaItem mediaItem, @Nullable Bundle bundle) throws PackageManager.NameNotFoundException { + EditedMediaItem.Builder editedMediaItemBuilder = new EditedMediaItem.Builder(mediaItem); if (bundle == null) { - return new EditedMediaItem(mediaItem); + return editedMediaItemBuilder.build(); } - ImmutableList audioProcessors = createAudioProcessorsFromBundle(bundle); ImmutableList videoEffects = createVideoEffectsFromBundle(bundle); - Effects effects = new Effects(audioProcessors, videoEffects); - return new EditedMediaItem(mediaItem, effects); + return editedMediaItemBuilder + .setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO)) + .setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO)) + .setEffects(new Effects(audioProcessors, videoEffects)) + .build(); } private ImmutableList createAudioProcessorsFromBundle(Bundle bundle) { diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerAndroidTestRunner.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerAndroidTestRunner.java index 744425d712..8194d8f235 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerAndroidTestRunner.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerAndroidTestRunner.java @@ -173,19 +173,6 @@ public class TransformerAndroidTestRunner { this.inputValues = inputValues; } - /** - * Transforms the {@link MediaItem}, saving a summary of the transformation to the application - * cache. - * - * @param testId A unique identifier for the transformer test run. - * @param mediaItem The {@link MediaItem} to transform. - * @return The {@link TransformationTestResult}. - * @throws Exception The cause of the transformation not completing. - */ - public TransformationTestResult run(String testId, MediaItem mediaItem) throws Exception { - return run(testId, new EditedMediaItem(mediaItem)); - } - /** * Transforms the {@link EditedMediaItem}, saving a summary of the transformation to the * application cache. diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java index f44e1e35ce..56c9ad09b2 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerEndToEndTest.java @@ -51,7 +51,8 @@ public class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)); ImmutableList videoEffects = ImmutableList.of(Presentation.createForHeight(480)); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); // Result of the following command: // ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4 int expectedFrameCount = 30; @@ -68,14 +69,14 @@ public class TransformerEndToEndTest { public void videoOnly_completesWithConsistentDuration() throws Exception { Transformer transformer = new Transformer.Builder(context) - .setRemoveAudio(true) .setEncoderFactory( new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build()) .build(); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)); ImmutableList videoEffects = ImmutableList.of(Presentation.createForHeight(480)); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).setEffects(effects).build(); long expectedDurationMs = 967; TransformationTestResult result = @@ -100,11 +101,12 @@ public class TransformerEndToEndTest { .setEndPositionMs(clippingEndMs) .build()) .build(); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); TransformationTestResult result = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(/* testId= */ "clippedMedia_completesWithClippedDuration", mediaItem); + .run(/* testId= */ "clippedMedia_completesWithClippedDuration", editedMediaItem); assertThat(result.transformationResult.durationMs).isAtMost(clippingEndMs - clippingStartMs); } @@ -114,6 +116,9 @@ public class TransformerEndToEndTest { Transformer transformer = new Transformer.Builder(context) .setEncoderFactory(new VideoUnsupportedEncoderFactory(context)) + .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING))) .setRemoveAudio(true) .build(); @@ -125,7 +130,7 @@ public class TransformerEndToEndTest { .build() .run( /* testId= */ "videoEncoderFormatUnsupported_completesWithError", - MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))); + editedMediaItem)); assertThat(exception).hasCauseThat().isInstanceOf(IllegalArgumentException.class); assertThat(exception.errorCode) diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java index 1ea8bfc16f..68c79d6cd5 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ForceInterpretHdrVideoAsSdrTest.java @@ -27,6 +27,7 @@ import androidx.media3.common.C; import androidx.media3.common.MediaItem; import androidx.media3.common.util.Log; import androidx.media3.transformer.AndroidTestUtil; +import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.TransformationException; import androidx.media3.transformer.TransformationRequest; import androidx.media3.transformer.TransformationTestResult; @@ -67,11 +68,14 @@ public class ForceInterpretHdrVideoAsSdrTest { TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR) .build()) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))); + .run(testId, editedMediaItem); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR); Log.i(TAG, "Transformed."); } catch (TransformationException exception) { @@ -103,11 +107,14 @@ public class ForceInterpretHdrVideoAsSdrTest { TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR) .build()) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))); + .run(testId, editedMediaItem); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR); Log.i(TAG, "Transformed."); } catch (TransformationException exception) { diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java index 912e36755a..2d9c079f69 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java @@ -74,12 +74,15 @@ public class HdrEditingTest { Context context = ApplicationProvider.getApplicationContext(); Transformer transformer = new Transformer.Builder(context).build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))); + .run(testId, editedMediaItem); Log.i(TAG, "Transformed."); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_ST2084); } catch (TransformationException exception) { @@ -96,12 +99,15 @@ public class HdrEditingTest { Context context = ApplicationProvider.getApplicationContext(); Transformer transformer = new Transformer.Builder(context).build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))); + .run(testId, editedMediaItem); Log.i(TAG, "Transformed."); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_HLG); } catch (TransformationException exception) { @@ -127,7 +133,8 @@ public class HdrEditingTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) @@ -151,7 +158,8 @@ public class HdrEditingTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) @@ -194,7 +202,8 @@ public class HdrEditingTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); try { TransformationTestResult transformationTestResult = @@ -249,7 +258,8 @@ public class HdrEditingTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); try { TransformationTestResult transformationTestResult = @@ -283,11 +293,12 @@ public class HdrEditingTest { } Transformer transformer = new Transformer.Builder(context).build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_1_SECOND_HDR10_VIDEO_SDR_CONTAINER)); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run( - testId, - MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_1_SECOND_HDR10_VIDEO_SDR_CONTAINER))); + .run(testId, editedMediaItem); } private static boolean deviceSupportsHdrEditing(String mimeType, ColorInfo colorInfo) { diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTest.java index 3ebb9aa1e6..3357064b3c 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/RepeatedTranscodeTest.java @@ -59,7 +59,8 @@ public final class RepeatedTranscodeTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); Set differentOutputSizesBytes = new HashSet<>(); for (int i = 0; i < TRANSCODE_COUNT; i++) { @@ -83,7 +84,6 @@ public final class RepeatedTranscodeTest { new TransformerAndroidTestRunner.Builder( context, new Transformer.Builder(context) - .setRemoveAudio(true) .setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context)) .build()) .build(); @@ -92,7 +92,8 @@ public final class RepeatedTranscodeTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).setEffects(effects).build(); Set differentOutputSizesBytes = new HashSet<>(); for (int i = 0; i < TRANSCODE_COUNT; i++) { @@ -117,11 +118,14 @@ public final class RepeatedTranscodeTest { new TransformerAndroidTestRunner.Builder( context, new Transformer.Builder(context) - .setRemoveVideo(true) .setTransformationRequest(new TransformationRequest.Builder().build()) .setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context)) .build()) .build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveVideo(true).build(); Set differentOutputSizesBytes = new HashSet<>(); for (int i = 0; i < TRANSCODE_COUNT; i++) { @@ -129,7 +133,7 @@ public final class RepeatedTranscodeTest { TransformationTestResult testResult = transformerRunner.run( /* testId= */ "repeatedTranscodeNoVideo_givesConsistentLengthOutput_" + i, - MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING))); + editedMediaItem); differentOutputSizesBytes.add(checkNotNull(testResult.transformationResult.fileSizeBytes)); } diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingMediaCodecTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingMediaCodecTest.java index 838970c0bf..923e0c3559 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingMediaCodecTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingMediaCodecTest.java @@ -75,12 +75,15 @@ public class ToneMapHdrToSdrUsingMediaCodecTest { } }) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))); + .run(testId, editedMediaItem); Log.i(TAG, "Tone mapped."); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR); } catch (TransformationException exception) { @@ -118,12 +121,15 @@ public class ToneMapHdrToSdrUsingMediaCodecTest { } }) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))); + .run(testId, editedMediaItem); Log.i(TAG, "Tone mapped."); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR); } catch (TransformationException exception) { @@ -165,7 +171,8 @@ public class ToneMapHdrToSdrUsingMediaCodecTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); try { TransformationTestResult transformationTestResult = @@ -213,7 +220,8 @@ public class ToneMapHdrToSdrUsingMediaCodecTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(180).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); try { TransformationTestResult transformationTestResult = diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlTest.java index 3acacc4fb7..8cc3dfd313 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ToneMapHdrToSdrUsingOpenGlTest.java @@ -32,6 +32,7 @@ import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.Log; import androidx.media3.common.util.Util; import androidx.media3.transformer.AndroidTestUtil; +import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.TransformationException; import androidx.media3.transformer.TransformationRequest; import androidx.media3.transformer.TransformationTestResult; @@ -85,11 +86,14 @@ public class ToneMapHdrToSdrUsingOpenGlTest { .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL) .build()) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10))); + .run(testId, editedMediaItem); Log.i(TAG, "Tone mapped."); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR); } catch (TransformationException exception) { @@ -135,11 +139,14 @@ public class ToneMapHdrToSdrUsingOpenGlTest { .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL) .build()) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))) + .build(); try { TransformationTestResult transformationTestResult = new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_4_SECOND_HDR10))); + .run(testId, editedMediaItem); Log.i(TAG, "Tone mapped."); assertFileHasColorTransfer(transformationTestResult.filePath, C.COLOR_TRANSFER_SDR); } catch (TransformationException exception) { diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TranscodeQualityTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TranscodeQualityTest.java index fce08f376e..30a7c1a2e0 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TranscodeQualityTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TranscodeQualityTest.java @@ -24,6 +24,7 @@ import androidx.media3.common.MediaItem; import androidx.media3.common.MimeTypes; import androidx.media3.transformer.AndroidTestUtil; import androidx.media3.transformer.DefaultEncoderFactory; +import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.TransformationRequest; import androidx.media3.transformer.TransformationTestResult; import androidx.media3.transformer.Transformer; @@ -62,17 +63,18 @@ public final class TranscodeQualityTest { .experimentalSetEnableHighQualityTargeting(true) .build()) .build()) - .setRemoveAudio(true) .build(); + MediaItem mediaItem = + MediaItem.fromUri( + Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); TransformationTestResult result = new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .build() - .run( - testId, - MediaItem.fromUri( - Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))); + .run(testId, editedMediaItem); if (result.ssim != TransformationTestResult.SSIM_UNSET) { assertThat(result.ssim).isGreaterThan(0.90); @@ -99,17 +101,18 @@ public final class TranscodeQualityTest { new Transformer.Builder(context) .setTransformationRequest( new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H265).build()) - .setRemoveAudio(true) .build(); + MediaItem mediaItem = + MediaItem.fromUri( + Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); TransformationTestResult result = new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .build() - .run( - testId, - MediaItem.fromUri( - Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))); + .run(testId, editedMediaItem); if (result.ssim != TransformationTestResult.SSIM_UNSET) { assertThat(result.ssim).isGreaterThan(0.90); @@ -129,19 +132,19 @@ public final class TranscodeQualityTest { .setTransformationRequest( new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H264).build()) .setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context)) - .setRemoveAudio(true) .build(); + MediaItem mediaItem = + MediaItem.fromUri( + Uri.parse( + AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); TransformationTestResult result = new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .build() - .run( - testId, - MediaItem.fromUri( - Uri.parse( - AndroidTestUtil - .MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))); + .run(testId, editedMediaItem); if (result.ssim != TransformationTestResult.SSIM_UNSET) { assertThat(result.ssim).isGreaterThan(0.90); diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java index e687c3d9d1..e9e98553e8 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformationTest.java @@ -59,10 +59,13 @@ public class TransformationTest { new Transformer.Builder(context) .setEncoderFactory(new ForceEncodeEncoderFactory(context)) .build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -70,10 +73,13 @@ public class TransformationTest { String testId = TAG + "_transformWithoutDecodeEncode"; Context context = ApplicationProvider.getApplicationContext(); Transformer transformer = new Transformer.Builder(context).build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); // No need to calculate SSIM because no decode/encoding, so input frames match output frames. new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -82,7 +88,6 @@ public class TransformationTest { Context context = ApplicationProvider.getApplicationContext(); Transformer transformer = new Transformer.Builder(context) - .setRemoveAudio(true) .setEncoderFactory( new ForceEncodeEncoderFactory( /* wrappedEncoderFactory= */ new DefaultEncoderFactory.Builder(context) @@ -90,10 +95,14 @@ public class TransformationTest { new VideoEncoderSettings.Builder().setBitrate(5_000_000).build()) .build())) .build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -113,11 +122,13 @@ public class TransformationTest { new Transformer.Builder(context) .setEncoderFactory(new ForceEncodeEncoderFactory(context)) .build(); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_REMOTE_4K60_PORTRAIT_URI_STRING)); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .setTimeoutSeconds(180) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_REMOTE_4K60_PORTRAIT_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -136,11 +147,14 @@ public class TransformationTest { new Transformer.Builder(context) .setEncoderFactory(new ForceEncodeEncoderFactory(context)) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_REMOTE_8K24_URI_STRING))) + .build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .setTimeoutSeconds(180) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_REMOTE_8K24_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -150,12 +164,15 @@ public class TransformationTest { Transformer transformer = new Transformer.Builder(context) .setEncoderFactory(new ForceEncodeEncoderFactory(context)) - .setRemoveAudio(true) .build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setRequestCalculateSsim(true) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -165,11 +182,14 @@ public class TransformationTest { Transformer transformer = new Transformer.Builder(context) .setEncoderFactory(new ForceEncodeEncoderFactory(context)) + .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING))) .setRemoveVideo(true) .build(); new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -188,9 +208,11 @@ public class TransformationTest { .setTransformationRequest( new TransformationRequest.Builder().setFlattenForSlowMotion(true).build()) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING))).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .build() - .run(testId, MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING))); + .run(testId, editedMediaItem); } @Test @@ -204,7 +226,8 @@ public class TransformationTest { ImmutableList videoEffects = ImmutableList.of(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build()); Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); new TransformerAndroidTestRunner.Builder(context, transformer) .build() diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/BitrateAnalysisTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/BitrateAnalysisTest.java index 14dc4d850d..9ffd8dd789 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/BitrateAnalysisTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/BitrateAnalysisTest.java @@ -42,6 +42,7 @@ import androidx.media3.common.MediaItem; import androidx.media3.common.util.Assertions; import androidx.media3.transformer.AndroidTestUtil; import androidx.media3.transformer.DefaultEncoderFactory; +import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.Transformer; import androidx.media3.transformer.TransformerAndroidTestRunner; import androidx.media3.transformer.VideoEncoderSettings; @@ -142,7 +143,6 @@ public class BitrateAnalysisTest { Transformer transformer = new Transformer.Builder(context) - .setRemoveAudio(true) .setEncoderFactory( new AndroidTestUtil.ForceEncodeEncoderFactory( /* wrappedEncoderFactory= */ new DefaultEncoderFactory.Builder(context) @@ -154,11 +154,15 @@ public class BitrateAnalysisTest { .setEnableFallback(false) .build())) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(fileUri))) + .setRemoveAudio(true) + .build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setInputValues(inputValues) .setRequestCalculateSsim(true) .build() - .run(testId, MediaItem.fromUri(Uri.parse(fileUri))); + .run(testId, editedMediaItem); } } diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/EncoderPerformanceAnalysisTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/EncoderPerformanceAnalysisTest.java index df7399c8b8..72acc68d02 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/EncoderPerformanceAnalysisTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/EncoderPerformanceAnalysisTest.java @@ -27,6 +27,7 @@ import androidx.media3.common.MediaItem; import androidx.media3.common.util.Util; import androidx.media3.transformer.AndroidTestUtil; import androidx.media3.transformer.DefaultEncoderFactory; +import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.Transformer; import androidx.media3.transformer.TransformerAndroidTestRunner; import androidx.media3.transformer.VideoEncoderSettings; @@ -118,7 +119,6 @@ public class EncoderPerformanceAnalysisTest { Transformer transformer = new Transformer.Builder(context) - .setRemoveAudio(true) .setEncoderFactory( new AndroidTestUtil.ForceEncodeEncoderFactory( /* wrappedEncoderFactory= */ new DefaultEncoderFactory.Builder(context) @@ -129,10 +129,14 @@ public class EncoderPerformanceAnalysisTest { .setEnableFallback(false) .build())) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(fileUri))) + .setRemoveAudio(true) + .build(); new TransformerAndroidTestRunner.Builder(context, transformer) .setInputValues(inputValues) .build() - .run(testId, MediaItem.fromUri(Uri.parse(fileUri))); + .run(testId, editedMediaItem); } } diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/SsimMapperTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/SsimMapperTest.java index ad770dec4d..2c9924d4d7 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/SsimMapperTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/analysis/SsimMapperTest.java @@ -55,6 +55,7 @@ import androidx.media3.common.MimeTypes; import androidx.media3.common.util.Util; import androidx.media3.transformer.AndroidTestUtil; import androidx.media3.transformer.DefaultEncoderFactory; +import androidx.media3.transformer.EditedMediaItem; import androidx.media3.transformer.TransformationRequest; import androidx.media3.transformer.Transformer; import androidx.media3.transformer.TransformerAndroidTestRunner; @@ -287,7 +288,6 @@ public class SsimMapperTest { Transformer transformer = new Transformer.Builder(context) - .setRemoveAudio(true) .setTransformationRequest( new TransformationRequest.Builder().setVideoMimeType(outputMimeType).build()) .setEncoderFactory( @@ -300,6 +300,10 @@ public class SsimMapperTest { .setEnableFallback(false) .build()) .build(); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(videoUri))) + .setRemoveAudio(true) + .build(); transformationsLeft--; @@ -308,7 +312,7 @@ public class SsimMapperTest { .setInputValues(inputValues) .setRequestCalculateSsim(true) .build() - .run(testId, MediaItem.fromUri(Uri.parse(videoUri))) + .run(testId, editedMediaItem) .ssim; checkState(ssim != SSIM_UNSET, "SSIM has not been calculated."); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java index 569790d2b9..b85ffd4a31 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java @@ -15,34 +15,106 @@ */ package androidx.media3.transformer; +import static androidx.media3.common.util.Assertions.checkState; + import androidx.media3.common.MediaItem; import androidx.media3.common.util.UnstableApi; import com.google.common.collect.ImmutableList; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** A {@link MediaItem} with the transformations to apply to it. */ @UnstableApi public class EditedMediaItem { - /* package */ final MediaItem mediaItem; - /* package */ final Effects effects; + /** A builder for {@link EditedMediaItem} instances. */ + public static final class Builder { - /** - * Creates an instance with no {@link Effects}. - * - * @param mediaItem The {@link MediaItem} to edit. - */ - public EditedMediaItem(MediaItem mediaItem) { - this(mediaItem, new Effects(ImmutableList.of(), ImmutableList.of())); + private final MediaItem mediaItem; + + private boolean removeAudio; + private boolean removeVideo; + private @MonotonicNonNull Effects effects; + + /** + * Creates an instance. + * + * @param mediaItem The {@link MediaItem} on which transformations are applied. + */ + public Builder(MediaItem mediaItem) { + this.mediaItem = mediaItem; + } + + /** + * Sets whether to remove the audio from the {@link MediaItem}. + * + *

The default value is {@code false}. + * + *

The audio and video cannot both be removed because the output would not contain any + * samples. + * + * @param removeAudio Whether to remove the audio. + * @return This builder. + */ + @CanIgnoreReturnValue + public Builder setRemoveAudio(boolean removeAudio) { + this.removeAudio = removeAudio; + return this; + } + + /** + * Sets whether to remove the video from the {@link MediaItem}. + * + *

The default value is {@code false}. + * + *

The audio and video cannot both be removed because the output would not contain any + * samples. + * + * @param removeVideo Whether to remove the video. + * @return This builder. + */ + @CanIgnoreReturnValue + public Builder setRemoveVideo(boolean removeVideo) { + this.removeVideo = removeVideo; + return this; + } + + /** + * Sets the {@link Effects} to apply to the {@link MediaItem}. + * + *

The default value is an empty {@link Effects} instance. + * + * @param effects The {@link Effects} to apply. + * @return This builder. + */ + @CanIgnoreReturnValue + public Builder setEffects(Effects effects) { + this.effects = effects; + return this; + } + + /** Builds an {@link EditedMediaItem} instance. */ + public EditedMediaItem build() { + if (effects == null) { + effects = + new Effects( + /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of()); + } + return new EditedMediaItem(mediaItem, removeAudio, removeVideo, effects); + } } - /** - * Creates an instance. - * - * @param mediaItem The {@link MediaItem} to edit. - * @param effects The {@link Effects} to apply to the {@code mediaItem}. - */ - public EditedMediaItem(MediaItem mediaItem, Effects effects) { + /* package */ final MediaItem mediaItem; + /* package */ final boolean removeAudio; + /* package */ final boolean removeVideo; + /* package */ final Effects effects; + + private EditedMediaItem( + MediaItem mediaItem, boolean removeAudio, boolean removeVideo, Effects effects) { + checkState(!removeAudio || !removeVideo, "Audio and video cannot both be removed"); this.mediaItem = mediaItem; + this.removeAudio = removeAudio; + this.removeVideo = removeVideo; this.effects = effects; } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index c2a605661d..2363920fe5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -175,34 +175,24 @@ public final class Transformer { } /** - * Sets whether to remove the audio from the output. - * - *

The default value is {@code false}. - * - *

The audio and video cannot both be removed because the output would not contain any - * samples. - * - * @param removeAudio Whether to remove the audio. - * @return This builder. + * @deprecated Use {@link EditedMediaItem.Builder#setRemoveAudio(boolean)} to remove the audio + * from the {@link EditedMediaItem} passed to {@link #startTransformation(EditedMediaItem, + * String)} or {@link #startTransformation(EditedMediaItem, ParcelFileDescriptor)} instead. */ @CanIgnoreReturnValue + @Deprecated public Builder setRemoveAudio(boolean removeAudio) { this.removeAudio = removeAudio; return this; } /** - * Sets whether to remove the video from the output. - * - *

The default value is {@code false}. - * - *

The audio and video cannot both be removed because the output would not contain any - * samples. - * - * @param removeVideo Whether to remove the video. - * @return This builder. + * @deprecated Use {@link EditedMediaItem.Builder#setRemoveVideo(boolean)} to remove the video + * from the {@link EditedMediaItem} passed to {@link #startTransformation(EditedMediaItem, + * String)} or {@link #startTransformation(EditedMediaItem, ParcelFileDescriptor)} instead. */ @CanIgnoreReturnValue + @Deprecated public Builder setRemoveVideo(boolean removeVideo) { this.removeVideo = removeVideo; return this; @@ -384,7 +374,9 @@ public final class Transformer { * *

This method is experimental and may be removed or changed without warning. * - *

To replace existing audio with silence, call {@link #setRemoveAudio(boolean)} as well. + *

To replace existing audio with silence, {@linkplain + * EditedMediaItem.Builder#setRemoveAudio(boolean) remove the audio} from the {@link + * EditedMediaItem} to transform. * *

Audio properties/format: * @@ -721,8 +713,11 @@ public final class Transformer { @Deprecated public void startTransformation(MediaItem mediaItem, String path) { EditedMediaItem editedMediaItem = - new EditedMediaItem( - mediaItem, new Effects(audioProcessors, videoEffects, frameProcessorFactory)); + new EditedMediaItem.Builder(mediaItem) + .setRemoveAudio(removeAudio) + .setRemoveVideo(removeVideo) + .setEffects(new Effects(audioProcessors, videoEffects, frameProcessorFactory)) + .build(); startTransformationInternal(editedMediaItem, path, /* parcelFileDescriptor= */ null); } @@ -733,8 +728,11 @@ public final class Transformer { @RequiresApi(26) public void startTransformation(MediaItem mediaItem, ParcelFileDescriptor parcelFileDescriptor) { EditedMediaItem editedMediaItem = - new EditedMediaItem( - mediaItem, new Effects(audioProcessors, videoEffects, frameProcessorFactory)); + new EditedMediaItem.Builder(mediaItem) + .setRemoveAudio(removeAudio) + .setRemoveVideo(removeVideo) + .setEffects(new Effects(audioProcessors, videoEffects, frameProcessorFactory)) + .build(); startTransformationInternal(editedMediaItem, /* path= */ null, parcelFileDescriptor); } @@ -765,8 +763,6 @@ public final class Transformer { path, parcelFileDescriptor, transformationRequest, - removeAudio, - removeVideo, generateSilentAudio, assetLoaderFactory, encoderFactory, diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java index 029682adaa..137e1901a5 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -118,8 +118,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Nullable String outputPath, @Nullable ParcelFileDescriptor outputParcelFileDescriptor, TransformationRequest transformationRequest, - boolean removeAudio, - boolean removeVideo, boolean generateSilentAudio, AssetLoader.Factory assetLoaderFactory, Codec.EncoderFactory encoderFactory, @@ -144,8 +142,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ComponentListener componentListener = new ComponentListener(mediaItem, fallbackListener); assetLoader = assetLoaderFactory - .setRemoveAudio(removeAudio) - .setRemoveVideo(removeVideo) + .setRemoveAudio(editedMediaItem.removeAudio) + .setRemoveVideo(editedMediaItem.removeVideo) .setFlattenVideoForSlowMotion(transformationRequest.flattenForSlowMotion) .createAssetLoader(mediaItem, internalLooper, componentListener); effects = editedMediaItem.effects; diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java new file mode 100644 index 0000000000..381d15415d --- /dev/null +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java @@ -0,0 +1,41 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.media3.transformer; + +import static org.junit.Assert.assertThrows; + +import androidx.media3.common.MediaItem; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit test for {@link EditedMediaItem.Builder}. */ +@RunWith(AndroidJUnit4.class) +public final class EditedMediaItemBuilderTest { + + @Test + public void build_removeAudioAndVideo_throws() { + MediaItem mediaItem = MediaItem.fromUri("uri"); + + assertThrows( + IllegalStateException.class, + () -> + new EditedMediaItem.Builder(mediaItem) + .setRemoveAudio(true) + .setRemoveVideo(true) + .build()); + } +} diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerBuilderTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerBuilderTest.java index 1bded4adf8..55a8a92e4f 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerBuilderTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerBuilderTest.java @@ -29,15 +29,6 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class TransformerBuilderTest { - @Test - public void build_removeAudioAndVideo_throws() { - Context context = ApplicationProvider.getApplicationContext(); - - assertThrows( - IllegalStateException.class, - () -> new Transformer.Builder(context).setRemoveAudio(true).setRemoveVideo(true).build()); - } - @Test public void build_withUnsupportedAudioMimeType_throws() { Context context = ApplicationProvider.getApplicationContext(); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerEndToEndTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerEndToEndTest.java index 9826241a2c..01dfbc408b 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerEndToEndTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerEndToEndTest.java @@ -131,7 +131,7 @@ public final class TransformerEndToEndTest { public void startTransformation_videoOnlyPassthrough_completesSuccessfully() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -142,9 +142,8 @@ public final class TransformerEndToEndTest { @Test public void startTransformation_audioOnlyPassthrough_completesSuccessfully() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem( - MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -162,9 +161,8 @@ public final class TransformerEndToEndTest { .setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer .build()) .build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem( - MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -177,7 +175,7 @@ public final class TransformerEndToEndTest { public void startTransformation_audioAndVideo_completesSuccessfully() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -199,7 +197,7 @@ public final class TransformerEndToEndTest { .setStartsAtKeyFrame(true) .build()) .build(); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -218,7 +216,8 @@ public final class TransformerEndToEndTest { new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build()) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES)) + .build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -231,7 +230,7 @@ public final class TransformerEndToEndTest { throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); // Transform first media item. transformer.startTransformation(editedMediaItem, outputPath); @@ -249,7 +248,7 @@ public final class TransformerEndToEndTest { public void startTransformation_concurrentTransformations_throwsError() { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); transformer.startTransformation(editedMediaItem, outputPath); @@ -260,10 +259,11 @@ public final class TransformerEndToEndTest { @Test public void startTransformation_removeAudio_completesSuccessfully() throws Exception { - Transformer transformer = - createTransformerBuilder(/* enableFallback= */ false).setRemoveAudio(true).build(); + Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) + .setRemoveAudio(true) + .build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -274,10 +274,11 @@ public final class TransformerEndToEndTest { @Test public void startTransformation_removeVideo_completesSuccessfully() throws Exception { - Transformer transformer = - createTransformerBuilder(/* enableFallback= */ false).setRemoveVideo(true).build(); + Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) + .setRemoveVideo(true) + .build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -292,9 +293,8 @@ public final class TransformerEndToEndTest { createTransformerBuilder(/* enableFallback= */ false) .experimentalSetGenerateSilentAudio(true) .build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem( - MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -310,7 +310,7 @@ public final class TransformerEndToEndTest { .experimentalSetGenerateSilentAudio(true) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -323,10 +323,11 @@ public final class TransformerEndToEndTest { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false) .experimentalSetGenerateSilentAudio(true) - .setRemoveAudio(true) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) + .setRemoveAudio(true) + .build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -340,10 +341,11 @@ public final class TransformerEndToEndTest { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false) .experimentalSetGenerateSilentAudio(true) - .setRemoveVideo(true) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)) + .setRemoveVideo(true) + .build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -358,7 +360,7 @@ public final class TransformerEndToEndTest { .experimentalSetGenerateSilentAudio(true) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -375,7 +377,8 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); ImmutableList audioProcessors = ImmutableList.of(sonicAudioProcessor); Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of()); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -396,7 +399,7 @@ public final class TransformerEndToEndTest { .addListener(mockListener3) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -419,9 +422,8 @@ public final class TransformerEndToEndTest { .setTransformationRequest( // Request transcoding so that decoder is used. new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build()) .build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem( - MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationException exception = @@ -451,8 +453,8 @@ public final class TransformerEndToEndTest { .addListener(mockListener2) .addListener(mockListener3) .build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -488,7 +490,7 @@ public final class TransformerEndToEndTest { .build(); Transformer transformer2 = transformer1.buildUpon().removeListener(mockListener2).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer2.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer2); @@ -506,7 +508,8 @@ public final class TransformerEndToEndTest { new TransformationRequest.Builder().setFlattenForSlowMotion(true).build()) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION)) + .build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -518,7 +521,7 @@ public final class TransformerEndToEndTest { public void startTransformation_completesWithValidBitrate() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationResult result = TransformerTestRunner.runLooper(transformer); @@ -537,8 +540,8 @@ public final class TransformerEndToEndTest { MimeTypes.AUDIO_AMR_NB) // unsupported by encoder, supported by muxer .build()) .build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationException exception = @@ -558,9 +561,8 @@ public final class TransformerEndToEndTest { .setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer .build()) .build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem( - MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationException exception = @@ -575,7 +577,7 @@ public final class TransformerEndToEndTest { public void startTransformation_withIoError_completesWithError() { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri("asset:///non-existing-path.mp4")); + new EditedMediaItem.Builder(MediaItem.fromUri("asset:///non-existing-path.mp4")).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationException exception = @@ -596,8 +598,8 @@ public final class TransformerEndToEndTest { new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build(); Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).addListener(mockListener).build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -621,8 +623,8 @@ public final class TransformerEndToEndTest { new TransformationRequest.Builder().setAudioMimeType(MimeTypes.AUDIO_AAC).build(); Transformer transformer = createTransformerBuilder(/* enableFallback= */ true).addListener(mockListener).build(); - EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER)); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); + EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -651,7 +653,7 @@ public final class TransformerEndToEndTest { .setMuxerFactory(muxerFactory) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationException exception = @@ -668,7 +670,7 @@ public final class TransformerEndToEndTest { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).setMuxerFactory(muxerFactory).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -680,7 +682,7 @@ public final class TransformerEndToEndTest { public void startTransformation_afterCancellation_completesSuccessfully() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); transformer.cancel(); @@ -702,7 +704,7 @@ public final class TransformerEndToEndTest { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).setLooper(looper).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); AtomicReference exception = new AtomicReference<>(); CountDownLatch countDownLatch = new CountDownLatch(1); @@ -728,7 +730,7 @@ public final class TransformerEndToEndTest { public void startTransformation_fromWrongThread_throwsError() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); HandlerThread anotherThread = new HandlerThread("AnotherThread"); AtomicReference illegalStateException = new AtomicReference<>(); CountDownLatch countDownLatch = new CountDownLatch(1); @@ -760,7 +762,7 @@ public final class TransformerEndToEndTest { new FakeAssetLoader.Factory(SUPPORTED_OUTPUT_TYPE_DECODED, sampleConsumerRef)) .build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)).build(); transformer.startTransformation(editedMediaItem, outputPath); runLooperUntil(transformer.getApplicationLooper(), () -> sampleConsumerRef.get() != null); @@ -779,7 +781,8 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); ImmutableList audioProcessors = ImmutableList.of(new SonicAudioProcessor()); Effects effects = new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of()); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformationException transformationException = @@ -799,7 +802,8 @@ public final class TransformerEndToEndTest { Presentation.createForHeight(mediaItemHeightPixels), new ScaleToFitTransformation.Builder().build()); Effects effects = new Effects(ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = new EditedMediaItem(mediaItem, effects); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -812,7 +816,7 @@ public final class TransformerEndToEndTest { public void getProgress_knownDuration_returnsConsistentStates() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); AtomicInteger previousProgressState = new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY); AtomicBoolean foundInconsistentState = new AtomicBoolean(); @@ -859,7 +863,7 @@ public final class TransformerEndToEndTest { public void getProgress_knownDuration_givesIncreasingPercentages() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); List progresses = new ArrayList<>(); Handler progressHandler = new Handler(Looper.myLooper()) { @@ -895,7 +899,7 @@ public final class TransformerEndToEndTest { public void getProgress_noCurrentTransformation_returnsNoTransformation() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); @Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder); transformer.startTransformation(editedMediaItem, outputPath); @@ -910,7 +914,8 @@ public final class TransformerEndToEndTest { public void getProgress_unknownDuration_returnsConsistentStates() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_UNKNOWN_DURATION)) + .build(); AtomicInteger previousProgressState = new AtomicInteger(PROGRESS_STATE_WAITING_FOR_AVAILABILITY); AtomicBoolean foundInconsistentState = new AtomicBoolean(); @@ -978,7 +983,7 @@ public final class TransformerEndToEndTest { public void cancel_afterCompletion_doesNotThrow() throws Exception { Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); EditedMediaItem editedMediaItem = - new EditedMediaItem(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)); + new EditedMediaItem.Builder(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY)).build(); transformer.startTransformation(editedMediaItem, outputPath); TransformerTestRunner.runLooper(transformer);