Skip to content

Commit f7112b1

Browse files
authored
Clean code for Image display (#1271)
Signed-off-by: Peng Wang <[email protected]>
1 parent 2a34490 commit f7112b1

File tree

1 file changed

+31
-60
lines changed

1 file changed

+31
-60
lines changed

rviz_default_plugins/src/rviz_default_plugins/displays/image/ros_image_texture.cpp

Lines changed: 31 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <sstream>
4040
#include <iostream>
4141
#include <string>
42+
#include <tuple>
4243
#include <vector>
4344
#include <utility>
4445

@@ -190,6 +191,32 @@ bool ROSImageTexture::update()
190191
return true;
191192
}
192193

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+
193220
struct yuyv
194221
{
195222
uint8_t y0;
@@ -216,12 +243,6 @@ static void imageConvertUYVYToRGB(
216243
int final_u = 0;
217244
int final_y1 = 0;
218245
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;
225246

226247
uint32_t stride_in_pixels = stride_in_bytes / 4;
227248

@@ -237,30 +258,8 @@ static void imageConvertUYVYToRGB(
237258
final_y1 = pixel->y1;
238259
final_v = pixel->v;
239260

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);
264263
dst_img += 6;
265264
}
266265
}
@@ -276,12 +275,6 @@ static void imageConvertYUYVToRGB(
276275
int final_u = 0;
277276
int final_y1 = 0;
278277
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;
285278

286279
uint32_t stride_in_pixels = stride_in_bytes / 4;
287280

@@ -297,30 +290,8 @@ static void imageConvertYUYVToRGB(
297290
final_y1 = pixel->y1;
298291
final_v = pixel->v;
299292

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);
324295
dst_img += 6;
325296
}
326297
}

0 commit comments

Comments
 (0)