Don't optimize for trim if the media is not clipped

PiperOrigin-RevId: 688120868
This commit is contained in:
claincly 2024-10-21 06:56:31 -07:00 committed by Copybara-Service
parent 0ecd35e24c
commit 73790cf2a4
2 changed files with 26 additions and 48 deletions

View File

@ -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

View File

@ -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<Effect> 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