FFmpeg
Macros | Functions
yuv2rgb_lsx.c File Reference
#include "swscale_loongarch.h"
#include "libavutil/loongarch/loongson_intrinsics.h"

Go to the source code of this file.

Macros

#define YUV2RGB_LOAD_COE
 
#define LOAD_YUV_16
 
#define YUV2RGB(y1, y2, u, v, r1, g1, b1, r2, g2, b2)
 
#define RGB_PACK(r, g, b, rgb_l, rgb_h)
 
#define RGB32_PACK(a, r, g, b, rgb_l, rgb_h)
 
#define RGB_STORE(rgb_l, rgb_h, image)
 
#define RGB32_STORE(rgb_l, rgb_h, image)
 
#define YUV2RGBFUNC(func_name, dst_type, alpha)
 
#define YUV2RGBFUNC32(func_name, dst_type, alpha)
 
#define DEALYUV2RGBREMAIN
 
#define DEALYUV2RGBREMAIN32
 
#define PUTRGB24(dst, src)
 
#define PUTBGR24(dst, src)
 
#define PUTRGB(dst, src)
 
#define ENDRES
 
#define ENDRES32
 
#define END_FUNC()
 

Functions

LOAD_YUV_16 YUV2RGB (m_y1, m_y2, m_u, m_v, r1, g1, b1, r2, g2, b2)
 
 RGB_PACK (r1, g1, b1, rgb1_l, rgb1_h)
 
 RGB_PACK (r2, g2, b2, rgb2_l, rgb2_h)
 
 RGB_STORE (rgb1_l, rgb1_h, image1)
 
 RGB_STORE (rgb2_l, rgb2_h, image2)
 
 YUV2RGB (m_y1_h, m_y2_h, m_u_h, m_v_h, r1, g1, b1, r2, g2, b2)
 
 RGB_STORE (rgb1_l, rgb1_h, image1+24)
 
 RGB_STORE (rgb2_l, rgb2_h, image2+24)
 
DEALYUV2RGBREMAIN PUTRGB24 (image1, py_1)
 
 PUTRGB24 (image2, py_2)
 
 RGB_PACK (b1, g1, r1, rgb1_l, rgb1_h)
 
 RGB_PACK (b2, g2, r2, rgb2_l, rgb2_h)
 
DEALYUV2RGBREMAIN PUTBGR24 (image1, py_1)
 
 PUTBGR24 (image2, py_2)
 
 RGB32_PACK (r1, g1, b1, a, rgb1_l, rgb1_h)
 
 RGB32_PACK (r2, g2, b2, a, rgb2_l, rgb2_h)
 
 RGB32_STORE (rgb1_l, rgb1_h, image1)
 
 RGB32_STORE (rgb2_l, rgb2_h, image2)
 
 RGB32_STORE (rgb1_l, rgb1_h, image1+8)
 
 RGB32_STORE (rgb2_l, rgb2_h, image2+8)
 
DEALYUV2RGBREMAIN32 PUTRGB (image1, py_1)
 
 PUTRGB (image2, py_2)
 
 RGB32_PACK (b1, g1, r1, a, rgb1_l, rgb1_h)
 
 RGB32_PACK (b2, g2, r2, a, rgb2_l, rgb2_h)
 
 RGB32_PACK (a, r1, g1, b1, rgb1_l, rgb1_h)
 
 RGB32_PACK (a, r2, g2, b2, rgb2_l, rgb2_h)
 
 RGB32_PACK (a, b1, g1, r1, rgb1_l, rgb1_h)
 
 RGB32_PACK (a, b2, g2, r2, rgb2_l, rgb2_h)
 

Macro Definition Documentation

◆ YUV2RGB_LOAD_COE

#define YUV2RGB_LOAD_COE
Value:
/* Load x_offset */ \
__m128i y_offset = __lsx_vreplgr2vr_d(c->yOffset); \
__m128i u_offset = __lsx_vreplgr2vr_d(c->uOffset); \
__m128i v_offset = __lsx_vreplgr2vr_d(c->vOffset); \
/* Load x_coeff */ \
__m128i ug_coeff = __lsx_vreplgr2vr_d(c->ugCoeff); \
__m128i vg_coeff = __lsx_vreplgr2vr_d(c->vgCoeff); \
__m128i y_coeff = __lsx_vreplgr2vr_d(c->yCoeff); \
__m128i ub_coeff = __lsx_vreplgr2vr_d(c->ubCoeff); \
__m128i vr_coeff = __lsx_vreplgr2vr_d(c->vrCoeff); \

