From 80d2159ff4dd74e33ebd8db42d3401c5243f643e Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Thu, 2 Jul 2020 02:00:25 +0900 Subject: [PATCH] Use Android Q API to test if MediaCodecInfo is HW Accelerated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also, add the prefix of SW Codecs in Codec2.0. Bug: None Change-Id: Ifc7a079a68506975cd9e52ddaf6da69744ac0614 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/177800 Reviewed-by: Sami Kalliomäki Commit-Queue: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#31723} --- .../webrtc/HardwareVideoDecoderFactory.java | 11 +----- .../PlatformSoftwareVideoDecoderFactory.java | 12 +------ .../src/java/org/webrtc/MediaCodecUtils.java | 34 ++++++++++++++++++- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java b/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java index 4a648c8cd7..2876df028e 100644 --- a/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java +++ b/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java @@ -18,18 +18,9 @@ import java.util.Arrays; public class HardwareVideoDecoderFactory extends MediaCodecVideoDecoderFactory { private final static Predicate defaultAllowedPredicate = new Predicate() { - private String[] prefixBlocklist = - Arrays.copyOf(MediaCodecUtils.SOFTWARE_IMPLEMENTATION_PREFIXES, - MediaCodecUtils.SOFTWARE_IMPLEMENTATION_PREFIXES.length); @Override public boolean test(MediaCodecInfo arg) { - final String name = arg.getName(); - for (String prefix : prefixBlocklist) { - if (name.startsWith(prefix)) { - return false; - } - } - return true; + return MediaCodecUtils.isHardwareAccelerated(arg); } }; diff --git a/sdk/android/api/org/webrtc/PlatformSoftwareVideoDecoderFactory.java b/sdk/android/api/org/webrtc/PlatformSoftwareVideoDecoderFactory.java index 31b6e59e3b..d334dfab4e 100644 --- a/sdk/android/api/org/webrtc/PlatformSoftwareVideoDecoderFactory.java +++ b/sdk/android/api/org/webrtc/PlatformSoftwareVideoDecoderFactory.java @@ -21,19 +21,9 @@ public class PlatformSoftwareVideoDecoderFactory extends MediaCodecVideoDecoderF */ private static final Predicate defaultAllowedPredicate = new Predicate() { - private String[] prefixAllowlist = - Arrays.copyOf(MediaCodecUtils.SOFTWARE_IMPLEMENTATION_PREFIXES, - MediaCodecUtils.SOFTWARE_IMPLEMENTATION_PREFIXES.length); - @Override public boolean test(MediaCodecInfo arg) { - final String name = arg.getName(); - for (String prefix : prefixAllowlist) { - if (name.startsWith(prefix)) { - return true; - } - } - return false; + return MediaCodecUtils.isSoftwareOnly(arg); } }; diff --git a/sdk/android/src/java/org/webrtc/MediaCodecUtils.java b/sdk/android/src/java/org/webrtc/MediaCodecUtils.java index 9028cc3ae4..cd43098015 100644 --- a/sdk/android/src/java/org/webrtc/MediaCodecUtils.java +++ b/sdk/android/src/java/org/webrtc/MediaCodecUtils.java @@ -10,6 +10,7 @@ package org.webrtc; +import android.annotation.TargetApi; import android.media.MediaCodecInfo; import android.media.MediaCodecInfo.CodecCapabilities; import android.os.Build; @@ -28,7 +29,8 @@ class MediaCodecUtils { static final String INTEL_PREFIX = "OMX.Intel."; static final String NVIDIA_PREFIX = "OMX.Nvidia."; static final String QCOM_PREFIX = "OMX.qcom."; - static final String[] SOFTWARE_IMPLEMENTATION_PREFIXES = {"OMX.google.", "OMX.SEC."}; + static final String[] SOFTWARE_IMPLEMENTATION_PREFIXES = { + "OMX.google.", "OMX.SEC.", "c2.android"}; // NV12 color format supported by QCOM codec, but not declared in MediaCodec - // see /hardware/qcom/media/mm-core/inc/OMX_QCOMExtns.h @@ -97,6 +99,36 @@ class MediaCodecUtils { } } + static boolean isHardwareAccelerated(MediaCodecInfo info) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + return isHardwareAcceleratedQOrHigher(info); + } + return !isSoftwareOnly(info); + } + + @TargetApi(29) + private static boolean isHardwareAcceleratedQOrHigher(android.media.MediaCodecInfo codecInfo) { + return codecInfo.isHardwareAccelerated(); + } + + static boolean isSoftwareOnly(android.media.MediaCodecInfo codecInfo) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + return isSoftwareOnlyQOrHigher(codecInfo); + } + String name = codecInfo.getName(); + for (String prefix : SOFTWARE_IMPLEMENTATION_PREFIXES) { + if (name.startsWith(prefix)) { + return true; + } + } + return false; + } + + @TargetApi(29) + private static boolean isSoftwareOnlyQOrHigher(android.media.MediaCodecInfo codecInfo) { + return codecInfo.isSoftwareOnly(); + } + private MediaCodecUtils() { // This class should not be instantiated. }