Go to the documentation of this file.
31 # define PIXEL_TYPE SWS_PIXEL_U32
32 # define PIXEL_MAX 0xFFFFFFFFu
33 # define SWAP_BYTES av_bswap32
34 # define pixel_t uint32_t
35 # define block_t u32block_t
38 # define PIXEL_TYPE SWS_PIXEL_U16
39 # define PIXEL_MAX 0xFFFFu
40 # define SWAP_BYTES av_bswap16
41 # define pixel_t uint16_t
42 # define block_t u16block_t
45 # define PIXEL_TYPE SWS_PIXEL_U8
46 # define PIXEL_MAX 0xFFu
47 # define pixel_t uint8_t
48 # define block_t u8block_t
51 # error Invalid BIT_DEPTH
83 x[
i] = in0[elems *
i + 0];
85 y[
i] = in0[elems *
i + 1];
87 z[
i] = in0[elems *
i + 2];
89 w[
i] = in0[elems *
i + 3];
113 out0[elems *
i + 0] = x[
i];
115 out0[elems *
i + 1] = y[
i];
117 out0[elems *
i + 2] = z[
i];
119 out0[elems *
i + 3] =
w[
i];
123 #define WRAP_READ(FUNC, ELEMS, FRAC, PACKED) \
124 DECL_IMPL(FUNC##ELEMS) \
126 CALL_READ(FUNC, ELEMS); \
127 for (int i = 0; i < (PACKED ? 1 : ELEMS); i++) \
128 iter->in[i] += sizeof(block_t) * (PACKED ? ELEMS : 1) >> FRAC; \
131 DECL_ENTRY(FUNC##ELEMS, \
148 #define WRAP_WRITE(FUNC, ELEMS, FRAC, PACKED) \
149 DECL_IMPL(FUNC##ELEMS) \
151 CALL_WRITE(FUNC, ELEMS); \
152 for (int i = 0; i < (PACKED ? 1 : ELEMS); i++) \
153 iter->out[i] += sizeof(block_t) * (PACKED ? ELEMS : 1) >> FRAC; \
156 DECL_ENTRY(FUNC##ELEMS, \
157 .op = SWS_OP_WRITE, \
182 x[
i + 1] =
val & 0xF;
195 x[
i + 0] = (
val >> 7) & 1;
196 x[
i + 1] = (
val >> 6) & 1;
197 x[
i + 2] = (
val >> 5) & 1;
198 x[
i + 3] = (
val >> 4) & 1;
199 x[
i + 4] = (
val >> 3) & 1;
200 x[
i + 5] = (
val >> 2) & 1;
201 x[
i + 6] = (
val >> 1) & 1;
202 x[
i + 7] = (
val >> 0) & 1;
215 out0[
i >> 1] = x[
i] << 4 | x[
i + 1];
222 out0[
i >> 3] = x[
i + 0] << 7 |
243 x[
i] = SWAP_BYTES(x[
i]);
245 y[
i] = SWAP_BYTES(y[
i]);
247 z[
i] = SWAP_BYTES(z[
i]);
249 w[
i] = SWAP_BYTES(
w[
i]);
266 x16[
i] = x[
i] << 8 | x[
i];
268 y16[
i] = y[
i] << 8 | y[
i];
270 z16[
i] = z[
i] << 8 | z[
i];
272 w16[
i] =
w[
i] << 8 |
w[
i];
281 .convert.expand =
true,
290 x32[
i] = x[
i] << 24 | x[
i] << 16 | x[
i] << 8 | x[
i];
291 y32[
i] = y[
i] << 24 | y[
i] << 16 | y[
i] << 8 | y[
i];
292 z32[
i] = z[
i] << 24 | z[
i] << 16 | z[
i] << 8 | z[
i];
293 w32[
i] =
w[
i] << 24 |
w[
i] << 16 |
w[
i] << 8 |
w[
i];
302 .convert.expand =
true,
306 #define WRAP_PACK_UNPACK(X, Y, Z, W) \
307 inline DECL_IMPL(pack_##X##Y##Z##W) \
310 for (int i = 0; i < SWS_BLOCK_SIZE; i++) { \
311 x[i] = x[i] << (Y+Z+W); \
313 x[i] |= y[i] << (Z+W); \
320 CONTINUE(block_t, x, y, z, w); \
323 DECL_ENTRY(pack_##X##Y##Z##W, \
325 .pack.pattern = { X, Y, Z, W }, \
328 inline DECL_IMPL(unpack_##X##Y##Z##W) \
331 for (int i = 0; i < SWS_BLOCK_SIZE; i++) { \
332 const pixel_t val = x[i]; \
333 x[i] = val >> (Y+Z+W); \
335 y[i] = (val >> (Z+W)) & ((1 << Y) - 1); \
337 z[i] = (val >> W) & ((1 << Z) - 1); \
339 w[i] = val & ((1 << W) - 1); \
342 CONTINUE(block_t, x, y, z, w); \
345 DECL_ENTRY(unpack_##X##Y##Z##W, \
346 .op = SWS_OP_UNPACK, \
347 .pack.pattern = { X, Y, Z, W }, \
362 const uint8_t amount = impl->priv.u8[0];
377 const uint8_t amount = impl->priv.u8[0];
427 #define DECL_SWIZZLE(X, Y, Z, W) \
428 static SWS_FUNC void \
429 fn(swizzle_##X##Y##Z##W)(SwsOpIter *restrict iter, \
430 const SwsOpImpl *restrict impl, \
431 block_t c0, block_t c1, block_t c2, block_t c3) \
433 CONTINUE(block_t, c##X, c##Y, c##Z, c##W); \
436 DECL_ENTRY(swizzle_##X##Y##Z##W, \
437 .op = SWS_OP_SWIZZLE, \
438 .swizzle.in = { X, Y, Z, W }, \
461 #define DECL_EXPAND_LUMA(X, W, T0, T1) \
462 static SWS_FUNC void \
463 fn(expand_luma_##X##W)(SwsOpIter *restrict iter, \
464 const SwsOpImpl *restrict impl, \
465 block_t c0, block_t c1, block_t c2, block_t c3) \
468 for (int i = 0; i < SWS_BLOCK_SIZE; i++) \
469 T0[i] = T1[i] = c0[i]; \
471 CONTINUE(block_t, c##X, T0, T1, c##W); \
474 DECL_ENTRY(expand_luma_##X##W, \
475 .op = SWS_OP_SWIZZLE, \
476 .swizzle.in = { X, 0, 0, W }, \
487 &
fn(op_read_planar1),
488 &
fn(op_read_planar2),
489 &
fn(op_read_planar3),
490 &
fn(op_read_planar4),
491 &
fn(op_read_packed2),
492 &
fn(op_read_packed3),
493 &
fn(op_read_packed4),
495 &
fn(op_write_planar1),
496 &
fn(op_write_planar2),
497 &
fn(op_write_planar3),
498 &
fn(op_write_planar4),
499 &
fn(op_write_packed2),
500 &
fn(op_write_packed3),
501 &
fn(op_write_packed4),
505 &
fn(op_read_nibbles1),
507 &
fn(op_write_nibbles1),
519 #elif BIT_DEPTH == 16
526 #elif BIT_DEPTH == 32
527 &
fn(op_pack_2101010),
528 &
fn(op_pack_1010102),
529 &
fn(op_unpack_2101010),
530 &
fn(op_unpack_1010102),
553 &
fn(op_swizzle_3012),
554 &
fn(op_swizzle_3021),
555 &
fn(op_swizzle_2103),
556 &
fn(op_swizzle_3210),
557 &
fn(op_swizzle_3102),
558 &
fn(op_swizzle_3201),
559 &
fn(op_swizzle_1203),
560 &
fn(op_swizzle_1023),
561 &
fn(op_swizzle_2013),
562 &
fn(op_swizzle_2310),
563 &
fn(op_swizzle_2130),
564 &
fn(op_swizzle_1230),
565 &
fn(op_swizzle_1320),
566 &
fn(op_swizzle_0213),
567 &
fn(op_swizzle_0231),
568 &
fn(op_swizzle_0312),
569 &
fn(op_swizzle_3120),
570 &
fn(op_swizzle_0321),
572 &
fn(op_expand_luma_03),
573 &
fn(op_expand_luma_30),
574 &
fn(op_expand_luma_10),
575 &
fn(op_expand_luma_01),
float f32block_t[SWS_BLOCK_SIZE]
static void convert(float y, float u, float v, float *b, float *g, float *r)
static double val(void *priv, double ch)
#define DECL_SWIZZLE(X, Y, Z, W)
Swizzle by directly swapping the order of arguments to the continuation.
#define CONTINUE(TYPE,...)
static int op(uint8_t **dst, const uint8_t *dst_end, GetByteContext *gb, int pixel, int count, int *x, int width, int linesize)
Perform decode operation.
uint16_t u16block_t[SWS_BLOCK_SIZE]
uint32_t u32block_t[SWS_BLOCK_SIZE]
#define SWS_BLOCK_SIZE
Copyright (C) 2025 Niklas Haas.
static const SwsOpTable fn(op_table_int)
#define DECL_EXPAND_LUMA(X, W, T0, T1)
static int read_bits(int bits, int *ppos, unsigned *src)
#define xf(width, name, var, range_min, range_max, subs,...)
#define WRAP_READ(FUNC, ELEMS, FRAC, PACKED)
#define WRAP_PACK_UNPACK(X, Y, Z, W)
#define i(width, name, range_min, range_max)
#define REF_COMMON_PATTERNS(NAME)
#define WRAP_WRITE(FUNC, ELEMS, FRAC, PACKED)
int ff_sws_setup_u8(const SwsOp *op, SwsOpPriv *out)
static void scale(int *out, const int *in, const int w, const int h, const int shift)
DECL_WRITE(write_planar, const int elems)
WRAP_COMMON_PATTERNS(expand16,.op=SWS_OP_CONVERT,.convert.to=SWS_PIXEL_U16,.convert.expand=true,)
DECL_READ(read_planar, const int elems)