From 7f087243bbf3162772be9006a1d65a6aa4342dcd Mon Sep 17 00:00:00 2001 From: tofunmi Date: Fri, 12 Jan 2024 13:46:35 -0800 Subject: [PATCH] Add supportsMimeType API to bitmapLoader PiperOrigin-RevId: 597942459 --- .../media3/common/util/BitmapLoader.java | 4 ++++ .../androidx/media3/common/util/Util.java | 19 +++++++++++++++++++ .../datasource/DataSourceBitmapLoader.java | 6 ++++++ .../image/BitmapFactoryImageDecoder.java | 18 +++--------------- .../media3/session/CacheBitmapLoader.java | 5 +++++ .../media3/session/SimpleBitmapLoader.java | 6 ++++++ 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/util/BitmapLoader.java b/libraries/common/src/main/java/androidx/media3/common/util/BitmapLoader.java index 44b7cadb28..50876375cd 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/BitmapLoader.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/BitmapLoader.java @@ -24,6 +24,10 @@ import com.google.common.util.concurrent.ListenableFuture; /** Loads images. */ @UnstableApi public interface BitmapLoader { + + /** Returns whether the given {@code mimeType} is supported. */ + boolean supportsMimeType(String mimeType); + /** Decodes an image from compressed binary data. */ ListenableFuture decodeBitmap(byte[] data); diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index 3622547344..561d878043 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -3149,6 +3149,25 @@ public final class Util { } } + /** + * Returns the image MIME types that can be decoded and loaded by {@link + * android.graphics.BitmapFactory} that Media3 aims to support. + */ + @UnstableApi + public static boolean isBitmapFactorySupportedMimeType(String mimeType) { + switch (mimeType) { + case MimeTypes.IMAGE_PNG: + case MimeTypes.IMAGE_JPEG: + case MimeTypes.IMAGE_BMP: + case MimeTypes.IMAGE_WEBP: + return true; + case MimeTypes.IMAGE_HEIF: + return Util.SDK_INT >= 26; + default: + return false; + } + } + /** * Returns a list of strings representing the {@link C.SelectionFlags} values present in {@code * selectionFlags}. diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceBitmapLoader.java b/libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceBitmapLoader.java index 7d4570e6bd..f8a927bbf6 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceBitmapLoader.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceBitmapLoader.java @@ -17,6 +17,7 @@ package androidx.media3.datasource; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.common.util.Util.isBitmapFactorySupportedMimeType; import android.content.Context; import android.graphics.Bitmap; @@ -93,6 +94,11 @@ public final class DataSourceBitmapLoader implements BitmapLoader { this.options = options; } + @Override + public boolean supportsMimeType(String mimeType) { + return isBitmapFactorySupportedMimeType(mimeType); + } + @Override public ListenableFuture decodeBitmap(byte[] data) { return listeningExecutorService.submit(() -> decode(data, options)); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoder.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoder.java index 9ef9694714..e15a66a500 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoder.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoder.java @@ -19,6 +19,7 @@ import static androidx.annotation.VisibleForTesting.PRIVATE; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; +import static androidx.media3.common.util.Util.isBitmapFactorySupportedMimeType; import static androidx.media3.decoder.DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL; import android.graphics.Bitmap; @@ -31,11 +32,9 @@ import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.UnstableApi; -import androidx.media3.common.util.Util; import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.SimpleDecoder; import androidx.media3.exoplayer.RendererCapabilities; -import com.google.common.collect.ImmutableSet; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -69,7 +68,6 @@ public final class BitmapFactoryImageDecoder /** A factory for {@link BitmapFactoryImageDecoder} instances. */ public static final class Factory implements ImageDecoder.Factory { - private static final ImmutableSet SUPPORTED_IMAGE_TYPES = getSupportedMimeTypes(); private final BitmapDecoder bitmapDecoder; @@ -91,10 +89,10 @@ public final class BitmapFactoryImageDecoder @Override public @RendererCapabilities.Capabilities int supportsFormat(Format format) { - if (!MimeTypes.isImage(format.containerMimeType)) { + if (format.containerMimeType == null || !MimeTypes.isImage(format.containerMimeType)) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE); } - return SUPPORTED_IMAGE_TYPES.contains(format.containerMimeType) + return isBitmapFactorySupportedMimeType(format.containerMimeType) ? RendererCapabilities.create(C.FORMAT_HANDLED) : RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE); } @@ -103,16 +101,6 @@ public final class BitmapFactoryImageDecoder public BitmapFactoryImageDecoder createImageDecoder() { return new BitmapFactoryImageDecoder(bitmapDecoder); } - - private static ImmutableSet getSupportedMimeTypes() { - ImmutableSet.Builder supportedMimeTypes = ImmutableSet.builder(); - supportedMimeTypes.add( - MimeTypes.IMAGE_PNG, MimeTypes.IMAGE_JPEG, MimeTypes.IMAGE_BMP, MimeTypes.IMAGE_WEBP); - if (Util.SDK_INT >= 26) { - supportedMimeTypes.add(MimeTypes.IMAGE_HEIF); - } - return supportedMimeTypes.build(); - } } private final BitmapDecoder bitmapDecoder; diff --git a/libraries/session/src/main/java/androidx/media3/session/CacheBitmapLoader.java b/libraries/session/src/main/java/androidx/media3/session/CacheBitmapLoader.java index 4fc3f5717f..84d09a31d6 100644 --- a/libraries/session/src/main/java/androidx/media3/session/CacheBitmapLoader.java +++ b/libraries/session/src/main/java/androidx/media3/session/CacheBitmapLoader.java @@ -48,6 +48,11 @@ public final class CacheBitmapLoader implements BitmapLoader { this.bitmapLoader = bitmapLoader; } + @Override + public boolean supportsMimeType(String mimeType) { + return bitmapLoader.supportsMimeType(mimeType); + } + @Override public ListenableFuture decodeBitmap(byte[] data) { if (lastBitmapLoadRequest != null && lastBitmapLoadRequest.matches(data)) { diff --git a/libraries/session/src/main/java/androidx/media3/session/SimpleBitmapLoader.java b/libraries/session/src/main/java/androidx/media3/session/SimpleBitmapLoader.java index 6649aa95e3..365882ec13 100644 --- a/libraries/session/src/main/java/androidx/media3/session/SimpleBitmapLoader.java +++ b/libraries/session/src/main/java/androidx/media3/session/SimpleBitmapLoader.java @@ -17,6 +17,7 @@ package androidx.media3.session; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.common.util.Util.isBitmapFactorySupportedMimeType; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -66,6 +67,11 @@ public final class SimpleBitmapLoader implements BitmapLoader { this.executorService = MoreExecutors.listeningDecorator(executorService); } + @Override + public boolean supportsMimeType(String mimeType) { + return isBitmapFactorySupportedMimeType(mimeType); + } + @Override public ListenableFuture decodeBitmap(byte[] data) { return executorService.submit(() -> decode(data));