FFmpeg
ops.h
Go to the documentation of this file.
1 /**
2  * Copyright (C) 2025 Niklas Haas
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef SWSCALE_OPS_H
22 #define SWSCALE_OPS_H
23 
24 #include <assert.h>
25 #include <stdbool.h>
26 #include <stdalign.h>
27 
28 #include "libavutil/bprint.h"
29 
30 #include "graph.h"
31 #include "filters.h"
32 #include "uops.h"
33 
34 typedef enum SwsOpType {
36 
37  /* Defined for all types; but implemented for integers only */
38  SWS_OP_READ, /* gather raw pixels from planes */
39  SWS_OP_WRITE, /* write raw pixels to planes */
40  SWS_OP_SWAP_BYTES, /* swap byte order (for differing endianness) */
41  SWS_OP_SWIZZLE, /* rearrange channel order, or duplicate channels */
42 
43  /* Bit manipulation operations. Defined for integers only. */
44  SWS_OP_UNPACK, /* split tightly packed data into components */
45  SWS_OP_PACK, /* compress components into tightly packed data */
46  SWS_OP_LSHIFT, /* logical left shift of raw pixel values */
47  SWS_OP_RSHIFT, /* right shift of raw pixel values */
48 
49  /* Generic arithmetic. Defined and implemented for all types */
50  SWS_OP_CLEAR, /* clear pixel values */
51  SWS_OP_CONVERT, /* convert (cast) between formats */
52  SWS_OP_MIN, /* numeric minimum */
53  SWS_OP_MAX, /* numeric maximum */
54  SWS_OP_SCALE, /* multiplication by scalar */
55 
56  /* Floating-point only arithmetic operations. */
57  SWS_OP_LINEAR, /* generalized linear affine transform */
58  SWS_OP_DITHER, /* add dithering noise */
59 
60  /* Filtering operations. Always output floating point. */
61  SWS_OP_FILTER_H, /* horizontal filtering */
62  SWS_OP_FILTER_V, /* vertical filtering */
63 
65 } SwsOpType;
66 
67 const char *ff_sws_op_type_name(SwsOpType op);
68 
69 /* Compute SwsCompMask from values with denominator != 0 */
71 
72 typedef enum SwsCompFlags {
73  SWS_COMP_GARBAGE = 1 << 0, /* contents are undefined / garbage data */
74  SWS_COMP_EXACT = 1 << 1, /* value is an exact integer */
75  SWS_COMP_ZERO = 1 << 2, /* known to be a constant zero */
76  SWS_COMP_SWAPPED = 1 << 3, /* byte order is swapped */
77 } SwsCompFlags;
78 
79 typedef struct SwsComps {
80  SwsCompFlags flags[4]; /* knowledge about (output) component contents */
81 
82  /* Keeps track of the known possible value range, or {0, 0} for undefined
83  * or (unknown range) floating point inputs */
84  AVRational min[4], max[4];
85 } SwsComps;
86 
87 typedef enum SwsReadWriteMode {
88  /**
89  * Note: 1-component reads are either SWS_RW_PLANAR or SWS_RW_PACKED,
90  * depending on the underlying interpretation. If multiple components are
91  * packed into one element (e.g. rgb10a2 -> u16), they are marked as
92  * SWS_RW_PACKED. Otherwise (e.g. gray16le), they are SWS_RW_PLANAR.
93  *
94  * This is a purely semantic/informative difference; the underlying code
95  * treats 1-components reads/writes the same regardless of mode.
96  */
97  SWS_RW_PLANAR, /* one plane per component */
98  SWS_RW_PACKED, /* all components on a single plane */
100 
101 typedef struct SwsReadWriteOp {
102  /**
103  * Examples:
104  * rgba = 4x u8 packed
105  * yuv444p = 3x u8
106  * rgb565 = 1x u16 <- use SWS_OP_UNPACK to unpack
107  * monow = 1x u8 (frac 3)
108  * rgb4 = 1x u8 (frac 1)
109  */
110  SwsReadWriteMode mode; /* how data is laid out in memory */
111  uint8_t elems; /* number of elements (of type `op.type`) to read/write */
112  uint8_t frac; /* fractional pixel step factor (log2) */
113 
114  /**
115  * Filter kernel to apply to each plane while sampling. Currently, only
116  * one shared filter kernel is supported for all planes. (Optional)
117  *
118  * Note: As with SWS_OP_FILTER_*, if a filter kernel is in use, the read
119  * operation will always output floating point values.
120  */
121  struct {
122  SwsOpType op; /* some value of SWS_OP_FILTER_* */
123  SwsFilterWeights *kernel; /* (refstruct) */
124  SwsPixelType type; /* pixel type to store result as */
125  } filter;
127 
128 typedef struct SwsPackOp {
129  /**
130  * Packed bits are assumed to be LSB-aligned within the underlying
131  * integer type; i.e. (msb) 0 ... X Y Z W (lsb).
132  */
133  uint8_t pattern[4]; /* bit depth pattern, from MSB to LSB */
134 } SwsPackOp;
135 
136 typedef struct SwsSwizzleOp {
137  /**
138  * Input component for each output component:
139  * Out[x] := In[swizzle.in[x]]
140  */
141  union {
142  uint32_t mask;
143  uint8_t in[4];
144  struct { uint8_t x, y, z, w; };
145  };
146 } SwsSwizzleOp;
147 
148 #define SWS_SWIZZLE(X,Y,Z,W) ((SwsSwizzleOp) { .in = {X, Y, Z, W} })
150 
151 typedef struct SwsShiftOp {
152  uint8_t amount; /* number of bits to shift */
153 } SwsShiftOp;
154 
155 typedef struct SwsClearOp {
156  SwsCompMask mask; /* mask of components to clear */
157  AVRational value[4]; /* value to set */
158 } SwsClearOp;
159 
160 typedef struct SwsConvertOp {
161  SwsPixelType to; /* type of pixel to convert to */
162  bool expand; /* if true, integers are expanded to the full range */
163 } SwsConvertOp;
164 
165 typedef struct SwsClampOp {
166  AVRational limit[4]; /* per-component min/max value */
167 } SwsClampOp;
168 
169 typedef struct SwsScaleOp {
170  AVRational factor; /* scalar multiplication factor */
171 } SwsScaleOp;
172 
173 typedef struct SwsDitherOp {
174  AVRational *matrix; /* tightly packed dither matrix (refstruct) */
175  AVRational min, max; /* minimum/maximum value in `matrix` */
176  int size_log2; /* size (in bits) of the dither matrix */
177  int8_t y_offset[4]; /* row offset for each component, or -1 for ignored */
178 } SwsDitherOp;
179 
180 typedef struct SwsLinearOp {
181  /**
182  * Generalized 5x5 affine transformation:
183  * [ Out.x ] = [ A B C D E ]
184  * [ Out.y ] = [ F G H I J ] * [ x y z w 1 ]
185  * [ Out.z ] = [ K L M N O ]
186  * [ Out.w ] = [ P Q R S T ]
187  *
188  * The mask keeps track of which components differ from an identity matrix.
189  * There may be more efficient implementations of particular subsets, for
190  * example the common subset of {A, E, G, J, M, O} can be implemented with
191  * just three fused multiply-add operations.
192  */
193  AVRational m[4][5];
194  uint32_t mask; /* m[i][j] <-> 1 << (5 * i + j) */
195 } SwsLinearOp;
196 
197 #define SWS_MASK(I, J) (1 << (5 * (I) + (J)))
198 #define SWS_MASK_OFF(I) SWS_MASK(I, 4)
199 #define SWS_MASK_ROW(I) (0x1F << (5 * (I)))
200 #define SWS_MASK_COL(J) (0x8421 << J)
201 
202 enum {
203  SWS_MASK_ALL = (1 << 20) - 1,
206 
207  SWS_MASK_DIAG3 = SWS_MASK(0, 0) | SWS_MASK(1, 1) | SWS_MASK(2, 2),
209  SWS_MASK_MAT3 = SWS_MASK(0, 0) | SWS_MASK(0, 1) | SWS_MASK(0, 2) |
210  SWS_MASK(1, 0) | SWS_MASK(1, 1) | SWS_MASK(1, 2) |
211  SWS_MASK(2, 0) | SWS_MASK(2, 1) | SWS_MASK(2, 2),
212 
216 };
217 
218 /* Helper function to compute the correct mask */
219 uint32_t ff_sws_linear_mask(const SwsLinearOp *c);
220 
221 typedef struct SwsFilterOp {
222  SwsFilterWeights *kernel; /* filter kernel (refstruct) */
223  SwsPixelType type; /* pixel type to store result as */
224 } SwsFilterOp;
225 
226 typedef struct SwsOp {
227  SwsOpType op; /* operation to perform */
228  SwsPixelType type; /* pixel type to operate on */
229  union {
241  };
242 
243  /**
244  * Metadata about the operation's input/output components. Discarded
245  * and regenerated automatically by `ff_sws_op_list_update_comps()`.
246  *
247  * Note that backends may rely on the presence and accuracy of this
248  * metadata for all operations, during ff_sws_ops_compile().
249  */
251 } SwsOp;
252 
253 #define SWS_OP_NEEDED(op, idx) (!((op)->comps.flags[idx] & SWS_COMP_GARBAGE))
254 
255 /* Compute SwsCompMask from a mask of needed components */
257 
258 /**
259  * Return the number of planes involved in a read/write operation.
260  */
261 int ff_sws_rw_op_planes(const SwsOp *op);
262 
263 /**
264  * Describe an operation in human-readable form.
265  */
266 void ff_sws_op_desc(AVBPrint *bp, const SwsOp *op);
267 
268 /**
269  * Frees any allocations associated with an SwsOp and sets it to {0}.
270  */
271 void ff_sws_op_uninit(SwsOp *op);
272 
273 /**
274  * Apply an operation to an AVRational. No-op for read/write operations.
275  */
276 void ff_sws_apply_op_q(const SwsOp *op, AVRational x[4]);
277 
278 /**
279  * Helper struct for representing a list of operations.
280  */
281 typedef struct SwsOpList {
283  int num_ops;
284 
285  /* Metadata associated with this operation list */
287 
288  /* Input/output plane indices */
289  uint8_t plane_src[4], plane_dst[4];
290 
291  /**
292  * Source component metadata associated with pixel values from each
293  * corresponding component (in plane/memory order, i.e. not affected by
294  * `plane_src`). Lets the optimizer know additional information about
295  * the value range and/or pixel data to expect.
296  *
297  * The default value of {0} is safe to pass in the case that no additional
298  * information is known.
299  */
301 } SwsOpList;
302 
304 void ff_sws_op_list_free(SwsOpList **ops);
305 
306 /**
307  * Returns a duplicate of `ops`, or NULL on OOM.
308  */
310 
311 /**
312  * Returns the input operation for a given op list, or NULL if there is none
313  * (e.g. for a pure CLEAR-only operation list).
314  *
315  * This will always be an op of type SWS_OP_READ.
316  */
317 const SwsOp *ff_sws_op_list_input(const SwsOpList *ops);
318 
319 /**
320  * Returns the output operation for a given op list, or NULL if there is none.
321  *
322  * This will always be an op of type SWS_OP_WRITE.
323  */
324 const SwsOp *ff_sws_op_list_output(const SwsOpList *ops);
325 
326 /**
327  * Returns whether an op list represents a true no-op operation, i.e. may be
328  * eliminated entirely from an execution graph.
329  */
330 bool ff_sws_op_list_is_noop(const SwsOpList *ops);
331 
332 /**
333  * Returns the size of the largest pixel type used in `ops`.
334  */
335 int ff_sws_op_list_max_size(const SwsOpList *ops);
336 
337 /**
338  * These will take over ownership of `op` and set it to {0}, even on failure.
339  */
342 
343 void ff_sws_op_list_remove_at(SwsOpList *ops, int index, int count);
344 
345 /**
346  * Print out the contents of an operation list.
347  */
348 void ff_sws_op_list_print(void *log_ctx, int log_level, int log_level_extra,
349  const SwsOpList *ops);
350 
351 /**
352  * Infer + propagate known information about components. Called automatically
353  * when needed by the optimizer and compiler.
354  */
356 
357 /**
358  * Fuse compatible and eliminate redundant operations, as well as replacing
359  * some operations with more efficient alternatives.
360  */
362 
364  /* Automatically optimize the operations when compiling */
366 };
367 
368 /**
369  * Helper function to enumerate over all possible (optimized) operation lists,
370  * under the current set of options in `ctx`, and run the given callback on
371  * each list.
372  *
373  * @param src_fmt If set (not AV_PIX_FMT_NONE), constrain the source format
374  * @param dst_fmt If set (not AV_PIX_FMT_NONE), constrain the destination format
375  * @return 0 on success, the return value if cb() < 0, or a negative error code
376  *
377  * @note `ops` belongs to ff_sws_enum_op_lists(), but may be mutated by `cb`.
378  */
379 int ff_sws_enum_op_lists(SwsContext *ctx, void *opaque,
380  enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt,
381  int (*cb)(SwsContext *ctx, void *opaque, SwsOpList *ops));
382 
383 #endif
SWS_OP_READ
@ SWS_OP_READ
Definition: ops.h:38
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
ff_sws_op_list_input
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.
Definition: ops.c:688
SWS_OP_SWIZZLE
@ SWS_OP_SWIZZLE
Definition: ops.h:41
SwsClearOp::value
AVRational value[4]
Definition: ops.h:157
SWS_OP_LSHIFT
@ SWS_OP_LSHIFT
Definition: ops.h:46
SWS_OP_UNPACK
@ SWS_OP_UNPACK
Definition: ops.h:44
SwsClearOp
Definition: ops.h:155
SWS_RW_PLANAR
@ SWS_RW_PLANAR
Note: 1-component reads are either SWS_RW_PLANAR or SWS_RW_PACKED, depending on the underlying interp...
Definition: ops.h:97
SWS_MASK_OFF4
@ SWS_MASK_OFF4
Definition: ops.h:214
SwsSwizzleOp::mask
uint32_t mask
Definition: ops.h:142
cb
static double cb(void *priv, double x, double y)
Definition: vf_geq.c:247
SwsOpList::comps_src
SwsComps comps_src
Source component metadata associated with pixel values from each corresponding component (in plane/me...
Definition: ops.h:300
SWS_COMP_ZERO
@ SWS_COMP_ZERO
Definition: ops.h:75
SWS_OP_CLEAR
@ SWS_OP_CLEAR
Definition: ops.h:50
SwsOp::swizzle
SwsSwizzleOp swizzle
Definition: ops.h:233
SwsLinearOp::m
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 ...
Definition: ops.h:193
SwsSwizzleOp::z
uint8_t z
Definition: ops.h:144
SwsOp::convert
SwsConvertOp convert
Definition: ops.h:236
mask
int mask
Definition: mediacodecdec_common.c:154
SwsOp::rw
SwsReadWriteOp rw
Definition: ops.h:231
SWS_OP_DITHER
@ SWS_OP_DITHER
Definition: ops.h:58
SwsFilterWeights
Represents a computed filter kernel.
Definition: filters.h:64
SwsFilterOp
Definition: ops.h:221
ff_sws_op_list_max_size
int ff_sws_op_list_max_size(const SwsOpList *ops)
Returns the size of the largest pixel type used in ops.
Definition: ops.c:765
SwsClampOp::limit
AVRational limit[4]
Definition: ops.h:166
SWS_OP_TYPE_NB
@ SWS_OP_TYPE_NB
Definition: ops.h:64
ff_sws_linear_mask
uint32_t ff_sws_linear_mask(const SwsLinearOp *c)
Definition: ops.c:776
SWS_MASK_ALL
@ SWS_MASK_ALL
Definition: ops.h:203
SwsComps::max
AVRational max[4]
Definition: ops.h:84
SwsOpList::plane_dst
uint8_t plane_dst[4]
Definition: ops.h:289
SwsSwizzleOp::w
uint8_t w
Definition: ops.h:144
SwsClearOp::mask
SwsCompMask mask
Definition: ops.h:156
SwsOpList::num_ops
int num_ops
Definition: ops.h:283
SwsCompFlags
SwsCompFlags
Definition: ops.h:72
SwsDitherOp
Definition: ops.h:173
ff_sws_op_uninit
void ff_sws_op_uninit(SwsOp *op)
Frees any allocations associated with an SwsOp and sets it to {0}.
ff_sws_op_list_alloc
SwsOpList * ff_sws_op_list_alloc(void)
Definition: ops.c:624
SwsReadWriteOp
Definition: ops.h:101
SwsSwizzleOp
Definition: ops.h:136
SWS_MASK_DIAG4
@ SWS_MASK_DIAG4
Definition: ops.h:213
SwsLinearOp::mask
uint32_t mask
Definition: ops.h:194
SwsOp::op
SwsOpType op
Definition: ops.h:227
SWS_RW_PACKED
@ SWS_RW_PACKED
Definition: ops.h:98
SwsOpCompileFlags
SwsOpCompileFlags
Definition: ops.h:363
SWS_OP_SCALE
@ SWS_OP_SCALE
Definition: ops.h:54
ff_sws_comp_mask_swizzle
SwsCompMask ff_sws_comp_mask_swizzle(SwsCompMask mask, const SwsSwizzleOp *swiz)
Definition: ops.c:147
SwsOp::clear
SwsClearOp clear
Definition: ops.h:235
ff_sws_op_list_append
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.
Definition: ops.c:731
SwsScaleOp::factor
AVRational factor
Definition: ops.h:170
SWS_MASK_MAT3
@ SWS_MASK_MAT3
Definition: ops.h:209
SwsFilterOp::kernel
SwsFilterWeights * kernel
Definition: ops.h:222
ff_sws_op_list_insert_at
int ff_sws_op_list_insert_at(SwsOpList *ops, int index, SwsOp *op)
Definition: ops.c:717
SwsComps::min
AVRational min[4]
Definition: ops.h:84
op
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.
Definition: anm.c:76
SwsDitherOp::max
AVRational max
Definition: ops.h:175
SWS_OP_MIN
@ SWS_OP_MIN
Definition: ops.h:52
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
SwsCompMask
uint8_t SwsCompMask
Bit-mask of components.
Definition: uops.h:61
SWS_OP_LINEAR
@ SWS_OP_LINEAR
Definition: ops.h:57
SWS_OP_FILTER_H
@ SWS_OP_FILTER_H
Definition: ops.h:61
ff_sws_op_desc
void ff_sws_op_desc(AVBPrint *bp, const SwsOp *op)
Describe an operation in human-readable form.
Definition: ops.c:876
SWS_OP_PACK
@ SWS_OP_PACK
Definition: ops.h:45
ff_sws_rw_op_planes
int ff_sws_rw_op_planes(const SwsOp *op)
Return the number of planes involved in a read/write operation.
Definition: ops.c:169
SwsOp::dither
SwsDitherOp dither
Definition: ops.h:239
SwsReadWriteOp::kernel
SwsFilterWeights * kernel
Definition: ops.h:123
ff_sws_comp_mask_q4
SwsCompMask ff_sws_comp_mask_q4(const AVRational q[4])
Definition: ops.c:137
filters.h
ff_sws_op_list_duplicate
SwsOpList * ff_sws_op_list_duplicate(const SwsOpList *ops)
Returns a duplicate of ops, or NULL on OOM.
Definition: ops.c:651
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
SwsReadWriteOp::frac
uint8_t frac
Definition: ops.h:112
ff_sws_op_list_is_noop
bool ff_sws_op_list_is_noop(const SwsOpList *ops)
Returns whether an op list represents a true no-op operation, i.e.
Definition: ops.c:736
SWS_COMP_GARBAGE
@ SWS_COMP_GARBAGE
Definition: ops.h:73
SwsConvertOp::to
SwsPixelType to
Definition: ops.h:161
SWS_OP_FILTER_V
@ SWS_OP_FILTER_V
Definition: ops.h:62
ff_sws_op_list_print
void ff_sws_op_list_print(void *log_ctx, int log_level, int log_level_extra, const SwsOpList *ops)
Print out the contents of an operation list.
Definition: ops.c:983
SwsOp::clamp
SwsClampOp clamp
Definition: ops.h:237
SwsOpType
SwsOpType
Copyright (C) 2025 Niklas Haas.
Definition: ops.h:34
SWS_MASK_OFF3
@ SWS_MASK_OFF3
Definition: ops.h:208
SWS_MASK
#define SWS_MASK(I, J)
Definition: ops.h:197
SwsPixelType
SwsPixelType
Definition: uops.h:38
index
int index
Definition: gxfenc.c:90
c
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
Definition: undefined.txt:32
SwsConvertOp::expand
bool expand
Definition: ops.h:162
SWS_MASK_LUMA
@ SWS_MASK_LUMA
Definition: ops.h:204
SwsPackOp::pattern
uint8_t pattern[4]
Packed bits are assumed to be LSB-aligned within the underlying integer type; i.e.
Definition: ops.h:133
ff_sws_op_list_free
void ff_sws_op_list_free(SwsOpList **ops)
Definition: ops.c:637
SwsDitherOp::size_log2
int size_log2
Definition: ops.h:176
SwsClampOp
Definition: ops.h:165
SwsOp::type
SwsPixelType type
Definition: ops.h:228
SwsDitherOp::matrix
AVRational * matrix
Definition: ops.h:174
SWS_MASK_ALPHA
@ SWS_MASK_ALPHA
Definition: ops.h:205
SwsShiftOp
Definition: ops.h:151
SWS_OP_RSHIFT
@ SWS_OP_RSHIFT
Definition: ops.h:47
SwsOp::lin
SwsLinearOp lin
Definition: ops.h:230
SwsOpList::src
SwsFormat src
Definition: ops.h:286
SWS_OP_INVALID
@ SWS_OP_INVALID
Definition: ops.h:35
SwsFormat
Definition: format.h:77
SwsShiftOp::amount
uint8_t amount
Definition: ops.h:152
SWS_MASK_DIAG3
@ SWS_MASK_DIAG3
Definition: ops.h:207
SWS_OP_WRITE
@ SWS_OP_WRITE
Definition: ops.h:39
ff_sws_op_list_output
const SwsOp * ff_sws_op_list_output(const SwsOpList *ops)
Returns the output operation for a given op list, or NULL if there is none.
Definition: ops.c:697
SwsOp::comps
SwsComps comps
Metadata about the operation's input/output components.
Definition: ops.h:250
SwsScaleOp
Definition: ops.h:169
SWS_OP_FLAG_OPTIMIZE
@ SWS_OP_FLAG_OPTIMIZE
Definition: ops.h:365
SwsLinearOp
Definition: ops.h:180
ff_sws_op_list_update_comps
void ff_sws_op_list_update_comps(SwsOpList *ops)
Infer + propagate known information about components.
Definition: ops.c:353
SwsReadWriteOp::op
SwsOpType op
Definition: ops.h:122
ff_sws_op_list_optimize
int ff_sws_op_list_optimize(SwsOpList *ops)
Fuse compatible and eliminate redundant operations, as well as replacing some operations with more ef...
Definition: ops_optimizer.c:352
bprint.h
SwsOp::filter
SwsFilterOp filter
Definition: ops.h:240
SwsOpList::ops
SwsOp * ops
Definition: ops.h:282
SwsPackOp
Definition: ops.h:128
SwsFilterOp::type
SwsPixelType type
Definition: ops.h:223
SwsReadWriteOp::type
SwsPixelType type
Definition: ops.h:124
graph.h
SwsReadWriteMode
SwsReadWriteMode
Definition: ops.h:87
SwsOp
Definition: ops.h:226
ff_sws_apply_op_q
void ff_sws_apply_op_q(const SwsOp *op, AVRational x[4])
Apply an operation to an AVRational.
Definition: ops.c:192
SwsComps::flags
SwsCompFlags flags[4]
Definition: ops.h:80
SwsOpList::dst
SwsFormat dst
Definition: ops.h:286
SWS_OP_MAX
@ SWS_OP_MAX
Definition: ops.h:53
SwsReadWriteOp::filter
struct SwsReadWriteOp::@571 filter
Filter kernel to apply to each plane while sampling.
SwsComps
Definition: ops.h:79
ff_sws_op_type_name
const char * ff_sws_op_type_name(SwsOpType op)
Definition: ops.c:109
SWS_MASK_OFF
#define SWS_MASK_OFF(I)
Definition: ops.h:198
SWS_COMP_SWAPPED
@ SWS_COMP_SWAPPED
Definition: ops.h:76
SwsSwizzleOp::y
uint8_t y
Definition: ops.h:144
SWS_OP_SWAP_BYTES
@ SWS_OP_SWAP_BYTES
Definition: ops.h:40
SwsDitherOp::min
AVRational min
Definition: ops.h:175
SwsOp::shift
SwsShiftOp shift
Definition: ops.h:234
SwsSwizzleOp::x
uint8_t x
Definition: ops.h:144
SWS_COMP_EXACT
@ SWS_COMP_EXACT
Definition: ops.h:74
ff_sws_enum_op_lists
int ff_sws_enum_op_lists(SwsContext *ctx, void *opaque, enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt, int(*cb)(SwsContext *ctx, void *opaque, SwsOpList *ops))
Helper function to enumerate over all possible (optimized) operation lists, under the current set of ...
Definition: ops.c:1081
SwsReadWriteOp::elems
uint8_t elems
Definition: ops.h:111
SWS_MASK_MAT4
@ SWS_MASK_MAT4
Definition: ops.h:215
SwsDitherOp::y_offset
int8_t y_offset[4]
Definition: ops.h:177
uops.h
SwsSwizzleOp::in
uint8_t in[4]
Definition: ops.h:143
SWS_OP_CONVERT
@ SWS_OP_CONVERT
Definition: ops.h:51
ff_sws_op_list_remove_at
void ff_sws_op_list_remove_at(SwsOpList *ops, int index, int count)
Definition: ops.c:706
SwsOp::scale
SwsScaleOp scale
Definition: ops.h:238
SwsConvertOp
Definition: ops.h:160
SwsReadWriteOp::mode
SwsReadWriteMode mode
Examples: rgba = 4x u8 packed yuv444p = 3x u8 rgb565 = 1x u16 <- use SWS_OP_UNPACK to unpack monow = ...
Definition: ops.h:110
SwsOpList::plane_src
uint8_t plane_src[4]
Definition: ops.h:289
SwsOpList
Helper struct for representing a list of operations.
Definition: ops.h:281
SwsOp::pack
SwsPackOp pack
Definition: ops.h:232
SwsContext
Main external API structure.
Definition: swscale.h:229
ff_sws_comp_mask_needed
SwsCompMask ff_sws_comp_mask_needed(const SwsOp *op)
Definition: ops.c:159