1 /*
2 * Copyright (C) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "color_utils.h"
16
17 namespace OHOS {
18 namespace Media {
19 enum CicpColorPrimaries {
20 CICP_COLORPRIMARIES_UNKNOWN = 0,
21 CICP_COLORPRIMARIES_SRGB = 1,
22 CICP_COLORPRIMARIES_BT601_P = 5,
23 CICP_COLORPRIMARIES_BT601_N = 6,
24 CICP_COLORPRIMARIES_BT2020 = 9,
25 CICP_COLORPRIMARIES_BT2100 = 9,
26 CICP_COLORPRIMARIES_P3_DCI = 11,
27 CICP_COLORPRIMARIES_P3_D65 = 12,
28 };
29
30 enum CicpTransfer {
31 CICP_TRANSFER_UNKNOWN = 2,
32 CICP_TRANSFER_BT709_1 = 1,
33 CICP_TRANSFER_BT709_6 = 6,
34 CICP_TRANSFER_BT709_14 = 14,
35 CICP_TRANSFER_BT709_15 = 15,
36 CICP_TRANSFER_SRGB = 13,
37 CICP_TRANSFER_LINEAR = 8,
38 CICP_TRANSFER_PQ = 16,
39 CICP_TRANSFER_HLG = 18,
40 };
41
42 enum CicpFullRangeFLag {
43 CICP_FULL_RANGE_UNKNOWN = 2,
44 CICP_FULL_RANGE_FULL = 1,
45 CICP_FULL_RANGE_LIMIT = 0,
46 };
47
48 enum CicpMatrix {
49 CICP_MATRIX_BT709 = 1,
50 CICP_MATRIX_BT601_P = 5,
51 CICP_MATRIX_BT601_N = 6,
52 CICP_MATRIX_P3 = 6,
53 CICP_MATRIX_BT2020 = 9,
54 CICP_MATRIX_BT2100_ICTCP = 14,
55 };
56
P3ToColorSpace(uint16_t transfer,uint8_t range)57 ColorManager::ColorSpaceName P3ToColorSpace(uint16_t transfer, uint8_t range)
58 {
59 if (transfer == CICP_TRANSFER_PQ) {
60 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::P3_PQ_LIMIT : ColorManager::P3_PQ;
61 } else if (transfer == CICP_TRANSFER_HLG) {
62 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::P3_HLG_LIMIT : ColorManager::P3_HLG;
63 } else if (transfer == CICP_TRANSFER_SRGB) {
64 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::DISPLAY_P3_LIMIT : ColorManager::DISPLAY_P3;
65 }
66 return ColorManager::NONE;
67 }
68
BT2020ToColorSpace(uint16_t transfer,uint8_t range)69 ColorManager::ColorSpaceName BT2020ToColorSpace(uint16_t transfer, uint8_t range)
70 {
71 if (transfer == CICP_TRANSFER_PQ) {
72 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT2020_PQ_LIMIT : ColorManager::BT2020_PQ;
73 } else if (transfer == CICP_TRANSFER_HLG) {
74 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT2020_HLG_LIMIT : ColorManager::BT2020_HLG;
75 }
76 return ColorManager::NONE;
77 }
78
CicpToColorSpace(uint16_t primaries,uint16_t transfer,uint16_t matrix,uint8_t range)79 ColorManager::ColorSpaceName ColorUtils::CicpToColorSpace(uint16_t primaries, uint16_t transfer,
80 uint16_t matrix, uint8_t range)
81 {
82 switch (primaries) {
83 case CICP_COLORPRIMARIES_SRGB:
84 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::SRGB_LIMIT : ColorManager::SRGB;
85 case CICP_COLORPRIMARIES_P3_D65:
86 return P3ToColorSpace(transfer, range);
87 case CICP_COLORPRIMARIES_BT2020:
88 return BT2020ToColorSpace(transfer, range);
89 case CICP_COLORPRIMARIES_BT601_N:
90 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_SMPTE_C_LIMIT : ColorManager::BT601_SMPTE_C;
91 case CICP_COLORPRIMARIES_BT601_P:
92 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_EBU_LIMIT : ColorManager::BT601_EBU;
93 case CICP_COLORPRIMARIES_P3_DCI:
94 return ColorManager::DCI_P3;
95 default:
96 break;
97 }
98 return ColorManager::NONE;
99 }
100
GetPrimaries(ColorManager::ColorSpaceName name)101 uint16_t ColorUtils::GetPrimaries(ColorManager::ColorSpaceName name)
102 {
103 switch (name) {
104 case ColorManager::ColorSpaceName::SRGB:
105 case ColorManager::ColorSpaceName::SRGB_LIMIT:
106 return CICP_COLORPRIMARIES_SRGB;
107 case ColorManager::ColorSpaceName::DISPLAY_P3:
108 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
109 case ColorManager::ColorSpaceName::DCI_P3:
110 return CICP_COLORPRIMARIES_P3_D65;
111 case ColorManager::ColorSpaceName::BT2020:
112 case ColorManager::ColorSpaceName::BT2020_HLG:
113 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
114 case ColorManager::ColorSpaceName::BT2020_PQ:
115 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
116 return CICP_COLORPRIMARIES_BT2020;
117 default:
118 return CICP_COLORPRIMARIES_UNKNOWN;
119 }
120 }
121
GetTransfer(ColorManager::ColorSpaceName name)122 uint16_t GetTransfer(ColorManager::ColorSpaceName name)
123 {
124 switch (name) {
125 case ColorManager::ColorSpaceName::SRGB:
126 case ColorManager::ColorSpaceName::SRGB_LIMIT:
127 case ColorManager::ColorSpaceName::DISPLAY_P3:
128 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
129 case ColorManager::ColorSpaceName::DCI_P3:
130 return CICP_TRANSFER_SRGB;
131 case ColorManager::ColorSpaceName::BT2020:
132 case ColorManager::ColorSpaceName::BT2020_HLG:
133 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
134 return CICP_TRANSFER_HLG;
135 case ColorManager::ColorSpaceName::BT2020_PQ:
136 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
137 return CICP_TRANSFER_PQ;
138 default:
139 return CICP_TRANSFER_UNKNOWN;
140 }
141 }
142
GetMatrix(ColorManager::ColorSpaceName name)143 uint16_t GetMatrix(ColorManager::ColorSpaceName name)
144 {
145 switch (name) {
146 case ColorManager::ColorSpaceName::SRGB:
147 case ColorManager::ColorSpaceName::SRGB_LIMIT:
148 return CICP_MATRIX_BT601_N;
149 case ColorManager::ColorSpaceName::DISPLAY_P3:
150 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
151 case ColorManager::ColorSpaceName::DCI_P3:
152 return CICP_MATRIX_P3;
153 case ColorManager::ColorSpaceName::BT2020:
154 case ColorManager::ColorSpaceName::BT2020_HLG:
155 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
156 case ColorManager::ColorSpaceName::BT2020_PQ:
157 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
158 return CICP_MATRIX_BT2020;
159 default:
160 return CICP_TRANSFER_UNKNOWN;
161 }
162 }
163
GetRangeFlag(ColorManager::ColorSpaceName name)164 uint16_t GetRangeFlag(ColorManager::ColorSpaceName name)
165 {
166 switch (name) {
167 case ColorManager::ColorSpaceName::SRGB:
168 case ColorManager::ColorSpaceName::DISPLAY_P3:
169 case ColorManager::ColorSpaceName::DCI_P3:
170 case ColorManager::ColorSpaceName::BT2020:
171 case ColorManager::ColorSpaceName::BT2020_HLG:
172 case ColorManager::ColorSpaceName::BT2020_PQ:
173 return CICP_FULL_RANGE_FULL;
174 case ColorManager::ColorSpaceName::SRGB_LIMIT:
175 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
176 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
177 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
178 return CICP_FULL_RANGE_LIMIT;
179 default:
180 return CICP_FULL_RANGE_FULL;
181 }
182 }
183
ColorSpaceGetCicp(ColorManager::ColorSpaceName name,uint16_t & primaries,uint16_t & transfer,uint16_t & matrix,uint8_t & range)184 void ColorUtils::ColorSpaceGetCicp(ColorManager::ColorSpaceName name, uint16_t& primaries, uint16_t& transfer,
185 uint16_t& matrix, uint8_t& range)
186 {
187 primaries = GetPrimaries(name);
188 transfer = GetTransfer(name);
189 matrix = GetMatrix(name);
190 range = GetRangeFlag(name);
191 }
192
193 } // namespace Media
194 } // namespace OHOS