SDL  2.0
yuv_rgb_msa_func.h File Reference
#include <msa.h>
+ Include dependency graph for yuv_rgb_msa_func.h:

Go to the source code of this file.

Macros

#define LD_V(RTYPE, psrc)   *((RTYPE *)(psrc))
 
#define ST_B(RTYPE, in, pdst)   *((RTYPE*)(pdst)) = (in) /* NOLINT */
 
#define ST_B2(RTYPE, in0, in1, pdst, stride)
 
#define ST_UB2(...)   ST_B2(v16u8, __VA_ARGS__)
 
#define READ_Y(y_ptr)   y = LD_V(v16i8, y_ptr); \
 
#define READ_UV
 
#define PACK_RGBA_32(R1, R2, G1, G2, B1, B2, A1, A2, RGB1, RGB2, RGB3, RGB4, RGB5, RGB6, RGB7, RGB8)
 
#define PACK_RGB24_32_STEP(R, G, B, RGB1, RGB2, RGB3)
 
#define PACK_RGB24_32(R1, R2, G1, G2, B1, B2, RGB1, RGB2, RGB3, RGB4, RGB5, RGB6)
 
#define PACK_PIXEL
 
#define SAVE_LINE1
 
#define SAVE_LINE2
 
#define UV2RGB_16(U, V, R1, G1, B1, R2, G2, B2)
 
#define ADD_Y2RGB_16(Y1, Y2, R1, G1, B1, R2, G2, B2)
 
#define CLIP(in0, in1, in2, in3, in4, in5)
 
#define YUV2RGB_32
 

Functions

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)
 

Macro Definition Documentation

◆ ADD_Y2RGB_16

#define ADD_Y2RGB_16 (   Y1,
  Y2,
  R1,
  G1,
  B1,
  R2,
  G2,
  B2 
)
Value:
Y1 -= shift; \
Y2 -= shift; \
Y1 = __msa_mulv_h(Y1, yf); \
Y2 = __msa_mulv_h(Y2, yf); \
R1 += Y1; \
G1 += Y1; \
B1 += Y1; \
R2 += Y2; \
G2 += Y2; \
B2 += Y2; \
R1 = __msa_srai_h(R1, PRECISION); \
G1 = __msa_srai_h(G1, PRECISION); \
B1 = __msa_srai_h(B1, PRECISION); \
R2 = __msa_srai_h(R2, PRECISION); \
G2 = __msa_srai_h(G2, PRECISION); \
B2 = __msa_srai_h(B2, PRECISION); \
#define PRECISION
Definition: yuv_rgb.c:10

Definition at line 166 of file yuv_rgb_msa_func.h.

◆ CLIP

#define CLIP (   in0,
  in1,
  in2,
  in3,
  in4,
  in5 
)
Value:
{ \
in0 = __msa_maxi_s_h(in0, 0); \
in1 = __msa_maxi_s_h(in1, 0); \
in2 = __msa_maxi_s_h(in2, 0); \
in3 = __msa_maxi_s_h(in3, 0); \
in4 = __msa_maxi_s_h(in4, 0); \
in5 = __msa_maxi_s_h(in5, 0); \
in0 = __msa_sat_u_h(in0, 7); \
in1 = __msa_sat_u_h(in1, 7); \
in2 = __msa_sat_u_h(in2, 7); \
in3 = __msa_sat_u_h(in3, 7); \
in4 = __msa_sat_u_h(in4, 7); \
in5 = __msa_sat_u_h(in5, 7); \
}

Definition at line 185 of file yuv_rgb_msa_func.h.

◆ LD_V

#define LD_V (   RTYPE,
  psrc 
)    *((RTYPE *)(psrc))

Definition at line 6 of file yuv_rgb_msa_func.h.

◆ PACK_PIXEL

#define PACK_PIXEL
Value:
v16u8 rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6; \
v16u8 rgb_7, rgb_8, rgb_9, rgb_10, rgb_11, rgb_12; \
PACK_RGB24_32(r_8_11, r_8_12, g_8_11, g_8_12, b_8_11, b_8_12, \
rgb_1, rgb_2, rgb_3, rgb_4, rgb_5, rgb_6) \
PACK_RGB24_32(r_8_21, r_8_22, g_8_21, g_8_22, b_8_21, b_8_22, \
rgb_7, rgb_8, rgb_9, rgb_10, rgb_11, rgb_12) \

