This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 1d33874a8275c11d248b918cfdf1bac0c0c3506a
Author:     Niklas Haas <[email protected]>
AuthorDate: Sat Nov 7 14:51:48 2026 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Sun Nov 8 01:48:12 2026 +0000

    swscale/ops: only skip over consumed data in SwsOpImpl
    
    This commit turns on the mechanism built up by the previous commits. This
    allows ops to have dynamically sized priv data.
    
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/aarch64/ops.c        | 2 +-
 libswscale/aarch64/ops_static.c | 3 ++-
 libswscale/ops_chain.c          | 2 +-
 libswscale/uops_tmpl.h          | 7 +++++--
 libswscale/x86/ops_include.asm  | 9 +++++----
 5 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/libswscale/aarch64/ops.c b/libswscale/aarch64/ops.c
index 46970f7bf5..4d1e8b3345 100644
--- a/libswscale/aarch64/ops.c
+++ b/libswscale/aarch64/ops.c
@@ -193,7 +193,7 @@ static int compile_uops_aarch64(SwsContext *ctx, const 
SwsUOpList *uops,
         if (ret < 0)
             goto error;
         av_assert1(res.priv_size == aarch64_priv_size(&params));
-        ret = ff_sws_op_chain_append(chain, func, res.ref, &res.priv, 
sizeof(res.priv));
+        ret = ff_sws_op_chain_append(chain, func, res.ref, &res.priv, 
res.priv_size);
         av_refstruct_unref(&res.ref);
         if (ret < 0)
             goto error;
diff --git a/libswscale/aarch64/ops_static.c b/libswscale/aarch64/ops_static.c
index f090e4e099..d3fda52c66 100644
--- a/libswscale/aarch64/ops_static.c
+++ b/libswscale/aarch64/ops_static.c
@@ -635,8 +635,9 @@ static void asmgen_op_cps(SwsAArch64Context *s, const 
SwsAArch64OpEntry *entry)
         i_ret(r);
     } else {
         /* Load continuation address and increment impl pointer. */
+        const size_t priv_size = FFALIGN(aarch64_priv_size(p), alignof_impl);
         RasmNode *node = rasm_set_current_node(r, s->load_cont_node);
-        RasmOp impl_pre = a64op_pre(s->impl, sizeof_impl);
+        RasmOp impl_pre = a64op_pre(s->impl, offsetof_impl_priv + priv_size);
         i_ldr(r, s->cont, impl_pre);                    CMT("SwsFuncPtr cont = 
(++impl)->func;");
         rasm_set_current_node(r, node);
         /* Common end for remaining CPS functions. */
diff --git a/libswscale/ops_chain.c b/libswscale/ops_chain.c
index 62a487fe54..b977c7e69d 100644
--- a/libswscale/ops_chain.c
+++ b/libswscale/ops_chain.c
@@ -127,7 +127,7 @@ int ff_sws_uop_lookup(SwsContext *ctx, const SwsUOpTable 
*const tables[],
     }
 
     ret = ff_sws_op_chain_append(chain, res.func ? res.func : match->func,
-                                 res.ref, &res.priv, sizeof(res.priv));
+                                 res.ref, &res.priv, res.priv_size);
     av_refstruct_unref(&res.ref);
     if (ret < 0)
         return ret;
diff --git a/libswscale/uops_tmpl.h b/libswscale/uops_tmpl.h
index 42e0442e15..388ed4c311 100644
--- a/libswscale/uops_tmpl.h
+++ b/libswscale/uops_tmpl.h
@@ -117,13 +117,16 @@ static_assert(alignof(SwsFilterPriv) <= 
alignof(SwsOpPriv),
 
 #define CALL(NAME, ...) fn(NAME)(iter, impl, x, y, z, w, __VA_ARGS__)
 
+#define NEXT_IMPL(N)                                                           
 \
+    ((const SwsOpImpl *) &impl->priv.data[FFALIGN(N, alignof(SwsOpImpl))])
+
 /* Helper macro to call into the next continuation with a given type; N gives
  * the size of private data consumed by this op */
 #define CONTINUE(N, ...)                                                       
 \
     ((void (*)(SwsOpIter *, const SwsOpImpl *,                                 
 \
                void *restrict x, void *restrict y,                             
 \
-               void *restrict z, void *restrict w)) impl[1].func)              
 \
-        (iter, &impl[1], __VA_ARGS__)
+               void *restrict z, void *restrict w)) NEXT_IMPL(N)->func)        
 \
+        (iter, NEXT_IMPL(N), __VA_ARGS__)
 
 /* Helper macros for common op setup code */
 #define DECL_SETUP(NAME, PARAMS, OUT)                                          
 \
diff --git a/libswscale/x86/ops_include.asm b/libswscale/x86/ops_include.asm
index dfe24f85bd..c0655581f1 100644
--- a/libswscale/x86/ops_include.asm
+++ b/libswscale/x86/ops_include.asm
@@ -135,8 +135,7 @@ endstruc
 
 struc SwsOpImpl
     .func resq 1
-    .priv resb 16
-    .next resb 0
+    .priv resb 0
 endstruc
 
 %define SWS_COMP_NONE           0
@@ -306,14 +305,16 @@ endstruc
 ;---------------------------------------------------------
 ; Common macros for linking together different kernels
 
+%define sizeof_impl (SwsOpImpl.priv + ((PRIV_SIZE + gprsize - 1) & ~(gprsize - 
1)))
+
 ; Load the next operation kernel's address to a register
 %macro LOAD_CONT 1 ; reg
-    mov %1, [implq + SwsOpImpl.next + SwsOpImpl.func]
+    mov %1, [implq + sizeof_impl + SwsOpImpl.func]
 %endmacro
 
 ; Tail call into the next operation kernel, given that kernel's address
 %macro CONTINUE 1 ; reg
-    add implq, SwsOpImpl.next
+    add implq, sizeof_impl
     jmp %1
     annotate_function_size
 %endmacro

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to