39
39
#include < sstream>
40
40
#include < iostream>
41
41
#include < string>
42
+ #include < tuple>
42
43
#include < vector>
43
44
#include < utility>
44
45
@@ -190,6 +191,32 @@ bool ROSImageTexture::update()
190
191
return true ;
191
192
}
192
193
194
+ // Considering frequent execution, use inline
195
+ static inline std::tuple<uint8_t , uint8_t , uint8_t > pixelYUVToRGB (int y, int u, int v)
196
+ {
197
+ int r = 0 ;
198
+ int b = 0 ;
199
+ int g = 0 ;
200
+
201
+ // Values generated based on this formula
202
+ // for converting YUV to RGB
203
+ // R = Y + 1.403V'
204
+ // G = Y + 0.344U' - 0.714V'
205
+ // B = Y + 1.770U'
206
+
207
+ v -= 128 ;
208
+ u -= 128 ;
209
+
210
+ r = y + (1403 * v) / 1000 ;
211
+ g = y + (344 * u - 714 * v) / 1000 ;
212
+ b = y + (1770 * u) / 1000 ;
213
+
214
+ // pixel value must fit in a uint8_t
215
+ return {
216
+ std::clamp (r, 0 , 255 ), std::clamp (g, 0 , 255 ), std::clamp (b, 0 , 255 )
217
+ };
218
+ }
219
+
193
220
struct yuyv
194
221
{
195
222
uint8_t y0;
@@ -216,12 +243,6 @@ static void imageConvertUYVYToRGB(
216
243
int final_u = 0 ;
217
244
int final_y1 = 0 ;
218
245
int final_v = 0 ;
219
- int r1 = 0 ;
220
- int b1 = 0 ;
221
- int g1 = 0 ;
222
- int r2 = 0 ;
223
- int b2 = 0 ;
224
- int g2 = 0 ;
225
246
226
247
uint32_t stride_in_pixels = stride_in_bytes / 4 ;
227
248
@@ -237,30 +258,8 @@ static void imageConvertUYVYToRGB(
237
258
final_y1 = pixel->y1 ;
238
259
final_v = pixel->v ;
239
260
240
- // Values generated based on this formula
241
- // for converting YUV to RGB
242
- // R = Y + 1.403V'
243
- // G = Y + 0.344U' - 0.714V'
244
- // B = Y + 1.770U'
245
-
246
- final_v -= 128 ;
247
- final_u -= 128 ;
248
-
249
- r1 = final_y0 + (1403 * final_v) / 1000 ;
250
- g1 = final_y0 + (344 * final_u - 714 * final_v) / 1000 ;
251
- b1 = final_y0 + (1770 * final_u) / 1000 ;
252
-
253
- r2 = final_y1 + (1403 * final_v) / 1000 ;
254
- g2 = final_y1 + (344 * final_u - 714 * final_v) / 1000 ;
255
- b2 = final_y1 + (1770 * final_u) / 1000 ;
256
-
257
- // pixel value must fit in a uint8_t
258
- dst_img[0 ] = ((r1 & 0xFFFFFF00 ) == 0 ) ? r1 : (r1 < 0 ) ? 0 : 0xFF ;
259
- dst_img[1 ] = ((g1 & 0xFFFFFF00 ) == 0 ) ? g1 : (g1 < 0 ) ? 0 : 0xFF ;
260
- dst_img[2 ] = ((b1 & 0xFFFFFF00 ) == 0 ) ? b1 : (b1 < 0 ) ? 0 : 0xFF ;
261
- dst_img[3 ] = ((r2 & 0xFFFFFF00 ) == 0 ) ? r2 : (r2 < 0 ) ? 0 : 0xFF ;
262
- dst_img[4 ] = ((g2 & 0xFFFFFF00 ) == 0 ) ? g2 : (g2 < 0 ) ? 0 : 0xFF ;
263
- dst_img[5 ] = ((b2 & 0xFFFFFF00 ) == 0 ) ? b2 : (b2 < 0 ) ? 0 : 0xFF ;
261
+ std::tie (dst_img[0 ], dst_img[1 ], dst_img[2 ]) = pixelYUVToRGB (final_y0, final_u, final_v);
262
+ std::tie (dst_img[3 ], dst_img[4 ], dst_img[5 ]) = pixelYUVToRGB (final_y1, final_u, final_v);
264
263
dst_img += 6 ;
265
264
}
266
265
}
@@ -276,12 +275,6 @@ static void imageConvertYUYVToRGB(
276
275
int final_u = 0 ;
277
276
int final_y1 = 0 ;
278
277
int final_v = 0 ;
279
- int r1 = 0 ;
280
- int b1 = 0 ;
281
- int g1 = 0 ;
282
- int r2 = 0 ;
283
- int b2 = 0 ;
284
- int g2 = 0 ;
285
278
286
279
uint32_t stride_in_pixels = stride_in_bytes / 4 ;
287
280
@@ -297,30 +290,8 @@ static void imageConvertYUYVToRGB(
297
290
final_y1 = pixel->y1 ;
298
291
final_v = pixel->v ;
299
292
300
- // Values generated based on this formula
301
- // for converting YUV to RGB
302
- // R = Y + 1.403V'
303
- // G = Y + 0.344U' - 0.714V'
304
- // B = Y + 1.770U'
305
-
306
- final_v -= 128 ;
307
- final_u -= 128 ;
308
-
309
- r1 = final_y0 + (1403 * final_v) / 1000 ;
310
- g1 = final_y0 + (344 * final_u - 714 * final_v) / 1000 ;
311
- b1 = final_y0 + (1770 * final_u) / 1000 ;
312
-
313
- r2 = final_y1 + (1403 * final_v) / 1000 ;
314
- g2 = final_y1 + (344 * final_u - 714 * final_v) / 1000 ;
315
- b2 = final_y1 + (1770 * final_u) / 1000 ;
316
-
317
- // pixel value must fit in a uint8_t
318
- dst_img[0 ] = ((r1 & 0xFFFFFF00 ) == 0 ) ? r1 : (r1 < 0 ) ? 0 : 0xFF ;
319
- dst_img[1 ] = ((g1 & 0xFFFFFF00 ) == 0 ) ? g1 : (g1 < 0 ) ? 0 : 0xFF ;
320
- dst_img[2 ] = ((b1 & 0xFFFFFF00 ) == 0 ) ? b1 : (b1 < 0 ) ? 0 : 0xFF ;
321
- dst_img[3 ] = ((r2 & 0xFFFFFF00 ) == 0 ) ? r2 : (r2 < 0 ) ? 0 : 0xFF ;
322
- dst_img[4 ] = ((g2 & 0xFFFFFF00 ) == 0 ) ? g2 : (g2 < 0 ) ? 0 : 0xFF ;
323
- dst_img[5 ] = ((b2 & 0xFFFFFF00 ) == 0 ) ? b2 : (b2 < 0 ) ? 0 : 0xFF ;
293
+ std::tie (dst_img[0 ], dst_img[1 ], dst_img[2 ]) = pixelYUVToRGB (final_y0, final_u, final_v);
294
+ std::tie (dst_img[3 ], dst_img[4 ], dst_img[5 ]) = pixelYUVToRGB (final_y1, final_u, final_v);
324
295
dst_img += 6 ;
325
296
}
326
297
}
0 commit comments