FFmpeg
Loading...
Searching...
No Matches
ops_chain.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_CHAIN_H
22#define SWSCALE_OPS_CHAIN_H
23
24#include "libavutil/cpu.h"
25#include "libavutil/mem.h"
26
27#include "ops_internal.h"
28
29/**
30 * Helpers for SIMD implementations based on chained kernels, using a
31 * continuation passing style to link them together.
32 *
33 * The basic idea here is to "link" together a series of different operation
34 * kernels by constructing a list of kernel addresses into an SwsOpChain. Each
35 * kernel will load the address of the next kernel (the "continuation") from
36 * this struct, and jump directly into it; using an internal function signature
37 * that is an implementation detail of the specific backend.
38 */
39
40typedef struct SwsUOpTable SwsUOpTable;
41
42/**
43 * Private data for each kernel.
44 */
45typedef union SwsOpPriv {
47
48 /* Common types */
49 void *ptr;
50 uint8_t u8[16];
51 int8_t i8[16];
52 uint16_t u16[8];
53 int16_t i16[8];
54 uint32_t u32[4];
56 float f32[4];
57 uint64_t u64[2];
59 uintptr_t uptr[2];
60 intptr_t iptr[2];
61} SwsOpPriv;
62
63static_assert(sizeof(SwsOpPriv) == 16, "SwsOpPriv size mismatch");
64
65/**
66 * Per-kernel execution context.
67 *
68 * Note: This struct is hard-coded in assembly, so do not change the layout.
69 */
70typedef void (*SwsFuncPtr)(void);
71typedef struct SwsOpImpl {
72 SwsFuncPtr cont; /* [offset = 0] Continuation for this operation. */
73 SwsOpPriv priv; /* [offset = 16] Private data for this operation. */
74} SwsOpImpl;
75
76static_assert(sizeof(SwsOpImpl) == 32, "SwsOpImpl layout mismatch");
77static_assert(offsetof(SwsOpImpl, priv) == 16, "SwsOpImpl layout mismatch");
78
79/**
80 * Compiled "chain" of operations, which can be dispatched efficiently.
81 * Effectively just a list of function pointers, alongside a small amount of
82 * private data for each operation.
83 */
84typedef struct SwsOpChain {
85#define SWS_MAX_OPS 16
86 SwsOpImpl impl[SWS_MAX_OPS + 1]; /* reserve extra space for the entrypoint */
87 void (*free[SWS_MAX_OPS + 1])(SwsOpPriv *);
89 int cpu_flags; /* set of all used CPU flags */
90 int over_read[4]; /* chain over-reads input by this many bytes */
91 int over_write[4]; /* chain over-writes output by this many bytes */
93
95void ff_sws_op_chain_free_cb(void *chain);
96static inline void ff_sws_op_chain_free(SwsOpChain *chain)
97{
99}
100
101/* Returns 0 on success, or a negative error code. */
103 void (*free)(SwsOpPriv *), const SwsOpPriv *priv);
104
105typedef struct SwsImplParams {
107 union {
108 const SwsUOp *uop;
109 const SwsOp *op;
110 };
113
114typedef struct SwsImplResult {
115 SwsFuncPtr func; /* overrides `SwsUOpEntry.func` if non-NULL */
116 SwsOpPriv priv; /* private data for this implementation instance */
117 void (*free)(SwsOpPriv *priv); /* free function for `priv` */
118 int over_read[4]; /* implementation over-reads input by this many bytes */
119 int over_write[4]; /* implementation over-writes output by this many bytes */
121
122typedef struct SwsUOpEntry {
123 /* Kernel metadata; reduced size subset of SwsUOp (sans data) */
128
129 /* Kernel implementation */
131 int (*setup)(const SwsImplParams *params, SwsImplResult *out); /* optional */
132 bool (*check)(const SwsImplParams *params); /* optional, return true if supported */
134
135/* Setup helpers for common/trivial operation types */
139
140/* Setup helpers for SwsUOp data */
143
144static inline void ff_op_priv_free(SwsOpPriv *priv)
145{
146 av_freep(&priv->ptr);
147}
148
149static inline void ff_op_priv_unref(SwsOpPriv *priv)
150{
151 av_refstruct_unref(&priv->ptr);
152}
153
155 unsigned cpu_flags; /* required CPU flags for this table */
156 int block_size; /* fixed block size of this table */
157 const SwsUOpEntry *entries[]; /* terminated by NULL */
158};
159
160/**
161 * "Compile" a single uop by looking it up in a list of fixed size uop tables,
162 * in decreasing order of preference.
163 *
164 * Returns 0 or a negative error code.
165 */
167 int num_tables, const SwsUOp *uop, const int block_size,
168 SwsOpChain *chain);
169
170#endif
SwsAArch64OpImplParams params
Definition ops.c:51
int32_t
long long int64_t
Definition coverity.c:34
int(* func)(AVBPrint *dst, const char *in, const char *arg)
Definition jacosubdec.c:66
Memory handling functions.
const char data[16]
Definition mxf.c:149
#define SWS_MAX_OPS
Definition ops_chain.h:85
static void ff_sws_op_chain_free(SwsOpChain *chain)
Definition ops_chain.h:96
int ff_sws_op_chain_append(SwsOpChain *chain, SwsFuncPtr func, void(*free)(SwsOpPriv *), const SwsOpPriv *priv)
Definition ops_chain.c:46
void ff_sws_op_chain_free_cb(void *chain)
Definition ops_chain.c:32
static void ff_op_priv_unref(SwsOpPriv *priv)
Definition ops_chain.h:149
void(* SwsFuncPtr)(void)
Per-kernel execution context.
Definition ops_chain.h:70
int ff_sws_setup_clamp(const SwsImplParams *params, SwsImplResult *out)
int ff_sws_setup_vec4(const SwsImplParams *params, SwsImplResult *out)
Definition ops_chain.c:200
SwsOpChain * ff_sws_op_chain_alloc(void)
Copyright (C) 2025 Niklas Haas.
Definition ops_chain.c:27
int ff_sws_uop_lookup(SwsContext *ctx, const SwsUOpTable *const tables[], int num_tables, const SwsUOp *uop, const int block_size, SwsOpChain *chain)
"Compile" a single uop by looking it up in a list of fixed size uop tables, in decreasing order of pr...
Definition ops_chain.c:116
int ff_sws_setup_scale(const SwsImplParams *params, SwsImplResult *out)
static void ff_op_priv_free(SwsOpPriv *priv)
Definition ops_chain.h:144
int ff_sws_setup_scalar(const SwsImplParams *params, SwsImplResult *out)
Definition ops_chain.c:185
int ff_sws_setup_clear(const SwsImplParams *params, SwsImplResult *out)
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:120
Main external API structure.
Definition swscale.h:227
const SwsUOpTable * table
Definition ops_chain.h:106
SwsContext * ctx
Definition ops_chain.h:111
const SwsUOp * uop
Definition ops_chain.h:108
const SwsOp * op
Definition ops_chain.h:109
int over_write[4]
Definition ops_chain.h:119
SwsFuncPtr func
Definition ops_chain.h:115
SwsOpPriv priv
Definition ops_chain.h:116
int over_read[4]
Definition ops_chain.h:118
void(* free)(SwsOpPriv *priv)
Definition ops_chain.h:117
Compiled "chain" of operations, which can be dispatched efficiently.
Definition ops_chain.h:84
int over_read[4]
Definition ops_chain.h:90
SwsOpImpl impl[SWS_MAX_OPS+1]
Definition ops_chain.h:86
int over_write[4]
Definition ops_chain.h:91
int cpu_flags
Definition ops_chain.h:89
int num_impl
Definition ops_chain.h:88
void(* free[SWS_MAX_OPS+1])(SwsOpPriv *)
Definition ops_chain.h:87
SwsFuncPtr cont
Definition ops_chain.h:72
SwsOpPriv priv
Definition ops_chain.h:73
Definition ops.h:237
SwsFuncPtr func
Definition ops_chain.h:130
int(* setup)(const SwsImplParams *params, SwsImplResult *out)
Definition ops_chain.h:131
SwsUOpParams par
Definition ops_chain.h:127
SwsCompMask mask
Definition ops_chain.h:126
SwsPixelType type
Definition ops_chain.h:125
bool(* check)(const SwsImplParams *params)
Definition ops_chain.h:132
SwsUOpType uop
Definition ops_chain.h:124
Copyright (C) 2025 Niklas Haas.
Definition ops_chain.h:154
const SwsUOpEntry * entries[]
Definition ops_chain.h:157
unsigned cpu_flags
Definition ops_chain.h:155
Definition uops.h:264
#define av_freep(p)
static FILE * out
Definition movenc.c:55
static AVFormatContext * ctx
Definition movenc.c:49
static const uint8_t *const tables[]
Private data for each kernel.
Definition ops_chain.h:45
int32_t i32[4]
Definition ops_chain.h:55
uint32_t u32[4]
Definition ops_chain.h:54
void * ptr
Definition ops_chain.h:49
DECLARE_ALIGNED_16(char, data)[16]
uintptr_t uptr[2]
Definition ops_chain.h:59
uint16_t u16[8]
Definition ops_chain.h:52
uint64_t u64[2]
Definition ops_chain.h:57
int16_t i16[8]
Definition ops_chain.h:53
float f32[4]
Definition ops_chain.h:56
int64_t i64[2]
Definition ops_chain.h:58
uint8_t u8[16]
Definition ops_chain.h:50
int8_t i8[16]
Definition ops_chain.h:51
intptr_t iptr[2]
Definition ops_chain.h:60
SwsPixelType
Definition uops.h:39
SwsUOpType
Definition uops.h:129
uint8_t SwsCompMask
Bit-mask of components.
Definition uops.h:93