Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a4bef0f authored by Lajos Molnar's avatar Lajos Molnar
Browse files

media: protect around all codec_fwk aconfig flag access

This is hopefully a temporary workaround until this functionality
is added to the generated stubs.

Related-Bug: 325389296
Bug: 331666510
Change-Id: Ie08c9241f61e44c8e9857c2cf761fc43ac7fe35f
parent 03eb2ee1
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -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) {
+5 −4
Original line number Diff line number Diff line
@@ -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));
                }