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 fc978cbe38..e6e8520bb4 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java @@ -250,7 +250,7 @@ public final class EditedMediaItem { public final Effects effects; /** The duration for which this {@code EditedMediaItem} should be presented, in microseconds. */ - public final long presentationDurationUs; + private long presentationDurationUs; private EditedMediaItem( MediaItem mediaItem, @@ -268,26 +268,32 @@ public final class EditedMediaItem { this.durationUs = durationUs; this.frameRate = frameRate; this.effects = effects; - - if (mediaItem.clippingConfiguration.equals(MediaItem.ClippingConfiguration.UNSET) - || durationUs == C.TIME_UNSET) { - // TODO - b/290734981: Use presentationDurationUs for image presentation - presentationDurationUs = durationUs; - } else { - MediaItem.ClippingConfiguration clippingConfiguration = mediaItem.clippingConfiguration; - checkArgument(!clippingConfiguration.relativeToDefaultPosition); - if (clippingConfiguration.endPositionUs == C.TIME_END_OF_SOURCE) { - presentationDurationUs = durationUs - clippingConfiguration.startPositionUs; - } else { - checkArgument(clippingConfiguration.endPositionUs <= durationUs); - presentationDurationUs = - clippingConfiguration.endPositionUs - clippingConfiguration.startPositionUs; - } - } + presentationDurationUs = C.TIME_UNSET; } /** Returns a {@link Builder} initialized with the values of this instance. */ /* package */ Builder buildUpon() { return new Builder(this); } + + /* package */ long getPresentationDurationUs() { + if (presentationDurationUs == C.TIME_UNSET) { + if (mediaItem.clippingConfiguration.equals(MediaItem.ClippingConfiguration.UNSET) + || durationUs == C.TIME_UNSET) { + // TODO - b/290734981: Use presentationDurationUs for image presentation + presentationDurationUs = durationUs; + } else { + MediaItem.ClippingConfiguration clippingConfiguration = mediaItem.clippingConfiguration; + checkArgument(!clippingConfiguration.relativeToDefaultPosition); + if (clippingConfiguration.endPositionUs == C.TIME_END_OF_SOURCE) { + presentationDurationUs = durationUs - clippingConfiguration.startPositionUs; + } else { + checkArgument(clippingConfiguration.endPositionUs <= durationUs); + presentationDurationUs = + clippingConfiguration.endPositionUs - clippingConfiguration.startPositionUs; + } + } + } + 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 89321f63aa..7e157b8b31 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/EditedMediaItemBuilderTest.java @@ -62,7 +62,7 @@ public final class EditedMediaItemBuilderTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setDurationUs(1_000).build(); - assertThat(editedMediaItem.presentationDurationUs).isEqualTo(1_000); + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(1_000); } @Test @@ -78,7 +78,7 @@ public final class EditedMediaItemBuilderTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setDurationUs(1_000_000).build(); - assertThat(editedMediaItem.presentationDurationUs).isEqualTo(500_000); + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(500_000); } @Test @@ -99,7 +99,7 @@ public final class EditedMediaItemBuilderTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setDurationUs(1_000_000).build(); - assertThat(editedMediaItem.presentationDurationUs).isEqualTo(200_000); + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(200_000); } @Test @@ -118,7 +118,7 @@ public final class EditedMediaItemBuilderTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setDurationUs(1_000_000).build(); - assertThat(editedMediaItem.presentationDurationUs).isEqualTo(200_000); + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(200_000); } @Test @@ -137,6 +137,6 @@ public final class EditedMediaItemBuilderTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setDurationUs(1_000_000).build(); - assertThat(editedMediaItem.presentationDurationUs).isEqualTo(700_000); + assertThat(editedMediaItem.getPresentationDurationUs()).isEqualTo(700_000); } }