blob: 337ccbc3f7fe32c9e314d99485c50972cda45761 [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Michalis Spyrouf44e57b2020-01-22 11:07:54 +00002 * Copyright (c) 2016-2020 ARM Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
Michalis Spyrouf4643372019-11-29 16:17:13 +000024#ifndef ARM_COMPUTE_PIXELVALUE_H
25#define ARM_COMPUTE_PIXELVALUE_H
Anthony Barbier6ff3b192017-09-04 18:44:23 +010026
Georgios Pinitas583137c2017-08-31 18:12:42 +010027#include "arm_compute/core/Types.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010028
Georgios Pinitas583137c2017-08-31 18:12:42 +010029#include <cstdint>
Pablo Tello0c34fe22017-06-26 17:17:42 +010030
Anthony Barbier6ff3b192017-09-04 18:44:23 +010031namespace arm_compute
32{
33/** Class describing the value of a pixel for any image format. */
34class PixelValue
35{
36public:
37 /** Default constructor: value initialized to 0 */
38 PixelValue()
Michalis Spyrouf44e57b2020-01-22 11:07:54 +000039 : value{ int64_t(0) }
Anthony Barbier6ff3b192017-09-04 18:44:23 +010040 {
41 }
Manuel Bottinib412fab2018-12-10 17:40:23 +000042 /** Initialize the union with a pixel value of chosen datatype
43 *
Giorgio Arena1856ff72020-02-07 13:46:45 +000044 * @param[in] v value.
Georgios Pinitas4c5469b2019-05-21 13:32:43 +010045 * @param[in] datatype DataType that @p v have to be stored
Michele Di Giorgio35ea9a72019-08-23 12:02:06 +010046 * @param[in] qinfo (Optional) QuantizationInfo to apply in case of quantized data types to @p v
Manuel Bottinib412fab2018-12-10 17:40:23 +000047 */
Giorgio Arena1856ff72020-02-07 13:46:45 +000048 PixelValue(double v, DataType datatype, QuantizationInfo qinfo = QuantizationInfo())
Manuel Bottinib412fab2018-12-10 17:40:23 +000049 : PixelValue()
50 {
51 switch(datatype)
52 {
53 case DataType::U8:
54 value.u8 = static_cast<uint8_t>(v);
55 break;
56 case DataType::S8:
57 value.s8 = static_cast<int8_t>(v);
58 break;
Manuel Bottini1d4f3852019-01-14 15:14:43 +000059 case DataType::QASYMM8:
Giorgio Arena1856ff72020-02-07 13:46:45 +000060 value.u8 = quantize_qasymm8(static_cast<float>(v), qinfo);
Georgios Pinitas4c5469b2019-05-21 13:32:43 +010061 break;
Georgios Pinitas33843562019-12-10 13:33:18 +000062 case DataType::QASYMM8_SIGNED:
Giorgio Arena1856ff72020-02-07 13:46:45 +000063 value.s8 = quantize_qasymm8_signed(static_cast<float>(v), qinfo);
Georgios Pinitas33843562019-12-10 13:33:18 +000064 break;
Georgios Pinitas4c5469b2019-05-21 13:32:43 +010065 case DataType::QSYMM8:
Giorgio Arena1856ff72020-02-07 13:46:45 +000066 value.s8 = quantize_qsymm8(static_cast<float>(v), qinfo);
Manuel Bottini1d4f3852019-01-14 15:14:43 +000067 break;
Manuel Bottinib412fab2018-12-10 17:40:23 +000068 case DataType::U16:
69 value.u16 = static_cast<uint16_t>(v);
70 break;
71 case DataType::S16:
72 value.s16 = static_cast<int16_t>(v);
73 break;
Michele Di Giorgio35ea9a72019-08-23 12:02:06 +010074 case DataType::QASYMM16:
Giorgio Arena1856ff72020-02-07 13:46:45 +000075 value.u16 = quantize_qasymm16(static_cast<float>(v), qinfo);
Michele Di Giorgio35ea9a72019-08-23 12:02:06 +010076 break;
Manuel Bottini3689fcd2019-06-14 17:18:12 +010077 case DataType::QSYMM16:
Giorgio Arena1856ff72020-02-07 13:46:45 +000078 value.s16 = quantize_qsymm16(static_cast<float>(v), qinfo);
Manuel Bottini3689fcd2019-06-14 17:18:12 +010079 break;
Manuel Bottinib412fab2018-12-10 17:40:23 +000080 case DataType::U32:
81 value.u32 = static_cast<uint32_t>(v);
82 break;
83 case DataType::S32:
84 value.s32 = static_cast<int32_t>(v);
85 break;
86 case DataType::U64:
87 value.u64 = static_cast<uint64_t>(v);
88 break;
89 case DataType::S64:
Michalis Spyrouf44e57b2020-01-22 11:07:54 +000090 value.s64 = static_cast<int64_t>(v);
Manuel Bottinib412fab2018-12-10 17:40:23 +000091 break;
Georgios Pinitase8291ac2020-02-26 09:58:13 +000092 case DataType::BFLOAT16:
93 value.bf16 = static_cast<bfloat16>(v);
94 break;
Manuel Bottinib412fab2018-12-10 17:40:23 +000095 case DataType::F16:
96 value.f16 = static_cast<half>(v);
97 break;
98 case DataType::F32:
99 value.f32 = static_cast<float>(v);
100 break;
101 case DataType::F64:
Manuel Bottinib412fab2018-12-10 17:40:23 +0000102 default:
Giorgio Arena1856ff72020-02-07 13:46:45 +0000103 value.f64 = v;
Manuel Bottinib412fab2018-12-10 17:40:23 +0000104 break;
105 }
106 }
Michalis Spyroue7be8a02019-12-12 16:16:09 +0000107 /** Initialize the union with a S8 pixel value
108 *
109 * @param[in] v S8 value.
110 */
111 PixelValue(int8_t v)
112 : PixelValue()
113 {
114 value.s8 = v;
115 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100116 /** Initialize the union with a U8 pixel value
117 *
118 * @param[in] v U8 value.
119 */
120 PixelValue(uint8_t v)
121 : PixelValue()
122 {
123 value.u8 = v;
124 }
125 /** Initialize the union with a U16 pixel value
126 *
127 * @param[in] v U16 value.
128 */
129 PixelValue(uint16_t v)
130 : PixelValue()
131 {
132 value.u16 = v;
133 }
134 /** Initialize the union with a S16 pixel value
135 *
136 * @param[in] v S16 value.
137 */
138 PixelValue(int16_t v)
139 : PixelValue()
140 {
141 value.s16 = v;
142 }
143 /** Initialize the union with a U32 pixel value
144 *
145 * @param[in] v U32 value.
146 */
147 PixelValue(uint32_t v)
148 : PixelValue()
149 {
150 value.u32 = v;
151 }
152 /** Initialize the union with a S32 pixel value
153 *
154 * @param[in] v S32 value.
155 */
156 PixelValue(int32_t v)
157 : PixelValue()
158 {
159 value.s32 = v;
160 }
Michalis Spyrou53b405f2017-09-27 15:55:31 +0100161
162 /** Initialize the union with a U64 pixel value
163 *
164 * @param[in] v U64 value.
165 */
166 PixelValue(uint64_t v)
167 : PixelValue()
168 {
169 value.u64 = v;
170 }
171 /** Initialize the union with a S64 pixel value
172 *
173 * @param[in] v S64 value.
174 */
175 PixelValue(int64_t v)
176 : PixelValue()
177 {
178 value.s64 = v;
179 }
Georgios Pinitase8291ac2020-02-26 09:58:13 +0000180 /** Initialize the union with a BFLOAT16 pixel value
181 *
182 * @param[in] v F16 value.
183 */
184 PixelValue(bfloat16 v)
185 : PixelValue()
186 {
187 value.bf16 = v;
188 }
Pablo Tello0c34fe22017-06-26 17:17:42 +0100189 /** Initialize the union with a F16 pixel value
190 *
191 * @param[in] v F16 value.
192 */
Georgios Pinitas583137c2017-08-31 18:12:42 +0100193 PixelValue(half v)
Pablo Tello0c34fe22017-06-26 17:17:42 +0100194 : PixelValue()
195 {
196 value.f16 = v;
197 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100198 /** Initialize the union with a F32 pixel value
199 *
200 * @param[in] v F32 value.
201 */
202 PixelValue(float v)
203 : PixelValue()
204 {
205 value.f32 = v;
206 }
Michalis Spyrou53b405f2017-09-27 15:55:31 +0100207 /** Initialize the union with a F64 pixel value
208 *
209 * @param[in] v F64 value.
210 */
211 PixelValue(double v)
212 : PixelValue()
213 {
214 value.f64 = v;
215 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100216 /** Union which describes the value of a pixel for any image format.
217 * Use the field corresponding to the image format
218 */
219 union
220 {
giuros0191a73f32018-09-21 12:23:44 +0100221 uint64_t u64; /**< Single channel U64 */
222 int64_t s64; /**< Single channel S64 */
Georgios Pinitas583137c2017-08-31 18:12:42 +0100223 uint8_t rgb[3]; /**< 3 channels: RGB888 */
224 uint8_t yuv[3]; /**< 3 channels: Any YUV format */
225 uint8_t rgbx[4]; /**< 4 channels: RGBX8888 */
Michalis Spyrou53b405f2017-09-27 15:55:31 +0100226 double f64; /**< Single channel double */
Georgios Pinitas583137c2017-08-31 18:12:42 +0100227 float f32; /**< Single channel float 32 */
228 half f16; /**< Single channel F16 */
Georgios Pinitase8291ac2020-02-26 09:58:13 +0000229 bfloat16 bf16; /**< Single channel brain floating-point number */
Georgios Pinitas583137c2017-08-31 18:12:42 +0100230 uint8_t u8; /**< Single channel U8 */
231 int8_t s8; /**< Single channel S8 */
232 uint16_t u16; /**< Single channel U16 */
233 int16_t s16; /**< Single channel S16 */
234 uint32_t u32; /**< Single channel U32 */
235 int32_t s32; /**< Single channel S32 */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100236 } value;
237 /** Interpret the pixel value as a U8
238 *
239 * @param[out] v Returned value
240 */
241 void get(uint8_t &v) const
242 {
243 v = value.u8;
244 }
245 /** Interpret the pixel value as a S8
246 *
247 * @param[out] v Returned value
248 */
249 void get(int8_t &v) const
250 {
251 v = value.s8;
252 }
253 /** Interpret the pixel value as a U16
254 *
255 * @param[out] v Returned value
256 */
257 void get(uint16_t &v) const
258 {
259 v = value.u16;
260 }
261 /** Interpret the pixel value as a S16
262 *
263 * @param[out] v Returned value
264 */
265 void get(int16_t &v) const
266 {
267 v = value.s16;
268 }
269 /** Interpret the pixel value as a U32
270 *
271 * @param[out] v Returned value
272 */
273 void get(uint32_t &v) const
274 {
275 v = value.u32;
276 }
277 /** Interpret the pixel value as a S32
278 *
279 * @param[out] v Returned value
280 */
281 void get(int32_t &v) const
282 {
283 v = value.s32;
284 }
Michalis Spyrou53b405f2017-09-27 15:55:31 +0100285 /** Interpret the pixel value as a U64
286 *
287 * @param[out] v Returned value
288 */
289 void get(uint64_t &v) const
290 {
291 v = value.u64;
292 }
293 /** Interpret the pixel value as a S64
294 *
295 * @param[out] v Returned value
296 */
297 void get(int64_t &v) const
298 {
299 v = value.s64;
300 }
Georgios Pinitase8291ac2020-02-26 09:58:13 +0000301 /** Interpret the pixel value as a BFLOAT16
302 *
303 * @param[out] v Returned value
304 */
305 void get(bfloat16 &v) const
306 {
307 v = value.bf16;
308 }
Pablo Tello0c34fe22017-06-26 17:17:42 +0100309 /** Interpret the pixel value as a F16
310 *
311 * @param[out] v Returned value
312 */
Georgios Pinitas583137c2017-08-31 18:12:42 +0100313 void get(half &v) const
Pablo Tello0c34fe22017-06-26 17:17:42 +0100314 {
315 v = value.f16;
316 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100317 /** Interpret the pixel value as a F32
318 *
319 * @param[out] v Returned value
320 */
321 void get(float &v) const
322 {
323 v = value.f32;
324 }
Michalis Spyrou53b405f2017-09-27 15:55:31 +0100325 /** Interpret the pixel value as a double
326 *
327 * @param[out] v Returned value
328 */
329 void get(double &v) const
330 {
331 v = value.f64;
332 }
333 /** Get the pixel value
334 *
335 * @return Pixel value
336 */
337 template <typename T>
338 T get() const
339 {
340 T val;
341 get(val);
342 return val;
343 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100344};
Georgios Pinitas33843562019-12-10 13:33:18 +0000345} // namespace arm_compute
Michalis Spyrouf4643372019-11-29 16:17:13 +0000346#endif /* ARM_COMPUTE_PIXELVALUE_H */