blob: a6595cfc274db9544a085aed0a9da0b1d4c5242c [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
17#include <ui/GraphicTypes.h> // ui::Dataspace
18#include <ui/PublicFormat.h>
19
20// ----------------------------------------------------------------------------
21namespace android {
22// ----------------------------------------------------------------------------
23
24using ui::Dataspace;
25
26int mapPublicFormatToHalFormat(PublicFormat f) {
27 switch (f) {
28 case PublicFormat::JPEG:
29 case PublicFormat::DEPTH_POINT_CLOUD:
30 case PublicFormat::DEPTH_JPEG:
31 case PublicFormat::HEIC:
32 return HAL_PIXEL_FORMAT_BLOB;
33 case PublicFormat::DEPTH16:
34 return HAL_PIXEL_FORMAT_Y16;
35 case PublicFormat::RAW_SENSOR:
36 case PublicFormat::RAW_DEPTH:
37 return HAL_PIXEL_FORMAT_RAW16;
Emilian Peevb7bd5852020-08-31 17:27:56 -070038 case PublicFormat::RAW_DEPTH10:
39 return HAL_PIXEL_FORMAT_RAW10;
Jooyung Han419fb442019-02-21 15:02:58 +090040 default:
41 // Most formats map 1:1
42 return static_cast<int>(f);
43 }
44}
45
46android_dataspace mapPublicFormatToHalDataspace(PublicFormat f) {
47 Dataspace dataspace;
48 switch (f) {
49 case PublicFormat::JPEG:
50 dataspace = Dataspace::V0_JFIF;
51 break;
52 case PublicFormat::DEPTH_POINT_CLOUD:
53 case PublicFormat::DEPTH16:
54 case PublicFormat::RAW_DEPTH:
Emilian Peevb7bd5852020-08-31 17:27:56 -070055 case PublicFormat::RAW_DEPTH10:
Jooyung Han419fb442019-02-21 15:02:58 +090056 dataspace = Dataspace::DEPTH;
57 break;
58 case PublicFormat::RAW_SENSOR:
59 case PublicFormat::RAW_PRIVATE:
60 case PublicFormat::RAW10:
61 case PublicFormat::RAW12:
62 dataspace = Dataspace::ARBITRARY;
63 break;
64 case PublicFormat::YUV_420_888:
65 case PublicFormat::NV21:
66 case PublicFormat::YV12:
67 dataspace = Dataspace::V0_JFIF;
68 break;
69 case PublicFormat::DEPTH_JPEG:
70 dataspace = Dataspace::DYNAMIC_DEPTH;
71 break;
72 case PublicFormat::HEIC:
73 dataspace = Dataspace::HEIF;
74 break;
75 default:
76 // Most formats map to UNKNOWN
77 dataspace = Dataspace::UNKNOWN;
78 break;
79 }
80 return static_cast<android_dataspace>(dataspace);
81}
82
83PublicFormat mapHalFormatDataspaceToPublicFormat(int format, android_dataspace dataSpace) {
84 Dataspace ds = static_cast<Dataspace>(dataSpace);
85 switch (format) {
Emilian Peevb7bd5852020-08-31 17:27:56 -070086 case HAL_PIXEL_FORMAT_RAW10:
87 switch (ds) {
88 case Dataspace::DEPTH:
89 return PublicFormat::RAW_DEPTH10;
90 default:
91 return PublicFormat::RAW10;
92 }
Jooyung Han419fb442019-02-21 15:02:58 +090093 case HAL_PIXEL_FORMAT_RGBA_8888:
94 case HAL_PIXEL_FORMAT_RGBX_8888:
95 case HAL_PIXEL_FORMAT_RGBA_FP16:
96 case HAL_PIXEL_FORMAT_RGBA_1010102:
97 case HAL_PIXEL_FORMAT_RGB_888:
98 case HAL_PIXEL_FORMAT_RGB_565:
99 case HAL_PIXEL_FORMAT_Y8:
Jooyung Han419fb442019-02-21 15:02:58 +0900100 case HAL_PIXEL_FORMAT_RAW12:
101 case HAL_PIXEL_FORMAT_YCbCr_420_888:
102 case HAL_PIXEL_FORMAT_YV12:
103 // Enums overlap in both name and value
104 return static_cast<PublicFormat>(format);
105 case HAL_PIXEL_FORMAT_RAW16:
106 switch (ds) {
107 case Dataspace::DEPTH:
108 return PublicFormat::RAW_DEPTH;
109 default:
110 return PublicFormat::RAW_SENSOR;
111 }
112 case HAL_PIXEL_FORMAT_RAW_OPAQUE:
113 // Name differs, though value is the same
114 return PublicFormat::RAW_PRIVATE;
115 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
116 // Name differs, though the value is the same
117 return PublicFormat::NV16;
118 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
119 // Name differs, though the value is the same
120 return PublicFormat::NV21;
121 case HAL_PIXEL_FORMAT_YCbCr_422_I:
122 // Name differs, though the value is the same
123 return PublicFormat::YUY2;
124 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
125 // Name differs, though the value is the same
126 return PublicFormat::PRIVATE;
127 case HAL_PIXEL_FORMAT_Y16:
128 // Dataspace-dependent
129 switch (ds) {
130 case Dataspace::DEPTH:
131 return PublicFormat::DEPTH16;
132 default:
133 // Assume non-depth Y16 is just Y16.
134 return PublicFormat::Y16;
135 }
136 case HAL_PIXEL_FORMAT_BLOB:
137 // Dataspace-dependent
138 switch (ds) {
139 case Dataspace::DEPTH:
140 return PublicFormat::DEPTH_POINT_CLOUD;
141 case Dataspace::V0_JFIF:
142 return PublicFormat::JPEG;
143 case Dataspace::HEIF:
144 return PublicFormat::HEIC;
145 default:
146 if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) {
147 return PublicFormat::DEPTH_JPEG;
148 } else {
149 // Assume otherwise-marked blobs are also JPEG
150 return PublicFormat::JPEG;
151 }
152 }
153 case HAL_PIXEL_FORMAT_BGRA_8888:
154 // Not defined in public API
155 return PublicFormat::UNKNOWN;
156
157 default:
158 return PublicFormat::UNKNOWN;
159 }
160}
161
162// ----------------------------------------------------------------------------
163}; // namespace android
164// ----------------------------------------------------------------------------