xref: /aosp_15_r20/frameworks/native/libs/ui/PublicFormat.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1 /*
2  * Copyright (C) 2019 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 "aidl/android/hardware/graphics/common/Dataspace.h"
18 #include <ui/PublicFormat.h>
19 
20 
21 // ----------------------------------------------------------------------------
22 namespace android {
23 // ----------------------------------------------------------------------------
24 
25 using ::aidl::android::hardware::graphics::common::Dataspace;
26 
mapPublicFormatToHalFormat(PublicFormat f)27 int mapPublicFormatToHalFormat(PublicFormat f) {
28     switch (f) {
29         case PublicFormat::JPEG:
30         case PublicFormat::DEPTH_POINT_CLOUD:
31         case PublicFormat::DEPTH_JPEG:
32         case PublicFormat::HEIC:
33         case PublicFormat::HEIC_ULTRAHDR:
34         case PublicFormat::JPEG_R:
35             return HAL_PIXEL_FORMAT_BLOB;
36         case PublicFormat::DEPTH16:
37             return HAL_PIXEL_FORMAT_Y16;
38         case PublicFormat::RAW_SENSOR:
39         case PublicFormat::RAW_DEPTH:
40             return HAL_PIXEL_FORMAT_RAW16;
41         case PublicFormat::RAW_DEPTH10:
42             return HAL_PIXEL_FORMAT_RAW10;
43         default:
44             // Most formats map 1:1
45             return static_cast<int>(f);
46     }
47 }
48 
mapPublicFormatToHalDataspace(PublicFormat f)49 android_dataspace mapPublicFormatToHalDataspace(PublicFormat f) {
50     Dataspace dataspace;
51     switch (f) {
52         case PublicFormat::JPEG:
53             dataspace = Dataspace::JFIF;
54             break;
55         case PublicFormat::DEPTH_POINT_CLOUD:
56         case PublicFormat::DEPTH16:
57         case PublicFormat::RAW_DEPTH:
58         case PublicFormat::RAW_DEPTH10:
59             dataspace = Dataspace::DEPTH;
60             break;
61         case PublicFormat::RAW_SENSOR:
62         case PublicFormat::RAW_PRIVATE:
63         case PublicFormat::RAW10:
64         case PublicFormat::RAW12:
65             dataspace = Dataspace::ARBITRARY;
66             break;
67         case PublicFormat::YUV_420_888:
68         case PublicFormat::NV21:
69         case PublicFormat::YV12:
70             dataspace = Dataspace::JFIF;
71             break;
72         case PublicFormat::DEPTH_JPEG:
73             dataspace = Dataspace::DYNAMIC_DEPTH;
74             break;
75         case PublicFormat::HEIC:
76             dataspace = Dataspace::HEIF;
77             break;
78         case PublicFormat::HEIC_ULTRAHDR:
79             dataspace = Dataspace::HEIF_ULTRAHDR;
80             break;
81         case PublicFormat::JPEG_R:
82             dataspace = Dataspace::JPEG_R;
83             break;
84         default:
85             // Most formats map to UNKNOWN
86             dataspace = Dataspace::UNKNOWN;
87             break;
88     }
89     return static_cast<android_dataspace>(dataspace);
90 }
91 
mapHalFormatDataspaceToPublicFormat(int format,android_dataspace dataSpace)92 PublicFormat mapHalFormatDataspaceToPublicFormat(int format, android_dataspace dataSpace) {
93     Dataspace ds = static_cast<Dataspace>(dataSpace);
94     switch (format) {
95         case HAL_PIXEL_FORMAT_RAW10:
96             switch (ds) {
97                 case Dataspace::DEPTH:
98                     return PublicFormat::RAW_DEPTH10;
99                 default:
100                     return PublicFormat::RAW10;
101             }
102         case HAL_PIXEL_FORMAT_RGBA_8888:
103         case HAL_PIXEL_FORMAT_RGBX_8888:
104         case HAL_PIXEL_FORMAT_RGBA_FP16:
105         case HAL_PIXEL_FORMAT_RGBA_1010102:
106         case HAL_PIXEL_FORMAT_RGB_888:
107         case HAL_PIXEL_FORMAT_RGB_565:
108         case HAL_PIXEL_FORMAT_Y8:
109         case HAL_PIXEL_FORMAT_RAW12:
110         case HAL_PIXEL_FORMAT_YCbCr_420_888:
111         case HAL_PIXEL_FORMAT_YV12:
112         case HAL_PIXEL_FORMAT_YCBCR_P010:
113             // Enums overlap in both name and value
114             return static_cast<PublicFormat>(format);
115         case HAL_PIXEL_FORMAT_RAW16:
116             switch (ds) {
117                 case Dataspace::DEPTH:
118                     return PublicFormat::RAW_DEPTH;
119                 default:
120                     return PublicFormat::RAW_SENSOR;
121             }
122         case HAL_PIXEL_FORMAT_RAW_OPAQUE:
123             // Name differs, though value is the same
124             return PublicFormat::RAW_PRIVATE;
125         case HAL_PIXEL_FORMAT_YCbCr_422_SP:
126             // Name differs, though the value is the same
127             return PublicFormat::NV16;
128         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
129             // Name differs, though the value is the same
130             return PublicFormat::NV21;
131         case HAL_PIXEL_FORMAT_YCbCr_422_I:
132             // Name differs, though the value is the same
133             return PublicFormat::YUY2;
134         case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
135             // Name differs, though the value is the same
136             return PublicFormat::PRIVATE;
137         case HAL_PIXEL_FORMAT_Y16:
138             // Dataspace-dependent
139             switch (ds) {
140                 case Dataspace::DEPTH:
141                     return PublicFormat::DEPTH16;
142                 default:
143                     // Assume non-depth Y16 is just Y16.
144                     return PublicFormat::Y16;
145             }
146         case HAL_PIXEL_FORMAT_BLOB:
147             // Dataspace-dependent
148             switch (ds) {
149                 case Dataspace::DEPTH:
150                     return PublicFormat::DEPTH_POINT_CLOUD;
151                 case Dataspace::JFIF:
152                     return PublicFormat::JPEG;
153                 case Dataspace::HEIF:
154                     return PublicFormat::HEIC;
155                 default:
156                     if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) {
157                         return PublicFormat::DEPTH_JPEG;
158                     } else if (dataSpace == static_cast<android_dataspace>(Dataspace::JPEG_R)) {
159                         return PublicFormat::JPEG_R;
160                     } else if (dataSpace == static_cast<android_dataspace>(
161                                 Dataspace::HEIF_ULTRAHDR)) {
162                         return PublicFormat::HEIC_ULTRAHDR;
163                     }else {
164                         // Assume otherwise-marked blobs are also JPEG
165                         return PublicFormat::JPEG;
166                     }
167             }
168         case HAL_PIXEL_FORMAT_BGRA_8888:
169             // Not defined in public API
170             return PublicFormat::UNKNOWN;
171 
172         default:
173             return PublicFormat::UNKNOWN;
174     }
175 }
176 
177 // ----------------------------------------------------------------------------
178 }; // namespace android
179 // ----------------------------------------------------------------------------
180