Go to the documentation of this file.
30 if ((ret = (x)) < 0) \
67 for (
int i = 0;
i < 4;
i++) {
128 for (
int i = 0;
i < 4;
i++) {
131 const int j =
op->swizzle.in[
i];
142 for (
int i = 0;
i < 4;
i++) {
145 const int j =
op->swizzle.in[
i];
223 return (1 <<
p) == x ?
p : 0;
249 for (
int i = 0;
i < 4;
i++) {
259 if (
scale.factor.den)
261 return scale.factor.den;
271 for (
int i = 0;
i < 4;
i++) {
272 bool const_row =
c->m[
i][4].den == 1;
273 for (
int j = 0; j < 4; j++) {
274 const_row &=
c->m[
i][j].num == 0 ||
279 for (
int j = 0; j < 5; j++)
280 c->m[
i][j] =
Q(
i == j);
299 uint32_t nonzero = 0;
300 for (
int i = 0;
i < 4;
i++) {
301 for (
int j = 0; j < 4; j++) {
310 for (
int i = 0;
i < 4;
i++) {
313 for (
int j = 0; j < 4; j++) {
316 c.m[
i][
i] =
c.m[
i][j];
342 for (
int n = 1; n < ops->
num_ops; n++) {
358 for (
int n = 0; n < ops->
num_ops; n++) {
379 if (!
op->rw.packed) {
382 for (
int i = 0;
i <
op->rw.elems;
i++) {
384 swiz.
in[
i] = 3 - (
i - nb_planes);
388 const int idx = nb_planes++;
394 if (nb_planes < op->rw.elems) {
395 op->rw.elems = nb_planes;
430 if (next->
op ==
op->op) {
437 if (!
op->shift.amount) {
444 for (
int i = 0;
i < 4;
i++) {
445 if (!
op->clear.value[
i].den)
450 op->clear.value[
i].num == 0)
453 op->clear.value[
i].den = 0;
457 }
else if (
op->clear.value[
i].den) {
469 for (
int i = 0;
i < 4;
i++) {
479 for (
int i = 0;
i < 4;
i++) {
482 if (
op->swizzle.in[
i] !=
i)
495 for (
int i = 0;
i < 4;
i++)
504 const int src =
op->swizzle.in[
dst];
505 if (
src >
dst && src < prev->rw.elems) {
507 for (
int i =
dst;
i < 4;
i++) {
508 if (
op->swizzle.in[
i] ==
dst)
510 else if (
op->swizzle.in[
i] ==
src)
520 const int src =
op->swizzle.in[
dst];
521 if (
src >
dst && src < next->rw.elems) {
532 if (
op->type ==
op->convert.to) {
554 op->convert.expand =
true;
561 for (
int i = 0;
i < 4;
i++) {
575 for (
int i = 0;
i < 4;
i++) {
589 for (
int i = 0;
i < 4;
i++) {
590 if (
op->dither.y_offset[
i] < 0)
593 op->dither.y_offset[
i] = -1;
621 for (
int i = 0;
i < 4;
i++) {
622 for (
int j = 0; j < 5; j++) {
624 for (
int k = 0; k < 4; k++)
628 op->lin.m[
i][j] = sum;
637 for (
int j = 0; j < 4; j++) {
641 for (
int i = 0;
i < 4;
i++)
642 op->lin.m[
i][j] =
Q(
i == j);
643 op->lin.mask &= ~col;
648 for (
int i = 0;
i < 4;
i++) {
652 for (
int j = 0; j < 5; j++)
653 op->lin.m[
i][j] =
Q(
i == j);
654 op->lin.mask &= ~row;
692 if (
op->scale.factor.num == 1 &&
op->scale.factor.den == 1) {
702 av_reduce(&
op->scale.factor.num, &
op->scale.factor.den,
p, q, INT_MAX);
711 op->shift.amount =
FFABS(factor2);
732 for (
int n = 0; n < ops->
num_ops - 1; n++) {
749 for (
int n = 0; n < ops->
num_ops - 1; n++) {
780 int size, uint8_t clear_val,
788 (!
read->rw.packed &&
read->rw.elems > 1))
792 uint32_t
mask[4] = {0};
793 for (
int i = 0;
i <
read->rw.elems;
i++)
794 mask[
i] = 0x01010101 *
i * read_size + 0x03020100;
796 for (
int opidx = 1; opidx < ops->
num_ops; opidx++) {
801 for (
int i = 0;
i < 4;
i++)
807 for (
int i = 0;
i < 4;
i++) {
816 for (
int i = 0;
i < 4;
i++) {
817 if (!
op->clear.value[
i].den)
819 if (
op->clear.value[
i].num != 0 || !clear_val)
821 mask[
i] = 0x1010101ul * clear_val;
826 if (!
op->convert.expand)
828 for (
int i = 0;
i < 4;
i++) {
830 case 1:
mask[
i] = 0x01010101 * (
mask[
i] & 0xFF);
break;
831 case 2:
mask[
i] = 0x00010001 * (
mask[
i] & 0xFFFF);
break;
838 if (
op->rw.frac ||
op->rw.filter ||
839 (!
op->rw.packed &&
op->rw.elems > 1))
847 const int write_chunk =
op->rw.elems * write_size;
849 for (
int n = 0; n < num_groups; n++) {
851 const int base_out = n * write_chunk;
852 for (
int i = 0;
i <
op->rw.elems;
i++) {
853 const int offset = base_out +
i * write_size;
854 for (
int b = 0;
b < write_size;
b++) {
855 const uint8_t idx =
mask[
i] >> (
b * 8);
856 if (idx != clear_val)
934 for (idx = 0; idx < ops1->
num_ops; idx++) {
935 op = &ops1->
ops[idx];
946 const SwsOp *prev = &ops1->
ops[idx - 1];
960 for (
int i = 0;
i < 4;
i++) {
962 const int o = nb_planes++;
976 for (
int i = 0;
i < nb_planes;
i++)
996 .rw.elems = nb_planes,
1004 .rw.elems = nb_planes,
void ff_sws_op_list_free(SwsOpList **p_ops)
AVPixelFormat
Pixel format.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
SwsOpList * ff_sws_op_list_duplicate(const SwsOpList *ops)
Returns a duplicate of ops, or NULL on OOM.
SwsComps comps_src
Source component metadata associated with pixel values from each corresponding component (in plane/me...
const SwsOp * ff_sws_op_list_input(const SwsOpList *ops)
Returns the input operation for a given op list, or NULL if there is none (e.g.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
uint32_t ff_sws_linear_mask(const SwsLinearOp c)
AVRational m[4][5]
Generalized 5x5 affine transformation: [ Out.x ] = [ A B C D E ] [ Out.y ] = [ F G H I J ] * [ x y z ...
int ff_sws_op_list_append(SwsOpList *ops, SwsOp *op)
These will take over ownership of op and set it to {0}, even on failure.
static void read_bytes(const uint8_t *src, float *dst, int src_stride, int dst_stride, int width, int height, float scale)
static void get_input_size(const SwsOpList *ops, SwsFormat *fmt)
int ff_sws_op_list_optimize(SwsOpList *ops)
Fuse compatible and eliminate redundant operations, as well as replacing some operations with more ef...
static bool extract_constant_rows(SwsLinearOp *c, SwsComps prev, SwsClearOp *out_clear)
int ff_sws_pixel_type_size(SwsPixelType type)
SwsPixelType
Copyright (C) 2025 Niklas Haas.
#define AV_PIX_FMT_YUVA444P16
bool ff_sws_pixel_type_is_int(SwsPixelType type)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
#define AV_PIX_FMT_GRAY16
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
#define SWS_OP_NEEDED(op, idx)
#define AV_PIX_FMT_YUV444P16
#define SWS_SWIZZLE(X, Y, Z, W)
static int read_chunk(AVFormatContext *s)
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.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static int exact_log2_q(const AVRational x)
static bool extract_scalar(const SwsLinearOp *c, SwsComps comps, SwsComps prev, SwsScaleOp *out_scale)
If a linear operation can be reduced to a scalar multiplication, returns the corresponding scaling fa...
static AVRational ff_sws_pixel_expand(SwsPixelType from, SwsPixelType to)
static bool op_commute_filter(SwsOp *op, SwsOp *prev)
Try to commute a filter op with the previous operation.
#define AV_PIX_FMT_GRAYF32
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
SwsFilterWeights * kernel
Rational number (pair of numerator and denominator).
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
int ff_sws_op_list_subpass(SwsOpList *ops1, SwsOpList **out_rest)
Eliminate SWS_OP_FILTER_* operations by merging them with prior SWS_OP_READ operations.
void ff_sws_op_list_remove_at(SwsOpList *ops, int index, int count)
#define RET(x)
Copyright (C) 2025 Niklas Haas.
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
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
void ff_sws_apply_op_q(const SwsOp *op, AVRational x[4])
Apply an operation to an AVRational.
uint8_t pattern[4]
Packed bits are assumed to be LSB-aligned within the underlying integer type; i.e.
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
#define i(width, name, range_min, range_max)
#define AV_PIX_FMT_GBRPF32
int ff_sws_op_list_insert_at(SwsOpList *ops, int index, SwsOp *op)
void ff_sws_op_list_update_comps(SwsOpList *ops)
Infer + propagate known information about components.
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
SwsComps comps
Metadata about the operation's input/output components.
static enum AVPixelFormat get_planar_fmt(SwsPixelType type, int nb_planes)
Determine a suitable intermediate buffer format for a given combination of pixel types and number of ...
static bool extract_swizzle(SwsLinearOp *op, SwsComps prev, SwsSwizzleOp *out_swiz)
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
static void write_bytes(const float *src, uint8_t *dst, int src_stride, int dst_stride, int width, int height, int depth, float scale)
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
#define FFSWAP(type, a, b)
static bool op_commute_swizzle(SwsOp *op, SwsOp *next)
Try to commute a swizzle op with the next operation.
SwsOpType filter
Filter kernel to apply to each plane while sampling.
#define AV_PIX_FMT_GBRAPF32
int ff_sws_solve_shuffle(const SwsOpList *const ops, uint8_t shuffle[], int size, uint8_t clear_val, int *read_bytes, int *write_bytes)
"Solve" an op list into a fixed shuffle mask, with an optional ability to also directly clear the out...
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
uint8_t elems
Examples: rgba = 4x u8 packed yuv444p = 3x u8 rgb565 = 1x u16 <- use SWS_OP_UNPACK to unpack monow = ...
static void scale(int *out, const int *in, const int w, const int h, const int shift)
AVRational av_add_q(AVRational b, AVRational c)
Add two rationals.
static bool op_commute_clear(SwsOp *op, SwsOp *next)
Try to commute a clear op with the next operation.
Helper struct for representing a list of operations.
static uint64_t shuffle(uint64_t in, const uint8_t *shuffle, int shuffle_len)
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
static int exact_log2(const int x)