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 e17ed9e6f3..4e1d2f1543 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java @@ -314,6 +314,7 @@ public final class EditedMediaItem { clippingConfiguration.endPositionUs - clippingConfiguration.startPositionUs; } } + presentationDurationUs = getDurationAfterEffectsApplied(presentationDurationUs); } return presentationDurationUs; } diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java index 7e157b8b31..8442575b6e 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java @@ -19,7 +19,11 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import androidx.media3.common.MediaItem; +import androidx.media3.common.audio.AudioProcessor; +import androidx.media3.common.audio.SpeedChangingAudioProcessor; +import androidx.media3.test.utils.TestSpeedProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; @@ -56,7 +60,7 @@ public final class EditedMediaItemBuilderTest { } @Test - public void duration_withoutClippingConfiguration() { + public void presentationDurationUs_withoutClippingConfiguration() { MediaItem mediaItem = MediaItem.fromUri("Uri"); EditedMediaItem editedMediaItem = @@ -66,7 +70,7 @@ public final class EditedMediaItemBuilderTest { } @Test - public void duration_withClippingConfigurationAndEndPosition() { + public void presentationDurationUs_withClippingConfigurationAndEndPosition() { MediaItem.ClippingConfiguration clippingConfiguration = new MediaItem.ClippingConfiguration.Builder().setEndPositionMs(500).build(); MediaItem mediaItem = @@ -82,7 +86,7 @@ public final class EditedMediaItemBuilderTest { } @Test - public void duration_withClippingConfigurationAndStartEndPosition() { + public void presentationDurationUs_withClippingConfigurationAndStartEndPosition() { MediaItem.ClippingConfiguration clippingConfiguration = new MediaItem.ClippingConfiguration.Builder() // 300_000us @@ -103,7 +107,7 @@ public final class EditedMediaItemBuilderTest { } @Test - public void duration_withClippingConfigurationAndStartEndPositionInUs() { + public void presentationDurationUs_withClippingConfigurationAndStartEndPositionInUs() { MediaItem.ClippingConfiguration clippingConfiguration = new MediaItem.ClippingConfiguration.Builder() .setStartPositionUs(300_000) @@ -122,7 +126,7 @@ public final class EditedMediaItemBuilderTest { } @Test - public void duration_withClippingConfigurationAndStartPosition() { + public void presentationDurationUs_withClippingConfigurationAndStartPosition() { MediaItem.ClippingConfiguration clippingConfiguration = new MediaItem.ClippingConfiguration.Builder() // 300_000us @@ -139,4 +143,44 @@ public final class EditedMediaItemBuilderTest { assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(700_000); } + + @Test + public void presentationDurationUs_withClippingConfigurationAndDurationAdjustingEffect() { + MediaItem.ClippingConfiguration clippingConfiguration = + new MediaItem.ClippingConfiguration.Builder().setStartPositionUs(200_000).build(); + MediaItem mediaItem = + new MediaItem.Builder() + .setUri("Uri") + .setClippingConfiguration(clippingConfiguration) + .build(); + ImmutableList audioProcessors = + ImmutableList.of( + new SpeedChangingAudioProcessor( + TestSpeedProvider.createWithStartTimes(new long[] {0L}, new float[] {2f}))); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem) + .setDurationUs(1_000_000) + .setRemoveVideo(true) + .setEffects(new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of())) + .build(); + + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(400_000); + } + + @Test + public void presentationDurationUs_withdurationAdjustingEffect() { + MediaItem mediaItem = new MediaItem.Builder().setUri("Uri").build(); + ImmutableList audioProcessors = + ImmutableList.of( + new SpeedChangingAudioProcessor( + TestSpeedProvider.createWithStartTimes(new long[] {0L}, new float[] {2f}))); + EditedMediaItem editedMediaItem = + new EditedMediaItem.Builder(mediaItem) + .setDurationUs(1_000_000) + .setRemoveVideo(true) + .setEffects(new Effects(audioProcessors, /* videoEffects= */ ImmutableList.of())) + .build(); + + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(500_000); + } }