24#define YUV_TO_RGB_TABLE \
25 c->yuv2rgb_v2r_coeff, \
26 c->yuv2rgb_u2g_coeff, \
27 c->yuv2rgb_v2g_coeff, \
28 c->yuv2rgb_u2b_coeff, \
30#define DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(ifmt, ofmt) \
31int ff_##ifmt##_to_##ofmt##_neon(int w, int h, \
34 const int16_t *table, \
35 const uint8_t *const src[], const int srcStride[], \
36 uint8_t *dst, int linesize); \
38static int ifmt##_to_##ofmt##_neon_wrapper(SwsInternal *c, const uint8_t *const src[], \
39 const int srcStride[], int srcSliceY, \
40 int srcSliceH, uint8_t *const dst[], \
41 const int dstStride[]) { \
42 const int16_t yuv2rgb_table[] = { YUV_TO_RGB_TABLE }; \
44 return ff_##ifmt##_to_##ofmt##_neon(c->opts.src_w, srcSliceH, \
45 c->yuv2rgb_y_offset >> 6, \
49 dst[0] + srcSliceY * dstStride[0], \
53#define DECLARE_FF_YUVX_TO_PLANAR_RGB_FUNCS(ifmt, ofmt) \
54int ff_##ifmt##_to_##ofmt##_neon(int w, int h, \
57 const int16_t *table, \
58 const uint8_t *const src[], const int srcStride[], \
59 uint8_t *dst0, int linesize0, \
60 uint8_t *dst1, int linesize1, \
61 uint8_t *dst2, int linesize2); \
63static int ifmt##_to_##ofmt##_neon_wrapper(SwsInternal *c, const uint8_t *const src[], \
64 const int srcStride[], int srcSliceY, \
65 int srcSliceH, uint8_t *const dst[], \
66 const int dstStride[]) { \
67 const int16_t yuv2rgb_table[] = { YUV_TO_RGB_TABLE }; \
69 return ff_##ifmt##_to_##ofmt##_neon(c->opts.src_w, srcSliceH, \
70 c->yuv2rgb_y_offset >> 6, \
74 dst[0] + srcSliceY * dstStride[0], dstStride[0], \
75 dst[1] + srcSliceY * dstStride[1], dstStride[1], \
76 dst[2] + srcSliceY * dstStride[2], dstStride[2]); \
79#define DECLARE_FF_YUVX_TO_ALL_RGBX_FUNCS(yuvx) \
80DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, argb) \
81DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, rgba) \
82DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, abgr) \
83DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, bgra) \
84DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, rgb24) \
85DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, bgr24) \
86DECLARE_FF_YUVX_TO_PLANAR_RGB_FUNCS(yuvx, gbrp) \
93#define DECLARE_FF_YUVX_TO_ALL_RGB16_FUNCS(yuvx) \
94DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, rgb565le) \
95DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, bgr565le) \
96DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, rgb555le) \
97DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, bgr555le) \
98DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, rgb565be) \
99DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, bgr565be) \
100DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, rgb555be) \
101DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(yuvx, bgr555be) \
114 uint8_t *dst2,
int dstStride2,
115 const uint8_t *
src,
int srcStride,
119 const
int srcStride[],
int srcSliceY,
int srcSliceH,
120 uint8_t *const
dst[], const
int dstStride[])
122 uint8_t *dst1 =
dst[1] + dstStride[1] * srcSliceY / 2;
123 uint8_t *dst2 =
dst[2] + dstStride[2] * srcSliceY / 2;
126 dst[0], dstStride[0]);
130 src[1], srcStride[1],
c->opts.src_w / 2,
134 src[1], srcStride[1],
c->opts.src_w / 2,
144#define SET_FF_YUVX_TO_RGBX_FUNC(ifmt, IFMT, ofmt, OFMT, accurate_rnd) do { \
145 if (c->opts.src_format == AV_PIX_FMT_##IFMT \
146 && c->opts.dst_format == AV_PIX_FMT_##OFMT \
147 && !(c->opts.src_h & 1) \
148 && !(c->opts.src_w & 15) \
150 c->convert_unscaled = ifmt##_to_##ofmt##_neon_wrapper; \
153#define SET_FF_YUVX_TO_ALL_RGBX_FUNC(yuvx, YUVX, accurate_rnd) do { \
154 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, argb, ARGB, accurate_rnd); \
155 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, rgba, RGBA, accurate_rnd); \
156 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, abgr, ABGR, accurate_rnd); \
157 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, bgra, BGRA, accurate_rnd); \
158 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, gbrp, GBRP, accurate_rnd); \
159 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, rgb24, RGB24, accurate_rnd); \
160 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, bgr24, BGR24, accurate_rnd); \
163#define SET_FF_YUVX_TO_ALL_RGB16_FUNC(yuvx, YUVX, accurate_rnd) do { \
164 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, rgb565le, RGB565LE, accurate_rnd); \
165 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, bgr565le, BGR565LE, accurate_rnd); \
166 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, rgb555le, RGB555LE, accurate_rnd); \
167 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, bgr555le, BGR555LE, accurate_rnd); \
168 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, rgb565be, RGB565BE, accurate_rnd); \
169 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, bgr565be, BGR565BE, accurate_rnd); \
170 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, rgb555be, RGB555BE, accurate_rnd); \
171 SET_FF_YUVX_TO_RGBX_FUNC(yuvx, YUVX, bgr555be, BGR555BE, accurate_rnd); \
204 !(
c->opts.src_h & 1) && !(
c->opts.src_w & 15) && !accurate_rnd)
219 (
c->opts.src_h & 1) || (
c->opts.src_w & 15) ||
224 switch (
c->opts.dst_format) {
242 switch (
c->opts.dst_format) {
243#if CONFIG_SWSCALE_ALPHA
263 switch (
c->opts.dst_format) {
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
#define DECLARE_FF_YUVX_TO_ALL_RGB16_FUNCS(yuvx)
void ff_nv24_to_yuv420p_chroma_neon(uint8_t *dst1, int dstStride1, uint8_t *dst2, int dstStride2, const uint8_t *src, int srcStride, int w, int h)
#define SET_FF_YUVX_TO_ALL_RGBX_FUNC(yuvx, YUVX, accurate_rnd)
av_cold SwsFunc ff_yuv2rgb_init_aarch64(SwsInternal *c)
static void get_unscaled_swscale_neon(SwsInternal *c)
#define DECLARE_FF_YUVX_TO_PACKED_RGB_FUNCS(ifmt, ofmt)
static int nv24_to_yuv420p_neon_wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
void ff_get_unscaled_swscale_aarch64(SwsInternal *c)
#define SET_FF_YUVX_TO_RGBX_FUNC(ifmt, IFMT, ofmt, OFMT, accurate_rnd)
#define SET_FF_YUVX_TO_ALL_RGB16_FUNC(yuvx, YUVX, accurate_rnd)
#define DECLARE_FF_YUVX_TO_ALL_RGBX_FUNCS(yuvx)
@ SWS_ACCURATE_RND
Force bit-exact output.
static atomic_int cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_NV42
as above, but U and V bytes are swapped
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_BGR565BE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
@ AV_PIX_FMT_RGB555BE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_RGB565LE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_BGR555BE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
@ AV_PIX_FMT_RGB565BE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
@ AV_PIX_FMT_BGR555LE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_BGR565LE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
int(* SwsFunc)(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
void ff_copyPlane(const uint8_t *src, int srcStride, int srcSliceY, int srcSliceH, int width, uint8_t *dst, int dstStride)