summaryrefslogtreecommitdiff
path: root/include/color_metadata.h
blob: aff6fc936c3f225e9892e96d3f686ccd1bcf970b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/*
* Copyright (c) 2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*    * Redistributions of source code must retain the above copyright notice, this list of
*      conditions and the following disclaimer.
*    * Redistributions in binary form must reproduce the above copyright notice, this list of
*      conditions and the following disclaimer in the documentation and/or other materials provided
*      with the distribution.
*    * Neither the name of The Linux Foundation nor the names of its contributors may be used to
*      endorse or promote products derived from this software without specific prior written
*      permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef __COLOR_METADATA_H__
#define __COLOR_METADATA_H__

#ifdef __cplusplus
extern "C" {
#else
#include <stdbool.h>
#endif

typedef enum ColorRange {
  Range_Limited = 0,
  Range_Full    = 1,
  Range_Max     = 0xff,
} ColorRange;

// The following values matches the HEVC spec
typedef enum ColorPrimaries {
  // Unused = 0;
  ColorPrimaries_BT709_5     = 1,  // ITU-R BT.709-5 or equivalent
  /* Unspecified = 2, Reserved = 3*/
  ColorPrimaries_BT470_6M    = 4,  // ITU-R BT.470-6 System M or equivalent
  ColorPrimaries_BT601_6_625 = 5,  // ITU-R BT.601-6 625 or equivalent
  ColorPrimaries_BT601_6_525 = 6,  // ITU-R BT.601-6 525 or equivalent
  ColorPrimaries_SMPTE_240M  = 7,  // SMPTE_240M
  ColorPrimaries_GenericFilm = 8,  // Generic Film
  ColorPrimaries_BT2020      = 9,  // ITU-R BT.2020 or equivalent
  ColorPrimaries_SMPTE_ST428 = 10,  // SMPTE_240M
  ColorPrimaries_AdobeRGB    = 11,
  ColorPrimaries_DCIP3       = 12,
  ColorPrimaries_EBU3213     = 22,
  ColorPrimaries_Max         = 0xff,
} ColorPrimaries;

typedef enum GammaTransfer {
  // Unused = 0;
  Transfer_sRGB            = 1,  // ITR-BT.709-5
  /* Unspecified = 2, Reserved = 3 */
  Transfer_Gamma2_2        = 4,
  Transfer_Gamma2_8        = 5,
  Transfer_SMPTE_170M      = 6,  // BT.601-6 525 or 625
  Transfer_SMPTE_240M      = 7,  // SMPTE_240M
  Transfer_Linear          = 8,
  Transfer_Log             = 9,
  Transfer_Log_Sqrt        = 10,
  Transfer_XvYCC           = 11,  // IEC 61966-2-4
  Transfer_BT1361          = 12,  // Rec.ITU-R BT.1361 extended gamut
  Transfer_sYCC            = 13,  // IEC 61966-2-1 sRGB or sYCC
  Transfer_BT2020_2_1      = 14,  // Rec. ITU-R BT.2020-2 (same as the values 1, 6, and 15)
  Transfer_BT2020_2_2      = 15,  // Rec. ITU-R BT.2020-2 (same as the values 1, 6, and 14)
  Transfer_SMPTE_ST2084    = 16,  // 2084
  // transfers unlikely to be required by Android
  Transfer_ST_428          = 17,  // SMPTE ST 428-1
  Transfer_HLG             = 18,  // ARIB STD-B67
  Transfer_Max             = 0xff,
} GammaTransfer;

typedef enum MatrixCoEfficients {
  MatrixCoEff_Identity           = 0,
  MatrixCoEff_BT709_5            = 1,
  /* Unspecified = 2, Reserved = 3 */
  MatrixCoeff_FCC_73_682         = 4,
  MatrixCoEff_BT601_6_625        = 5,
  MatrixCoEff_BT601_6_525        = 6,
  MatrixCoEff_SMPTE240M          = 7,  // used with 601_525_Unadjusted
  MatrixCoEff_YCgCo              = 8,
  MatrixCoEff_BT2020             = 9,
  MatrixCoEff_BT2020Constant     = 10,
  MatrixCoEff_BT601_6_Unadjusted = 11,  // Used with BT601_625(KR=0.222, KB=0.071)
  MatrixCoEff_DCIP3              = 12,
  MatrixCoEff_Chroma_NonConstant = 13,
  MatrixCoEff_Max                = 0xff,
} MatrixCoEfficients;

