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
79 x[
i] = in0[elems *
i + 0];
81 y[
i] = in0[elems *
i + 1];
83 z[
i] = in0[elems *
i + 2];
85 w[
i] = in0[elems *
i + 3];
109 out0[elems *
i + 0] = x[
i];
111 out0[elems *
i + 1] = y[
i];
113 out0[elems *
i + 2] = z[
i];
115 out0[elems *
i + 3] =
w[
i];
119 #define WRAP_READ(FUNC, ELEMS, FRAC, PACKED) \
120 DECL_IMPL(FUNC##ELEMS) \
122 CALL_READ(FUNC, ELEMS); \
123 for (int i = 0; i < (PACKED ? 1 : ELEMS); i++) \
124 iter->in[i] += sizeof(block_t) * (PACKED ? ELEMS : 1) >> FRAC; \
127 DECL_ENTRY(FUNC##ELEMS, \
144 #define WRAP_WRITE(FUNC, ELEMS, FRAC, PACKED) \
145 DECL_IMPL(FUNC##ELEMS) \
147 CALL_WRITE(FUNC, ELEMS); \
148 for (int i = 0; i < (PACKED ? 1 : ELEMS); i++) \
149 iter->out[i] += sizeof(block_t) * (PACKED ? ELEMS : 1) >> FRAC; \
152 DECL_ENTRY(FUNC##ELEMS, \
153 .op = SWS_OP_WRITE, \
176 x[
i + 1] =
val & 0xF;
187 x[
i + 0] = (
val >> 7) & 1;
188 x[
i + 1] = (
val >> 6) & 1;
189 x[
i + 2] = (
val >> 5) & 1;
190 x[
i + 3] = (
val >> 4) & 1;
191 x[
i + 4] = (
val >> 3) & 1;
192 x[
i + 5] = (
val >> 2) & 1;
193 x[
i + 6] = (
val >> 1) & 1;
194 x[
i + 7] = (
val >> 0) & 1;
207 out0[
i >> 1] = x[
i] << 4 | x[
i + 1];
214 out0[
i >> 3] = x[
i + 0] << 7 |
235 x[
i] = SWAP_BYTES(x[
i]);
237 y[
i] = SWAP_BYTES(y[
i]);
239 z[
i] = SWAP_BYTES(z[
i]);
241 w[
i] = SWAP_BYTES(
w[
i]);
258 x16[
i] = x[
i] << 8 | x[
i];
260 y16[
i] = y[
i] << 8 | y[
i];
262 z16[
i] = z[
i] << 8 | z[
i];
264 w16[
i] =
w[
i] << 8 |
w[
i];
273 .convert.expand =
true,
282 x32[
i] = (uint32_t)x[
i] << 24 | x[
i] << 16 | x[
i] << 8 | x[
i];
283 y32[
i] = (uint32_t)y[
i] << 24 | y[
i] << 16 | y[
i] << 8 | y[
i];
284 z32[
i] = (uint32_t)z[
i] << 24 | z[
i] << 16 | z[
i] << 8 | z[
i];
285 w32[
i] = (uint32_t)
w[
i] << 24 |
w[
i] << 16 |
w[
i] << 8 |
w[
i];
294 .convert.expand =
true,
298 #define WRAP_PACK_UNPACK(X, Y, Z, W) \
299 inline DECL_IMPL(pack_##X##Y##Z##W) \
302 for (int i = 0; i < SWS_BLOCK_SIZE; i++) { \
303 x[i] = x[i] << (Y+Z+W); \
305 x[i] |= y[i] << (Z+W); \
312 CONTINUE(block_t, x, y, z, w); \
315 DECL_ENTRY(pack_##X##Y##Z##W, \
317 .pack.pattern = { X, Y, Z, W }, \
320 inline DECL_IMPL(unpack_##X##Y##Z##W) \
323 for (int i = 0; i < SWS_BLOCK_SIZE; i++) { \
324 const pixel_t val = x[i]; \
325 x[i] = val >> (Y+Z+W); \
327 y[i] = (val >> (Z+W)) & ((1 << Y) - 1); \
329 z[i] = (val >> W) & ((1 << Z) - 1); \
331 w[i] = val & ((1 << W) - 1); \
334 CONTINUE(block_t, x, y, z, w); \
337 DECL_ENTRY(unpack_##X##Y##Z##W, \
338 .op = SWS_OP_UNPACK, \
339 .pack.pattern = { X, Y, Z, W }, \
354 const uint8_t amount = impl->priv.u8[0];
369 const uint8_t amount = impl->priv.u8[0];
419 #define DECL_SWIZZLE(X, Y, Z, W) \
420 static SWS_FUNC void \
421 fn(swizzle_##X##Y##Z##W)(SwsOpIter *restrict iter, \
422 const SwsOpImpl *restrict impl, \
423 block_t c0, block_t c1, block_t c2, block_t c3) \
425 CONTINUE(block_t, c##X, c##Y, c##Z, c##W); \
428 DECL_ENTRY(swizzle_##X##Y##Z##W, \
429 .op = SWS_OP_SWIZZLE, \
430 .swizzle.in = { X, Y, Z, W }, \
453 #define DECL_EXPAND_LUMA(X, W, T0, T1) \
454 static SWS_FUNC void \
455 fn(expand_luma_##X##W)(SwsOpIter *restrict iter, \
456 const SwsOpImpl *restrict impl, \
457 block_t c0, block_t c1, block_t c2, block_t c3) \
460 for (int i = 0; i < SWS_BLOCK_SIZE; i++) \
461 T0[i] = T1[i] = c0[i]; \
463 CONTINUE(block_t, c##X, T0, T1, c##W); \
466 DECL_ENTRY(expand_luma_##X##W, \
467 .op = SWS_OP_SWIZZLE, \
468 .swizzle.in = { X, 0, 0, W }, \
479 &
fn(op_read_planar1),
480 &
fn(op_read_planar2),
481 &
fn(op_read_planar3),
482 &
fn(op_read_planar4),
483 &
fn(op_read_packed2),
484 &
fn(op_read_packed3),
485 &
fn(op_read_packed4),
487 &
fn(op_write_planar1),
488 &
fn(op_write_planar2),
489 &
fn(op_write_planar3),
490 &
fn(op_write_planar4),
491 &
fn(op_write_packed2),
492 &
fn(op_write_packed3),
493 &
fn(op_write_packed4),
497 &
fn(op_read_nibbles1),
499 &
fn(op_write_nibbles1),
511 #elif BIT_DEPTH == 16
518 #elif BIT_DEPTH == 32
519 &
fn(op_pack_2101010),
520 &
fn(op_pack_1010102),
521 &
fn(op_unpack_2101010),
522 &
fn(op_unpack_1010102),
546 &
fn(op_swizzle_3012),
547 &
fn(op_swizzle_3021),
548 &
fn(op_swizzle_2103),
549 &
fn(op_swizzle_3210),
550 &
fn(op_swizzle_3102),
551 &
fn(op_swizzle_3201),
552 &
fn(op_swizzle_1203),
553 &
fn(op_swizzle_1023),
554 &
fn(op_swizzle_2013),
555 &
fn(op_swizzle_2310),
556 &
fn(op_swizzle_2130),
557 &
fn(op_swizzle_1230),
558 &
fn(op_swizzle_1320),
559 &
fn(op_swizzle_0213),
560 &
fn(op_swizzle_0231),
561 &
fn(op_swizzle_0312),
562 &
fn(op_swizzle_3120),
563 &
fn(op_swizzle_0321),
565 &
fn(op_expand_luma_03),
566 &
fn(op_expand_luma_30),
567 &
fn(op_expand_luma_10),
568 &
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)