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

Commit 587adb18 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes I2cff6070,I5b59a3fc

* changes:
  stagefright: remove O-ABI specific requirements from ColorUtils
  stagefright: define ColorUtils enums independently from graphics HAL
parents 58d0ab1f 36aa5a11
Loading
Loading
Loading
Loading
+87 −3
Original line number Diff line number Diff line
@@ -398,6 +398,7 @@ void ColorUtils::setDefaultCodecColorAspectsIfNeeded(
}

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

const static
ALookup<CU::ColorStandard, CA::Primaries> sStandardPrimariesFallbacks {
    {
        { CU::kColorStandardFilm,                 CA::PrimariesGenericFilm },
@@ -430,7 +432,8 @@ ALookup<CU::ColorStandard, CA::Primaries> sStandardPrimariesFallbacks {
    }
};

static ALookup<android_dataspace, android_dataspace> sLegacyDataSpaceToV0 {
const static
ALookup<android_dataspace, android_dataspace> sLegacyDataSpaceToV0 {
    {
        { HAL_DATASPACE_SRGB, HAL_DATASPACE_V0_SRGB },
        { HAL_DATASPACE_BT709, HAL_DATASPACE_V0_BT709 },
@@ -441,6 +444,73 @@ 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::ColorTransfer, uint32_t> sGfxTransfers {
    {
        { CU::kColorTransferUnspecified, GET_HAL_BITFIELD(TRANSFER, UNSPECIFIED) },
        { CU::kColorTransferLinear,      GET_HAL_BITFIELD(TRANSFER, LINEAR) },
        { CU::kColorTransferSRGB,        GET_HAL_BITFIELD(TRANSFER, SRGB) },
        { CU::kColorTransferSMPTE_170M,  GET_HAL_BITFIELD(TRANSFER, SMPTE_170M) },
        { CU::kColorTransferGamma22,     GET_HAL_BITFIELD(TRANSFER, GAMMA2_2) },
        { CU::kColorTransferGamma28,     GET_HAL_BITFIELD(TRANSFER, GAMMA2_8) },
        { CU::kColorTransferST2084,      GET_HAL_BITFIELD(TRANSFER, ST2084) },
        { CU::kColorTransferHLG,         GET_HAL_BITFIELD(TRANSFER, HLG) },
    }
};

// verify public values are stable
static_assert(CU::kColorTransferUnspecified == 0, "SDK mismatch"); // N
static_assert(CU::kColorTransferLinear == 1, "SDK mismatch"); // N
static_assert(CU::kColorTransferSRGB == 2, "SDK mismatch"); // N
static_assert(CU::kColorTransferSMPTE_170M == 3, "SDK mismatch"); // N
static_assert(CU::kColorTransferST2084 == 6, "SDK mismatch"); // N
static_assert(CU::kColorTransferHLG == 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;
@@ -507,9 +577,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) {
+36 −36
Original line number Diff line number Diff line
@@ -39,26 +39,28 @@ 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

        /* 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
@@ -67,19 +69,19 @@ struct ColorUtils {
    };

    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, // not in SDK
        kColorTransferGamma22 =     4, // not in SDK
        kColorTransferGamma28 =     5, // not in SDK
        kColorTransferST2084 =      6,
        kColorTransferHLG =         7,
        kColorTransferGamma26 =     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. */
        kColorTransferExtendedStart = kColorTransferMax + 1,
        kColorTransferExtendedStart = 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. */
@@ -87,23 +89,19 @@ struct ColorUtils {
    };

    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,

        /* 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,6 +195,7 @@ 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;
    }
}
@@ -212,6 +211,7 @@ inline static const char *asString(android::ColorUtils::ColorTransfer i, const c
        case ColorUtils::kColorTransferGamma28:     return "Gamma28";
        case ColorUtils::kColorTransferST2084:      return "ST2084";
        case ColorUtils::kColorTransferHLG:         return "HLG";
        case ColorUtils::kColorTransferGamma26:     return "Gamma26";
        default:                                    return def;
    }
}