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