From 73790cf2a46df5c25be909040a73d994d11d222f Mon Sep 17 00:00:00 2001 From: claincly Date: Mon, 21 Oct 2024 06:56:31 -0700 Subject: [PATCH] Don't optimize for trim if the media is not clipped PiperOrigin-RevId: 688120868 --- .../media3/transformer/Transformer.java | 26 ++++++++-- .../transformer/MediaItemExportTest.java | 48 ++----------------- 2 files changed, 26 insertions(+), 48 deletions(-) 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 62c2585396..0fa03e6a37 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -1084,7 +1084,9 @@ public final class Transformer { public void start(Composition composition, String path) { verifyApplicationThread(); initialize(composition, path); - if (!trimOptimizationEnabled || isMultiAsset()) { + if (shouldOptimizeForTrimming()) { + processMediaBeforeFirstSyncSampleAfterTrimStartTime(); + } else { startInternal( composition, new MuxerWrapper( @@ -1098,8 +1100,6 @@ public final class Transformer { componentListener, /* initialTimestampOffsetUs= */ 0, /* useDefaultAssetLoaderFactory= */ false); - } else { - processMediaBeforeFirstSyncSampleAfterTrimStartTime(); } } @@ -1225,6 +1225,26 @@ public final class Transformer { : transformerInternal.getProgress(progressHolder); } + private boolean shouldOptimizeForTrimming() { + if (isMultiAsset()) { + return false; + } + + MediaItem.ClippingConfiguration clippingConfiguration = + checkNotNull(composition) + .sequences + .get(0) + .editedMediaItems + .get(0) + .mediaItem + .clippingConfiguration; + if (clippingConfiguration.equals(MediaItem.ClippingConfiguration.UNSET)) { + return false; + } + + return trimOptimizationEnabled; + } + private boolean isExportResumed() { return transformerState == TRANSFORMER_STATE_REMUX_PROCESSED_VIDEO || transformerState == TRANSFORMER_STATE_PROCESS_REMAINING_VIDEO diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java index 57797879e9..96fac1b45d 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java @@ -23,6 +23,7 @@ import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_NA; import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_TRANSMUXED; import static androidx.media3.transformer.ExportResult.OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM; import static androidx.media3.transformer.ExportResult.OPTIMIZATION_FAILED_EXTRACTION_FAILED; +import static androidx.media3.transformer.ExportResult.OPTIMIZATION_NONE; import static androidx.media3.transformer.TestUtil.ASSET_URI_PREFIX; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_NB; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_WB; @@ -216,7 +217,7 @@ public final class MediaItemExportTest { } @Test - public void start_trimOptimizationEnabled_clippingConfigurationUnset_outputMatchesOriginal() + public void start_trimOptimizationEnabled_clippingConfigurationUnset_doesNotOptimize() throws Exception { CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ false); Transformer transformer = @@ -231,50 +232,7 @@ public final class MediaItemExportTest { transformer.start(mediaItem, outputDir.newFile().getPath()); ExportResult result = TransformerTestRunner.runLooper(transformer); - assertThat(result.optimizationResult) - .isEqualTo(OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM); - // Asserts against file generated when experimentalSetTrimOptimizationEnabled is set to false. - DumpFileAsserts.assertOutput( - context, - muxerFactory.getCreatedMuxer(), - getDumpFileName(/* originalFileName= */ FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S)); - assertThat(result.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); - assertThat(result.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); - } - - @Test - public void - start_trimOptimizationEnabled_clippingConfigurationUnsetAndRotated_outputMatchesOriginalRotated() - throws Exception { - CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ false); - - Transformer transformer = - createTransformerBuilder(muxerFactory, /* enableFallback= */ false) - .experimentalSetTrimOptimizationEnabled(true) - .build(); - MediaItem mediaItem = - new MediaItem.Builder() - .setUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S) - .build(); - ImmutableList videoEffects = - ImmutableList.of( - new ScaleAndRotateTransformation.Builder().setRotationDegrees(180).build()); - Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects); - EditedMediaItem editedMediaItem = - new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); - - transformer.start(editedMediaItem, outputDir.newFile().getPath()); - ExportResult exportResult = TransformerTestRunner.runLooper(transformer); - - assertThat(exportResult.optimizationResult) - .isEqualTo(OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM); - // Asserts against file generated when experimentalSetTrimOptimizationEnabled is set to false. - DumpFileAsserts.assertOutput( - context, - muxerFactory.getCreatedMuxer(), - getDumpFileName( - /* originalFileName= */ FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S, - /* modifications...= */ "rotated")); + assertThat(result.optimizationResult).isEqualTo(OPTIMIZATION_NONE); } @Test