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