Definition at line 64 of file yuv_rgb_msa_func.h.

Referenced by MSA_FUNCTION_NAME().

◆ PACK_RGB24_32

#define PACK_RGB24_32 (   R1,
  R2,
  G1,
  G2,
  B1,
  B2,
  RGB1,
  RGB2,
  RGB3,
  RGB4,
  RGB5,
  RGB6 
)
Value:
PACK_RGB24_32_STEP(R1, G1, B1, RGB1, RGB2, RGB3); \
PACK_RGB24_32_STEP(R2, G2, B2, RGB4, RGB5, RGB6); \
#define PACK_RGB24_32_STEP(R, G, B, RGB1, RGB2, RGB3)

Definition at line 58 of file yuv_rgb_msa_func.h.

◆ PACK_RGB24_32_STEP

#define PACK_RGB24_32_STEP (   R,
  G,
  B,
  RGB1,
  RGB2,
  RGB3 
)
Value:
RGB1 = __msa_ilvr_b(G, R); \
RGB1 = __msa_vshf_b(mask1, B, RGB1); \
RGB2 = __msa_vshf_b(mask2, B, G); \
RGB2 = __msa_vshf_b(mask3, R, RGB2); \
RGB3 = __msa_vshf_b(mask4, R, B); \
RGB3 = __msa_vshf_b(mask5, G, RGB3); \
#define G(x, y, z)
Definition: SDL_test_md5.c:74

Definition at line 49 of file yuv_rgb_msa_func.h.

◆ PACK_RGBA_32

#define PACK_RGBA_32 (   R1,
  R2,
  G1,
  G2,
  B1,
  B2,
  A1,
  A2,
  RGB1,
  RGB2,
  RGB3,
  RGB4,
  RGB5,
  RGB6,
  RGB7,
  RGB8 
)
Value:
{ \
v8u16 ab_r, ab_l, gr_r, gr_l; \
ab_r = (v8u16)__msa_ilvr_b((v16i8)B1, (v16i8)A1); \
ab_l = (v8u16)__msa_ilvl_b((v16i8)B1, (v16i8)A1); \
gr_r = (v8u16)__msa_ilvr_b((v16i8)R1, (v16i8)G1); \
gr_l = (v8u16)__msa_ilvl_b((v16i8)R1, (v16i8)G1); \
RGB1 = (v16u8)__msa_ilvr_h((v8i16)gr_r, (v8i16)ab_r); \
RGB2 = (v16u8)__msa_ilvl_h((v8i16)gr_r, (v8i16)ab_r); \
RGB3 = (v16u8)__msa_ilvr_h((v8i16)gr_l, (v8i16)ab_l); \
RGB4 = (v16u8)__msa_ilvl_h((v8i16)gr_l, (v8i16)ab_l); \
ab_r = (v8u16)__msa_ilvr_b((v16i8)B2, (v16i8)A2); \
ab_l = (v8u16)__msa_ilvl_b((v16i8)B2, (v16i8)A2); \
gr_r = (v8u16)__msa_ilvr_b((v16i8)R2, (v16i8)G2); \
gr_l = (v8u16)__msa_ilvl_b((v16i8)R2, (v16i8)G2); \
RGB5 = (v16u8)__msa_ilvr_h((v8i16)gr_r, (v8i16)ab_r); \
RGB6 = (v16u8)__msa_ilvl_h((v8i16)gr_r, (v8i16)ab_r); \
RGB7 = (v16u8)__msa_ilvr_h((v8i16)gr_l, (v8i16)ab_l); \
RGB8 = (v16u8)__msa_ilvl_h((v8i16)gr_l, (v8i16)ab_l); \
}

Definition at line 28 of file yuv_rgb_msa_func.h.

◆ READ_UV

#define READ_UV
Value:
u_temp = LD_V(v16i8, u_ptr); \
v_temp = LD_V(v16i8, v_ptr); \
#define LD_V(RTYPE, psrc)

