26#define YUV2RGB_LOAD_COE \
28 __m128i y_offset = __lsx_vreplgr2vr_d(c->yOffset); \
29 __m128i u_offset = __lsx_vreplgr2vr_d(c->uOffset); \
30 __m128i v_offset = __lsx_vreplgr2vr_d(c->vOffset); \
32 __m128i ug_coeff = __lsx_vreplgr2vr_d(c->ugCoeff); \
33 __m128i vg_coeff = __lsx_vreplgr2vr_d(c->vgCoeff); \
34 __m128i y_coeff = __lsx_vreplgr2vr_d(c->yCoeff); \
35 __m128i ub_coeff = __lsx_vreplgr2vr_d(c->ubCoeff); \
36 __m128i vr_coeff = __lsx_vreplgr2vr_d(c->vrCoeff); \
39 m_y1 = __lsx_vld(py_1, 0); \
40 m_y2 = __lsx_vld(py_2, 0); \
41 m_u = __lsx_vldrepl_d(pu, 0); \
42 m_v = __lsx_vldrepl_d(pv, 0); \
43 DUP2_ARG2(__lsx_vilvl_b, m_u, m_u, m_v, m_v, m_u, m_v); \
44 DUP2_ARG2(__lsx_vilvh_b, zero, m_u, zero, m_v, m_u_h, m_v_h); \
45 DUP2_ARG2(__lsx_vilvl_b, zero, m_u, zero, m_v, m_u, m_v); \
46 DUP2_ARG2(__lsx_vilvh_b, zero, m_y1, zero, m_y2, m_y1_h, m_y2_h); \
47 DUP2_ARG2(__lsx_vilvl_b, zero, m_y1, zero, m_y2, m_y1, m_y2); \
49#define LOAD_YUV_16_NV12 \
50 m_y1 = __lsx_vld(py_1, 0); \
51 m_y2 = __lsx_vld(py_2, 0); \
52 m_uv = __lsx_vld(puv, 0); \
53 m_u = __lsx_vshuf_b(zero, m_uv, shuf_u); \
54 m_u_h = __lsx_vshuf_b(zero, m_uv, shuf_uh); \
55 m_v = __lsx_vshuf_b(zero, m_uv, shuf_v); \
56 m_v_h = __lsx_vshuf_b(zero, m_uv, shuf_vh); \
57 DUP2_ARG2(__lsx_vilvh_b, zero, m_y1, zero, m_y2, m_y1_h, m_y2_h); \
58 DUP2_ARG2(__lsx_vilvl_b, zero, m_y1, zero, m_y2, m_y1, m_y2); \
70#define YUV2RGB(y1, y2, u, v, r1, g1, b1, r2, g2, b2) \
72 y1 = __lsx_vslli_h(y1, 3); \
73 y2 = __lsx_vslli_h(y2, 3); \
74 u = __lsx_vslli_h(u, 3); \
75 v = __lsx_vslli_h(v, 3); \
76 y1 = __lsx_vsub_h(y1, y_offset); \
77 y2 = __lsx_vsub_h(y2, y_offset); \
78 u = __lsx_vsub_h(u, u_offset); \
79 v = __lsx_vsub_h(v, v_offset); \
80 y_1 = __lsx_vmuh_h(y1, y_coeff); \
81 y_2 = __lsx_vmuh_h(y2, y_coeff); \
82 u2g = __lsx_vmuh_h(u, ug_coeff); \
83 u2b = __lsx_vmuh_h(u, ub_coeff); \
84 v2r = __lsx_vmuh_h(v, vr_coeff); \
85 v2g = __lsx_vmuh_h(v, vg_coeff); \
86 r1 = __lsx_vsadd_h(y_1, v2r); \
87 v2g = __lsx_vsadd_h(v2g, u2g); \
88 g1 = __lsx_vsadd_h(y_1, v2g); \
89 b1 = __lsx_vsadd_h(y_1, u2b); \
90 r2 = __lsx_vsadd_h(y_2, v2r); \
91 g2 = __lsx_vsadd_h(y_2, v2g); \
92 b2 = __lsx_vsadd_h(y_2, u2b); \
93 DUP4_ARG1(__lsx_vclip255_h, r1, g1, b1, r2, r1, g1, b1, r2); \
94 DUP2_ARG1(__lsx_vclip255_h, g2, b2, g2, b2); \
97#define RGB_PACK(r, g, b, rgb_l, rgb_h) \
100 rg = __lsx_vpackev_b(g, r); \
101 DUP2_ARG3(__lsx_vshuf_b, b, rg, shuf2, b, rg, shuf3, rgb_l, rgb_h); \
104#define RGB32_PACK(a, r, g, b, rgb_l, rgb_h) \
107 ra = __lsx_vpackev_b(r, a); \
108 bg = __lsx_vpackev_b(b, g); \
109 rgb_l = __lsx_vilvl_h(bg, ra); \
110 rgb_h = __lsx_vilvh_h(bg, ra); \
113#define RGB_STORE(rgb_l, rgb_h, image) \
115 __lsx_vstelm_d(rgb_l, image, 0, 0); \
116 __lsx_vstelm_d(rgb_l, image, 8, 1); \
117 __lsx_vstelm_d(rgb_h, image, 16, 0); \
120#define RGB32_STORE(rgb_l, rgb_h, image) \
122 __lsx_vst(rgb_l, image, 0); \
123 __lsx_vst(rgb_h, image, 16); \
126#define YUV2RGBFUNC(func_name, dst_type, alpha) \
127 int func_name(SwsInternal *c, const uint8_t *const src[], \
128 const int srcStride[], int srcSliceY, int srcSliceH, \
129 uint8_t *const dst[], const int dstStride[]) \
131 int x, y, h_size, vshift, res; \
132 __m128i m_y1, m_y2, m_u, m_v; \
133 __m128i m_y1_h, m_y2_h, m_u_h, m_v_h; \
134 __m128i y_1, y_2, u2g, v2g, u2b, v2r, rgb1_l, rgb1_h; \
135 __m128i rgb2_l, rgb2_h, r1, g1, b1, r2, g2, b2; \
136 __m128i shuf2 = {0x0504120302100100, 0x0A18090816070614}; \
137 __m128i shuf3 = {0x1E0F0E1C0D0C1A0B, 0x0101010101010101}; \
138 __m128i zero = __lsx_vldi(0); \
142 h_size = c->opts.dst_w >> 4; \
143 res = (c->opts.dst_w & 15) >> 1; \
144 vshift = c->opts.src_format != AV_PIX_FMT_YUV422P; \
145 for (y = 0; y < srcSliceH; y += 2) { \
146 av_unused dst_type *r, *g, *b; \
147 dst_type *image1 = (dst_type *)(dst[0] + (y + srcSliceY) * dstStride[0]);\
148 dst_type *image2 = (dst_type *)(image1 + dstStride[0]);\
149 const uint8_t *py_1 = src[0] + y * srcStride[0]; \
150 const uint8_t *py_2 = py_1 + srcStride[0]; \
151 const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \
152 const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \
153 for(x = 0; x < h_size; x++) { \
155#define YUV2RGBFUNC32(func_name, dst_type, alpha) \
156 int func_name(SwsInternal *c, const uint8_t *const src[], \
157 const int srcStride[], int srcSliceY, int srcSliceH, \
158 uint8_t *const dst[], const int dstStride[]) \
160 int x, y, h_size, vshift, res; \
161 __m128i m_y1, m_y2, m_u, m_v; \
162 __m128i m_y1_h, m_y2_h, m_u_h, m_v_h; \
163 __m128i y_1, y_2, u2g, v2g, u2b, v2r, rgb1_l, rgb1_h; \
164 __m128i rgb2_l, rgb2_h, r1, g1, b1, r2, g2, b2; \
165 __m128i a = __lsx_vldi(0xFF); \
166 __m128i zero = __lsx_vldi(0); \
170 h_size = c->opts.dst_w >> 4; \
171 res = (c->opts.dst_w & 15) >> 1; \
172 vshift = c->opts.src_format != AV_PIX_FMT_YUV422P; \
173 for (y = 0; y < srcSliceH; y += 2) { \
174 int yd = y + srcSliceY; \
175 av_unused dst_type *r, *g, *b; \
176 dst_type *image1 = (dst_type *)(dst[0] + (yd) * dstStride[0]); \
177 dst_type *image2 = (dst_type *)(dst[0] + (yd + 1) * dstStride[0]); \
178 const uint8_t *py_1 = src[0] + y * srcStride[0]; \
179 const uint8_t *py_2 = py_1 + srcStride[0]; \
180 const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \
181 const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \
182 for(x = 0; x < h_size; x++) { \
184#define DEALYUV2RGBREMAIN \
192 for (x = 0; x < res; x++) { \
193 av_unused int U, V, Y; \
196 r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
197 g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] \
198 + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
199 b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
201#define DEALYUV2RGBREMAIN32 \
209 for (x = 0; x < res; x++) { \
210 av_unused int U, V, Y; \
213 r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
214 g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] \
215 + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
216 b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \
218#define PUTRGB24(dst, src) \
228#define PUTBGR24(dst, src) \
238#define PUTRGB(dst, src) \
240 dst[0] = r[Y] + g[Y] + b[Y]; \
242 dst[1] = r[Y] + g[Y] + b[Y]; \
266#define SHUF_UV_EVEN {0x1002100210001000, 0x1006100610041004}
267#define SHUF_UV_EVEN_HI {0x100a100a10081008, 0x100e100e100c100c}
268#define SHUF_UV_ODD {0x1003100310011001, 0x1007100710051005}
269#define SHUF_UV_ODD_HI {0x100b100b10091009, 0x100f100f100d100d}
271#define YUV2RGBFUNC32_NV12(func_name, dst_type, alpha, \
272 SHUF_U, SHUF_UH, SHUF_V, SHUF_VH) \
273 int func_name(SwsInternal *c, const uint8_t *const src[], \
274 const int srcStride[], int srcSliceY, int srcSliceH, \
275 uint8_t *const dst[], const int dstStride[]) \
277 int x, y, h_size, vshift, res; \
278 __m128i m_y1, m_y2, m_u, m_v, m_uv; \
279 __m128i m_y1_h, m_y2_h, m_u_h, m_v_h; \
280 __m128i y_1, y_2, u2g, v2g, u2b, v2r, rgb1_l, rgb1_h; \
281 __m128i rgb2_l, rgb2_h, r1, g1, b1, r2, g2, b2; \
282 __m128i a = __lsx_vldi(0xFF); \
283 __m128i zero = __lsx_vldi(0); \
284 __m128i shuf_u = SHUF_U; \
285 __m128i shuf_uh = SHUF_UH; \
286 __m128i shuf_v = SHUF_V; \
287 __m128i shuf_vh = SHUF_VH; \
291 h_size = c->opts.dst_w >> 4; \
292 res = (c->opts.dst_w & 15) >> 1; \
293 vshift = c->opts.src_format != AV_PIX_FMT_YUV422P; \
294 for (y = 0; y < srcSliceH; y += 2) { \
295 int yd = y + srcSliceY; \
296 dst_type av_unused *r, *g, *b; \
297 dst_type *image1 = (dst_type *)(dst[0] + (yd) * dstStride[0]); \
298 dst_type *image2 = (dst_type *)(dst[0] + (yd + 1) * dstStride[0]); \
299 const uint8_t *py_1 = src[0] + y * srcStride[0]; \
300 const uint8_t *py_2 = py_1 + srcStride[0]; \
301 const uint8_t *puv = src[1] + (y >> vshift) * srcStride[1]; \
302 for(x = 0; x < h_size; x++) { \
304#define DEALYUV2RGBREMAIN32_NV12 \
311 for (x = 0; x < res; x++) { \
312 av_unused int U, V, Y; \
315 r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
316 g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] \
317 + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
318 b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \
320#define DEALYUV2RGBREMAIN32_NV21 \
327 for (x = 0; x < res; x++) { \
328 av_unused int U, V, Y; \
331 r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
332 g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] \
333 + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
334 b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \
336#define ENDRES32_NV12 \
363 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
368 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
381 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
386 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
399 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
404 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
417 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
422 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
435 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
440 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
457 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
462 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
479 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
484 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
501 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
506 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
523 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
528 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
545 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
550 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
567 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
572 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
589 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
594 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
611 YUV2RGB(m_y1, m_y2, m_u, m_v, r1, g1,
b1, r2, g2,
b2);
616 YUV2RGB(m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1,
b1, r2, g2,
b2);
#define YUV2RGB(NAME, TYPE)
int yuv420_argb32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv21_argb32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_rgba32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_bgra32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_rgb24_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv12_bgra32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv21_abgr32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv12_abgr32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv21_bgra32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv12_rgba32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_bgr24_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_abgr32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv21_rgba32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
int yuv420_nv12_argb32_lsx(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
static double b1(void *priv, double x, double y)
static double b2(void *priv, double x, double y)
#define RGB_STORE(rgb_l, rgb_h, image)
#define YUV2RGBFUNC(func_name, dst_type, alpha)
#define RGB32_PACK(a, r, g, b, rgb_l, rgb_h)
#define RGB32_STORE(rgb_l, rgb_h, image)
#define YUV2RGBFUNC32(func_name, dst_type, alpha)
#define RGB_PACK(r, g, b, rgb_l, rgb_h)
#define PUTBGR24(dst, src)
#define DEALYUV2RGBREMAIN32_NV12
#define PUTRGB24(dst, src)
#define DEALYUV2RGBREMAIN32_NV21
#define YUV2RGBFUNC(func_name, dst_type, alpha)
#define YUV2RGBFUNC32_NV12(func_name, dst_type, alpha, SHUF_U, SHUF_UH, SHUF_V, SHUF_VH)
#define DEALYUV2RGBREMAIN
#define DEALYUV2RGBREMAIN32