Definition at line 26 of file yuv2rgb_lsx.c.

◆ LOAD_YUV_16

#define LOAD_YUV_16
Value:
m_y1 = __lsx_vld(py_1, 0); \
m_y2 = __lsx_vld(py_2, 0); \
m_u = __lsx_vldrepl_d(pu, 0); \
m_v = __lsx_vldrepl_d(pv, 0); \
DUP2_ARG2(__lsx_vilvl_b, m_u, m_u, m_v, m_v, m_u, m_v); \
DUP2_ARG2(__lsx_vilvh_b, zero, m_u, zero, m_v, m_u_h, m_v_h); \
DUP2_ARG2(__lsx_vilvl_b, zero, m_u, zero, m_v, m_u, m_v); \
DUP2_ARG2(__lsx_vilvh_b, zero, m_y1, zero, m_y2, m_y1_h, m_y2_h); \
DUP2_ARG2(__lsx_vilvl_b, zero, m_y1, zero, m_y2, m_y1, m_y2); \

Definition at line 38 of file yuv2rgb_lsx.c.

◆ YUV2RGB

#define YUV2RGB (   y1,
  y2,
  u,
  v,
  r1,
  g1,
  b1,
  r2,
  g2,
  b2 
)
Value:
{ \
y1 = __lsx_vslli_h(y1, 3); \
y2 = __lsx_vslli_h(y2, 3); \
u = __lsx_vslli_h(u, 3); \
v = __lsx_vslli_h(v, 3); \
y1 = __lsx_vsub_h(y1, y_offset); \
y2 = __lsx_vsub_h(y2, y_offset); \
u = __lsx_vsub_h(u, u_offset); \
v = __lsx_vsub_h(v, v_offset); \
y_1 = __lsx_vmuh_h(y1, y_coeff); \
y_2 = __lsx_vmuh_h(y2, y_coeff); \
u2g = __lsx_vmuh_h(u, ug_coeff); \
u2b = __lsx_vmuh_h(u, ub_coeff); \
v2r = __lsx_vmuh_h(v, vr_coeff); \
v2g = __lsx_vmuh_h(v, vg_coeff); \
r1 = __lsx_vsadd_h(y_1, v2r); \
v2g = __lsx_vsadd_h(v2g, u2g); \
g1 = __lsx_vsadd_h(y_1, v2g); \
b1 = __lsx_vsadd_h(y_1, u2b); \
r2 = __lsx_vsadd_h(y_2, v2r); \
g2 = __lsx_vsadd_h(y_2, v2g); \
b2 = __lsx_vsadd_h(y_2, u2b); \
DUP4_ARG1(__lsx_vclip255_h, r1, g1, b1, r2, r1, g1, b1, r2); \
DUP2_ARG1(__lsx_vclip255_h, g2, b2, g2, b2); \
}

Definition at line 59 of file yuv2rgb_lsx.c.

◆ RGB_PACK

#define RGB_PACK (   r,
  g,
  b,
  rgb_l,
  rgb_h 
)
Value:
{ \
__m128i rg; \
rg = __lsx_vpackev_b(g, r); \
DUP2_ARG3(__lsx_vshuf_b, b, rg, shuf2, b, rg, shuf3, rgb_l, rgb_h); \
}

Definition at line 86 of file yuv2rgb_lsx.c.

◆ RGB32_PACK

#define RGB32_PACK (   a,
  r,
  g,
  b,
  rgb_l,
  rgb_h 
)
Value:
{ \
__m128i ra, bg; \
ra = __lsx_vpackev_b(r, a); \
bg = __lsx_vpackev_b(b, g); \
rgb_l = __lsx_vilvl_h(bg, ra); \
rgb_h = __lsx_vilvh_h(bg, ra); \
}

