From 477994461de776f40eda0defbf794b359f1482bb Mon Sep 17 00:00:00 2001 From: tofunmi Date: Tue, 9 May 2023 12:13:24 +0000 Subject: [PATCH] Image transcoding: Add support for heic/heif image formats PiperOrigin-RevId: 530578549 --- .../media3/effect/BitmapTextureManager.java | 13 +++++++++++++ .../transformer/DefaultAssetLoaderFactory.java | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libraries/effect/src/main/java/androidx/media3/effect/BitmapTextureManager.java b/libraries/effect/src/main/java/androidx/media3/effect/BitmapTextureManager.java index ba405d1c18..3ed088b57f 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/BitmapTextureManager.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/BitmapTextureManager.java @@ -16,6 +16,7 @@ package androidx.media3.effect; import static androidx.media3.common.util.Assertions.checkNotNull; +import static androidx.media3.common.util.Assertions.checkState; import static java.lang.Math.round; import android.graphics.Bitmap; @@ -27,6 +28,7 @@ import androidx.media3.common.GlTextureInfo; import androidx.media3.common.VideoFrameProcessingException; import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.UnstableApi; +import androidx.media3.common.util.Util; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -39,6 +41,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; */ @UnstableApi /* package */ final class BitmapTextureManager implements TextureManager { + private static final String UNSUPPORTED_IMAGE_CONFIGURATION = + "Unsupported Image Configuration: No more than 8 bits of precision should be used for each" + + " RGB channel."; private final GlShaderProgram shaderProgram; private final VideoFrameProcessingTaskExecutor videoFrameProcessingTaskExecutor; // The queue holds all bitmaps with one or more frames pending to be sent downstream. @@ -125,6 +130,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private void setupBitmap( Bitmap bitmap, long durationUs, long offsetUs, float frameRate, boolean useHdr) throws VideoFrameProcessingException { + if (Util.SDK_INT >= 26) { + checkState( + !bitmap.getConfig().equals(Bitmap.Config.RGBA_F16), UNSUPPORTED_IMAGE_CONFIGURATION); + } + if (Util.SDK_INT >= 33) { + checkState( + !bitmap.getConfig().equals(Bitmap.Config.RGBA_1010102), UNSUPPORTED_IMAGE_CONFIGURATION); + } this.useHdr = useHdr; int framesToAdd = round(frameRate * (durationUs / (float) C.MICROS_PER_SECOND)); double frameDurationUs = C.MICROS_PER_SECOND / frameRate; 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 10ea97fa94..873e5ccdc3 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAssetLoaderFactory.java @@ -26,6 +26,7 @@ import androidx.media3.common.util.Clock; import androidx.media3.common.util.UnstableApi; import androidx.media3.exoplayer.source.MediaSource; import com.google.common.collect.ImmutableList; +import java.util.Locale; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** The default {@link AssetLoader.Factory} implementation. */ @@ -114,13 +115,14 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory { if (localConfiguration == null) { return false; } - ImmutableList supportedImageTypes = ImmutableList.of(".png", ".webp", ".jpg", ".jpeg"); + ImmutableList supportedImageTypes = + ImmutableList.of(".png", ".webp", ".jpg", ".jpeg", ".heic", ".heif"); String uriPath = checkNotNull(localConfiguration.uri.getPath()); int fileExtensionStart = uriPath.lastIndexOf("."); if (fileExtensionStart < 0) { return false; } - String extension = uriPath.substring(fileExtensionStart); + String extension = uriPath.substring(fileExtensionStart).toLowerCase(Locale.ENGLISH); return supportedImageTypes.contains(extension); } }