Go to the documentation of this file.
38 #if HAVE_SPIRV_HEADERS_SPIRV_H || HAVE_SPIRV_UNIFIED1_SPIRV_H
41 #if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG
47 #if ARCH_AARCH64 && HAVE_NEON
49 #elif ARCH_X86_64 && HAVE_X86ASM
53 #if HAVE_SPIRV_HEADERS_SPIRV_H || HAVE_SPIRV_UNIFIED1_SPIRV_H
56 #if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG
140 for (
int i = 0;
i < 4;
i++) {
150 for (
int i = 0;
i < 4;
i++) {
151 const int src = swiz.
in[
i];
162 for (
int i = 0;
i < 4;
i++) {
193 for (
int i = 0;
i < 4;
i++)
201 for (
int i = 0;
i < 4;
i++)
210 for (
int i = 0;
i < 4;
i++)
214 for (
int i = 0;
i < 4;
i++)
220 for (
int i = 0;
i < 4;
i++) {
222 x[
i] =
op->clear.value[
i];
228 for (
int i = 0;
i < 4;
i++)
234 for (
int i = 0;
i < 4;
i++)
235 x[
i] = x[
i].den ?
Q((x[
i].num / x[
i].den) >>
op->shift.amount) : x[
i];
239 const AVRational orig[4] = { x[0], x[1], x[2], x[3] };
240 for (
int i = 0;
i < 4;
i++)
241 x[
i] = orig[
op->swizzle.in[
i]];
247 for (
int i = 0;
i < 4;
i++) {
248 x[
i] = x[
i].
den ?
Q(x[
i].num / x[
i].den) : x[
i];
249 if (
op->convert.expand)
256 for (
int i = 0;
i < 4;
i++) {
257 if (
op->dither.y_offset[
i] >= 0 && x[
i].
den)
262 for (
int i = 0;
i < 4;
i++)
266 for (
int i = 0;
i < 4;
i++)
271 const AVRational orig[4] = { x[0], x[1], x[2], x[3] };
272 for (
int i = 0;
i < 4;
i++) {
274 for (
int j = 0; j < 4; j++)
281 for (
int i = 0;
i < 4;
i++)
303 return ((
a &
b) & flags_and) | ((
a |
b) & flags_or);
309 for (
int i = 0;
i < 4;
i++)
316 for (
int i = 0;
i < 4;
i++) {
327 for (
int i = 0;
i < 4;
i++) {
348 for (
int n = 0; n < ops->
num_ops; n++) {
361 memcpy(
op->comps.min, prev.
min,
sizeof(prev.
min));
362 memcpy(
op->comps.max, prev.
max,
sizeof(prev.
max));
372 for (
int i = 0;
i <
op->rw.elems;
i++) {
379 for (
int i =
op->rw.elems;
i < 4;
i++) {
381 op->comps.min[
i] = prev.
min[
i];
382 op->comps.max[
i] = prev.
max[
i];
391 for (
int i = 0;
i < 4;
i++) {
393 op->comps.min[
i] = prev.
min[
i];
394 op->comps.max[
i] = prev.
max[
i];
398 for (
int i = 0;
i <
op->rw.elems;
i++)
414 for (
int i = 0;
i < 4;
i++) {
415 op->comps.min[
i] = prev.
min[
i];
416 op->comps.max[
i] = prev.
max[
i];
417 if (
op->dither.y_offset[
i] < 0)
426 for (
int i = 0;
i < 4;
i++) {
427 const int pattern =
op->pack.pattern[
i];
431 op->comps.min[
i] =
Q(0);
432 op->comps.max[
i] =
Q((1ULL << pattern) - 1);
439 for (
int i = 0;
i < 4;
i++) {
440 if (
op->pack.pattern[
i])
449 for (
int i = 0;
i < 4;
i++) {
451 op->comps.flags[
i] = 0;
452 if (
op->clear.value[
i].num == 0)
454 if (
op->clear.value[
i].den == 1)
462 for (
int i = 0;
i < 4;
i++)
463 op->comps.flags[
i] = prev.
flags[
op->swizzle.in[
i]];
466 for (
int i = 0;
i < 4;
i++) {
473 for (
int i = 0;
i < 4;
i++) {
476 for (
int j = 0; j < 4; j++) {
490 if (
op->lin.m[
i][4].num) {
492 if (
op->lin.m[
i][4].den != 1)
503 for (
int i = 0;
i < 4;
i++) {
505 if (
op->scale.factor.den != 1)
507 if (
op->scale.factor.num < 0)
526 bool need_out[4] = {
false,
false,
false,
false };
527 for (
int n = ops->
num_ops - 1; n >= 0; n--) {
529 bool need_in[4] = {
false,
false,
false,
false };
531 for (
int i = 0;
i < 4;
i++) {
539 for (
int i = 0;
i <
op->rw.elems;
i++)
541 for (
int i =
op->rw.elems;
i < 4;
i++)
542 need_in[
i] = need_out[
i];
554 for (
int i = 0;
i < 4;
i++)
555 need_in[
i] = need_out[
i];
558 for (
int i = 0;
i < 4 &&
op->pack.pattern[
i];
i++)
559 need_in[0] |= need_out[
i];
562 for (
int i = 0;
i < 4 &&
op->pack.pattern[
i];
i++)
563 need_in[
i] = need_out[0];
566 for (
int i = 0;
i < 4;
i++) {
568 need_in[
i] = need_out[
i];
572 for (
int i = 0;
i < 4;
i++)
573 need_in[
op->swizzle.in[
i]] |= need_out[
i];
576 for (
int i = 0;
i < 4;
i++) {
577 for (
int j = 0; j < 4; j++) {
578 if (
op->lin.m[
i][j].num)
579 need_in[j] |= need_out[
i];
585 memcpy(need_out, need_in,
sizeof(need_in));
613 for (
int i = 0;
i < 4;
i++)
651 for (
int i = 0;
i <
copy->num_ops;
i++) {
691 const int end = ops->
num_ops - count;
693 for (
int i = 0;
i < count;
i++)
739 const int num_planes =
read->rw.packed ? 1 :
read->rw.elems;
740 for (
int i = 0;
i < num_planes;
i++) {
762 for (
int i = 0;
i < 4;
i++) {
763 for (
int j = 0; j < 5; j++) {
774 static const struct {
805 return patterns[
i].
name;
830 }
else if (q.
den == 1) {
842 for (
int i = 0;
i < 4;
i++) {
867 op->rw.elems,
op->rw.packed ?
"packed" :
"planar",
885 op->pack.pattern[0],
op->pack.pattern[1],
886 op->pack.pattern[2],
op->pack.pattern[3]);
894 op->swizzle.x,
op->swizzle.y,
op->swizzle.z,
op->swizzle.w);
900 op->convert.expand ?
" (expand)" :
"");
904 1 <<
op->dither.size_log2, 1 <<
op->dither.size_log2,
905 op->dither.y_offset[0],
op->dither.y_offset[1],
906 op->dither.y_offset[2],
op->dither.y_offset[3]);
919 for (
int i = 0;
i < 4;
i++) {
921 for (
int j = 0; j < 5; j++) {
931 if (
op->scale.factor.den != 1)
950 for (
int i = 0;
i < nb_planes;
i++)
951 inorder &= order[
i] ==
i;
956 for (
int i = 0;
i < nb_planes;
i++)
986 const int planes =
op->rw.packed ? 1 :
op->rw.elems;
997 if (range_mask &
mask) {
1009 av_log(
log,
lev,
" (X = unused, z = byteswapped, + = exact, 0 = zero)\n");
int ff_sws_enum_ops(SwsContext *ctx, void *opaque, enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt, int(*cb)(SwsContext *ctx, void *opaque, SwsOp *op))
Helper function to enumerate over all possible operations, under the current set of options in ctx,...
void ff_sws_op_list_free(SwsOpList **p_ops)
AVPixelFormat
Pixel format.
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 minimum maximum flags name is the option name
SwsOpList * ff_sws_op_list_alloc(void)
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
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 filter_size
The number of source texels to convolve over for each row.
SwsOpList * ff_sws_op_list_duplicate(const SwsOpList *ops)
Returns a duplicate of ops, or NULL on OOM.
static void apply_filter_weights(SwsComps *comps, const SwsComps *prev, const SwsFilterWeights *weights)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
static double cb(void *priv, double x, double y)
static AVRational av_min_q(AVRational a, AVRational b)
SwsComps comps_src
Source component metadata associated with pixel values from each corresponding component (in plane/me...
static SwsCompFlags merge_comp_flags(SwsCompFlags a, SwsCompFlags b)
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)
int ff_sws_op_list_max_size(const SwsOpList *ops)
Returns the size of the largest pixel type used in ops.
const SwsOpBackend backend_x86
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.
Represents a computed filter kernel.
static char describe_comp_flags(SwsCompFlags flags)
void * av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, const uint8_t *elem_data)
Add an element of size elem_size to a dynamic array.
static void desc_plane_order(AVBPrint *bp, int nb_planes, const uint8_t *order)
const AVPixFmtDescriptor * av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
Iterate over all pixel format descriptors known to libavutil.
uint8_t SwsCompMask
Bit-mask of components.
static int enum_ops_fmt(SwsContext *ctx, void *opaque, enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt, int(*cb)(SwsContext *ctx, void *opaque, SwsOpList *ops))
static int enum_ops(SwsContext *ctx, void *opaque, SwsOpList *ops)
int ff_sws_pixel_type_size(SwsPixelType type)
static void clear_undefined_values(AVRational dst[4], const AVRational src[4])
SwsCompMask ff_sws_comp_mask_needed(const SwsOp *op)
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
SwsPixelType
Copyright (C) 2025 Niklas Haas.
void ff_sws_op_list_print(void *log, int lev, int lev_extra, const SwsOpList *ops)
Print out the contents of an operation list.
const SwsOpBackend *const ff_sws_op_backends[]
#define AV_BPRINT_SIZE_AUTOMATIC
#define SWS_COMP_TEST(mask, X)
bool ff_sws_pixel_type_is_int(SwsPixelType type)
static double val(void *priv, double ch)
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
static int16_t mult(Float11 *f1, Float11 *f2)
#define FF_ARRAY_ELEMS(a)
const SwsOpBackend backend_aarch64
#define SWS_OP_NEEDED(op, idx)
static void print_q(AVBPrint *bp, const AVRational q)
static void print_q4(AVBPrint *bp, const AVRational q4[4], SwsCompMask mask)
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 double av_q2d(AVRational a)
Convert an AVRational to a double.
const SwsOpBackend backend_c
Copyright (C) 2025 Niklas Haas.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static AVFormatContext * ctx
static AVRational ff_sws_pixel_expand(SwsPixelType from, SwsPixelType to)
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.
bool ff_sws_op_list_is_noop(const SwsOpList *ops)
Returns whether an op list represents a true no-op operation, i.e.
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)
int src_size
Copy of the parameters used to generate this filter, for reference.
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.
@ SWS_FILTER_SCALE
14-bit coefficients are picked to fit comfortably within int16_t for efficient SIMD processing (e....
static void copy(const float *p1, float *p2, const int length)
static int shift(int a, int b)
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)
int ff_sws_op_list_insert_at(SwsOpList *ops, int index, SwsOp *op)
static AVRational av_make_q(int num, int den)
Create an AVRational.
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.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static void op_uninit(SwsOp *op)
static const struct @585 planes[]
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
char name[16]
Extra metadata about the filter, used to inform the optimizer / range tracker about the filter's beha...
void ff_sws_op_desc(AVBPrint *bp, const SwsOp *op)
Describe an operation in human-readable form.
SwsCompMask ff_sws_comp_mask_swizzle(const SwsCompMask mask, const SwsSwizzleOp swiz)
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
SwsCompMask ff_sws_comp_mask_q4(const AVRational q[4])
int ff_sws_op_list_optimize(SwsOpList *ops)
Fuse compatible and eliminate redundant operations, as well as replacing some operations with more ef...
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
static AVRational av_max_q(AVRational a, AVRational b)
static const int weights[]
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
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 ...
static LevelCodes lev[4+3+3]
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
const SwsOpBackend backend_murder
#define FFSWAP(type, a, b)
void av_bprintf(AVBPrint *buf, const char *fmt,...)
int(* cb)(SwsContext *ctx, void *opaque, SwsOp *op)
const char * ff_sws_pixel_type_name(SwsPixelType type)
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
static const char * describe_lin_mask(uint32_t mask)
uint8_t elems
Examples: rgba = 4x u8 packed yuv444p = 3x u8 rgb565 = 1x u16 <- use SWS_OP_UNPACK to unpack monow = ...
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
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 void ff_sws_pack_op_decode(const SwsOp *op, uint64_t mask[4], int shift[4])
static void propagate_flags(SwsOp *op, const SwsComps *prev)
Helper struct for representing a list of operations.
const char * ff_sws_op_type_name(SwsOpType op)
Main external API structure.
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.