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

Commit 04e0a45e authored by Lajos Molnar's avatar Lajos Molnar
Browse files

stagefright:

define ColorUtils enums independently from graphics HAL

Graphics HAL changed in Android 8.0, but ColorUtils enums are exposed
to Android SDK. Define ColorUtils enums directly and map to HAL
enums as needed.

Also add enums introduced in Android 8.0.

Bug: 68709151
Change-Id: I5b59a3fcd045130c1840d8c811312cc6a38b11a7
parent 4f1e0847
Loading
Loading
Loading
Loading
+108 −18
Original line number Diff line number Diff line
@@ -62,17 +62,23 @@ ALookup<CU::ColorStandard, std::pair<CA::Primaries, CA::MatrixCoeffs>> sStandard
    }
};

// TODO: remove this. This is needed ABI compat as we used to instantiate this templated type.
const static
ALookup<CU::ColorTransfer, CA::Transfer> sTransfers{
ALookup<CU::ColorTransfer, CA::Transfer> __sTransfersForAbiCompat {
    {}
};

const static
ALookup<CU::ColorTransferSdk, CA::Transfer> sTransfers{
    {
        { CU::kColorTransferUnspecified,    CA::TransferUnspecified },
        { CU::kColorTransferLinear,         CA::TransferLinear },
        { CU::kColorTransferSRGB,           CA::TransferSRGB },
        { CU::kColorTransferSMPTE_170M,     CA::TransferSMPTE170M },
        { CU::kColorTransferGamma22,        CA::TransferGamma22 },
        { CU::kColorTransferGamma28,        CA::TransferGamma28 },
        { CU::kColorTransferST2084,         CA::TransferST2084 },
        { CU::kColorTransferHLG,            CA::TransferHLG },
        { CU::kColorTransferSdkUnspecified,    CA::TransferUnspecified },
        { CU::kColorTransferSdkLinear,         CA::TransferLinear },
        { CU::kColorTransferSdkSRGB,           CA::TransferSRGB },
        { CU::kColorTransferSdkSMPTE_170M,     CA::TransferSMPTE170M },
        { CU::kColorTransferSdkGamma22,        CA::TransferGamma22 },
        { CU::kColorTransferSdkGamma28,        CA::TransferGamma28 },
        { CU::kColorTransferSdkST2084,         CA::TransferST2084 },
        { CU::kColorTransferSdkHLG,            CA::TransferHLG },
    }
};

@@ -192,7 +198,7 @@ static bool isDefined(ColorAspects::Transfer t) {
//  static
int32_t ColorUtils::wrapColorAspectsIntoColorTransfer(
        ColorAspects::Transfer transfer) {
    ColorTransfer res;
    ColorTransferSdk res;
    if (sTransfers.map(transfer, &res)) {
        return res;
    } else if (!isValid(transfer)) {
@@ -208,7 +214,7 @@ int32_t ColorUtils::wrapColorAspectsIntoColorTransfer(
//static
status_t ColorUtils::unwrapColorAspectsFromColorTransfer(
        int32_t transfer, ColorAspects::Transfer *aspect) {
    if (sTransfers.map((ColorTransfer)transfer, aspect)) {
    if (sTransfers.map((ColorTransferSdk)transfer, aspect)) {
        return OK;
    }

@@ -398,6 +404,7 @@ void ColorUtils::setDefaultCodecColorAspectsIfNeeded(
}

// TODO: move this into a Video HAL
// TODO: make this const static
ALookup<CU::ColorStandard, std::pair<CA::Primaries, CA::MatrixCoeffs>> sStandardFallbacks {
    {
        { CU::kColorStandardBT601_625, { CA::PrimariesBT709_5, CA::MatrixBT470_6M } },
@@ -420,6 +427,7 @@ ALookup<CU::ColorStandard, std::pair<CA::Primaries, CA::MatrixCoeffs>> sStandard
    }
};

// TODO: make this const static
ALookup<CU::ColorStandard, CA::Primaries> sStandardPrimariesFallbacks {
    {
        { CU::kColorStandardFilm,                 CA::PrimariesGenericFilm },
@@ -430,7 +438,9 @@ ALookup<CU::ColorStandard, CA::Primaries> sStandardPrimariesFallbacks {
    }
};

static ALookup<android_dataspace, android_dataspace> sLegacyDataSpaceToV0 {
// TODO: make this const static
static
ALookup<android_dataspace, android_dataspace> sLegacyDataSpaceToV0 {
    {
        { HAL_DATASPACE_SRGB, HAL_DATASPACE_V0_SRGB },
        { HAL_DATASPACE_BT709, HAL_DATASPACE_V0_BT709 },
@@ -441,6 +451,72 @@ static ALookup<android_dataspace, android_dataspace> sLegacyDataSpaceToV0 {
    }
};

#define GET_HAL_ENUM(class, name) HAL_DATASPACE_##class##name
#define GET_HAL_BITFIELD(class, name) (GET_HAL_ENUM(class, _##name) >> GET_HAL_ENUM(class, _SHIFT))

const static
ALookup<CU::ColorStandard, uint32_t> sGfxStandards {
    {
        { CU::kColorStandardUnspecified,          GET_HAL_BITFIELD(STANDARD, UNSPECIFIED) },
        { CU::kColorStandardBT709,                GET_HAL_BITFIELD(STANDARD, BT709) },
        { CU::kColorStandardBT601_625,            GET_HAL_BITFIELD(STANDARD, BT601_625) },
        { CU::kColorStandardBT601_625_Unadjusted, GET_HAL_BITFIELD(STANDARD, BT601_625_UNADJUSTED) },
        { CU::kColorStandardBT601_525,            GET_HAL_BITFIELD(STANDARD, BT601_525) },
        { CU::kColorStandardBT601_525_Unadjusted, GET_HAL_BITFIELD(STANDARD, BT601_525_UNADJUSTED) },
        { CU::kColorStandardBT2020,               GET_HAL_BITFIELD(STANDARD, BT2020) },
        { CU::kColorStandardBT2020Constant,       GET_HAL_BITFIELD(STANDARD, BT2020_CONSTANT_LUMINANCE) },
        { CU::kColorStandardBT470M,               GET_HAL_BITFIELD(STANDARD, BT470M) },
        { CU::kColorStandardFilm,                 GET_HAL_BITFIELD(STANDARD, FILM) },
        { CU::kColorStandardDCI_P3,               GET_HAL_BITFIELD(STANDARD, DCI_P3) },
    }
};

// verify public values are stable
static_assert(CU::kColorStandardUnspecified == 0, "SDK mismatch"); // N
static_assert(CU::kColorStandardBT709 == 1, "SDK mismatch"); // N
static_assert(CU::kColorStandardBT601_625 == 2, "SDK mismatch"); // N
static_assert(CU::kColorStandardBT601_525 == 4, "SDK mismatch"); // N
static_assert(CU::kColorStandardBT2020 == 6, "SDK mismatch"); // N

const static
ALookup<CU::ColorTransferSdk, uint32_t> sGfxTransfers {
    {
        { CU::kColorTransferSdkUnspecified, GET_HAL_BITFIELD(TRANSFER, UNSPECIFIED) },
        { CU::kColorTransferSdkLinear,      GET_HAL_BITFIELD(TRANSFER, LINEAR) },
        { CU::kColorTransferSdkSRGB,        GET_HAL_BITFIELD(TRANSFER, SRGB) },
        { CU::kColorTransferSdkSMPTE_170M,  GET_HAL_BITFIELD(TRANSFER, SMPTE_170M) },
        { CU::kColorTransferSdkGamma22,     GET_HAL_BITFIELD(TRANSFER, GAMMA2_2) },
        { CU::kColorTransferSdkGamma28,     GET_HAL_BITFIELD(TRANSFER, GAMMA2_8) },
        { CU::kColorTransferSdkST2084,      GET_HAL_BITFIELD(TRANSFER, ST2084) },
        { CU::kColorTransferSdkHLG,         GET_HAL_BITFIELD(TRANSFER, HLG) },
    }
};

// verify public values are stable
static_assert(CU::kColorTransferSdkUnspecified == 0, "SDK mismatch"); // N
static_assert(CU::kColorTransferSdkLinear == 1, "SDK mismatch"); // N
static_assert(CU::kColorTransferSdkSRGB == 2, "SDK mismatch"); // N
static_assert(CU::kColorTransferSdkSMPTE_170M == 3, "SDK mismatch"); // N
static_assert(CU::kColorTransferSdkST2084 == 6, "SDK mismatch"); // N
static_assert(CU::kColorTransferSdkHLG == 7, "SDK mismatch"); // N

const static
ALookup<CU::ColorRange, uint32_t> sGfxRanges {
    {
        { CU::kColorRangeUnspecified, GET_HAL_BITFIELD(RANGE, UNSPECIFIED) },
        { CU::kColorRangeFull,        GET_HAL_BITFIELD(RANGE, FULL) },
        { CU::kColorRangeLimited,     GET_HAL_BITFIELD(RANGE, LIMITED) },
    }
};

// verify public values are stable
static_assert(CU::kColorRangeUnspecified == 0, "SDK mismatch"); // N
static_assert(CU::kColorRangeFull == 1, "SDK mismatch"); // N
static_assert(CU::kColorRangeLimited == 2, "SDK mismatch"); // N

#undef GET_HAL_BITFIELD
#undef GET_HAL_ENUM

bool ColorUtils::convertDataSpaceToV0(android_dataspace &dataSpace) {
    (void)sLegacyDataSpaceToV0.lookup(dataSpace, &dataSpace);
    return (dataSpace & 0xC000FFFF) == 0;
@@ -491,7 +567,7 @@ android_dataspace ColorUtils::getDataSpaceForColorAspects(ColorAspects &aspects,

    // default to video range and transfer
    ColorRange range = kColorRangeLimited;
    ColorTransfer transfer = kColorTransferSMPTE_170M;
    ColorTransferSdk transfer = kColorTransferSdkSMPTE_170M;
    (void)sRanges.map(aspects.mRange, &range);
    (void)sTransfers.map(aspects.mTransfer, &transfer);

@@ -507,9 +583,23 @@ android_dataspace ColorUtils::getDataSpaceForColorAspects(ColorAspects &aspects,
        }
    }

    // assume 1-to-1 mapping to HAL values (to deal with potential vendor extensions)
    uint32_t gfxRange = range;
    uint32_t gfxStandard = standard;
    uint32_t gfxTransfer = transfer;
    // TRICKY: use & to ensure all three mappings are completed
    if (!(sGfxRanges.map(range, &gfxRange) & sGfxStandards.map(standard, &gfxStandard)
            & sGfxTransfers.map(transfer, &gfxTransfer))) {
        ALOGW("could not safely map platform color aspects (R:%u(%s) S:%u(%s) T:%u(%s) to "
              "graphics dataspace (R:%u S:%u T:%u)",
              range, asString(range), standard, asString(standard), transfer, asString(transfer),
              gfxRange, gfxStandard, gfxTransfer);
    }

    android_dataspace dataSpace = (android_dataspace)(
            (range << HAL_DATASPACE_RANGE_SHIFT) | (standard << HAL_DATASPACE_STANDARD_SHIFT) |
            (transfer << HAL_DATASPACE_TRANSFER_SHIFT));
            (gfxRange << HAL_DATASPACE_RANGE_SHIFT) |
            (gfxStandard << HAL_DATASPACE_STANDARD_SHIFT) |
            (gfxTransfer << HAL_DATASPACE_TRANSFER_SHIFT));
    (void)sLegacyDataSpaceToV0.rlookup(dataSpace, &dataSpace);

    if (!mayExpand) {
@@ -558,7 +648,7 @@ void ColorUtils::getColorAspectsFromFormat(const sp<AMessage> &format, ColorAspe
        ALOGW("Ignoring illegal color aspects(R:%d(%s), S:%d(%s), T:%d(%s))",
                range, asString((ColorRange)range),
                standard, asString((ColorStandard)standard),
                transfer, asString((ColorTransfer)transfer));
                transfer, asString((ColorTransferSdk)transfer));
        // Invalid values were converted to unspecified !params!, but otherwise were not changed
        // For encoders, we leave these as is. For decoders, we will use default values.
    }
@@ -570,7 +660,7 @@ void ColorUtils::getColorAspectsFromFormat(const sp<AMessage> &format, ColorAspe
            aspects.mTransfer, asString(aspects.mTransfer),
            range, asString((ColorRange)range),
            standard, asString((ColorStandard)standard),
            transfer, asString((ColorTransfer)transfer));
            transfer, asString((ColorTransferSdk)transfer));
}

// static
@@ -597,7 +687,7 @@ void ColorUtils::setColorAspectsIntoFormat(
            aspects.mTransfer, asString(aspects.mTransfer),
            range, asString((ColorRange)range),
            standard, asString((ColorStandard)standard),
            transfer, asString((ColorTransfer)transfer));
            transfer, asString((ColorTransferSdk)transfer));
}

// static
+82 −35
Original line number Diff line number Diff line
@@ -39,26 +39,30 @@ struct ColorUtils {
     * vendor-extension section so they won't collide with future platform values.
     */

#define GET_HAL_ENUM(class, name) HAL_DATASPACE_##class##name
#define GET_HAL_BITFIELD(class, name) (GET_HAL_ENUM(class, _##name) >> GET_HAL_ENUM(class, _SHIFT))

    /**
     * graphic.h constants changed in Android 8.0 after ColorStandard values were already public
     * in Android 7.0. We will not deal with the break in graphic.h here, but list the public
     * Android SDK MediaFormat values here.
     */
    enum ColorStandard : uint32_t {
        kColorStandardUnspecified =          GET_HAL_BITFIELD(STANDARD, UNSPECIFIED),
        kColorStandardBT709 =                GET_HAL_BITFIELD(STANDARD, BT709),
        kColorStandardBT601_625 =            GET_HAL_BITFIELD(STANDARD, BT601_625),
        kColorStandardBT601_625_Unadjusted = GET_HAL_BITFIELD(STANDARD, BT601_625_UNADJUSTED),
        kColorStandardBT601_525 =            GET_HAL_BITFIELD(STANDARD, BT601_525),
        kColorStandardBT601_525_Unadjusted = GET_HAL_BITFIELD(STANDARD, BT601_525_UNADJUSTED),
        kColorStandardBT2020 =               GET_HAL_BITFIELD(STANDARD, BT2020),
        kColorStandardBT2020Constant =       GET_HAL_BITFIELD(STANDARD, BT2020_CONSTANT_LUMINANCE),
        kColorStandardBT470M =               GET_HAL_BITFIELD(STANDARD, BT470M),
        kColorStandardFilm =                 GET_HAL_BITFIELD(STANDARD, FILM),
        kColorStandardMax =                  GET_HAL_BITFIELD(STANDARD, MASK),
        kColorStandardUnspecified =          0,
        kColorStandardBT709 =                1,
        kColorStandardBT601_625 =            2,
        kColorStandardBT601_625_Unadjusted = 3, // not in SDK
        kColorStandardBT601_525 =            4,
        kColorStandardBT601_525_Unadjusted = 5, // not in SDK
        kColorStandardBT2020 =               6,
        kColorStandardBT2020Constant =       7, // not in SDK
        kColorStandardBT470M =               8, // not in SDK
        kColorStandardFilm =                 9, // not in SDK
        kColorStandardDCI_P3 =               10, // not in SDK, new in Android 8.0

        kColorStandardMax = 63, // TODO: remove post O

        /* This marks a section of color-standard values that are not supported by graphics HAL,
           but track defined color primaries-matrix coefficient combinations in media.
           These are stable for a given release. */
        kColorStandardExtendedStart = kColorStandardMax + 1,
        kColorStandardExtendedStart = 64,

        /* This marks a section of color-standard values that are not supported by graphics HAL
           nor using media defined color primaries or matrix coefficients. These may differ per
@@ -66,16 +70,20 @@ struct ColorUtils {
        kColorStandardVendorStart = 0x10000,
    };

    /**
     * These values shipped in Android O, but they do not correspond to the SDK values also in O.
     * DO NOT USE THIS ENUM.
     */
    enum ColorTransfer : uint32_t  {
        kColorTransferUnspecified = GET_HAL_BITFIELD(TRANSFER, UNSPECIFIED),
        kColorTransferLinear =      GET_HAL_BITFIELD(TRANSFER, LINEAR),
        kColorTransferSRGB =        GET_HAL_BITFIELD(TRANSFER, SRGB),
        kColorTransferSMPTE_170M =  GET_HAL_BITFIELD(TRANSFER, SMPTE_170M),
        kColorTransferGamma22 =     GET_HAL_BITFIELD(TRANSFER, GAMMA2_2),
        kColorTransferGamma28 =     GET_HAL_BITFIELD(TRANSFER, GAMMA2_8),
        kColorTransferST2084 =      GET_HAL_BITFIELD(TRANSFER, ST2084),
        kColorTransferHLG =         GET_HAL_BITFIELD(TRANSFER, HLG),
        kColorTransferMax =         GET_HAL_BITFIELD(TRANSFER, MASK),
        kColorTransferUnspecified = 0,
        kColorTransferLinear =      1,
        kColorTransferSRGB =        2,
        kColorTransferSMPTE_170M =  3,
        kColorTransferGamma22 =     4,
        kColorTransferGamma28 =     6,
        kColorTransferST2084 =      7,
        kColorTransferHLG =         8,
        kColorTransferMax =         31,

        /* This marks a section of color-transfer values that are not supported by graphics HAL,
           but track media-defined color-transfer. These are stable for a given release. */
@@ -86,24 +94,45 @@ struct ColorUtils {
        kColorTransferVendorStart = 0x10000,
    };

    /**
     * TODO: rename this into ColorTransfer post Android O.
     */
    enum ColorTransferSdk : uint32_t  {
        kColorTransferSdkUnspecified = 0,
        kColorTransferSdkLinear =      1,
        kColorTransferSdkSRGB =        2,
        kColorTransferSdkSMPTE_170M =  3, // not in SDK
        kColorTransferSdkGamma22 =     4, // not in SDK
        kColorTransferSdkGamma28 =     5, // not in SDK
        kColorTransferSdkST2084 =      6,
        kColorTransferSdkHLG =         7,
        kColorTransferSdkGamma26 =     8, // not in SDK, new in Android 8.0

        /* This marks a section of color-transfer values that are not supported by graphics HAL,
           but track media-defined color-transfer. These are stable for a given release. */
        kColorTransferSdkExtendedStart = 32,

        /* This marks a section of color-transfer values that are not supported by graphics HAL
           nor defined by media. These may differ per device. */
        kColorTransferSdkVendorStart = 0x10000,
    };

    enum ColorRange : uint32_t  {
        kColorRangeUnspecified = GET_HAL_BITFIELD(RANGE, UNSPECIFIED),
        kColorRangeFull =        GET_HAL_BITFIELD(RANGE, FULL),
        kColorRangeLimited =     GET_HAL_BITFIELD(RANGE, LIMITED),
        kColorRangeMax =         GET_HAL_BITFIELD(RANGE, MASK),
        kColorRangeUnspecified = 0,
        kColorRangeFull =        1,
        kColorRangeLimited =     2,

        kColorRangeMax = 7, // TODO: remove post O

        /* This marks a section of color-transfer values that are not supported by graphics HAL,
           but track media-defined color-transfer. These are stable for a given release. */
        kColorRangeExtendedStart = kColorRangeMax + 1,
        kColorRangeExtendedStart = 8,

        /* This marks a section of color-transfer values that are not supported by graphics HAL
           nor defined by media. These may differ per device. */
        kColorRangeVendorStart = 0x10000,
    };

#undef GET_HAL_BITFIELD
#undef GET_HAL_ENUM

    /*
     * Static utilities for codec support
     */
@@ -197,10 +226,12 @@ inline static const char *asString(android::ColorUtils::ColorStandard i, const c
        case ColorUtils::kColorStandardBT2020Constant:       return "BT2020Constant";
        case ColorUtils::kColorStandardBT470M:               return "BT470M";
        case ColorUtils::kColorStandardFilm:                 return "Film";
        case ColorUtils::kColorStandardDCI_P3:               return "DCI_P3";
        default:                                             return def;
    }
}

// TODO: remove post O
inline static const char *asString(android::ColorUtils::ColorTransfer i, const char *def = "??") {
    using namespace android;
    switch (i) {
@@ -216,6 +247,22 @@ inline static const char *asString(android::ColorUtils::ColorTransfer i, const c
    }
}

inline static const char *asString(android::ColorUtils::ColorTransferSdk i, const char *def = "??") {
    using namespace android;
    switch (i) {
        case ColorUtils::kColorTransferSdkUnspecified: return "Unspecified";
        case ColorUtils::kColorTransferSdkLinear:      return "Linear";
        case ColorUtils::kColorTransferSdkSRGB:        return "SRGB";
        case ColorUtils::kColorTransferSdkSMPTE_170M:  return "SMPTE_170M";
        case ColorUtils::kColorTransferSdkGamma22:     return "Gamma22";
        case ColorUtils::kColorTransferSdkGamma28:     return "Gamma28";
        case ColorUtils::kColorTransferSdkST2084:      return "ST2084";
        case ColorUtils::kColorTransferSdkHLG:         return "HLG";
        case ColorUtils::kColorTransferSdkGamma26:     return "Gamma26";
        default:                                       return def;
    }
}

inline static const char *asString(android::ColorUtils::ColorRange i, const char *def = "??") {
    using namespace android;
    switch (i) {