Add more restriction for 10-bit HEIF test
Check exactly if device has decoder for HEVC Main10 profile and Level5,
which is the profile/level of our test 10-bit HEIF image. Early
terminate if no decoder for this format.
Bug: b/222063912
Test: ImageDecoderTest, BitmapFactoryTest
Change-Id: Ib072436f454ea7f23df6a36279cb11329581bb7f
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
index 9600df2..4766268 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
@@ -35,6 +35,8 @@
import android.graphics.BitmapFactory.Options;
import android.graphics.Color;
import android.graphics.Rect;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
import android.media.MediaFormat;
import android.os.Build;
import android.os.Parcel;
@@ -1010,9 +1012,8 @@
public void testDecode10BitHEIFTo10BitBitmap() {
assumeTrue(
"Test needs Android T.", ApiLevelUtil.isFirstApiAtLeast(Build.VERSION_CODES.TIRAMISU));
- if (!MediaUtils.hasDecoder(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
- return;
- }
+ assumeTrue("No 10-bit HEVC decoder, skip the test.", has10BitHEVCDecoder());
+
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Config.RGBA_1010102;
Bitmap bm = BitmapFactory.decodeStream(obtainInputStream(R.raw.heifimage_10bit), null, opt);
@@ -1027,9 +1028,8 @@
public void testDecode10BitHEIFTo8BitBitmap() {
assumeTrue(
"Test needs Android T.", ApiLevelUtil.isFirstApiAtLeast(Build.VERSION_CODES.TIRAMISU));
- if (!MediaUtils.hasDecoder(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
- return;
- }
+ assumeTrue("No 10-bit HEVC decoder, skip the test.", has10BitHEVCDecoder());
+
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Config.ARGB_8888;
Bitmap bm1 =
@@ -1091,4 +1091,19 @@
private String obtainPath() throws IOException {
return Utils.obtainPath(R.drawable.start, 0);
}
+
+ private static boolean has10BitHEVCDecoder() {
+ MediaFormat format = new MediaFormat();
+ format.setString(MediaFormat.KEY_MIME, "video/hevc");
+ format.setInteger(
+ MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10);
+ format.setInteger(
+ MediaFormat.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel5);
+
+ MediaCodecList mcl = new MediaCodecList(MediaCodecList.ALL_CODECS);
+ if (mcl.findDecoderForFormat(format) == null) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/tests/tests/graphics/src/android/graphics/cts/ImageDecoderTest.java b/tests/tests/graphics/src/android/graphics/cts/ImageDecoderTest.java
index 5b179d6..6741c07 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ImageDecoderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ImageDecoderTest.java
@@ -44,6 +44,8 @@
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.media.MediaFormat;
import android.net.Uri;
import android.os.Build;
@@ -244,9 +246,8 @@
public void testDecode10BitHeif() {
assumeTrue(
"Test needs Android T.", ApiLevelUtil.isFirstApiAtLeast(Build.VERSION_CODES.TIRAMISU));
- if (!MediaUtils.hasDecoder(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
- return;
- }
+ assumeTrue("No 10-bit HEVC decoder, skip the test.", has10BitHEVCDecoder());
+
try {
ImageDecoder.Source src = ImageDecoder
.createSource(getResources(), R.raw.heifimage_10bit);
@@ -266,9 +267,8 @@
@Test
@RequiresDevice
public void testDecode10BitHeifWithLowRam() {
- if (!MediaUtils.hasDecoder(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
- return;
- }
+ assumeTrue("No 10-bit HEVC decoder, skip the test.", has10BitHEVCDecoder());
+
ImageDecoder.Source src = ImageDecoder.createSource(getResources(), R.raw.heifimage_10bit);
assertNotNull(src);
try {
@@ -2770,4 +2770,19 @@
ImageDecoder.Source src = ImageDecoder.createSource(() -> null);
ImageDecoder.decodeDrawable(src);
}
+
+ private static boolean has10BitHEVCDecoder() {
+ MediaFormat format = new MediaFormat();
+ format.setString(MediaFormat.KEY_MIME, "video/hevc");
+ format.setInteger(
+ MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10);
+ format.setInteger(
+ MediaFormat.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel5);
+
+ MediaCodecList mcl = new MediaCodecList(MediaCodecList.ALL_CODECS);
+ if (mcl.findDecoderForFormat(format) == null) {
+ return false;
+ }
+ return true;
+ }
}