24 {
27
28
29 const fl::i32 YUV_TO_RGB_MATRIX[9] = {
30 1164, 0, 1596,
31 1164, -391, -813,
32 1164, 2017, 0
33 };
34
36 for (fl::u32
x = 0;
x <
width;
x++) {
37
38 fl::u32 y_index =
y * frame->
y.
width +
x;
41 fl::u32 uv_index = uv_y * frame->
cr.
width + uv_x;
42
43 fl::i32 Y = frame->
y.
data[y_index] - 16;
44 fl::i32 U = frame->
cb.
data[uv_index] - 128;
45 fl::i32 V = frame->
cr.
data[uv_index] - 128;
46
47
48 fl::i32 R = (YUV_TO_RGB_MATRIX[0] * Y + YUV_TO_RGB_MATRIX[1] * U + YUV_TO_RGB_MATRIX[2] * V) / 1000;
49 fl::i32 G = (YUV_TO_RGB_MATRIX[3] * Y + YUV_TO_RGB_MATRIX[4] * U + YUV_TO_RGB_MATRIX[5] * V) / 1000;
50 fl::i32
B = (YUV_TO_RGB_MATRIX[6] * Y + YUV_TO_RGB_MATRIX[7] * U + YUV_TO_RGB_MATRIX[8] * V) / 1000;
51
52
53 R = R < 0 ? 0 : (R > 255 ? 255 : R);
54 G = G < 0 ? 0 : (G > 255 ? 255 : G);
55 B =
B < 0 ? 0 : (
B > 255 ? 255 :
B);
56
57
58 fl::u32 rgb_index = (
y *
width +
x) * 3;
59 rgb_buffer[rgb_index + 0] =
static_cast<fl::u8>(R);
60 rgb_buffer[rgb_index + 1] =
static_cast<fl::u8>(G);
61 rgb_buffer[rgb_index + 2] =
static_cast<fl::u8>(
B);
62 }
63 }
64}
FL_DISABLE_WARNING_PUSH unsigned char * B