xref: /aosp_15_r20/frameworks/native/libs/ui/PublicFormat.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include "aidl/android/hardware/graphics/common/Dataspace.h"
18*38e8c45fSAndroid Build Coastguard Worker #include <ui/PublicFormat.h>
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
22*38e8c45fSAndroid Build Coastguard Worker namespace android {
23*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker using ::aidl::android::hardware::graphics::common::Dataspace;
26*38e8c45fSAndroid Build Coastguard Worker 
mapPublicFormatToHalFormat(PublicFormat f)27*38e8c45fSAndroid Build Coastguard Worker int mapPublicFormatToHalFormat(PublicFormat f) {
28*38e8c45fSAndroid Build Coastguard Worker     switch (f) {
29*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::JPEG:
30*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::DEPTH_POINT_CLOUD:
31*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::DEPTH_JPEG:
32*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::HEIC:
33*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::HEIC_ULTRAHDR:
34*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::JPEG_R:
35*38e8c45fSAndroid Build Coastguard Worker             return HAL_PIXEL_FORMAT_BLOB;
36*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::DEPTH16:
37*38e8c45fSAndroid Build Coastguard Worker             return HAL_PIXEL_FORMAT_Y16;
38*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_SENSOR:
39*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_DEPTH:
40*38e8c45fSAndroid Build Coastguard Worker             return HAL_PIXEL_FORMAT_RAW16;
41*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_DEPTH10:
42*38e8c45fSAndroid Build Coastguard Worker             return HAL_PIXEL_FORMAT_RAW10;
43*38e8c45fSAndroid Build Coastguard Worker         default:
44*38e8c45fSAndroid Build Coastguard Worker             // Most formats map 1:1
45*38e8c45fSAndroid Build Coastguard Worker             return static_cast<int>(f);
46*38e8c45fSAndroid Build Coastguard Worker     }
47*38e8c45fSAndroid Build Coastguard Worker }
48*38e8c45fSAndroid Build Coastguard Worker 
mapPublicFormatToHalDataspace(PublicFormat f)49*38e8c45fSAndroid Build Coastguard Worker android_dataspace mapPublicFormatToHalDataspace(PublicFormat f) {
50*38e8c45fSAndroid Build Coastguard Worker     Dataspace dataspace;
51*38e8c45fSAndroid Build Coastguard Worker     switch (f) {
52*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::JPEG:
53*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::JFIF;
54*38e8c45fSAndroid Build Coastguard Worker             break;
55*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::DEPTH_POINT_CLOUD:
56*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::DEPTH16:
57*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_DEPTH:
58*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_DEPTH10:
59*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::DEPTH;
60*38e8c45fSAndroid Build Coastguard Worker             break;
61*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_SENSOR:
62*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW_PRIVATE:
63*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW10:
64*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::RAW12:
65*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::ARBITRARY;
66*38e8c45fSAndroid Build Coastguard Worker             break;
67*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::YUV_420_888:
68*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::NV21:
69*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::YV12:
70*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::JFIF;
71*38e8c45fSAndroid Build Coastguard Worker             break;
72*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::DEPTH_JPEG:
73*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::DYNAMIC_DEPTH;
74*38e8c45fSAndroid Build Coastguard Worker             break;
75*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::HEIC:
76*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::HEIF;
77*38e8c45fSAndroid Build Coastguard Worker             break;
78*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::HEIC_ULTRAHDR:
79*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::HEIF_ULTRAHDR;
80*38e8c45fSAndroid Build Coastguard Worker             break;
81*38e8c45fSAndroid Build Coastguard Worker         case PublicFormat::JPEG_R:
82*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::JPEG_R;
83*38e8c45fSAndroid Build Coastguard Worker             break;
84*38e8c45fSAndroid Build Coastguard Worker         default:
85*38e8c45fSAndroid Build Coastguard Worker             // Most formats map to UNKNOWN
86*38e8c45fSAndroid Build Coastguard Worker             dataspace = Dataspace::UNKNOWN;
87*38e8c45fSAndroid Build Coastguard Worker             break;
88*38e8c45fSAndroid Build Coastguard Worker     }
89*38e8c45fSAndroid Build Coastguard Worker     return static_cast<android_dataspace>(dataspace);
90*38e8c45fSAndroid Build Coastguard Worker }
91*38e8c45fSAndroid Build Coastguard Worker 
mapHalFormatDataspaceToPublicFormat(int format,android_dataspace dataSpace)92*38e8c45fSAndroid Build Coastguard Worker PublicFormat mapHalFormatDataspaceToPublicFormat(int format, android_dataspace dataSpace) {
93*38e8c45fSAndroid Build Coastguard Worker     Dataspace ds = static_cast<Dataspace>(dataSpace);
94*38e8c45fSAndroid Build Coastguard Worker     switch (format) {
95*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RAW10:
96*38e8c45fSAndroid Build Coastguard Worker             switch (ds) {
97*38e8c45fSAndroid Build Coastguard Worker                 case Dataspace::DEPTH:
98*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::RAW_DEPTH10;
99*38e8c45fSAndroid Build Coastguard Worker                 default:
100*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::RAW10;
101*38e8c45fSAndroid Build Coastguard Worker             }
102*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RGBA_8888:
103*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RGBX_8888:
104*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RGBA_FP16:
105*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RGBA_1010102:
106*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RGB_888:
107*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RGB_565:
108*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_Y8:
109*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RAW12:
110*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_YCbCr_420_888:
111*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_YV12:
112*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_YCBCR_P010:
113*38e8c45fSAndroid Build Coastguard Worker             // Enums overlap in both name and value
114*38e8c45fSAndroid Build Coastguard Worker             return static_cast<PublicFormat>(format);
115*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RAW16:
116*38e8c45fSAndroid Build Coastguard Worker             switch (ds) {
117*38e8c45fSAndroid Build Coastguard Worker                 case Dataspace::DEPTH:
118*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::RAW_DEPTH;
119*38e8c45fSAndroid Build Coastguard Worker                 default:
120*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::RAW_SENSOR;
121*38e8c45fSAndroid Build Coastguard Worker             }
122*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_RAW_OPAQUE:
123*38e8c45fSAndroid Build Coastguard Worker             // Name differs, though value is the same
124*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::RAW_PRIVATE;
125*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_YCbCr_422_SP:
126*38e8c45fSAndroid Build Coastguard Worker             // Name differs, though the value is the same
127*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::NV16;
128*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
129*38e8c45fSAndroid Build Coastguard Worker             // Name differs, though the value is the same
130*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::NV21;
131*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_YCbCr_422_I:
132*38e8c45fSAndroid Build Coastguard Worker             // Name differs, though the value is the same
133*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::YUY2;
134*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
135*38e8c45fSAndroid Build Coastguard Worker             // Name differs, though the value is the same
136*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::PRIVATE;
137*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_Y16:
138*38e8c45fSAndroid Build Coastguard Worker             // Dataspace-dependent
139*38e8c45fSAndroid Build Coastguard Worker             switch (ds) {
140*38e8c45fSAndroid Build Coastguard Worker                 case Dataspace::DEPTH:
141*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::DEPTH16;
142*38e8c45fSAndroid Build Coastguard Worker                 default:
143*38e8c45fSAndroid Build Coastguard Worker                     // Assume non-depth Y16 is just Y16.
144*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::Y16;
145*38e8c45fSAndroid Build Coastguard Worker             }
146*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_BLOB:
147*38e8c45fSAndroid Build Coastguard Worker             // Dataspace-dependent
148*38e8c45fSAndroid Build Coastguard Worker             switch (ds) {
149*38e8c45fSAndroid Build Coastguard Worker                 case Dataspace::DEPTH:
150*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::DEPTH_POINT_CLOUD;
151*38e8c45fSAndroid Build Coastguard Worker                 case Dataspace::JFIF:
152*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::JPEG;
153*38e8c45fSAndroid Build Coastguard Worker                 case Dataspace::HEIF:
154*38e8c45fSAndroid Build Coastguard Worker                     return PublicFormat::HEIC;
155*38e8c45fSAndroid Build Coastguard Worker                 default:
156*38e8c45fSAndroid Build Coastguard Worker                     if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) {
157*38e8c45fSAndroid Build Coastguard Worker                         return PublicFormat::DEPTH_JPEG;
158*38e8c45fSAndroid Build Coastguard Worker                     } else if (dataSpace == static_cast<android_dataspace>(Dataspace::JPEG_R)) {
159*38e8c45fSAndroid Build Coastguard Worker                         return PublicFormat::JPEG_R;
160*38e8c45fSAndroid Build Coastguard Worker                     } else if (dataSpace == static_cast<android_dataspace>(
161*38e8c45fSAndroid Build Coastguard Worker                                 Dataspace::HEIF_ULTRAHDR)) {
162*38e8c45fSAndroid Build Coastguard Worker                         return PublicFormat::HEIC_ULTRAHDR;
163*38e8c45fSAndroid Build Coastguard Worker                     }else {
164*38e8c45fSAndroid Build Coastguard Worker                         // Assume otherwise-marked blobs are also JPEG
165*38e8c45fSAndroid Build Coastguard Worker                         return PublicFormat::JPEG;
166*38e8c45fSAndroid Build Coastguard Worker                     }
167*38e8c45fSAndroid Build Coastguard Worker             }
168*38e8c45fSAndroid Build Coastguard Worker         case HAL_PIXEL_FORMAT_BGRA_8888:
169*38e8c45fSAndroid Build Coastguard Worker             // Not defined in public API
170*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::UNKNOWN;
171*38e8c45fSAndroid Build Coastguard Worker 
172*38e8c45fSAndroid Build Coastguard Worker         default:
173*38e8c45fSAndroid Build Coastguard Worker             return PublicFormat::UNKNOWN;
174*38e8c45fSAndroid Build Coastguard Worker     }
175*38e8c45fSAndroid Build Coastguard Worker }
176*38e8c45fSAndroid Build Coastguard Worker 
177*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
178*38e8c45fSAndroid Build Coastguard Worker }; // namespace android
179*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
180