Go to the documentation of this file.
27 #define Q(N) ((AVRational) { N, 1 })
58 chain->
free[idx + 1] = free;
83 if (
op->rw.filter &&
op->type !=
entry->type)
115 if (
op->rw.elems !=
entry->rw.elems ||
116 op->rw.frac !=
entry->rw.frac ||
117 op->rw.filter !=
entry->rw.filter ||
118 (
op->rw.elems > 1 &&
op->rw.packed !=
entry->rw.packed))
125 for (
int i = 0;
i < 4 &&
op->pack.pattern[
i];
i++) {
126 if (
op->pack.pattern[
i] !=
entry->pack.pattern[
i])
132 if (
op->clear.mask !=
entry->clear.mask)
134 for (
int i = 0;
i < 4;
i++) {
137 else if (!
entry->clear.value[
i].den)
148 for (
int i = 0;
i < 4;
i++) {
154 if (
op->convert.to !=
entry->convert.to ||
155 op->convert.expand !=
entry->convert.expand)
159 return op->dither.size_log2 ==
entry->dither_size ? score : 0;
165 if (
op->lin.mask !=
entry->linear_mask)
182 int num_tables,
SwsOpList *ops,
int ops_index,
189 int ret, best_score = 0;
196 for (
int n = 0; n < num_tables; n++) {
198 if (
table->block_size &&
table->block_size != block_size ||
203 for (
int i = 0;
table->entries[
i];
i++) {
206 if (score <= best_score)
219 params.
table = best_table;
242 #define q2pixel(type, q) ((q).den ? (type) (q).num / (q).den : 0)
259 default:
return AVERROR(EINVAL);
268 for (
int i = 0;
i < 4;
i++) {
275 default:
return AVERROR(EINVAL);
285 for (
int i = 0;
i < 4;
i++) {
294 default:
return AVERROR(EINVAL);
Copyright (C) 2025 Niklas Haas.
int(* func)(AVBPrint *dst, const char *in, const char *arg)
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
int ff_sws_setup_clear(const SwsImplParams *params, SwsImplResult *out)
int ff_sws_setup_scale(const SwsImplParams *params, SwsImplResult *out)
int ff_sws_setup_shift(const SwsImplParams *params, SwsImplResult *out)
static const uint16_t table[]
uint8_t SwsCompMask
Bit-mask of components.
int(* setup)(const SwsImplParams *params, SwsImplResult *out)
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
static atomic_int cpu_flags
int ff_sws_pixel_type_size(SwsPixelType type)
SwsCompMask ff_sws_comp_mask_needed(const SwsOp *op)
void(* SwsFuncPtr)(void)
Per-kernel execution context.
Writing a table generator This documentation is preliminary Parts of the API are not good and should be changed Basic concepts A table generator consists of two *_tablegen c and *_tablegen h The h file will provide the variable declarations and initialization code for the tables
#define SWS_COMP_TEST(mask, X)
void(* free[SWS_MAX_OPS+1])(SwsOpPriv *)
#define SWS_OP_NEEDED(op, idx)
SwsOpChain * ff_sws_op_chain_alloc(void)
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 AVFormatContext * ctx
SwsOpImpl impl[SWS_MAX_OPS+1]
Compiled "chain" of operations, which can be dispatched efficiently.
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_setup_clamp(const SwsImplParams *params, SwsImplResult *out)
#define i(width, name, range_min, range_max)
int ff_sws_op_compile_tables(SwsContext *ctx, const SwsOpTable *const tables[], int num_tables, SwsOpList *ops, int ops_index, const int block_size, SwsOpChain *chain)
"Compile" a single op by looking it up in a list of fixed size op tables.
void ff_sws_op_chain_free_cb(void *ptr)
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is needed
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 default value
void(* free)(SwsOpPriv *priv)
static double limit(double x)
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
static int op_match(const SwsOp *op, const SwsOpEntry *entry)
Match an operation against a reference operation.
#define SWS_COMP_INV(mask)
static const int factor[16]
int ff_sws_op_chain_append(SwsOpChain *chain, SwsFuncPtr func, void(*free)(SwsOpPriv *), const SwsOpPriv *priv)
Helper struct for representing a list of operations.
Main external API structure.
Private data for each kernel.