ColorUtils.h revision 3a09d8d6f909063990a5681b15a442b2ba8ce54a
13a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar/*
23a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * Copyright (C) 2016 The Android Open Source Project
33a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *
43a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
53a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * you may not use this file except in compliance with the License.
63a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * You may obtain a copy of the License at
73a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *
83a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
93a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar *
103a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * Unless required by applicable law or agreed to in writing, software
113a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
123a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * See the License for the specific language governing permissions and
143a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar * limitations under the License.
153a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar */
163a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
173a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#ifndef COLOR_UTILS_H_
183a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
193a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define COLOR_UTILS_H_
203a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
213a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <stdint.h>
223a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
233a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define STRINGIFY_ENUMS
243a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
253a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/stagefright/foundation/AMessage.h>
263a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
273a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <media/hardware/VideoAPI.h>
283a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#include <system/graphics.h>
293a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
303a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarnamespace android {
313a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
323a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarstruct ColorUtils {
333a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    /*
343a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * Media-platform color constants. MediaCodec uses (an extended version of) platform-defined
353a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * constants that are derived from HAL_DATASPACE, since these are directly exposed to the user.
363a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * We extend the values to maintain the richer set of information defined inside media
373a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * containers and bitstreams that are not supported by the platform. We also expect vendors
383a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * to extend some of these values with vendor-specific values. These are separated into a
393a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * vendor-extension section so they won't collide with future platform values.
403a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     */
413a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
423a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define GET_HAL_ENUM(class, name) HAL_DATASPACE_##class##name
433a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#define GET_HAL_BITFIELD(class, name) (GET_HAL_ENUM(class, _##name) >> GET_HAL_ENUM(class, _SHIFT))
443a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
453a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    enum ColorStandard : uint32_t {
463a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardUnspecified =          GET_HAL_BITFIELD(STANDARD, UNSPECIFIED),
473a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT709 =                GET_HAL_BITFIELD(STANDARD, BT709),
483a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT601_625 =            GET_HAL_BITFIELD(STANDARD, BT601_625),
493a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT601_625_Unadjusted = GET_HAL_BITFIELD(STANDARD, BT601_625_UNADJUSTED),
503a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT601_525 =            GET_HAL_BITFIELD(STANDARD, BT601_525),
513a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT601_525_Unadjusted = GET_HAL_BITFIELD(STANDARD, BT601_525_UNADJUSTED),
523a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT2020 =               GET_HAL_BITFIELD(STANDARD, BT2020),
533a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT2020Constant =       GET_HAL_BITFIELD(STANDARD, BT2020_CONSTANT_LUMINANCE),
543a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardBT470M =               GET_HAL_BITFIELD(STANDARD, BT470M),
553a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardFilm =                 GET_HAL_BITFIELD(STANDARD, FILM),
563a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardMax =                  GET_HAL_BITFIELD(STANDARD, MASK),
573a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
583a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-standard values that are not supported by graphics HAL,
593a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           but track defined color primaries-matrix coefficient combinations in media.
603a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           These are stable for a given release. */
613a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardExtendedStart = kColorStandardMax + 1,
623a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
633a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-standard values that are not supported by graphics HAL
643a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           nor using media defined color primaries or matrix coefficients. These may differ per
653a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           device. */
663a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorStandardVendorStart = 0x10000,
673a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    };
683a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
693a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    enum ColorTransfer : uint32_t  {
703a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferUnspecified = GET_HAL_BITFIELD(TRANSFER, UNSPECIFIED),
713a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferLinear =      GET_HAL_BITFIELD(TRANSFER, LINEAR),
723a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferSRGB =        GET_HAL_BITFIELD(TRANSFER, SRGB),
733a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferSMPTE_170M =  GET_HAL_BITFIELD(TRANSFER, SMPTE_170M),
743a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferGamma22 =     GET_HAL_BITFIELD(TRANSFER, GAMMA2_2),
753a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferGamma28 =     GET_HAL_BITFIELD(TRANSFER, GAMMA2_8),
763a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferST2084 =      GET_HAL_BITFIELD(TRANSFER, ST2084),
773a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferHLG =         GET_HAL_BITFIELD(TRANSFER, HLG),
783a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferMax =         GET_HAL_BITFIELD(TRANSFER, MASK),
793a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
803a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL,
813a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           but track media-defined color-transfer. These are stable for a given release. */
823a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferExtendedStart = kColorTransferMax + 1,
833a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
843a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL
853a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           nor defined by media. These may differ per device. */
863a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorTransferVendorStart = 0x10000,
873a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    };
883a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
893a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    enum ColorRange : uint32_t  {
903a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeUnspecified = GET_HAL_BITFIELD(RANGE, UNSPECIFIED),
913a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeFull =        GET_HAL_BITFIELD(RANGE, FULL),
923a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeLimited =     GET_HAL_BITFIELD(RANGE, LIMITED),
933a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeMax =         GET_HAL_BITFIELD(RANGE, MASK),
943a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
953a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL,
963a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           but track media-defined color-transfer. These are stable for a given release. */
973a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeExtendedStart = kColorRangeMax + 1,
983a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
993a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        /* This marks a section of color-transfer values that are not supported by graphics HAL
1003a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar           nor defined by media. These may differ per device. */
1013a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        kColorRangeVendorStart = 0x10000,
1023a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    };
1033a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1043a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#undef GET_HAL_BITFIELD
1053a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#undef GET_HAL_ENUM
1063a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1073a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    /*
1083a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     * Static utilities for codec support
1093a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar     */
1103a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1113a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // using int32_t for media range/standard/transfers to denote extended ranges
1123a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // wrap methods change invalid aspects to the Unspecified value
1133a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static int32_t wrapColorAspectsIntoColorStandard(
1143a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            ColorAspects::Primaries primaries, ColorAspects::MatrixCoeffs coeffs);
1153a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static int32_t wrapColorAspectsIntoColorRange(ColorAspects::Range range);
1163a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static int32_t wrapColorAspectsIntoColorTransfer(ColorAspects::Transfer transfer);
1173a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1183a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // unwrap methods change invalid aspects to the Other value
1193a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t unwrapColorAspectsFromColorRange(
1203a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t range, ColorAspects::Range *aspect);
1213a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t unwrapColorAspectsFromColorTransfer(
1223a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t transfer, ColorAspects::Transfer *aspect);
1233a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t unwrapColorAspectsFromColorStandard(
1243a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t standard,
1253a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            ColorAspects::Primaries *primaries, ColorAspects::MatrixCoeffs *coeffs);
1263a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1273a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t convertPlatformColorAspectsToCodecAspects(
1283a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t range, int32_t standard, int32_t transfer, ColorAspects &aspects);
1293a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static status_t convertCodecColorAspectsToPlatformAspects(
1303a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            const ColorAspects &aspects, int32_t *range, int32_t *standard, int32_t *transfer);
1313a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1323a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    // updates unspecified range, standard and transfer values to their defaults
1333a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static void setDefaultPlatformColorAspectsIfNeeded(
1343a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            int32_t &range, int32_t &standard, int32_t &transfer, int32_t width, int32_t height);
1353a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    static void setDefaultCodecColorAspectsIfNeeded(
1363a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar            ColorAspects &aspects, int32_t width, int32_t height);
1373a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar};
1383a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1393a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarinline static const char *asString(android::ColorUtils::ColorStandard i, const char *def = "??") {
1403a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    using namespace android;
1413a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    switch (i) {
1423a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardUnspecified:          return "Unspecified";
1433a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT709:                return "BT709";
1443a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_625:            return "BT601_625";
1453a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_625_Unadjusted: return "BT601_625_Unadjusted";
1463a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_525:            return "BT601_525";
1473a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT601_525_Unadjusted: return "BT601_525_Unadjusted";
1483a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT2020:               return "BT2020";
1493a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT2020Constant:       return "BT2020Constant";
1503a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardBT470M:               return "BT470M";
1513a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorStandardFilm:                 return "Film";
1523a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        default:                                            return def;
1533a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    }
1543a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}
1553a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1563a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarinline static const char *asString(android::ColorUtils::ColorTransfer i, const char *def = "??") {
1573a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    using namespace android;
1583a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    switch (i) {
1593a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferUnspecified: return "Unspecified";
1603a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferLinear:      return "Linear";
1613a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferSRGB:        return "SRGB";
1623a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferSMPTE_170M:  return "SMPTE_170M";
1633a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferGamma22:     return "Gamma22";
1643a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferGamma28:     return "Gamma28";
1653a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferST2084:      return "ST2084";
1663a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorTransferHLG:         return "HLG";
1673a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        default:                                   return def;
1683a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    }
1693a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}
1703a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1713a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnarinline static const char *asString(android::ColorUtils::ColorRange i, const char *def = "??") {
1723a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    using namespace android;
1733a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    switch (i) {
1743a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorRangeUnspecified: return "Unspecified";
1753a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorRangeFull:        return "Full";
1763a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        case ColorUtils::kColorRangeLimited:     return "Limited";
1773a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar        default:                                return def;
1783a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar    }
1793a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}
1803a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1813a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar}  // namespace android
1823a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
1833a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar#endif  // COLOR_UTILS_H_
1843a09d8d6f909063990a5681b15a442b2ba8ce54aLajos Molnar
185