1 /* 2 * Copyright (c) 2016, The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without modification, are permitted 5 * provided that the following conditions are met: 6 * * Redistributions of source code must retain the above copyright notice, this list of 7 * conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above copyright notice, this list of 9 * conditions and the following disclaimer in the documentation and/or other materials provided 10 * with the distribution. 11 * * Neither the name of The Linux Foundation nor the names of its contributors may be used to 12 * endorse or promote products derived from this software without specific prior written 13 * permission. 14 * 15 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 19 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24 25 #ifndef __COLOR_METADATA_H__ 26 #define __COLOR_METADATA_H__ 27 28 #ifdef __cplusplus 29 extern "C" { 30 #else 31 #include <stdbool.h> 32 #endif 33 34 typedef enum ColorRange { 35 Range_Limited = 0, 36 Range_Full = 1, 37 Range_Max = 0xff, 38 } ColorRange; 39 40 // The following values matches the HEVC spec 41 typedef enum ColorPrimaries { 42 // Unused = 0; 43 ColorPrimaries_BT709_5 = 1, // ITU-R BT.709-5 or equivalent 44 /* Unspecified = 2, Reserved = 3*/ 45 ColorPrimaries_BT470_6M = 4, // ITU-R BT.470-6 System M or equivalent 46 ColorPrimaries_BT601_6_625 = 5, // ITU-R BT.601-6 625 or equivalent 47 ColorPrimaries_BT601_6_525 = 6, // ITU-R BT.601-6 525 or equivalent 48 ColorPrimaries_SMPTE_240M = 7, // SMPTE_240M 49 ColorPrimaries_GenericFilm = 8, // Generic Film 50 ColorPrimaries_BT2020 = 9, // ITU-R BT.2020 or equivalent 51 ColorPrimaries_SMPTE_ST428 = 10, // SMPTE_240M 52 ColorPrimaries_AdobeRGB = 11, 53 ColorPrimaries_DCIP3 = 12, 54 ColorPrimaries_EBU3213 = 22, 55 ColorPrimaries_Max = 0xff, 56 } ColorPrimaries; 57 58 typedef enum GammaTransfer { 59 // Unused = 0; 60 Transfer_sRGB = 1, // ITR-BT.709-5 61 /* Unspecified = 2, Reserved = 3 */ 62 Transfer_Gamma2_2 = 4, 63 Transfer_Gamma2_8 = 5, 64 Transfer_SMPTE_170M = 6, // BT.601-6 525 or 625 65 Transfer_SMPTE_240M = 7, // SMPTE_240M 66 Transfer_Linear = 8, 67 Transfer_Log = 9, 68 Transfer_Log_Sqrt = 10, 69 Transfer_XvYCC = 11, // IEC 61966-2-4 70 Transfer_BT1361 = 12, // Rec.ITU-R BT.1361 extended gamut 71 Transfer_sYCC = 13, // IEC 61966-2-1 sRGB or sYCC 72 Transfer_BT2020_2_1 = 14, // Rec. ITU-R BT.2020-2 (same as the values 1, 6, and 15) 73 Transfer_BT2020_2_2 = 15, // Rec. ITU-R BT.2020-2 (same as the values 1, 6, and 14) 74 Transfer_SMPTE_ST2084 = 16, // 2084 75 // transfers unlikely to be required by Android 76 Transfer_ST_428 = 17, // SMPTE ST 428-1 77 Transfer_HLG = 18, // ARIB STD-B67 78 Transfer_Max = 0xff, 79 } GammaTransfer; 80 81 typedef enum MatrixCoEfficients { 82 MatrixCoEff_Identity = 0, 83 MatrixCoEff_BT709_5 = 1, 84 /* Unspecified = 2, Reserved = 3 */ 85 MatrixCoeff_FCC_73_682 = 4, 86 MatrixCoEff_BT601_6_625 = 5, 87 MatrixCoEff_BT601_6_525 = 6, 88 MatrixCoEff_SMPTE240M = 7, // used with 601_525_Unadjusted 89 MatrixCoEff_YCgCo = 8, 90 MatrixCoEff_BT2020 = 9, 91 MatrixCoEff_BT2020Constant = 10, 92 MatrixCoEff_BT601_6_Unadjusted = 11, // Used with BT601_625(KR=0.222, KB=0.071) 93 MatrixCoEff_DCIP3 = 12, 94 MatrixCoEff_Chroma_NonConstant = 13, 95 MatrixCoEff_Max = 0xff, 96 } MatrixCoEfficients; 97 98 typedef struct Primaries { 99 uint32_t rgbPrimaries[3][2]; // unit 1/50000; 100 uint32_t whitePoint[2]; // unit 1/50000; 101 } Primaries; 102 103 typedef struct MasteringDisplay { 104 bool colorVolumeSEIEnabled; 105 Primaries primaries; 106 uint32_t maxDisplayLuminance; // unit: cd/m^2. 107 uint32_t minDisplayLuminance; // unit: 1/10000 cd/m^2. 108 } MasteringDisplay; 109 110 typedef struct ContentLightLevel { 111 bool lightLevelSEIEnabled; 112 uint32_t maxContentLightLevel; // unit: cd/m^2. 113 uint32_t minPicAverageLightLevel; // unit: 1/10000 cd/m^2. 114 } ContentLightLevel; 115 116 typedef struct ColorRemappingInfo { 117 bool criEnabled; 118 uint32_t crId; 119 uint32_t crCancelFlag; 120 uint32_t crPersistenceFlag; 121 uint32_t crVideoSignalInfoPresentFlag; 122 uint32_t crRange; 123 ColorPrimaries crPrimaries; 124 GammaTransfer crTransferFunction; 125 MatrixCoEfficients crMatrixCoefficients; 126 uint32_t crInputBitDepth; 127 uint32_t crOutputBitDepth; 128 uint32_t crPreLutNumValMinusOne[3]; 129 uint32_t crPreLutCodedValue[3*33]; 130 uint32_t crPreLutTargetValue[3*33]; 131 uint32_t crMatrixPresentFlag; 132 uint32_t crLog2MatrixDenom; 133 int32_t crCoefficients[3*3]; 134 uint32_t crPostLutNumValMinusOne[3]; 135 uint32_t crPostLutCodedValue[3*33]; 136 uint32_t crPostLutTargetValue[3*33]; 137 } ColorRemappingInfo; 138 139 typedef struct ColorMetaData { 140 // Default values based on sRGB, needs to be overridden in gralloc 141 // based on the format and size. 142 ColorPrimaries colorPrimaries; 143 ColorRange range; 144 GammaTransfer transfer; 145 MatrixCoEfficients matrixCoefficients; 146 147 MasteringDisplay masteringDisplayInfo; 148 ContentLightLevel contentLightLevel; 149 ColorRemappingInfo cRI; 150 } ColorMetaData; 151 152 typedef struct Color10Bit { 153 uint32_t R: 10; 154 uint32_t G: 10; 155 uint32_t B: 10; 156 uint32_t A: 2; 157 } Color10Bit; 158 159 typedef struct Lut3d { 160 uint16_t dim; // dimension of each side of LUT cube (ex: 13, 17)in lutEntries 161 uint16_t gridSize; // number of elements in the gridEntries 162 /* Matrix ordering convension 163 for (b = 0; b < dim; b++) { 164 for (g = 0; g < dim; g++) { 165 for (r = 0; r < dim; r++) { 166 read/write [mR mG mB] associated w/ 3DLUT[r][g][b] to/from file 167 } 168 } 169 } */ 170 Color10Bit *lutEntries; 171 bool validLutEntries; // Indicates if entries are valid and can be used. 172 /* 173 The grid is a 1D LUT for each of the R,G,B channels that can be 174 used to apply an independent nonlinear transformation to each 175 channel before it is used as a coordinate for addressing 176 the uniform 3D LUT. This effectively creates a non-uniformly 177 sampled 3D LUT. This is useful for having independent control 178 of the sampling grid density along each dimension for greater 179 precision in spite of having a relatively small number of samples.i 180 */ 181 Color10Bit *gridEntries; 182 bool validGridEntries; // Indicates if entries are valid and can be used. 183 } Lut3d; 184 185 #ifdef __cplusplus 186 } 187 #endif 188 189 #endif // __COLOR_METADATA_H__ 190