From daa879ac687bdbcb9594a5fc5c811a4c7c66ac44 Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Wed, 20 Oct 2021 16:10:08 -0700 Subject: [PATCH] media: allow excluding arbitrary codecs from REGULAR_CODECS list. This can be done by adding the 'special-codec' feature as a required feature to media_codecs.xml, e.g. ... This feature is not exposed to applications, and is only used to exclude a codec from the REGULAR_CODECS list. Bug: 197577115 Bug: 196518411 Bug: 191944087 Test: CtsVideoTestCases and manual testing with a modified media_codecs.xml Change-Id: Ica5510bbe7e781f25ca329535d2ba771afbdb263 --- media/java/android/media/MediaCodecInfo.java | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 49477b94cbe0..374cc7592faf 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -182,10 +182,15 @@ public final class MediaCodecInfo { public String mName; public int mValue; public boolean mDefault; + public boolean mInternal; public Feature(String name, int value, boolean def) { + this(name, value, def, false /* internal */); + } + public Feature(String name, int value, boolean def, boolean internal) { mName = name; mValue = value; mDefault = def; + mInternal = internal; } } @@ -578,6 +583,11 @@ public final class MediaCodecInfo { */ public static final String FEATURE_LowLatency = "low-latency"; + /** + * Do not include in REGULAR_CODECS list in MediaCodecList. + */ + private static final String FEATURE_SpecialCodec = "special-codec"; + /** * video encoder only: codec supports quantization parameter bounds. * @see MediaFormat#KEY_VIDEO_QP_MAX @@ -616,6 +626,8 @@ public final class MediaCodecInfo { new Feature(FEATURE_MultipleFrames, (1 << 5), false), new Feature(FEATURE_DynamicTimestamp, (1 << 6), false), new Feature(FEATURE_LowLatency, (1 << 7), true), + // feature to exclude codec from REGULAR codec list + new Feature(FEATURE_SpecialCodec, (1 << 30), false, true), }; private static final Feature[] encoderFeatures = { @@ -623,6 +635,8 @@ public final class MediaCodecInfo { new Feature(FEATURE_MultipleFrames, (1 << 1), false), new Feature(FEATURE_DynamicTimestamp, (1 << 2), false), new Feature(FEATURE_QpBounds, (1 << 3), false), + // feature to exclude codec from REGULAR codec list + new Feature(FEATURE_SpecialCodec, (1 << 30), false, true), }; /** @hide */ @@ -630,7 +644,9 @@ public final class MediaCodecInfo { Feature[] features = getValidFeatures(); String[] res = new String[features.length]; for (int i = 0; i < res.length; i++) { - res[i] = features[i].mName; + if (!features[i].mInternal) { + res[i] = features[i].mName; + } } return res; } @@ -778,6 +794,10 @@ public final class MediaCodecInfo { // check feature support for (Feature feat: getValidFeatures()) { + if (feat.mInternal) { + continue; + } + Integer yesNo = (Integer)map.get(MediaFormat.KEY_FEATURE_ + feat.mName); if (yesNo == null) { continue; @@ -1091,7 +1111,9 @@ public final class MediaCodecInfo { mFlagsRequired |= feat.mValue; } mFlagsSupported |= feat.mValue; - mDefaultFormat.setInteger(key, 1); + if (!feat.mInternal) { + mDefaultFormat.setInteger(key, 1); + } // TODO restrict features by mFlagsVerified once all codecs reliably verify them } }