ImageDecoder: Add AVIF to support list
Report true only if 10-bit AV1 decoding is supported.
Bug: 275081444
Change-Id: Iabcb2837e02d643a022c38315f0d04d5fc7b9a66
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 51f99ec..22462eb 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -38,8 +38,11 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
import android.net.Uri;
import android.os.Build;
+import android.os.SystemProperties;
import android.os.Trace;
import android.system.ErrnoException;
import android.system.Os;
@@ -928,6 +931,8 @@
case "image/x-pentax-pef":
case "image/x-samsung-srw":
return true;
+ case "image/avif":
+ return isP010SupportedForAV1();
default:
return false;
}
@@ -2063,6 +2068,49 @@
return decodeBitmapImpl(src, null);
}
+ private static boolean sIsP010SupportedForAV1 = false;
+ private static boolean sIsP010SupportedForAV1Initialized = false;
+
+ /**
+ * Checks if the device supports decoding 10-bit AV1.
+ */
+ private static boolean isP010SupportedForAV1() {
+ if (sIsP010SupportedForAV1Initialized) {
+ return sIsP010SupportedForAV1;
+ }
+
+ sIsP010SupportedForAV1Initialized = true;
+
+ if (hasHardwareDecoder("video/av01")) {
+ sIsP010SupportedForAV1 = true;
+ return true;
+ }
+
+ sIsP010SupportedForAV1 = SystemProperties.getInt("ro.product.first_api_level", 0) >=
+ Build.VERSION_CODES.S;
+ return sIsP010SupportedForAV1;
+ }
+
+ /**
+ * Checks if the device has hardware decoder for the target mime type.
+ */
+ private static boolean hasHardwareDecoder(String mime) {
+ final MediaCodecList sMCL = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+ for (MediaCodecInfo info : sMCL.getCodecInfos()) {
+ if (info.isEncoder() == false && info.isHardwareAccelerated()) {
+ try {
+ if (info.getCapabilitiesForType(mime) != null) {
+ return true;
+ }
+ } catch (IllegalArgumentException e) {
+ // mime is not supported
+ return false;
+ }
+ }
+ }
+ return false;
+ }
+
/**
* Private method called by JNI.
*/