mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Don't optimize for trim if the media is not clipped
PiperOrigin-RevId: 688120868
This commit is contained in:
parent
0ecd35e24c
commit
73790cf2a4
@ -1084,7 +1084,9 @@ public final class Transformer {
|
|||||||
public void start(Composition composition, String path) {
|
public void start(Composition composition, String path) {
|
||||||
verifyApplicationThread();
|
verifyApplicationThread();
|
||||||
initialize(composition, path);
|
initialize(composition, path);
|
||||||
if (!trimOptimizationEnabled || isMultiAsset()) {
|
if (shouldOptimizeForTrimming()) {
|
||||||
|
processMediaBeforeFirstSyncSampleAfterTrimStartTime();
|
||||||
|
} else {
|
||||||
startInternal(
|
startInternal(
|
||||||
composition,
|
composition,
|
||||||
new MuxerWrapper(
|
new MuxerWrapper(
|
||||||
@ -1098,8 +1100,6 @@ public final class Transformer {
|
|||||||
componentListener,
|
componentListener,
|
||||||
/* initialTimestampOffsetUs= */ 0,
|
/* initialTimestampOffsetUs= */ 0,
|
||||||
/* useDefaultAssetLoaderFactory= */ false);
|
/* useDefaultAssetLoaderFactory= */ false);
|
||||||
} else {
|
|
||||||
processMediaBeforeFirstSyncSampleAfterTrimStartTime();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1225,6 +1225,26 @@ public final class Transformer {
|
|||||||
: transformerInternal.getProgress(progressHolder);
|
: 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() {
|
private boolean isExportResumed() {
|
||||||
return transformerState == TRANSFORMER_STATE_REMUX_PROCESSED_VIDEO
|
return transformerState == TRANSFORMER_STATE_REMUX_PROCESSED_VIDEO
|
||||||
|| transformerState == TRANSFORMER_STATE_PROCESS_REMAINING_VIDEO
|
|| transformerState == TRANSFORMER_STATE_PROCESS_REMAINING_VIDEO
|
||||||
|
@ -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.CONVERSION_PROCESS_TRANSMUXED;
|
||||||
import static androidx.media3.transformer.ExportResult.OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM;
|
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_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.ASSET_URI_PREFIX;
|
||||||
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_NB;
|
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_NB;
|
||||||
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_WB;
|
import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_WB;
|
||||||
@ -216,7 +217,7 @@ public final class MediaItemExportTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void start_trimOptimizationEnabled_clippingConfigurationUnset_outputMatchesOriginal()
|
public void start_trimOptimizationEnabled_clippingConfigurationUnset_doesNotOptimize()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ false);
|
CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(/* handleAudioAsPcm= */ false);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
@ -231,50 +232,7 @@ public final class MediaItemExportTest {
|
|||||||
transformer.start(mediaItem, outputDir.newFile().getPath());
|
transformer.start(mediaItem, outputDir.newFile().getPath());
|
||||||
ExportResult result = TransformerTestRunner.runLooper(transformer);
|
ExportResult result = TransformerTestRunner.runLooper(transformer);
|
||||||
|
|
||||||
assertThat(result.optimizationResult)
|
assertThat(result.optimizationResult).isEqualTo(OPTIMIZATION_NONE);
|
||||||
.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"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
x
Reference in New Issue
Block a user