|
FFmpeg
|
#include "libavutil/attributes.h"#include "libavutil/avassert.h"#include "libavutil/bswap.h"#include "libavutil/rational.h"#include "ops.h"#include "ops_internal.h"Go to the source code of this file.
Macros | |
| #define | RET(x) |
| Copyright (C) 2025 Niklas Haas. More... | |
Functions | |
| static bool | op_commute_clear (SwsOp *op, SwsOp *next) |
| Try to commute a clear op with the next operation. More... | |
| static bool | op_commute_swizzle (SwsOp *op, SwsOp *next) |
| Try to commute a swizzle op with the next operation. More... | |
| static bool | op_commute_filter (SwsOp *op, SwsOp *prev) |
| Try to commute a filter op with the previous operation. More... | |
| static int | exact_log2 (const int x) |
| static int | exact_log2_q (const AVRational x) |
| static bool | extract_scalar (const SwsLinearOp *c, const SwsComps *comps, const SwsComps *prev, SwsScaleOp *out_scale) |
| If a linear operation can be reduced to a scalar multiplication, returns the corresponding scaling factor, or 0 otherwise. More... | |
| static bool | extract_constant_rows (SwsLinearOp *c, const SwsComps *prev, SwsClearOp *out_clear) |
| static bool | extract_swizzle (SwsLinearOp *op, const SwsComps *prev, SwsSwizzleOp *out_swiz) |
| static int | op_result_is_exact (const SwsOp *op) |
| int | ff_sws_op_list_optimize (SwsOpList *ops) |
| Fuse compatible and eliminate redundant operations, as well as replacing some operations with more efficient alternatives. More... | |
| static int | select_planes (SwsOpList *ops, SwsCompMask planes) |
| int | ff_sws_op_list_split_planes (SwsOpList *ops1, SwsOpList **out_ops2, SwsCompMask planes) |
| Reduce an op list into a reduced subset that operates only on a given subset of planes. More... | |
| 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 output value (for e.g. More... | |
| 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 planes. More... | |
| static void | get_input_size (const SwsOpList *ops, SwsFormat *fmt) |
| int | ff_sws_op_list_split_at (SwsOpList *ops1, SwsOpList **out_ops2, int index) |
| Split an op list into two at the given index. More... | |
| #define RET | ( | x | ) |
Copyright (C) 2025 Niklas Haas.
This file is part of FFmpeg.
FFmpeg is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
FFmpeg is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with FFmpeg; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Definition at line 29 of file ops_optimizer.c.
Try to commute a clear op with the next operation.
Makes any adjustments to the operations as needed, but does not perform the actual commutation.
Returns whether successful.
Definition at line 41 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
Try to commute a swizzle op with the next operation.
Makes any adjustments to the operations as needed, but does not perform the actual commutation.
Returns whether successful.
We can commute per-channel ops only if the per-channel constants are the same for all duplicated channels; e.g.: SWIZZLE {0, 0, 0, 3} NEXT {x, x, x, w} -> NEXT {x, _, _, w} SWIZZLE {0, 0, 0, 3}
Definition at line 107 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
Try to commute a filter op with the previous operation.
Makes any adjustments to the operations as needed, but does not perform the actual commutation.
Returns whether successful.
Definition at line 188 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
|
static |
Definition at line 223 of file ops_optimizer.c.
Referenced by exact_log2_q().
|
static |
Definition at line 232 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
|
static |
If a linear operation can be reduced to a scalar multiplication, returns the corresponding scaling factor, or 0 otherwise.
Definition at line 246 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
|
static |
Definition at line 272 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
|
static |
Definition at line 301 of file ops_optimizer.c.
Referenced by ff_sws_op_list_optimize().
|
static |
Definition at line 342 of file ops_optimizer.c.
Referenced by 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 efficient alternatives.
Definition at line 352 of file ops_optimizer.c.
Referenced by enum_ops_fmt(), ff_sws_compile_pass(), ff_sws_op_list_split_at(), and select_planes().
|
static |
Definition at line 811 of file ops_optimizer.c.
Referenced by ff_sws_op_list_split_planes().
| int ff_sws_op_list_split_planes | ( | SwsOpList * | ops1, |
| SwsOpList ** | ops2, | ||
| SwsCompMask | planes | ||
| ) |
Reduce an op list into a reduced subset that operates only on a given subset of planes.
No effect if the output is not planar, or if the plane mask is empty or equal to all planes.
| ops1 | Updated in-place to contain only the selected planes. |
| ops2 | The removed remainder is returned here, or NULL if no-op. |
| planes | A mask of the plane indices to keep. |
Returns 0 or a negative error code.
Definition at line 840 of file ops_optimizer.c.
Referenced by compile_subpass().
| int ff_sws_solve_shuffle | ( | const SwsOpList * | 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 output value (for e.g.
rgb24 -> rgb0). This can accept any operation chain that only consists of the following operations:
Basically, any operation that purely consists of moving around and reordering bytes within a single plane, can be turned into a shuffle mask.
| ops | The operation list to decompose. |
| shuffle | The output shuffle mask. |
| size | The size (in bytes) of the output shuffle mask. |
| clear_val | If nonzero, this index will be used to clear the output. |
| read_bytes | Returns the number of bytes read per shuffle iteration. |
| write_bytes | Returns the number of bytes written per shuffle iteration. |
Definition at line 873 of file ops_optimizer.c.
Referenced by solve_shuffle().
|
static |
Determine a suitable intermediate buffer format for a given combination of pixel types and number of planes.
The exact interpretation of these formats does not matter at all; since they will only ever be used as temporary intermediate buffers. We still need to pick some format as a consequence of ff_sws_graph_add_pass() taking an AVPixelFormat for the output buffer.
Definition at line 975 of file ops_optimizer.c.
Referenced by ff_sws_op_list_split_at().
Definition at line 1008 of file ops_optimizer.c.
Referenced by ff_sws_op_list_split_at().
Split an op list into two at the given index.
The split will be mediated by a set of planar read/write operations, plus a swizzle (if necessary) to re-order only used components. If a split is performed, both output lists will be optimized before returning.
| ops1 | The first part of the split op list. Will be modified in-place. |
| ops2 | The second part of the split op list will be returned here, or NULL if no split was necessary. |
| index | The index of the operation to split before. The operation itself will be absent from ops1 and instead moved to the start of ops2. |
Returnse 0 or a negative error code.
Not all components may be needed; but we need the ones that are used to be contiguous for the write/read operations. So, first compress them into a linearly ascending list of components
Definition at line 1021 of file ops_optimizer.c.
Referenced by compile_subpass().
1.8.17