SDL  2.0
yuv_rgb_msa_func.h
Go to the documentation of this file.
1 // Copyright 2016 Adrien Descamps
2 // // Distributed under BSD 3-Clause License
3 
4 #include <msa.h>
5 
6 #define LD_V(RTYPE, psrc) *((RTYPE *)(psrc))
7 #define ST_B(RTYPE, in, pdst) *((RTYPE*)(pdst)) = (in) /* NOLINT */
8 #define ST_B2(RTYPE, in0, in1, pdst, stride) \
9  { \
10  ST_B(RTYPE, in0, (pdst)); \
11  ST_B(RTYPE, in1, (pdst) + stride); \
12  }
13 #define ST_UB2(...) ST_B2(v16u8, __VA_ARGS__)
14 
15 #if YUV_FORMAT == YUV_FORMAT_420
16 
17 #define READ_Y(y_ptr) \
18  y = LD_V(v16i8, y_ptr); \
19 
20 #define READ_UV \
21  u_temp = LD_V(v16i8, u_ptr); \
22  v_temp = LD_V(v16i8, v_ptr); \
23 
24 #else
25 #error READ_UV unimplemented
26 #endif
27 
28 #define PACK_RGBA_32(R1, R2, G1, G2, B1, B2, A1, A2, RGB1, RGB2, RGB3, RGB4, RGB5, RGB6, RGB7, RGB8) \
29 { \
30  v8u16 ab_r, ab_l, gr_r, gr_l; \
31  ab_r = (v8u16)__msa_ilvr_b((v16i8)B1, (v16i8)A1); \
32  ab_l = (v8u16)__msa_ilvl_b((v16i8)B1, (v16i8)A1); \
33  gr_r = (v8u16)__msa_ilvr_b((v16i8)R1, (v16i8)G1); \
34  gr_l = (v8u16)__msa_ilvl_b((v16i8)R1, (v16i8)G1); \
35  RGB1 = (v16u8)__msa_ilvr_h((v8i16)gr_r, (v8i16)ab_r); \
36  RGB2 = (v16u8)__msa_ilvl_h((v8i16)gr_r, (v8i16)ab_r); \
37  RGB3 = (v16u8)__msa_ilvr_h((v8i16)gr_l, (v8i16)ab_l); \
38  RGB4 = (v16u8)__msa_ilvl_h((v8i16)gr_l, (v8i16)ab_l); \
39  ab_r = (v8u16)__msa_ilvr_b((v16i8)B2, (v16i8)A2); \
40  ab_l = (v8u16)__msa_ilvl_b((v16i8)B2, (v16i8)A2); \
41  gr_r = (v8u16)__msa_ilvr_b((v16i8)R2, (v16i8)G2); \
42  gr_l = (v8u16)__msa_ilvl_b((v16i8)R2, (v16i8)G2); \
43  RGB5 = (v16u8)__msa_ilvr_h((v8i16)gr_r, (v8i16)ab_r); \
44  RGB6 = (v16u8)__msa_ilvl_h((v8i16)gr_r, (v8i16)ab_r); \
45  RGB7 = (v16u8)__msa_ilvr_h((v8i16)gr_l, (v8i16)ab_l); \
46  RGB8 = (v16u8)__msa_ilvl_h((v8i16)gr_l, (v8i16)ab_l); \
47 }
48 
49 #define PACK_RGB24_32_STEP(R, G, B, RGB1, RGB2, RGB3) \
50  RGB1 = __msa_ilvr_b(G, R); \
51  RGB1 = __msa_vshf_b(mask1, B, RGB1); \
52  RGB2 = __msa_vshf_b(mask2, B, G); \
53  RGB2 = __msa_vshf_b(mask3, R, RGB2); \
54  RGB3 = __msa_vshf_b(mask4, R, B); \
55  RGB3 = __msa_vshf_b(mask5, G, RGB3); \
56 
57 
58 #define PACK_RGB24_32(R1, R2, G1, G2, B1, B2, RGB1, RGB2, RGB3, RGB4, RGB5, RGB6) \
59  PACK_RGB24_32_STEP(R1, G1, B1, RGB1, RGB2, RGB3); \
60  PACK_RGB24_32_STEP(R2, G2, B2, RGB4, RGB5, RGB6); \
61 
62 #if RGB_FORMAT == RGB_FORMAT_RGB24
63 
64 #define PACK_PIXEL \
65  v16u8 rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6; \
66  v16u8 rgb_7, rgb_8, rgb_9, rgb_10, rgb_11, rgb_12; \
67  PACK_RGB24_32(r_8_11, r_8_12, g_8_11, g_8_12, b_8_11, b_8_12, \
68  rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6) \
69  PACK_RGB24_32(r_8_21, r_8_22, g_8_21, g_8_22, b_8_21, b_8_22, \
70  rgb_7, rgb_8, rgb_9, rgb_10, rgb_11, rgb_12) \
71 
72 
73 #elif RGB_FORMAT == RGB_FORMAT_RGBA
74 
75 #define PACK_PIXEL \
76  v16u8 rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8; \
77  v16u8 rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16; \
78  v16u8 a = __msa_ldi_b(0xFF); \
79  PACK_RGBA_32(r_8_11, r_8_12, g_8_11, g_8_12, b_8_11, b_8_12, a, a, \
80  rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8) \
81  PACK_RGBA_32(r_8_21, r_8_22, g_8_21, g_8_22, b_8_21, b_8_22, a, a, \
82  rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16)\
83 
84 #elif RGB_FORMAT == RGB_FORMAT_BGRA
85 
86 #define PACK_PIXEL \
87  v16u8 rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8; \
88  v16u8 rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16; \
89  v16u8 a = __msa_ldi_b(0xFF); \
90  PACK_RGBA_32(b_8_11, b_8_12, g_8_11, g_8_12, r_8_11, r_8_12, a, a, \
91  rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8) \
92  PACK_RGBA_32(b_8_21, b_8_22, g_8_21, g_8_22, r_8_21, r_8_22, a, a, \
93  rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16)\
94 
95 #elif RGB_FORMAT == RGB_FORMAT_ARGB
96 
97 #define PACK_PIXEL \
98  v16u8 rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8; \
99  v16u8 rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16; \
100  v16u8 a = __msa_ldi_b(0xFF); \
101  PACK_RGBA_32(a, a, r_8_11, r_8_12, g_8_11, g_8_12, b_8_11, b_8_12, \
102  rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8) \
103  PACK_RGBA_32(a, a, r_8_21, r_8_22, g_8_21, g_8_22, b_8_21, b_8_22, \
104  rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16)\
105 
106 #elif RGB_FORMAT == RGB_FORMAT_ABGR
107 
108 #define PACK_PIXEL \
109  v16u8 rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8; \
110  v16u8 rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16; \
111  v16u8 a = __msa_ldi_b(0xFF); \
112  PACK_RGBA_32(a, a, b_8_11, b_8_12, g_8_11, g_8_12, r_8_11, r_8_12, \
113  rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6, rgb_7, rgb_8) \
114  PACK_RGBA_32(a, a, b_8_21, b_8_22, g_8_21, g_8_22, r_8_21, r_8_22, \
115  rgb_9, rgb_10, rgb_11, rgb_12, rgb_13, rgb_14, rgb_15, rgb_16)\
116 
117 #else
118 #error PACK_PIXEL unimplemented
119 #endif
120 
121 #if RGB_FORMAT == RGB_FORMAT_RGB24 \
122 
123 #define SAVE_LINE1 \
124  ST_UB2(rgb_1, rgb_2, rgb_ptr1, 16); \
125  ST_UB2(rgb_3, rgb_4, rgb_ptr1 + 32, 16); \
126  ST_UB2(rgb_5, rgb_6, rgb_ptr1 + 64, 16); \
127 
128 #define SAVE_LINE2 \
129  ST_UB2(rgb_7, rgb_8, rgb_ptr2, 16); \
130  ST_UB2(rgb_9, rgb_10, rgb_ptr2 + 32, 16); \
131  ST_UB2(rgb_11, rgb_12, rgb_ptr2 + 64, 16); \
132 
133 #elif RGB_FORMAT == RGB_FORMAT_RGBA || RGB_FORMAT == RGB_FORMAT_BGRA || \
134  RGB_FORMAT == RGB_FORMAT_ARGB || RGB_FORMAT == RGB_FORMAT_ABGR \
135 
136 #define SAVE_LINE1 \
137  ST_UB2(rgb_1, rgb_2, rgb_ptr1, 16); \
138  ST_UB2(rgb_3, rgb_4, rgb_ptr1 + 32, 16); \
139  ST_UB2(rgb_5, rgb_6, rgb_ptr1 + 64, 16); \
140  ST_UB2(rgb_7, rgb_8, rgb_ptr1 + 96, 16); \
141 
142 #define SAVE_LINE2 \
143  ST_UB2(rgb_9, rgb_10, rgb_ptr2, 16); \
144  ST_UB2(rgb_11, rgb_12, rgb_ptr2 + 32, 16); \
145  ST_UB2(rgb_13, rgb_14, rgb_ptr2 + 64, 16); \
146  ST_UB2(rgb_15, rgb_16, rgb_ptr2 + 96, 16); \
147 
148 #else
149 #error SAVE_LINE unimplemented
150 #endif
151 
152 //= u*vr g=u*ug+v*vg b=u*ub
153 #define UV2RGB_16(U,V,R1,G1,B1,R2,G2,B2) \
154  r_temp = __msa_mulv_h(V, v2r); \
155  g_temp = __msa_mulv_h(U, u2g); \
156  g_temp = __msa_maddv_h(V, v2g, g_temp); \
157  b_temp = __msa_mulv_h(U, u2b); \
158  R1 = (v8i16)__msa_ilvr_h((v8i16)r_temp, (v8i16)r_temp); \
159  G1 = (v8i16)__msa_ilvr_h((v8i16)g_temp, (v8i16)g_temp); \
160  B1 = (v8i16)__msa_ilvr_h((v8i16)b_temp, (v8i16)b_temp); \
161  R2 = (v8i16)__msa_ilvl_h((v8i16)r_temp, (v8i16)r_temp); \
162  G2 = (v8i16)__msa_ilvl_h((v8i16)g_temp, (v8i16)g_temp); \
163  B2 = (v8i16)__msa_ilvl_h((v8i16)b_temp, (v8i16)b_temp); \
164 
165 // Y=(Y-shift)*shift R=(Y+R)>>6,G=(Y+G)>>6,B=(B+Y)>>6
166 #define ADD_Y2RGB_16(Y1, Y2, R1, G1, B1, R2, G2, B2) \
167  Y1 -= shift; \
168  Y2 -= shift; \
169  Y1 = __msa_mulv_h(Y1, yf); \
170  Y2 = __msa_mulv_h(Y2, yf); \
171  R1 += Y1; \
172  G1 += Y1; \
173  B1 += Y1; \
174  R2 += Y2; \
175  G2 += Y2; \
176  B2 += Y2; \
177  R1 = __msa_srai_h(R1, PRECISION); \
178  G1 = __msa_srai_h(G1, PRECISION); \
179  B1 = __msa_srai_h(B1, PRECISION); \
180  R2 = __msa_srai_h(R2, PRECISION); \
181  G2 = __msa_srai_h(G2, PRECISION); \
182  B2 = __msa_srai_h(B2, PRECISION); \
183 
184 
185 #define CLIP(in0, in1, in2, in3, in4, in5) \
186  { \
187  in0 = __msa_maxi_s_h(in0, 0); \
188  in1 = __msa_maxi_s_h(in1, 0); \
189  in2 = __msa_maxi_s_h(in2, 0); \
190  in3 = __msa_maxi_s_h(in3, 0); \
191  in4 = __msa_maxi_s_h(in4, 0); \
192  in5 = __msa_maxi_s_h(in5, 0); \
193  in0 = __msa_sat_u_h(in0, 7); \
194  in1 = __msa_sat_u_h(in1, 7); \
195  in2 = __msa_sat_u_h(in2, 7); \
196  in3 = __msa_sat_u_h(in3, 7); \
197  in4 = __msa_sat_u_h(in4, 7); \
198  in5 = __msa_sat_u_h(in5, 7); \
199  }
200 
201 #define YUV2RGB_32 \
202  v16i8 y, u_temp, v_temp; \
203  v16i8 r_8_11, g_8_11, b_8_11, r_8_21, g_8_21, b_8_21; \
204  v16i8 r_8_12, g_8_12, b_8_12, r_8_22, g_8_22, b_8_22; \
205  v8i16 u, v, r_temp, g_temp, b_temp; \
206  v8i16 r_1, g_1, b_1, r_2, g_2, b_2; \
207  v8i16 y_1, y_2; \
208  v8i16 r_uv_1, g_uv_1, b_uv_1, r_uv_2, g_uv_2, b_uv_2; \
209  \
210  READ_UV \
211  \
212  /* process first 16 pixels of first line */ \
213  u = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)u_temp); \
214  v = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)v_temp); \
215  u -= bias; \
216  v -= bias; \
217  UV2RGB_16(u, v, r_1, g_1, b_1, r_2, g_2, b_2); \
218  r_uv_1 = r_1; g_uv_1 = g_1; b_uv_1 = b_1; \
219  r_uv_2 = r_2; g_uv_2 = g_2; b_uv_2 = b_2; \
220  READ_Y(y_ptr1) \
221  y_1 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)y); \
222  y_2 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)y); \
223  ADD_Y2RGB_16(y_1, y_2, r_1, g_1, b_1, r_2, g_2, b_2) \
224  CLIP(r_1, g_1, b_1, r_2, g_2, b_2); \
225  r_8_11 = __msa_pckev_b((v16i8)r_2, (v16i8)r_1); \
226  g_8_11 = __msa_pckev_b((v16i8)g_2, (v16i8)g_1); \
227  b_8_11 = __msa_pckev_b((v16i8)b_2, (v16i8)b_1); \
228  \
229  /* process first 16 pixels of second line */ \
230  r_1 = r_uv_1; g_1 = g_uv_1; b_1 = b_uv_1; \
231  r_2 = r_uv_2; g_2 = g_uv_2; b_2 = b_uv_2; \
232  \
233  READ_Y(y_ptr2) \
234  y_1 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)y); \
235  y_2 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)y); \
236  ADD_Y2RGB_16(y_1, y_2, r_1, g_1, b_1, r_2, g_2, b_2) \
237  CLIP(r_1, g_1, b_1, r_2, g_2, b_2); \
238  r_8_21 = __msa_pckev_b((v16i8)r_2, (v16i8)r_1); \
239  g_8_21 = __msa_pckev_b((v16i8)g_2, (v16i8)g_1); \
240  b_8_21 = __msa_pckev_b((v16i8)b_2, (v16i8)b_1); \
241  \
242  /* process last 16 pixels of first line */ \
243  u = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)u_temp); \
244  v = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)v_temp); \
245  u -= bias; \
246  v -= bias; \
247  UV2RGB_16(u, v, r_1, g_1, b_1, r_2, g_2, b_2); \
248  r_uv_1 = r_1; g_uv_1 = g_1; b_uv_1 = b_1; \
249  r_uv_2 = r_2; g_uv_2 = g_2; b_uv_2 = b_2; \
250  READ_Y(y_ptr1 + 16 * y_pixel_stride) \
251  y_1 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)y); \
252  y_2 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)y); \
253  ADD_Y2RGB_16(y_1, y_2, r_1, g_1, b_1, r_2, g_2, b_2) \
254  CLIP(r_1, g_1, b_1, r_2, g_2, b_2); \
255  r_8_12 = __msa_pckev_b((v16i8)r_2, (v16i8)r_1); \
256  g_8_12 = __msa_pckev_b((v16i8)g_2, (v16i8)g_1); \
257  b_8_12 = __msa_pckev_b((v16i8)b_2, (v16i8)b_1); \
258  \
259  /* process last 16 pixels of second line */ \
260  r_1 = r_uv_1; g_1 = g_uv_1; b_1 = b_uv_1; \
261  r_2 = r_uv_2; g_2 = g_uv_2; b_2 = b_uv_2; \
262  \
263  READ_Y(y_ptr2 + 16 * y_pixel_stride) \
264  y_1 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)y); \
265  y_2 = (v8i16)__msa_ilvl_b((v16i8)zero, (v16i8)y); \
266  ADD_Y2RGB_16(y_1, y_2, r_1, g_1, b_1, r_2, g_2, b_2) \
267  CLIP(r_1, g_1, b_1, r_2, g_2, b_2); \
268  r_8_22 = __msa_pckev_b((v16i8)r_2, (v16i8)r_1); \
269  g_8_22 = __msa_pckev_b((v16i8)g_2, (v16i8)g_1); \
270  b_8_22 = __msa_pckev_b((v16i8)b_2, (v16i8)b_1); \
271  \
272 
273 
275  const uint8_t *Y, const uint8_t *U, const uint8_t *V, uint32_t Y_stride, uint32_t UV_stride,
276  uint8_t *RGB, uint32_t RGB_stride,
277  YCbCrType yuv_type)
278 {
279  const YUV2RGBParam *const param = &(YUV2RGB[yuv_type]);
280 #if YUV_FORMAT == YUV_FORMAT_420
281  const int y_pixel_stride = 1;
282  const int uv_pixel_stride = 1;
283  const int uv_x_sample_interval = 2;
284  const int uv_y_sample_interval = 2;
285 #endif
286 #if RGB_FORMAT == RGB_FORMAT_RGB565
287  const int rgb_pixel_stride = 2;
288 #elif RGB_FORMAT == RGB_FORMAT_RGB24
289  const int rgb_pixel_stride = 3;
290  v16i8 mask1 = {0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, 8, 9, 20, 10};
291  v16i8 mask2 = {5, 21, 6, 22, 7, 23, 8, 24, 9, 25, 10, 0, 0, 0, 0, 0};
292  v16i8 mask3 = {0, 1, 22, 2, 3, 23, 4, 5, 24, 6, 7, 25, 8, 9, 26, 10};
293  v16i8 mask4 = {10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15, 0, 0, 0, 0, 0};
294  v16i8 mask5 = {0, 1, 27, 2, 3, 28, 4, 5, 29, 6, 7, 30, 8, 9, 31, 10};
295 #elif RGB_FORMAT == RGB_FORMAT_RGBA || RGB_FORMAT_BGRA || \
296  RGB_FORMAT == RGB_FORMAT_ARGB || RGB_FORMAT_ABGR
297  const int rgb_pixel_stride = 4;
298 #else
299 #error Unknown RGB pixel size
300 #endif
301 
302  uint32_t xpos, ypos;
303  v8i16 v2r = __msa_fill_h(param->v_r_factor);
304  v8i16 v2g = __msa_fill_h(param->v_g_factor);
305  v8i16 u2g = __msa_fill_h(param->u_g_factor);
306  v8i16 u2b = __msa_fill_h(param->u_b_factor);
307  v8i16 bias = __msa_fill_h(128);
308  v8i16 shift = __msa_fill_h(param->y_shift);
309  v8i16 yf = __msa_fill_h(param->y_factor);
310  v16i8 zero = {0};
311 
312  if (width >= 32) {
313  for (ypos = 0; ypos < (height - (uv_y_sample_interval - 1)); ypos += uv_y_sample_interval) {
314  const uint8_t *y_ptr1 = Y + ypos * Y_stride,
315  *y_ptr2 = Y + (ypos + 1) * Y_stride,
316  *u_ptr = U + (ypos/uv_y_sample_interval) * UV_stride,
317  *v_ptr = V + (ypos/uv_y_sample_interval) * UV_stride;
318  uint8_t *rgb_ptr1 = RGB + ypos * RGB_stride,
319  *rgb_ptr2 = RGB + (ypos + 1) * RGB_stride;
320 
321  for (xpos = 0; xpos < (width - 31); xpos += 32)
322  {
323  YUV2RGB_32
324  {
325  PACK_PIXEL
326  SAVE_LINE1
327  if (uv_y_sample_interval > 1)
328  {
329  SAVE_LINE2
330  }
331  }
332 
333  y_ptr1 += 32 * y_pixel_stride;
334  y_ptr2 += 32 * y_pixel_stride;
335  u_ptr += 32 * uv_pixel_stride / uv_x_sample_interval;
336  v_ptr += 32 * uv_pixel_stride / uv_x_sample_interval;
337  rgb_ptr1 += 32 * rgb_pixel_stride;
338  rgb_ptr2 += 32 * rgb_pixel_stride;
339  }
340  }
341 
342  if (uv_y_sample_interval == 2 && ypos == (height - 1)) {
343  const uint8_t *y_ptr = Y + ypos * Y_stride,
344  *u_ptr = U + (ypos/uv_y_sample_interval) * UV_stride,
345  *v_ptr = V + (ypos/uv_y_sample_interval) * UV_stride;
346  uint8_t *rgb_ptr = RGB + ypos * RGB_stride;
347 
348  STD_FUNCTION_NAME(width, 1, y_ptr, u_ptr, v_ptr, Y_stride, UV_stride, rgb_ptr, RGB_stride, yuv_type);
349  }
350  }
351 
352  {
353  int converted = (width & ~31);
354  if (converted != width)
355  {
356  const uint8_t *y_ptr = Y + converted * y_pixel_stride,
357  *u_ptr = U + converted * uv_pixel_stride / uv_x_sample_interval,
358  *v_ptr = V + converted * uv_pixel_stride / uv_x_sample_interval;
359  uint8_t *rgb_ptr = RGB + converted * rgb_pixel_stride;
360 
361  STD_FUNCTION_NAME(width-converted, height, y_ptr, u_ptr, v_ptr, Y_stride, UV_stride, rgb_ptr, RGB_stride, yuv_type);
362  }
363  }
364 }
365 
366 #undef MSA_FUNCTION_NAME
367 #undef STD_FUNCTION_NAME
368 #undef YUV_FORMAT
369 #undef RGB_FORMAT
370 #undef MSA_ALIGNED
371 #undef LD_V
372 #undef ST_B
373 #undef ST_B2
374 #undef ST_UB2
375 #undef UV2RGB_16
376 #undef ADD_Y2RGB_16
377 #undef PACK_RGB24_32_STEP
378 #undef PACK_RGB24_32
379 #undef PACK_PIXEL
380 #undef PACK_RGBA_32
381 #undef SAVE_LINE1
382 #undef SAVE_LINE2
383 #undef READ_Y
384 #undef READ_UV
385 #undef YUV2RGB_32
Definition: edid.h:20
int16_t y_factor
Definition: yuv_rgb.c:25
#define YUV2RGB_32
#define uv_x_sample_interval
#define SAVE_LINE2
int16_t v_g_factor
Definition: yuv_rgb.c:28
#define y_pixel_stride
int16_t u_b_factor
Definition: yuv_rgb.c:29
GLint GLint GLsizei width
Definition: SDL_opengl.h:1572
static const double zero
Definition: e_atan2.c:44
void STD_FUNCTION_NAME(uint32_t width, uint32_t height, const uint8_t *Y, const uint8_t *U, const uint8_t *V, uint32_t Y_stride, uint32_t UV_stride, uint8_t *RGB, uint32_t RGB_stride, YCbCrType yuv_type)
static const YUV2RGBParam YUV2RGB[3]
Definition: yuv_rgb.c:42
#define PACK_PIXEL
int16_t u_g_factor
Definition: yuv_rgb.c:27
#define SAVE_LINE1
YCbCrType
Definition: yuv_rgb.h:22
#define uv_pixel_stride
unsigned char uint8_t
unsigned int uint32_t
uint8_t y_shift
Definition: yuv_rgb.c:24
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1572
int16_t v_r_factor
Definition: yuv_rgb.c:26
#define V(value)
Definition: yuv_rgb.c:35
GLfloat param
#define uv_y_sample_interval
void MSA_FUNCTION_NAME(uint32_t width, uint32_t height, const uint8_t *Y, const uint8_t *U, const uint8_t *V, uint32_t Y_stride, uint32_t UV_stride, uint8_t *RGB, uint32_t RGB_stride, YCbCrType yuv_type)
GLfloat bias