Go to the documentation of this file.
30 if ((ret = (x)) < 0) \
65 for (
int i = 0;
i < 4;
i++) {
124 for (
int i = 0;
i < 4;
i++) {
127 const int j =
op->swizzle.in[
i];
130 next->
c.
q4[j] =
c.q4[
i];
138 for (
int i = 0;
i < 4;
i++) {
141 const int j =
op->swizzle.in[
i];
174 return (1 <<
p) == x ?
p : 0;
200 for (
int i = 0;
i < 4;
i++) {
221 for (
int i = 0;
i < 4;
i++) {
222 bool const_row =
c->m[
i][4].den == 1;
223 for (
int j = 0; j < 4; j++) {
224 const_row &=
c->m[
i][j].num == 0 ||
228 clear.
q4[
i] =
c->m[
i][4];
229 for (
int j = 0; j < 5; j++)
230 c->m[
i][j] =
Q(
i == j);
249 uint32_t nonzero = 0;
250 for (
int i = 0;
i < 4;
i++) {
251 for (
int j = 0; j < 4; j++) {
260 for (
int i = 0;
i < 4;
i++) {
263 for (
int j = 0; j < 4; j++) {
266 c.m[
i][
i] =
c.m[
i][j];
291 for (
int n = 0; n < ops->
num_ops; n++) {
311 if (!
op->rw.packed) {
314 for (
int i = 0;
i <
op->rw.elems;
i++) {
316 swiz.
in[
i] = 3 - (
i - nb_planes);
320 const int idx = nb_planes++;
326 if (nb_planes < op->rw.elems) {
327 op->rw.elems = nb_planes;
362 if (next->
op ==
op->op) {
363 op->c.u += next->
c.
u;
376 for (
int i = 0;
i < 4;
i++) {
377 if (!
op->c.q4[
i].den)
382 op->c.q4[
i].num == 0)
389 }
else if (
op->c.q4[
i].den) {
401 for (
int i = 0;
i < 4;
i++) {
411 for (
int i = 0;
i < 4;
i++) {
414 if (
op->swizzle.in[
i] !=
i)
427 for (
int i = 0;
i < 4;
i++)
436 const int src =
op->swizzle.in[
dst];
437 if (
src >
dst && src < prev->rw.elems) {
439 for (
int i =
dst;
i < 4;
i++) {
440 if (
op->swizzle.in[
i] ==
dst)
442 else if (
op->swizzle.in[
i] ==
src)
452 const int src =
op->swizzle.in[
dst];
453 if (
src >
dst && src < next->rw.elems) {
464 if (
op->type ==
op->convert.to) {
483 op->convert.expand =
true;
490 for (
int i = 0;
i < 4;
i++) {
504 for (
int i = 0;
i < 4;
i++) {
518 for (
int i = 0;
i < 4;
i++) {
543 for (
int i = 0;
i < 4;
i++) {
544 for (
int j = 0; j < 5; j++) {
546 for (
int k = 0; k < 4; k++)
550 op->lin.m[
i][j] = sum;
559 for (
int j = 0; j < 4; j++) {
563 for (
int i = 0;
i < 4;
i++)
564 op->lin.m[
i][j] =
Q(
i == j);
565 op->lin.mask &= ~col;
570 for (
int i = 0;
i < 4;
i++) {
574 for (
int j = 0; j < 5; j++)
575 op->lin.m[
i][j] =
Q(
i == j);
576 op->lin.mask &= ~row;
614 if (
op->c.q.num == 1 &&
op->c.q.den == 1) {
631 for (
int n = 0; n < ops->
num_ops - 1; n++) {
648 for (
int n = 0; n < ops->
num_ops - 1; n++) {
679 int size, uint8_t clear_val,
687 uint32_t
mask[4] = {0};
690 (!
read.rw.packed &&
read.rw.elems > 1))
693 for (
int i = 0;
i <
read.rw.elems;
i++)
694 mask[
i] = 0x01010101 *
i * read_size + 0x03020100;
696 for (
int opidx = 1; opidx < ops->
num_ops; opidx++) {
701 for (
int i = 0;
i < 4;
i++)
707 for (
int i = 0;
i < 4;
i++) {
716 for (
int i = 0;
i < 4;
i++) {
717 if (!
op->c.q4[
i].den)
719 if (
op->c.q4[
i].num != 0 || !clear_val)
721 mask[
i] = 0x1010101ul * clear_val;
726 if (!
op->convert.expand)
728 for (
int i = 0;
i < 4;
i++) {
730 case 1:
mask[
i] = 0x01010101 * (
mask[
i] & 0xFF);
break;
731 case 2:
mask[
i] = 0x00010001 * (
mask[
i] & 0xFFFF);
break;
738 if (
op->rw.frac || (!
op->rw.packed &&
op->rw.elems > 1))
746 const int write_chunk =
op->rw.elems * write_size;
748 for (
int n = 0; n < num_groups; n++) {
750 const int base_out = n * write_chunk;
751 for (
int i = 0;
i <
op->rw.elems;
i++) {
752 const int offset = base_out +
i * write_size;
753 for (
int b = 0;
b < write_size;
b++) {
754 const uint8_t idx =
mask[
i] >> (
b * 8);
755 if (idx != clear_val)
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
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 ...
static void read_bytes(const uint8_t *src, float *dst, int src_stride, int dst_stride, int width, int height, float scale)
int ff_sws_op_list_optimize(SwsOpList *ops)
Fuse compatible and eliminate redundant operations, as well as replacing some operations with more ef...
int ff_sws_pixel_type_size(SwsPixelType type)
bool ff_sws_pixel_type_is_int(SwsPixelType type)
#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.
static int exact_log2_q(const AVRational x)
static AVRational ff_sws_pixel_expand(SwsPixelType from, SwsPixelType to)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
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.
void ff_sws_op_list_remove_at(SwsOpList *ops, int index, int count)
#define RET(x)
Copyright (C) 2025 Niklas Haas.
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.
static bool extract_constant_rows(SwsLinearOp *c, SwsComps prev, SwsConst *out_clear)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
int ff_sws_op_list_insert_at(SwsOpList *ops, int index, SwsOp *op)
static bool extract_scalar(const SwsLinearOp *c, SwsComps prev, SwsComps next, SwsConst *out_scale)
If a linear operation can be reduced to a scalar multiplication, returns the corresponding scaling fa...
void ff_sws_op_list_update_comps(SwsOpList *ops)
Infer + propagate known information about components.
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.
#define i(width, name, range_min, range_max)
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.
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.
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)