diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 5bb30ccbfe813d4e1d5c2524cc89241507db0a59..2018a39f4e3d7f92158ffcd08709fd5d53877eb7 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -65,6 +65,7 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Supplier; /** MediaCodec class can be used to access low-level media codecs, i.e. encoder/decoder components. @@ -2014,6 +2015,23 @@ final public class MediaCodec { } } + // HACKY(b/325389296): aconfig flag accessors may not work in all contexts where MediaCodec API + // is used, so allow accessors to fail. In those contexts use a default value, normally false. + + /* package private */ + static boolean GetFlag(Supplier<Boolean> flagValueSupplier) { + return GetFlag(flagValueSupplier, false /* defaultValue */); + } + + /* package private */ + static boolean GetFlag(Supplier<Boolean> flagValueSupplier, boolean defaultValue) { + try { + return flagValueSupplier.get(); + } catch (java.lang.RuntimeException e) { + return defaultValue; + } + } + private boolean mHasSurface = false; /** @@ -2346,15 +2364,7 @@ final public class MediaCodec { } // at the moment no codecs support detachable surface - - // HACKY: aconfig flags accessors may not work in all contexts that MediaCodec API is used, - // so allow accessors to fail. In those contexts the flags will just not be enabled - boolean nullOutputSurface = false; - try { - nullOutputSurface = android.media.codec.Flags.nullOutputSurface(); - } catch (java.lang.RuntimeException e) { } - - if (nullOutputSurface) { + if (GetFlag(() -> android.media.codec.Flags.nullOutputSurface())) { // Detached surface flag is only meaningful if surface is null. Otherwise, it is // ignored. if (surface == null && (flags & CONFIGURE_FLAG_DETACHED_SURFACE) != 0) { diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index abad460468903d7af0a828b0aa625c0d20caa14b..8ff4305a981798ddc903c48c3060603cf3d47fbc 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -23,6 +23,7 @@ import static android.media.codec.Flags.FLAG_HLG_EDITING; import static android.media.codec.Flags.FLAG_IN_PROCESS_SW_AUDIO_CODEC; import static android.media.codec.Flags.FLAG_NULL_OUTPUT_SURFACE; import static android.media.codec.Flags.FLAG_REGION_OF_INTEREST; +import static android.media.MediaCodec.GetFlag; import android.annotation.FlaggedApi; import android.annotation.IntDef; @@ -827,10 +828,10 @@ public final class MediaCodecInfo { features.add(new Feature(FEATURE_MultipleFrames, (1 << 5), false)); features.add(new Feature(FEATURE_DynamicTimestamp, (1 << 6), false)); features.add(new Feature(FEATURE_LowLatency, (1 << 7), true)); - if (android.media.codec.Flags.dynamicColorAspects()) { + if (GetFlag(() -> android.media.codec.Flags.dynamicColorAspects())) { features.add(new Feature(FEATURE_DynamicColorAspects, (1 << 8), true)); } - if (android.media.codec.Flags.nullOutputSurface()) { + if (GetFlag(() -> android.media.codec.Flags.nullOutputSurface())) { features.add(new Feature(FEATURE_DetachedSurface, (1 << 9), true)); } @@ -851,10 +852,10 @@ public final class MediaCodecInfo { features.add(new Feature(FEATURE_QpBounds, (1 << 3), false)); features.add(new Feature(FEATURE_EncodingStatistics, (1 << 4), false)); features.add(new Feature(FEATURE_HdrEditing, (1 << 5), false)); - if (android.media.codec.Flags.hlgEditing()) { + if (GetFlag(() -> android.media.codec.Flags.hlgEditing())) { features.add(new Feature(FEATURE_HlgEditing, (1 << 6), true)); } - if (android.media.codec.Flags.regionOfInterest()) { + if (GetFlag(() -> android.media.codec.Flags.regionOfInterest())) { features.add(new Feature(FEATURE_Roi, (1 << 7), true)); }