blob: bee58e548a4d5b3ec25d0731e86f45699db5a54a [file] [log] [blame]
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -06001/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <ui/DebugUtils.h>
Marin Shalamanovf5de90d2019-10-08 10:57:25 +020018#include <ui/DeviceProductInfo.h>
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -060019#include <ui/PixelFormat.h>
Kalle Raitaa099a242017-01-11 11:17:29 -080020#include <ui/Rect.h>
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060021
22#include <android-base/stringprintf.h>
23#include <string>
24
Kalle Raitaa099a242017-01-11 11:17:29 -080025using android::base::StringPrintf;
Peiyong Linfd997e02018-03-28 15:29:00 -070026using android::ui::ColorMode;
Peiyong Lin0e7a7912018-04-05 14:36:36 -070027using android::ui::RenderIntent;
Kalle Raitaa099a242017-01-11 11:17:29 -080028
Sally Qi254ef492024-04-08 15:01:28 -070029std::string decodeStandardOnly(uint32_t dataspaceStandard) {
30 switch (dataspaceStandard) {
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060031 case HAL_DATASPACE_STANDARD_BT709:
32 return std::string("BT709");
33
34 case HAL_DATASPACE_STANDARD_BT601_625:
35 return std::string("BT601_625");
36
37 case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
38 return std::string("BT601_625_UNADJUSTED");
39
40 case HAL_DATASPACE_STANDARD_BT601_525:
41 return std::string("BT601_525");
42
43 case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
44 return std::string("BT601_525_UNADJUSTED");
45
46 case HAL_DATASPACE_STANDARD_BT2020:
47 return std::string("BT2020");
48
49 case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE:
50 return std::string("BT2020 (constant luminance)");
51
52 case HAL_DATASPACE_STANDARD_BT470M:
53 return std::string("BT470M");
54
55 case HAL_DATASPACE_STANDARD_FILM:
56 return std::string("FILM");
57
58 case HAL_DATASPACE_STANDARD_DCI_P3:
59 return std::string("DCI-P3");
60
61 case HAL_DATASPACE_STANDARD_ADOBE_RGB:
62 return std::string("AdobeRGB");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060063 }
64
Sally Qi254ef492024-04-08 15:01:28 -070065 return StringPrintf("Unknown dataspace code %d", dataspaceStandard);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060066}
67
Sally Qi254ef492024-04-08 15:01:28 -070068std::string decodeStandard(android_dataspace dataspace) {
69 const uint32_t dataspaceStandard = (dataspace & HAL_DATASPACE_STANDARD_MASK);
70 if (dataspaceStandard == 0) {
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060071 switch (dataspace & 0xffff) {
72 case HAL_DATASPACE_JFIF:
Sally Qi254ef492024-04-08 15:01:28 -070073 return std::string("(deprecated) JFIF (BT601_625)");
74
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060075 case HAL_DATASPACE_BT601_625:
Sally Qi254ef492024-04-08 15:01:28 -070076 return std::string("(deprecated) BT601_625");
77
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060078 case HAL_DATASPACE_BT601_525:
Sally Qi254ef492024-04-08 15:01:28 -070079 return std::string("(deprecated) BT601_525");
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060080
81 case HAL_DATASPACE_SRGB_LINEAR:
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060082 case HAL_DATASPACE_SRGB:
Sally Qi254ef492024-04-08 15:01:28 -070083 return std::string("(deprecated) sRGB");
84
85 case HAL_DATASPACE_BT709:
86 return std::string("(deprecated) BT709");
87
88 case HAL_DATASPACE_ARBITRARY:
89 return std::string("ARBITRARY");
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060090
91 case HAL_DATASPACE_UNKNOWN:
92 // Fallthrough
93 default:
Sally Qi254ef492024-04-08 15:01:28 -070094 return StringPrintf("Unknown deprecated dataspace code %d", dataspace);
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060095 }
96 }
Sally Qi254ef492024-04-08 15:01:28 -070097 return decodeStandardOnly(dataspaceStandard);
98}
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060099
Sally Qi254ef492024-04-08 15:01:28 -0700100std::string decodeTransferOnly(uint32_t dataspaceTransfer) {
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600101 switch (dataspaceTransfer) {
102 case HAL_DATASPACE_TRANSFER_UNSPECIFIED:
103 return std::string("Unspecified");
104
105 case HAL_DATASPACE_TRANSFER_LINEAR:
106 return std::string("Linear");
107
108 case HAL_DATASPACE_TRANSFER_SRGB:
109 return std::string("sRGB");
110
111 case HAL_DATASPACE_TRANSFER_SMPTE_170M:
112 return std::string("SMPTE_170M");
113
114 case HAL_DATASPACE_TRANSFER_GAMMA2_2:
115 return std::string("gamma 2.2");
116
117 case HAL_DATASPACE_TRANSFER_GAMMA2_6:
118 return std::string("gamma 2.6");
119
120 case HAL_DATASPACE_TRANSFER_GAMMA2_8:
121 return std::string("gamma 2.8");
122
123 case HAL_DATASPACE_TRANSFER_ST2084:
124 return std::string("SMPTE 2084");
125
126 case HAL_DATASPACE_TRANSFER_HLG:
127 return std::string("STD-B67");
128 }
129
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200130 return StringPrintf("Unknown dataspace transfer %d", dataspaceTransfer);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600131}
132
Sally Qi254ef492024-04-08 15:01:28 -0700133std::string decodeTransfer(android_dataspace dataspace) {
134 const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
135 if (dataspaceSelect == 0) {
136 switch (dataspace & 0xffff) {
137 case HAL_DATASPACE_JFIF:
138 case HAL_DATASPACE_BT601_625:
139 case HAL_DATASPACE_BT601_525:
140 case HAL_DATASPACE_BT709:
141 return std::string("SMPTE_170M");
142
143 case HAL_DATASPACE_SRGB_LINEAR:
144 case HAL_DATASPACE_ARBITRARY:
145 return std::string("Linear");
146
147 case HAL_DATASPACE_SRGB:
148 return std::string("sRGB");
149
150 case HAL_DATASPACE_UNKNOWN:
151 // Fallthrough
152 default:
153 return std::string("");
154 }
155 }
156
157 const uint32_t dataspaceTransfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK);
158 return decodeTransferOnly(dataspaceTransfer);
159}
160
161std::string decodeRangeOnly(uint32_t dataspaceRange) {
162 switch (dataspaceRange) {
163 case HAL_DATASPACE_RANGE_UNSPECIFIED:
164 return std::string("Range Unspecified");
165
166 case HAL_DATASPACE_RANGE_FULL:
167 return std::string("Full range");
168
169 case HAL_DATASPACE_RANGE_LIMITED:
170 return std::string("Limited range");
171
172 case HAL_DATASPACE_RANGE_EXTENDED:
173 return std::string("Extended range");
174 }
175
176 return StringPrintf("Unknown dataspace range %d", dataspaceRange);
177}
178
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600179std::string decodeRange(android_dataspace dataspace) {
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -0600180 const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
181 if (dataspaceSelect == 0) {
182 switch (dataspace & 0xffff) {
183 case HAL_DATASPACE_JFIF:
184 case HAL_DATASPACE_SRGB_LINEAR:
185 case HAL_DATASPACE_SRGB:
186 return std::string("Full range");
187
188 case HAL_DATASPACE_BT601_625:
189 case HAL_DATASPACE_BT601_525:
Yiwei Zhang8cf697c2018-03-01 17:27:39 -0800190 case HAL_DATASPACE_BT709:
191 return std::string("Limited range");
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -0600192
193 case HAL_DATASPACE_ARBITRARY:
194 case HAL_DATASPACE_UNKNOWN:
195 // Fallthrough
196 default:
197 return std::string("unspecified range");
198 }
199 }
200
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600201 const uint32_t dataspaceRange = (dataspace & HAL_DATASPACE_RANGE_MASK);
Sally Qi254ef492024-04-08 15:01:28 -0700202 return decodeRangeOnly(dataspaceRange);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600203}
204
205std::string dataspaceDetails(android_dataspace dataspace) {
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600206 if (dataspace == 0) {
Courtney Goeltzenleuchter9f484642017-07-14 12:14:28 -0600207 return "Default";
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600208 }
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200209 return StringPrintf("%s %s %s", decodeStandard(dataspace).c_str(),
210 decodeTransfer(dataspace).c_str(), decodeRange(dataspace).c_str());
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600211}
212
Peiyong Lina52f0292018-03-14 17:26:31 -0700213std::string decodeColorMode(ColorMode colorMode) {
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600214 switch (colorMode) {
Peiyong Lina52f0292018-03-14 17:26:31 -0700215 case ColorMode::NATIVE:
216 return std::string("ColorMode::NATIVE");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600217
Peiyong Lina52f0292018-03-14 17:26:31 -0700218 case ColorMode::STANDARD_BT601_625:
219 return std::string("ColorMode::BT601_625");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600220
Peiyong Lina52f0292018-03-14 17:26:31 -0700221 case ColorMode::STANDARD_BT601_625_UNADJUSTED:
222 return std::string("ColorMode::BT601_625_UNADJUSTED");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600223
Peiyong Lina52f0292018-03-14 17:26:31 -0700224 case ColorMode::STANDARD_BT601_525:
225 return std::string("ColorMode::BT601_525");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600226
Peiyong Lina52f0292018-03-14 17:26:31 -0700227 case ColorMode::STANDARD_BT601_525_UNADJUSTED:
228 return std::string("ColorMode::BT601_525_UNADJUSTED");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600229
Peiyong Lina52f0292018-03-14 17:26:31 -0700230 case ColorMode::STANDARD_BT709:
231 return std::string("ColorMode::BT709");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600232
Peiyong Lina52f0292018-03-14 17:26:31 -0700233 case ColorMode::DCI_P3:
234 return std::string("ColorMode::DCI_P3");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600235
Peiyong Lina52f0292018-03-14 17:26:31 -0700236 case ColorMode::SRGB:
237 return std::string("ColorMode::SRGB");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600238
Peiyong Lina52f0292018-03-14 17:26:31 -0700239 case ColorMode::ADOBE_RGB:
240 return std::string("ColorMode::ADOBE_RGB");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600241
Peiyong Lina52f0292018-03-14 17:26:31 -0700242 case ColorMode::DISPLAY_P3:
243 return std::string("ColorMode::DISPLAY_P3");
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700244
245 case ColorMode::BT2020:
246 return std::string("ColorMode::BT2020");
247
Valerie Hau9758ae02018-10-09 16:05:09 -0700248 case ColorMode::DISPLAY_BT2020:
249 return std::string("ColorMode::DISPLAY_BT2020");
250
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700251 case ColorMode::BT2100_PQ:
252 return std::string("ColorMode::BT2100_PQ");
253
254 case ColorMode::BT2100_HLG:
255 return std::string("ColorMode::BT2100_HLG");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600256 }
257
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200258 return StringPrintf("Unknown color mode %d", colorMode);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600259}
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600260
Yiwei Zhang7c64f172018-03-07 14:52:28 -0800261std::string decodeColorTransform(android_color_transform colorTransform) {
262 switch (colorTransform) {
263 case HAL_COLOR_TRANSFORM_IDENTITY:
264 return std::string("Identity");
265
266 case HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX:
267 return std::string("Arbitrary matrix");
268
269 case HAL_COLOR_TRANSFORM_VALUE_INVERSE:
270 return std::string("Inverse value");
271
272 case HAL_COLOR_TRANSFORM_GRAYSCALE:
273 return std::string("Grayscale");
274
275 case HAL_COLOR_TRANSFORM_CORRECT_PROTANOPIA:
276 return std::string("Correct protanopia");
277
278 case HAL_COLOR_TRANSFORM_CORRECT_DEUTERANOPIA:
279 return std::string("Correct deuteranopia");
280
281 case HAL_COLOR_TRANSFORM_CORRECT_TRITANOPIA:
282 return std::string("Correct tritanopia");
283 }
284
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200285 return StringPrintf("Unknown color transform %d", colorTransform);
Yiwei Zhang7c64f172018-03-07 14:52:28 -0800286}
287
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600288// Converts a PixelFormat to a human-readable string. Max 11 chars.
289// (Could use a table of prefab String8 objects.)
290std::string decodePixelFormat(android::PixelFormat format) {
291 switch (format) {
292 case android::PIXEL_FORMAT_UNKNOWN:
293 return std::string("Unknown/None");
294 case android::PIXEL_FORMAT_CUSTOM:
295 return std::string("Custom");
296 case android::PIXEL_FORMAT_TRANSLUCENT:
297 return std::string("Translucent");
298 case android::PIXEL_FORMAT_TRANSPARENT:
299 return std::string("Transparent");
300 case android::PIXEL_FORMAT_OPAQUE:
301 return std::string("Opaque");
302 case android::PIXEL_FORMAT_RGBA_8888:
303 return std::string("RGBA_8888");
304 case android::PIXEL_FORMAT_RGBX_8888:
305 return std::string("RGBx_8888");
306 case android::PIXEL_FORMAT_RGBA_FP16:
307 return std::string("RGBA_FP16");
308 case android::PIXEL_FORMAT_RGBA_1010102:
309 return std::string("RGBA_1010102");
310 case android::PIXEL_FORMAT_RGB_888:
311 return std::string("RGB_888");
312 case android::PIXEL_FORMAT_RGB_565:
313 return std::string("RGB_565");
314 case android::PIXEL_FORMAT_BGRA_8888:
315 return std::string("BGRA_8888");
Leon Scroggins III4d258852021-11-24 14:40:53 -0500316 case android::PIXEL_FORMAT_R_8:
317 return std::string("R_8");
Trevor David Blackc08e0612023-07-17 14:14:32 +0000318 case android::PIXEL_FORMAT_R_16_UINT:
319 return std::string("R_16_UINT");
320 case android::PIXEL_FORMAT_RG_1616_UINT:
321 return std::string("RG_1616_UINT");
322 case android::PIXEL_FORMAT_RGBA_10101010:
323 return std::string("RGBA_10101010");
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600324 default:
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200325 return StringPrintf("Unknown %#08x", format);
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600326 }
327}
Kalle Raitaa099a242017-01-11 11:17:29 -0800328
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700329std::string decodeRenderIntent(RenderIntent renderIntent) {
330 switch(renderIntent) {
331 case RenderIntent::COLORIMETRIC:
332 return std::string("RenderIntent::COLORIMETRIC");
333 case RenderIntent::ENHANCE:
334 return std::string("RenderIntent::ENHANCE");
335 case RenderIntent::TONE_MAP_COLORIMETRIC:
336 return std::string("RenderIntent::TONE_MAP_COLORIMETRIC");
337 case RenderIntent::TONE_MAP_ENHANCE:
338 return std::string("RenderIntent::TONE_MAP_ENHANCE");
339 }
340 return std::string("Unknown RenderIntent");
341}
342
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200343std::string toString(const android::DeviceProductInfo::ManufactureOrModelDate& date) {
344 using ModelYear = android::DeviceProductInfo::ModelYear;
345 using ManufactureYear = android::DeviceProductInfo::ManufactureYear;
346 using ManufactureWeekAndYear = android::DeviceProductInfo::ManufactureWeekAndYear;
347
348 if (const auto* model = std::get_if<ModelYear>(&date)) {
349 return StringPrintf("ModelYear{%d}", model->year);
350 } else if (const auto* manufacture = std::get_if<ManufactureYear>(&date)) {
351 return StringPrintf("ManufactureDate{year=%d}", manufacture->year);
352 } else if (const auto* manufacture = std::get_if<ManufactureWeekAndYear>(&date)) {
353 return StringPrintf("ManufactureDate{week=%d, year=%d}", manufacture->week,
354 manufacture->year);
355 } else {
356 LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
357 return {};
358 }
359}
360
361std::string toString(const android::DeviceProductInfo& info) {
362 return StringPrintf("DeviceProductInfo{name=%s, productId=%s, manufacturerPnpId=%s, "
363 "manufactureOrModelDate=%s}",
364 info.name.data(), info.productId.data(), info.manufacturerPnpId.data(),
365 toString(info.manufactureOrModelDate).c_str());
366}