1/*
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>
18
19#include <android-base/stringprintf.h>
20#include <string>
21
22std::string decodeStandard(android_dataspace dataspace) {
23    const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
24    switch (dataspaceSelect) {
25        case HAL_DATASPACE_STANDARD_BT709:
26            return std::string("BT709");
27
28        case HAL_DATASPACE_STANDARD_BT601_625:
29            return std::string("BT601_625");
30
31        case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
32            return std::string("BT601_625_UNADJUSTED");
33
34        case HAL_DATASPACE_STANDARD_BT601_525:
35            return std::string("BT601_525");
36
37        case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
38            return std::string("BT601_525_UNADJUSTED");
39
40        case HAL_DATASPACE_STANDARD_BT2020:
41            return std::string("BT2020");
42
43        case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE:
44            return std::string("BT2020 (constant luminance)");
45
46        case HAL_DATASPACE_STANDARD_BT470M:
47            return std::string("BT470M");
48
49        case HAL_DATASPACE_STANDARD_FILM:
50            return std::string("FILM");
51
52        case HAL_DATASPACE_STANDARD_DCI_P3:
53            return std::string("DCI-P3");
54
55        case HAL_DATASPACE_STANDARD_ADOBE_RGB:
56            return std::string("AdobeRGB");
57
58        case 0:
59            switch (dataspace & 0xffff) {
60                case HAL_DATASPACE_JFIF:
61                    return std::string("(deprecated) JFIF (BT601_625, SMPTE_170M Full range)");
62
63                case HAL_DATASPACE_BT601_625:
64                    return std::string("(deprecated) BT601_625 (BT601_625, SMPTE_170M Limited "
65                                       "range)");
66
67                case HAL_DATASPACE_BT601_525:
68                    return std::string("(deprecated) BT601_525 (BT601_525, SMPTE_170M Limited "
69                                       "range)");
70
71                case HAL_DATASPACE_SRGB_LINEAR:
72                    return std::string("(deprecated) SRGB Linear Full range");
73
74                case HAL_DATASPACE_SRGB:
75                    return std::string("(deprecated) sRGB");
76
77                case HAL_DATASPACE_V0_BT709:
78                    return std::string("(deprecated) BT709 (BT709, SMPTE_170M Limited range)");
79
80                case HAL_DATASPACE_ARBITRARY:
81                    return std::string("ARBITRARY");
82
83                case HAL_DATASPACE_UNKNOWN:
84                // Fallthrough
85                default:
86                    return android::base::StringPrintf("Unknown deprecated dataspace code %d",
87                                                       dataspaceSelect);
88            }
89    }
90
91    return android::base::StringPrintf("Unknown dataspace code %d", dataspaceSelect);
92}
93
94std::string decodeTransfer(android_dataspace dataspace) {
95    const uint32_t dataspaceTransfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK);
96    switch (dataspaceTransfer) {
97        case HAL_DATASPACE_TRANSFER_UNSPECIFIED:
98            return std::string("Unspecified");
99
100        case HAL_DATASPACE_TRANSFER_LINEAR:
101            return std::string("Linear");
102
103        case HAL_DATASPACE_TRANSFER_SRGB:
104            return std::string("sRGB");
105
106        case HAL_DATASPACE_TRANSFER_SMPTE_170M:
107            return std::string("SMPTE_170M");
108
109        case HAL_DATASPACE_TRANSFER_GAMMA2_2:
110            return std::string("gamma 2.2");
111
112        case HAL_DATASPACE_TRANSFER_GAMMA2_6:
113            return std::string("gamma 2.6");
114
115        case HAL_DATASPACE_TRANSFER_GAMMA2_8:
116            return std::string("gamma 2.8");
117
118        case HAL_DATASPACE_TRANSFER_ST2084:
119            return std::string("SMPTE 2084");
120
121        case HAL_DATASPACE_TRANSFER_HLG:
122            return std::string("STD-B67");
123    }
124
125    return android::base::StringPrintf("Unknown dataspace transfer %d", dataspaceTransfer);
126}
127
128std::string decodeRange(android_dataspace dataspace) {
129    const uint32_t dataspaceRange = (dataspace & HAL_DATASPACE_RANGE_MASK);
130    switch (dataspaceRange) {
131        case HAL_DATASPACE_RANGE_UNSPECIFIED:
132            return std::string("Range Unspecified");
133
134        case HAL_DATASPACE_RANGE_FULL:
135            return std::string("Full range");
136
137        case HAL_DATASPACE_RANGE_LIMITED:
138            return std::string("Limited range");
139
140        case HAL_DATASPACE_RANGE_EXTENDED:
141            return std::string("Extended range");
142    }
143
144    return android::base::StringPrintf("Unknown dataspace range %d", dataspaceRange);
145}
146
147std::string dataspaceDetails(android_dataspace dataspace) {
148    return android::base::StringPrintf("%s %s %s", decodeStandard(dataspace).c_str(),
149                                       decodeTransfer(dataspace).c_str(),
150                                       decodeRange(dataspace).c_str());
151}
152
153std::string decodeColorMode(android_color_mode colorMode) {
154    switch (colorMode) {
155        case HAL_COLOR_MODE_NATIVE:
156            return std::string("HAL_COLOR_MODE_NATIVE");
157
158        case HAL_COLOR_MODE_STANDARD_BT601_625:
159            return std::string("HAL_COLOR_MODE_BT601_625");
160
161        case HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED:
162            return std::string("HAL_COLOR_MODE_BT601_625_UNADJUSTED");
163
164        case HAL_COLOR_MODE_STANDARD_BT601_525:
165            return std::string("HAL_COLOR_MODE_BT601_525");
166
167        case HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED:
168            return std::string("HAL_COLOR_MODE_BT601_525_UNADJUSTED");
169
170        case HAL_COLOR_MODE_STANDARD_BT709:
171            return std::string("HAL_COLOR_MODE_BT709");
172
173        case HAL_COLOR_MODE_DCI_P3:
174            return std::string("HAL_COLOR_MODE_DCI_P3");
175
176        case HAL_COLOR_MODE_SRGB:
177            return std::string("HAL_COLOR_MODE_SRGB");
178
179        case HAL_COLOR_MODE_ADOBE_RGB:
180            return std::string("HAL_COLOR_MODE_ADOBE_RGB");
181
182        case HAL_COLOR_MODE_DISPLAY_P3:
183            return std::string("HAL_COLOR_MODE_DISPLAY_P3");
184    }
185
186    return android::base::StringPrintf("Unknown color mode %d", colorMode);
187}
188