From 3ec9c99644e12640884f39c08f549d3f43fead41 Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 25 Sep 2024 08:01:39 -0700 Subject: [PATCH] Document that the MediaItem's image duration should be set for images PiperOrigin-RevId: 678702334 --- RELEASENOTES.md | 2 ++ .../transformer/DefaultAssetLoaderFactory.java | 9 +++++++++ .../media3/transformer/EditedMediaItem.java | 14 ++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 30d3ac48cf..ba5882631a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -49,6 +49,8 @@ allow invoking events of subclass listeners ([1736](https://github.com/androidx/media/pull/1736)). * Transformer: + * Make setting the image duration using + `MediaItem.Builder.setImageDurationMs` mandatory for image export. * Add export support for gaps in sequences of audio EditedMediaItems. * Track Selection: * Extractors: diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java index b3394c1ecc..92366de0f3 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java @@ -16,15 +16,19 @@ package androidx.media3.transformer; +import static androidx.media3.common.util.Assertions.checkNotNull; + import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.ColorSpace; import android.os.Looper; import androidx.annotation.Nullable; +import androidx.media3.common.C; import androidx.media3.common.MediaItem; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.BitmapLoader; import androidx.media3.common.util.Clock; +import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import androidx.media3.datasource.DataSourceBitmapLoader; @@ -39,6 +43,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @UnstableApi public final class DefaultAssetLoaderFactory implements AssetLoader.Factory { + private static final String TAG = "DefaultAssetLoaderFact"; + // Limit decoded images to 4096x4096 - should be large enough for most image to video // transcode operations, and smaller than GL_MAX_TEXTURE_SIZE for most devices. // TODO: b/356072337 - consider reading this from GL_MAX_TEXTURE_SIZE. This requires an @@ -136,6 +142,9 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory { CompositionSettings compositionSettings) { MediaItem mediaItem = editedMediaItem.mediaItem; if (isImage(mediaItem)) { + if (checkNotNull(mediaItem.localConfiguration).imageDurationMs == C.TIME_UNSET) { + Log.w(TAG, "The imageDurationMs field must be set on image MediaItems."); + } if (imageAssetLoaderFactory == null) { imageAssetLoaderFactory = new ImageAssetLoader.Factory(context, bitmapLoader); } 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 dbd584af46..16d06a8335 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditedMediaItem.java @@ -50,10 +50,16 @@ public final class EditedMediaItem { /** * Creates an instance. * - *

For image inputs, the values passed into {@link #setRemoveAudio}, {@link #setRemoveVideo} - * and {@link #setFlattenForSlowMotion} will be ignored. For multi-picture formats (e.g. gifs), - * a single image frame from the container is displayed if the {@link DefaultAssetLoaderFactory} - * is used. + *

For image inputs: + * + *

* * @param mediaItem The {@link MediaItem} on which transformations are applied. */