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 inter_t int64_t
36 # define block_t u32block_t
39 # define PIXEL_TYPE SWS_PIXEL_U16
40 # define PIXEL_MAX 0xFFFFu
41 # define SWAP_BYTES av_bswap16
42 # define pixel_t uint16_t
43 # define inter_t int64_t
44 # define block_t u16block_t
47 # define PIXEL_TYPE SWS_PIXEL_U8
48 # define PIXEL_MAX 0xFFu
49 # define pixel_t uint8_t
50 # define inter_t int32_t
51 # define block_t u8block_t
54 # error Invalid BIT_DEPTH
81 x[
i] = in0[elems *
i + 0];
83 y[
i] = in0[elems *
i + 1];
85 z[
i] = in0[elems *
i + 2];
87 w[
i] = in0[elems *
i + 3];
111 out0[elems *
i + 0] = x[
i];
113 out0[elems *
i + 1] = y[
i];
115 out0[elems *
i + 2] = z[
i];
117 out0[elems *
i + 3] =
w[
i];
121 #define WRAP_READ(FUNC, ELEMS, FRAC, PACKED) \
122 DECL_IMPL(FUNC##ELEMS) \
124 CALL_READ(FUNC, ELEMS); \
125 for (int i = 0; i < (PACKED ? 1 : ELEMS); i++) \
126 iter->in[i] += sizeof(block_t) * (PACKED ? ELEMS : 1) >> FRAC; \
129 DECL_ENTRY(FUNC##ELEMS, \
146 #define WRAP_WRITE(FUNC, ELEMS, FRAC, PACKED) \
147 DECL_IMPL(FUNC##ELEMS) \
149 CALL_WRITE(FUNC, ELEMS); \
150 for (int i = 0; i < (PACKED ? 1 : ELEMS); i++) \
151 iter->out[i] += sizeof(block_t) * (PACKED ? ELEMS : 1) >> FRAC; \
154 DECL_ENTRY(FUNC##ELEMS, \
155 .op = SWS_OP_WRITE, \
178 x[
i + 1] =
val & 0xF;
189 x[
i + 0] = (
val >> 7) & 1;
190 x[
i + 1] = (
val >> 6) & 1;
191 x[
i + 2] = (
val >> 5) & 1;
192 x[
i + 3] = (
val >> 4) & 1;
193 x[
i + 4] = (
val >> 3) & 1;
194 x[
i + 5] = (
val >> 2) & 1;
195 x[
i + 6] = (
val >> 1) & 1;
196 x[
i + 7] = (
val >> 0) & 1;
209 out0[
i >> 1] = x[
i] << 4 | x[
i + 1];
216 out0[
i >> 3] = x[
i + 0] << 7 |
237 x[
i] = SWAP_BYTES(x[
i]);
239 y[
i] = SWAP_BYTES(y[
i]);
241 z[
i] = SWAP_BYTES(z[
i]);
243 w[
i] = SWAP_BYTES(
w[
i]);
260 x16[
i] = x[
i] << 8 | x[
i];
262 y16[
i] = y[
i] << 8 | y[
i];
264 z16[
i] = z[
i] << 8 | z[
i];
266 w16[
i] =
w[
i] << 8 |
w[
i];
275 .convert.expand =
true,
284 x32[
i] = (uint32_t)x[
i] << 24 | x[
i] << 16 | x[
i] << 8 | x[
i];
285 y32[
i] = (uint32_t)y[
i] << 24 | y[
i] << 16 | y[
i] << 8 | y[
i];
286 z32[
i] = (uint32_t)z[
i] << 24 | z[
i] << 16 | z[
i] << 8 | z[
i];
287 w32[
i] = (uint32_t)
w[
i] << 24 |
w[
i] << 16 |
w[
i] << 8 |
w[
i];
296 .convert.expand =
true,
300 #define WRAP_PACK_UNPACK(X, Y, Z, W) \
301 inline DECL_IMPL(pack_##X##Y##Z##W) \
304 for (int i = 0; i < SWS_BLOCK_SIZE; i++) { \
305 x[i] = x[i] << (Y+Z+W); \
307 x[i] |= y[i] << (Z+W); \
314 CONTINUE(block_t, x, y, z, w); \
317 DECL_ENTRY(pack_##X##Y##Z##W, \
319 .pack.pattern = { X, Y, Z, W }, \
322 inline DECL_IMPL(unpack_##X##Y##Z##W) \
325 for (int i = 0; i < SWS_BLOCK_SIZE; i++) { \
326 const pixel_t val = x[i]; \
327 x[i] = val >> (Y+Z+W); \
329 y[i] = (val >> (Z+W)) & ((1 << Y) - 1); \
331 z[i] = (val >> W) & ((1 << Z) - 1); \
333 w[i] = val & ((1 << W) - 1); \
336 CONTINUE(block_t, x, y, z, w); \
339 DECL_ENTRY(unpack_##X##Y##Z##W, \
340 .op = SWS_OP_UNPACK, \
341 .pack.pattern = { X, Y, Z, W }, \
356 const uint8_t amount = impl->priv.u8[0];
371 const uint8_t amount = impl->priv.u8[0];
421 #define DECL_SWIZZLE(X, Y, Z, W) \
422 static SWS_FUNC void \
423 fn(swizzle_##X##Y##Z##W)(SwsOpIter *restrict iter, \
424 const SwsOpImpl *restrict impl, \
425 block_t c0, block_t c1, block_t c2, block_t c3) \
427 CONTINUE(block_t, c##X, c##Y, c##Z, c##W); \
430 DECL_ENTRY(swizzle_##X##Y##Z##W, \
431 .op = SWS_OP_SWIZZLE, \
432 .swizzle.in = { X, Y, Z, W }, \
455 #define DECL_EXPAND_LUMA(X, W, T0, T1) \
456 static SWS_FUNC void \
457 fn(expand_luma_##X##W)(SwsOpIter *restrict iter, \
458 const SwsOpImpl *restrict impl, \
459 block_t c0, block_t c1, block_t c2, block_t c3) \
462 for (int i = 0; i < SWS_BLOCK_SIZE; i++) \
463 T0[i] = T1[i] = c0[i]; \
465 CONTINUE(block_t, c##X, T0, T1, c##W); \
468 DECL_ENTRY(expand_luma_##X##W, \
469 .op = SWS_OP_SWIZZLE, \
470 .swizzle.in = { X, 0, 0, W }, \
481 &
fn(op_read_planar1),
482 &
fn(op_read_planar2),
483 &
fn(op_read_planar3),
484 &
fn(op_read_planar4),
485 &
fn(op_read_packed2),
486 &
fn(op_read_packed3),
487 &
fn(op_read_packed4),
489 &
fn(op_write_planar1),
490 &
fn(op_write_planar2),
491 &
fn(op_write_planar3),
492 &
fn(op_write_planar4),
493 &
fn(op_write_packed2),
494 &
fn(op_write_packed3),
495 &
fn(op_write_packed4),
509 &
fn(op_read_nibbles1),
511 &
fn(op_write_nibbles1),
523 #elif BIT_DEPTH == 16
530 #elif BIT_DEPTH == 32
531 &
fn(op_pack_2101010),
532 &
fn(op_pack_1010102),
533 &
fn(op_unpack_2101010),
534 &
fn(op_unpack_1010102),
558 &
fn(op_swizzle_3012),
559 &
fn(op_swizzle_3021),
560 &
fn(op_swizzle_2103),
561 &
fn(op_swizzle_3210),
562 &
fn(op_swizzle_3102),
563 &
fn(op_swizzle_3201),
564 &
fn(op_swizzle_1203),
565 &
fn(op_swizzle_1023),
566 &
fn(op_swizzle_2013),
567 &
fn(op_swizzle_2310),
568 &
fn(op_swizzle_2130),
569 &
fn(op_swizzle_1230),
570 &
fn(op_swizzle_1320),
571 &
fn(op_swizzle_0213),
572 &
fn(op_swizzle_0231),
573 &
fn(op_swizzle_0312),
574 &
fn(op_swizzle_3120),
575 &
fn(op_swizzle_0321),
577 &
fn(op_expand_luma_03),
578 &
fn(op_expand_luma_30),
579 &
fn(op_expand_luma_10),
580 &
fn(op_expand_luma_01),
Copyright (C) 2025 Niklas Haas.
float f32block_t[SWS_BLOCK_SIZE]
int ff_sws_setup_shift(const SwsImplParams *params, SwsImplResult *out)
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)
#define i(width, name, range_min, range_max)
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 REF_COMMON_PATTERNS(NAME)
#define WRAP_WRITE(FUNC, ELEMS, FRAC, PACKED)
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)