Definition at line 93 of file yuv2rgb_lsx.c.

◆ RGB_STORE

#define RGB_STORE (   rgb_l,
  rgb_h,
  image 
)
Value:
{ \
__lsx_vstelm_d(rgb_l, image, 0, 0); \
__lsx_vstelm_d(rgb_l, image, 8, 1); \
__lsx_vstelm_d(rgb_h, image, 16, 0); \
}

Definition at line 102 of file yuv2rgb_lsx.c.

◆ RGB32_STORE

#define RGB32_STORE (   rgb_l,
  rgb_h,
  image 
)
Value:
{ \
__lsx_vst(rgb_l, image, 0); \
__lsx_vst(rgb_h, image, 16); \
}

Definition at line 109 of file yuv2rgb_lsx.c.

◆ YUV2RGBFUNC

#define YUV2RGBFUNC (   func_name,
  dst_type,
  alpha 
)
Value:
int func_name(SwsContext *c, const uint8_t *src[], \
int srcStride[], int srcSliceY, int srcSliceH, \
uint8_t *dst[], int dstStride[]) \
{ \
int x, y, h_size, vshift, res; \
__m128i m_y1, m_y2, m_u, m_v; \
__m128i m_y1_h, m_y2_h, m_u_h, m_v_h; \
__m128i y_1, y_2, u2g, v2g, u2b, v2r, rgb1_l, rgb1_h; \
__m128i rgb2_l, rgb2_h, r1, g1, b1, r2, g2, b2; \
__m128i shuf2 = {0x0504120302100100, 0x0A18090816070614}; \
__m128i shuf3 = {0x1E0F0E1C0D0C1A0B, 0x0101010101010101}; \
__m128i zero = __lsx_vldi(0); \
\
YUV2RGB_LOAD_COE \
\
h_size = c->dstW >> 4; \
res = (c->dstW & 15) >> 1; \
vshift = c->srcFormat != AV_PIX_FMT_YUV422P; \
for (y = 0; y < srcSliceH; y += 2) { \
dst_type av_unused *r, *g, *b; \
dst_type *image1 = (dst_type *)(dst[0] + (y + srcSliceY) * dstStride[0]);\
dst_type *image2 = (dst_type *)(image1 + dstStride[0]);\
const uint8_t *py_1 = src[0] + y * srcStride[0]; \
const uint8_t *py_2 = py_1 + srcStride[0]; \
const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \
const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \
for(x = 0; x < h_size; x++) { \

Definition at line 115 of file yuv2rgb_lsx.c.

◆ YUV2RGBFUNC32

#define YUV2RGBFUNC32 (   func_name,
  dst_type,
  alpha 
)
Value:
int func_name(SwsContext *c, const uint8_t *src[], \
int srcStride[], int srcSliceY, int srcSliceH, \
uint8_t *dst[], int dstStride[]) \
{ \
int x, y, h_size, vshift, res; \
__m128i m_y1, m_y2, m_u, m_v; \
__m128i m_y1_h, m_y2_h, m_u_h, m_v_h; \
__m128i y_1, y_2, u2g, v2g, u2b, v2r, rgb1_l, rgb1_h; \
__m128i rgb2_l, rgb2_h, r1, g1, b1, r2, g2, b2; \
__m128i a = __lsx_vldi(0xFF); \
__m128i zero = __lsx_vldi(0); \
\
YUV2RGB_LOAD_COE \
\
h_size = c->dstW >> 4; \
res = (c->dstW & 15) >> 1; \
vshift = c->srcFormat != AV_PIX_FMT_YUV422P; \
for (y = 0; y < srcSliceH; y += 2) { \
int yd = y + srcSliceY; \
dst_type av_unused *r, *g, *b; \
dst_type *image1 = (dst_type *)(dst[0] + (yd) * dstStride[0]); \
dst_type *image2 = (dst_type *)(dst[0] + (yd + 1) * dstStride[0]); \
const uint8_t *py_1 = src[0] + y * srcStride[0]; \
const uint8_t *py_2 = py_1 + srcStride[0]; \
const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \
const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \
for(x = 0; x < h_size; x++) { \

Definition at line 144 of file yuv2rgb_lsx.c.

◆ DEALYUV2RGBREMAIN

#define DEALYUV2RGBREMAIN
Value:
py_1 += 16; \
py_2 += 16; \
pu += 8; \
pv += 8; \
image1 += 48; \
image2 += 48; \
} \
for (x = 0; x < res; x++) { \
int av_unused U, V, Y; \
U = pu[0]; \
V = pv[0]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] \
+ c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];

Definition at line 173 of file yuv2rgb_lsx.c.

◆ DEALYUV2RGBREMAIN32

#define DEALYUV2RGBREMAIN32
Value:
py_1 += 16; \
py_2 += 16; \
pu += 8; \
pv += 8; \
image1 += 16; \
image2 += 16; \
} \
for (x = 0; x < res; x++) { \
int av_unused U, V, Y; \
U = pu[0]; \
V = pv[0]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] \
+ c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \

Definition at line 190 of file yuv2rgb_lsx.c.

◆ PUTRGB24

#define PUTRGB24 (   dst,
  src 
)
Value:
Y = src[0]; \
dst[0] = r[Y]; \
dst[1] = g[Y]; \
dst[2] = b[Y]; \
Y = src[1]; \
dst[3] = r[Y]; \
dst[4] = g[Y]; \
dst[5] = b[Y];

Definition at line 207 of file yuv2rgb_lsx.c.

◆ PUTBGR24

#define PUTBGR24 (   dst,
  src 
)
Value:
Y = src[0]; \
dst[0] = b[Y]; \
dst[1] = g[Y]; \
dst[2] = r[Y]; \
Y = src[1]; \
dst[3] = b[Y]; \
dst[4] = g[Y]; \
dst[5] = r[Y];

