Add supportsMimeType API to bitmapLoader

PiperOrigin-RevId: 597942459
This commit is contained in:
tofunmi 2024-01-12 13:46:35 -08:00 committed by Copybara-Service
parent 6879698d7e
commit 7f087243bb
6 changed files with 43 additions and 15 deletions

View File

@ -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<Bitmap> decodeBitmap(byte[] data);

View File

@ -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}.

View File

@ -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<Bitmap> decodeBitmap(byte[] data) {
return listeningExecutorService.submit(() -> decode(data, options));

View File

@ -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<String> 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<String> getSupportedMimeTypes() {
ImmutableSet.Builder<String> 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;

View File

@ -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<Bitmap> decodeBitmap(byte[] data) {
if (lastBitmapLoadRequest != null && lastBitmapLoadRequest.matches(data)) {

View File

@ -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<Bitmap> decodeBitmap(byte[] data) {
return executorService.submit(() -> decode(data));