blob: dbc0884bf49e9c72d9d4c401adb854c177518241 [file] [log] [blame]
Jooyung Han419fb442019-02-21 15:02:58 +09001/*
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
Emilian Peev42fd1512022-10-10 16:23:31 -070017#include "aidl/android/hardware/graphics/common/Dataspace.h"
Jooyung Han419fb442019-02-21 15:02:58 +090018#include <ui/PublicFormat.h>
19
Emilian Peev42fd1512022-10-10 16:23:31 -070020
Jooyung Han419fb442019-02-21 15:02:58 +090021// ----------------------------------------------------------------------------
22namespace android {
23// ----------------------------------------------------------------------------
24
Emilian Peev42fd1512022-10-10 16:23:31 -070025using ::aidl::android::hardware::graphics::common::Dataspace;
Jooyung Han419fb442019-02-21 15:02:58 +090026
27int 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:
Emilian Peev7ad5c2b2024-11-16 01:24:38 +000033 case PublicFormat::HEIC_ULTRAHDR:
Emilian Peev42fd1512022-10-10 16:23:31 -070034 case PublicFormat::JPEG_R:
Jooyung Han419fb442019-02-21 15:02:58 +090035 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;
Emilian Peevb7bd5852020-08-31 17:27:56 -070041 case PublicFormat::RAW_DEPTH10:
42 return HAL_PIXEL_FORMAT_RAW10;
Jooyung Han419fb442019-02-21 15:02:58 +090043 default:
44 // Most formats map 1:1
45 return static_cast<int>(f);
46 }
47}
48
49android_dataspace mapPublicFormatToHalDataspace(PublicFormat f) {
50 Dataspace dataspace;
51 switch (f) {
52 case PublicFormat::JPEG:
Emilian Peev42fd1512022-10-10 16:23:31 -070053 dataspace = Dataspace::JFIF;
Jooyung Han419fb442019-02-21 15:02:58 +090054 break;
55 case PublicFormat::DEPTH_POINT_CLOUD:
56 case PublicFormat::DEPTH16:
57 case PublicFormat::RAW_DEPTH:
Emilian Peevb7bd5852020-08-31 17:27:56 -070058 case PublicFormat::RAW_DEPTH10:
Jooyung Han419fb442019-02-21 15:02:58 +090059 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:
Emilian Peev42fd1512022-10-10 16:23:31 -070070 dataspace = Dataspace::JFIF;
Jooyung Han419fb442019-02-21 15:02:58 +090071 break;
72 case PublicFormat::DEPTH_JPEG:
73 dataspace = Dataspace::DYNAMIC_DEPTH;
74 break;
75 case PublicFormat::HEIC:
76 dataspace = Dataspace::HEIF;
77 break;
Emilian Peev7ad5c2b2024-11-16 01:24:38 +000078 case PublicFormat::HEIC_ULTRAHDR:
79 dataspace = Dataspace::HEIF_ULTRAHDR;
80 break;
Emilian Peev42fd1512022-10-10 16:23:31 -070081 case PublicFormat::JPEG_R:
82 dataspace = Dataspace::JPEG_R;
83 break;
Jooyung Han419fb442019-02-21 15:02:58 +090084 default:
85 // Most formats map to UNKNOWN
86 dataspace = Dataspace::UNKNOWN;
87 break;
88 }
89 return static_cast<android_dataspace>(dataspace);
90}
91
92PublicFormat mapHalFormatDataspaceToPublicFormat(int format, android_dataspace dataSpace) {
93 Dataspace ds = static_cast<Dataspace>(dataSpace);
94 switch (format) {
Emilian Peevb7bd5852020-08-31 17:27:56 -070095 case HAL_PIXEL_FORMAT_RAW10:
96 switch (ds) {
97 case Dataspace::DEPTH:
98 return PublicFormat::RAW_DEPTH10;
99 default:
100 return PublicFormat::RAW10;
101 }
Jooyung Han419fb442019-02-21 15:02:58 +0900102 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:
Jooyung Han419fb442019-02-21 15:02:58 +0900109 case HAL_PIXEL_FORMAT_RAW12:
110 case HAL_PIXEL_FORMAT_YCbCr_420_888:
111 case HAL_PIXEL_FORMAT_YV12:
Emilian Peevd1ce44b2021-01-21 11:42:22 -0800112 case HAL_PIXEL_FORMAT_YCBCR_P010:
Jooyung Han419fb442019-02-21 15:02:58 +0900113 // 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;
Emilian Peev42fd1512022-10-10 16:23:31 -0700151 case Dataspace::JFIF:
Jooyung Han419fb442019-02-21 15:02:58 +0900152 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;
Emilian Peev42fd1512022-10-10 16:23:31 -0700158 } else if (dataSpace == static_cast<android_dataspace>(Dataspace::JPEG_R)) {
159 return PublicFormat::JPEG_R;
Emilian Peev7ad5c2b2024-11-16 01:24:38 +0000160 } else if (dataSpace == static_cast<android_dataspace>(
161 Dataspace::HEIF_ULTRAHDR)) {
162 return PublicFormat::HEIC_ULTRAHDR;
Emilian Peev42fd1512022-10-10 16:23:31 -0700163 }else {
Jooyung Han419fb442019-02-21 15:02:58 +0900164 // 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// ----------------------------------------------------------------------------