Definition at line 217 of file yuv2rgb_lsx.c.

◆ PUTRGB

#define PUTRGB (   dst,
  src 
)
Value:
Y = src[0]; \
dst[0] = r[Y] + g[Y] + b[Y]; \
Y = src[1]; \
dst[1] = r[Y] + g[Y] + b[Y]; \

Definition at line 227 of file yuv2rgb_lsx.c.

◆ ENDRES

#define ENDRES
Value:
pu += 1; \
pv += 1; \
py_1 += 2; \
py_2 += 2; \
image1 += 6; \
image2 += 6; \

Definition at line 233 of file yuv2rgb_lsx.c.

◆ ENDRES32

#define ENDRES32
Value:
pu += 1; \
pv += 1; \
py_1 += 2; \
py_2 += 2; \
image1 += 2; \
image2 += 2; \

Definition at line 241 of file yuv2rgb_lsx.c.

◆ END_FUNC

#define END_FUNC ( )
Value:
} \
} \
return srcSliceH; \
}

Definition at line 249 of file yuv2rgb_lsx.c.

Function Documentation

◆ YUV2RGB() [1/2]

ENDRES32 LOAD_YUV_16 YUV2RGB ( m_y1  ,
m_y2  ,
m_u  ,
m_v  ,
r1  ,
g1  ,
b1  ,
r2  ,
g2  ,
b2   
)

◆ RGB_PACK() [1/4]

RGB_PACK ( r1  ,
g1  ,
b1  ,
rgb1_l  ,
rgb1_h   
)

◆ RGB_PACK() [2/4]

RGB_PACK ( r2  ,
g2  ,
b2  ,
rgb2_l  ,
rgb2_h   
)

◆ RGB_STORE() [1/4]

RGB_STORE ( rgb1_l  ,
rgb1_h  ,
image1   
)

◆ RGB_STORE() [2/4]

RGB_STORE ( rgb2_l  ,
rgb2_h  ,
image2   
)

◆ YUV2RGB() [2/2]

YUV2RGB ( m_y1_h  ,
m_y2_h  ,
m_u_h  ,
m_v_h  ,
r1  ,
g1  ,
b1  ,
r2  ,
g2  ,
b2   
)

◆ RGB_STORE() [3/4]

RGB_STORE ( rgb1_l  ,
rgb1_h  ,
image1+  24 
)

◆ RGB_STORE() [4/4]

