diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java index adebf6e666..8faca221d0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java @@ -320,8 +320,8 @@ public final class MediaCodecUtil { if ((!key.secure && secureRequired) || (key.secure && !secureSupported)) { continue; } - boolean hardwareAccelerated = isHardwareAccelerated(codecInfo); - boolean softwareOnly = isSoftwareOnly(codecInfo); + boolean hardwareAccelerated = isHardwareAccelerated(codecInfo, mimeType); + boolean softwareOnly = isSoftwareOnly(codecInfo, mimeType); boolean vendor = isVendor(codecInfo); if ((secureDecodersExplicit && key.secure == secureSupported) || (!secureDecodersExplicit && !key.secure)) { @@ -601,13 +601,14 @@ public final class MediaCodecUtil { * The result of {@link android.media.MediaCodecInfo#isHardwareAccelerated()} for API levels 29+, * or a best-effort approximation for lower levels. */ - private static boolean isHardwareAccelerated(android.media.MediaCodecInfo codecInfo) { + private static boolean isHardwareAccelerated( + android.media.MediaCodecInfo codecInfo, String mimeType) { if (Util.SDK_INT >= 29) { return isHardwareAcceleratedV29(codecInfo); } // codecInfo.isHardwareAccelerated() != codecInfo.isSoftwareOnly() is not necessarily true. // However, we assume this to be true as an approximation. - return !isSoftwareOnly(codecInfo); + return !isSoftwareOnly(codecInfo, mimeType); } @RequiresApi(29) @@ -619,12 +620,17 @@ public final class MediaCodecUtil { * The result of {@link android.media.MediaCodecInfo#isSoftwareOnly()} for API levels 29+, or a * best-effort approximation for lower levels. */ - private static boolean isSoftwareOnly(android.media.MediaCodecInfo codecInfo) { + private static boolean isSoftwareOnly(android.media.MediaCodecInfo codecInfo, String mimeType) { if (Util.SDK_INT >= 29) { return isSoftwareOnlyV29(codecInfo); } + if (MimeTypes.isAudio(mimeType)) { + // Assume audio decoders are software only. + return true; + } String codecName = Ascii.toLowerCase(codecInfo.getName()); - if (codecName.startsWith("arc.")) { // App Runtime for Chrome (ARC) codecs + if (codecName.startsWith("arc.")) { + // App Runtime for Chrome (ARC) codecs return false; } return codecName.startsWith("omx.google.")