Definition at line 20 of file yuv_rgb_msa_func.h.

◆ READ_Y

#define READ_Y (   y_ptr)    y = LD_V(v16i8, y_ptr); \

Definition at line 17 of file yuv_rgb_msa_func.h.

◆ SAVE_LINE1

#define SAVE_LINE1
Value:
ST_UB2(rgb_1, rgb_2, rgb_ptr1, 16); \
ST_UB2(rgb_3, rgb_4, rgb_ptr1 + 32, 16); \
ST_UB2(rgb_5, rgb_6, rgb_ptr1 + 64, 16); \
#define ST_UB2(...)

Definition at line 123 of file yuv_rgb_msa_func.h.

Referenced by MSA_FUNCTION_NAME().

◆ SAVE_LINE2

#define SAVE_LINE2
Value:
ST_UB2(rgb_7, rgb_8, rgb_ptr2, 16); \
ST_UB2(rgb_9, rgb_10, rgb_ptr2 + 32, 16); \
ST_UB2(rgb_11, rgb_12, rgb_ptr2 + 64, 16); \
#define ST_UB2(...)

Definition at line 128 of file yuv_rgb_msa_func.h.

Referenced by MSA_FUNCTION_NAME().

◆ ST_B

#define ST_B (   RTYPE,
  in,
  pdst 
)    *((RTYPE*)(pdst)) = (in) /* NOLINT */

Definition at line 7 of file yuv_rgb_msa_func.h.

◆ ST_B2

#define ST_B2 (   RTYPE,
  in0,
  in1,
  pdst,
  stride 
)
Value:
{ \
ST_B(RTYPE, in0, (pdst)); \
ST_B(RTYPE, in1, (pdst) + stride); \
}
GLsizei stride

Definition at line 8 of file yuv_rgb_msa_func.h.

◆ ST_UB2

#define ST_UB2 (   ...)    ST_B2(v16u8, __VA_ARGS__)

Definition at line 13 of file yuv_rgb_msa_func.h.

◆ UV2RGB_16

#define UV2RGB_16 (   U,
  V,
  R1,
  G1,
  B1,
  R2,
  G2,
  B2 
)
Value:
r_temp = __msa_mulv_h(V, v2r); \
g_temp = __msa_mulv_h(U, u2g); \
g_temp = __msa_maddv_h(V, v2g, g_temp); \
b_temp = __msa_mulv_h(U, u2b); \
R1 = (v8i16)__msa_ilvr_h((v8i16)r_temp, (v8i16)r_temp); \
G1 = (v8i16)__msa_ilvr_h((v8i16)g_temp, (v8i16)g_temp); \
B1 = (v8i16)__msa_ilvr_h((v8i16)b_temp, (v8i16)b_temp); \
R2 = (v8i16)__msa_ilvl_h((v8i16)r_temp, (v8i16)r_temp); \
G2 = (v8i16)__msa_ilvl_h((v8i16)g_temp, (v8i16)g_temp); \
B2 = (v8i16)__msa_ilvl_h((v8i16)b_temp, (v8i16)b_temp); \
#define V(value)
Definition: yuv_rgb.c:35

Definition at line 153 of file yuv_rgb_msa_func.h.

◆ YUV2RGB_32

#define YUV2RGB_32

Definition at line 201 of file yuv_rgb_msa_func.h.

Referenced by MSA_FUNCTION_NAME().

Function Documentation

◆ MSA_FUNCTION_NAME()

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 
)

Definition at line 274 of file yuv_rgb_msa_func.h.

References PACK_PIXEL, SAVE_LINE1, SAVE_LINE2, STD_FUNCTION_NAME(), YUV2RGBParam::u_b_factor, YUV2RGBParam::u_g_factor, uv_pixel_stride, uv_x_sample_interval, uv_y_sample_interval, YUV2RGBParam::v_g_factor, YUV2RGBParam::v_r_factor, YUV2RGBParam::y_factor, y_pixel_stride, YUV2RGBParam::y_shift, YUV2RGB, YUV2RGB_32, and zero.

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 }
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
#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
GLfloat bias