typedef struct Primaries {
  uint32_t rgbPrimaries[3][2];  // unit 1/50000;
  uint32_t whitePoint[2];  // unit 1/50000;
} Primaries;

typedef struct MasteringDisplay {
  bool      colorVolumeSEIEnabled;
  Primaries primaries;
  uint32_t  maxDisplayLuminance;  // unit: cd/m^2.
  uint32_t  minDisplayLuminance;  // unit: 1/10000 cd/m^2.
} MasteringDisplay;

typedef struct ContentLightLevel {
  bool     lightLevelSEIEnabled;
  uint32_t maxContentLightLevel;  // unit: cd/m^2.
  uint32_t minPicAverageLightLevel;  // unit: 1/10000 cd/m^2.
} ContentLightLevel;

typedef struct ColorRemappingInfo {
  bool               criEnabled;
  uint32_t           crId;
  uint32_t           crCancelFlag;
  uint32_t           crPersistenceFlag;
  uint32_t           crVideoSignalInfoPresentFlag;
  uint32_t           crRange;
  ColorPrimaries     crPrimaries;
  GammaTransfer      crTransferFunction;
  MatrixCoEfficients crMatrixCoefficients;
  uint32_t           crInputBitDepth;
  uint32_t           crOutputBitDepth;
  uint32_t           crPreLutNumValMinusOne[3];
  uint32_t           crPreLutCodedValue[3*33];
  uint32_t           crPreLutTargetValue[3*33];
  uint32_t           crMatrixPresentFlag;
  uint32_t           crLog2MatrixDenom;
  int32_t            crCoefficients[3*3];
  uint32_t           crPostLutNumValMinusOne[3];
  uint32_t           crPostLutCodedValue[3*33];
  uint32_t           crPostLutTargetValue[3*33];
} ColorRemappingInfo;

typedef struct ColorMetaData {
  // Default values based on sRGB, needs to be overridden in gralloc
  // based on the format and size.
  ColorPrimaries     colorPrimaries;
  ColorRange         range;
  GammaTransfer      transfer;
  MatrixCoEfficients matrixCoefficients;

  MasteringDisplay   masteringDisplayInfo;
  ContentLightLevel  contentLightLevel;
  ColorRemappingInfo cRI;
} ColorMetaData;

typedef struct Color10Bit {
  uint32_t R: 10;
  uint32_t G: 10;
  uint32_t B: 10;
  uint32_t A: 2;
} Color10Bit;

typedef struct Lut3d {
  uint16_t dim;  // dimension of each side of LUT cube (ex: 13, 17)in lutEntries
  uint16_t gridSize;  // number of elements in the gridEntries
  /* Matrix ordering convension
  for (b = 0; b < dim; b++) {
    for (g = 0; g < dim; g++) {
      for (r = 0; r < dim; r++) {
        read/write [mR mG mB] associated w/ 3DLUT[r][g][b] to/from file
      }
    }
  } */
  Color10Bit *lutEntries;
  bool validLutEntries;  // Indicates if entries are valid and can be used.
  /*
   The grid is a 1D LUT for each of the R,G,B channels that can be
   used to apply an independent nonlinear transformation to each
   channel before it is used as a coordinate for addressing
   the uniform 3D LUT.  This effectively creates a non-uniformly
   sampled 3D LUT.  This is useful for having independent control
   of the sampling grid density along each dimension for greater
   precision in spite of having a relatively small number of samples.i
  */
  Color10Bit *gridEntries;
  bool validGridEntries;  // Indicates if entries are valid and can be used.
} Lut3d;

#ifdef __cplusplus
}
#endif

#endif  // __COLOR_METADATA_H__