RGB_STORE ( rgb2_l  ,
rgb2_h  ,
image2+  24 
)

◆ PUTRGB24() [1/2]

DEALYUV2RGBREMAIN PUTRGB24 ( image1  ,
py_1   
)

◆ PUTRGB24() [2/2]

PUTRGB24 ( image2  ,
py_2   
)

◆ RGB_PACK() [3/4]

RGB_PACK ( b1  ,
g1  ,
r1  ,
rgb1_l  ,
rgb1_h   
)

◆ RGB_PACK() [4/4]

RGB_PACK ( b2  ,
g2  ,
r2  ,
rgb2_l  ,
rgb2_h   
)

◆ PUTBGR24() [1/2]

DEALYUV2RGBREMAIN PUTBGR24 ( image1  ,
py_1   
)

◆ PUTBGR24() [2/2]

PUTBGR24 ( image2  ,
py_2   
)

◆ RGB32_PACK() [1/8]

RGB32_PACK ( r1  ,
g1  ,
b1  ,
a  ,
rgb1_l  ,
rgb1_h   
)

◆ RGB32_PACK() [2/8]

RGB32_PACK ( r2  ,
g2  ,
b2  ,
a  ,
rgb2_l  ,
rgb2_h   
)

◆ RGB32_STORE() [1/4]

RGB32_STORE ( rgb1_l  ,
rgb1_h  ,
image1   
)

◆ RGB32_STORE() [2/4]

RGB32_STORE ( rgb2_l  ,
rgb2_h  ,
image2   
)

◆ RGB32_STORE() [3/4]

RGB32_STORE ( rgb1_l  ,
rgb1_h  ,
image1+  8 
)

◆ RGB32_STORE() [4/4]

RGB32_STORE ( rgb2_l  ,
rgb2_h  ,
image2+  8 
)

◆ PUTRGB() [1/2]

DEALYUV2RGBREMAIN32 PUTRGB ( image1  ,
py_1   
)

◆ PUTRGB() [2/2]

PUTRGB ( image2  ,
py_2   
)

◆ RGB32_PACK() [3/8]

RGB32_PACK ( b1  ,
g1  ,
r1  ,
a  ,
rgb1_l  ,
rgb1_h   
)

◆ RGB32_PACK() [4/8]

RGB32_PACK ( b2  ,
g2  ,
r2  ,
a  ,
rgb2_l  ,
rgb2_h   
)

◆ RGB32_PACK() [5/8]

RGB32_PACK ( a  ,
r1  ,
g1  ,
b1  ,
rgb1_l  ,
rgb1_h   
)

◆ RGB32_PACK() [6/8]

RGB32_PACK ( a  ,
r2  ,
g2  ,
b2  ,
rgb2_l  ,
rgb2_h   
)

◆ RGB32_PACK() [7/8]

RGB32_PACK ( a  ,
b1  ,
g1  ,
r1  ,
rgb1_l  ,
rgb1_h   
)

◆ RGB32_PACK() [8/8]

RGB32_PACK ( a  ,
b2  ,
g2  ,
r2  ,
rgb2_l  ,
rgb2_h   
)
r
const char * r
Definition: vf_curves.c:126
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:250
av_unused
#define av_unused
Definition: attributes.h:131
b
#define b
Definition: input.c:41
ra
#define ra
Definition: regdef.h:57
b1
static double b1(void *priv, double x, double y)
Definition: vf_xfade.c:2035
YUVRGB_TABLE_HEADROOM
#define YUVRGB_TABLE_HEADROOM
Definition: swscale_internal.h:42
g
const char * g
Definition: vf_curves.c:127
V
#define V
Definition: avdct.c:30
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
srcSliceH
return srcSliceH
Definition: yuv2rgb_template.c:87
b2
static double b2(void *priv, double x, double y)
Definition: vf_xfade.c:2036
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
Y
#define Y
Definition: boxblur.h:37
pv
#define pv
Definition: regdef.h:60
U
#define U(x)
Definition: vpx_arith.h:37
zero
#define zero
Definition: regdef.h:64
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
SwsContext
Definition: swscale_internal.h:299