Commit ae7e2412b7 for ffmpeg

commit ae7e2412b75986f2282a03f8a0d36e20da321954
Author: Niklas Haas <git@haasn.dev>
Date:   Tue Nov 3 20:49:12 2026 +0100

    swscale/x86/ops: pack the filter private data

    Signed-off-by: Niklas Haas <git@haasn.dev>

diff --git a/libswscale/x86/ops.c b/libswscale/x86/ops.c
index 3c6e783bd6..ab9a5c7a8f 100644
--- a/libswscale/x86/ops.c
+++ b/libswscale/x86/ops.c
@@ -43,11 +43,18 @@ static int setup_rw_packed(const SwsImplParams *params, SwsImplResult *out)
     return 0;
 }

+/* Private data for the filter kernels; layout hard-coded in ops_float.asm */
+typedef struct FilterPriv {
+    void *weights;
+    size_t filter_size;
+} FilterPriv;
+
+static_assert(offsetof(FilterPriv, filter_size) == sizeof(void *),
+              "FilterPriv layout mismatch");
+
 static int setup_filter_v(const SwsImplParams *params, SwsImplResult *out)
 {
     const SwsFilterWeights *filter = params->uop->data.kernel;
-    static_assert(sizeof(out->priv.ptr) <= sizeof(int32_t[2]),
-                  ">8 byte pointers not supported");

     /* Pre-convert weights to float */
     float *weights = ff_refstruct_calloc(filter->num_weights, sizeof(float));
@@ -57,8 +64,13 @@ static int setup_filter_v(const SwsImplParams *params, SwsImplResult *out)
     for (int i = 0; i < filter->num_weights; i++)
         weights[i] = (float) filter->weights[i] / SWS_FILTER_SCALE;

-    out->ref = out->priv.ptr = weights;
-    out->priv.uptr[1] = filter->filter_size;
+    const FilterPriv priv = {
+        .weights     = weights,
+        .filter_size = filter->filter_size,
+    };
+
+    SWS_OP_PRIV_PACK(out, priv);
+    out->ref = priv.weights;
     return 0;
 }

@@ -149,8 +161,13 @@ static int setup_filter_h(const SwsImplParams *params, SwsImplResult *out)
         }
     }

-    out->ref = out->priv.ptr = weights.ptr;
-    out->priv.uptr[1] = aligned_size;
+    const FilterPriv priv = {
+        .weights     = weights.ptr,
+        .filter_size = aligned_size,
+    };
+
+    SWS_OP_PRIV_PACK(out, priv);
+    out->ref = priv.weights;

     for (int i = 0; i < 4; i++) {
         if (uop->mask & SWS_COMP(i))
@@ -235,8 +252,13 @@ static int setup_filter_h_4x4(const SwsImplParams *params, SwsImplResult *out)
         }
     }

-    out->ref = out->priv.ptr = weights.ptr;
-    out->priv.uptr[1] = aligned_size * sizeof_weights;
+    const FilterPriv priv = {
+        .weights     = weights.ptr,
+        .filter_size = aligned_size * sizeof_weights,
+    };
+
+    SWS_OP_PRIV_PACK(out, priv);
+    out->ref = priv.weights;

     for (int i = 0; i < 4; i++) {
         if (uop->mask & SWS_COMP(i))
diff --git a/libswscale/x86/ops_float.asm b/libswscale/x86/ops_float.asm
index fe46cffe9d..54facff8aa 100644
--- a/libswscale/x86/ops_float.asm
+++ b/libswscale/x86/ops_float.asm
@@ -93,8 +93,8 @@ IF W,   %1 mw2, m11, m12
 assert_idn FILTER_TYPE, SWS_PIXEL_F32
 %assign SIZEOF_WEIGHT 4

-        mov weights, [implq + SwsOpImpl.priv]     ; float *weights
-        mov fltsize, [implq + SwsOpImpl.priv + 8] ; size_t filter_size
+        mov weights, [implq + SwsOpImpl.priv]           ; float *weights
+        mov fltsize, [implq + SwsOpImpl.priv + gprsize] ; size_t filter_size
         ; weights += filter_size * y * sizeof(float)
         mov tmp2q, fltsize
         imul tmp2q, yq
@@ -216,7 +216,7 @@ assert_idn FILTER_TYPE, SWS_PIXEL_F32
 %endif

         mov tmp0q,   [execq + SwsOpExec.in_offset_x]
-        mov fltsize, [implq + SwsOpImpl.priv + 8] ; size_t filter_size
+        mov fltsize, [implq + SwsOpImpl.priv + gprsize] ; size_t filter_size
         mov tmp2d, bxd
         shl_log2 tmp2q, FILTER_WIDTH   ; x := bx * FILTER_WIDTH
         movu m14, [tmp0q + 4 * tmp2q]  ; &exec->in_offset_x[x]
@@ -428,9 +428,9 @@ assert_idn FILTER_TYPE, SWS_PIXEL_F32
         push offset2q
         push offset3q
         shl_log2 bxq, FILTER_WIDTH ; x := bx * FILTER_WIDTH
-        mov weights, [implq + SwsOpImpl.priv]        ; int16_t *weights
-        mov tmp1d,   [implq + SwsOpImpl.priv + 8]    ; size_t filter_size
-        mov offsets, [execq + SwsOpExec.in_offset_x] ; int32_t *offsets
+        mov weights, [implq + SwsOpImpl.priv]           ; int16_t *weights
+        mov tmp1d,   [implq + SwsOpImpl.priv + gprsize] ; size_t filter_size
+        mov offsets, [execq + SwsOpExec.in_offset_x]    ; int32_t *offsets
         lea offsets, [offsets + 4 * bxq] ; offsets += x * sizeof(int32_t)
         imul bxq, fltsize
         add weights, bxq ; weights += x * filter_size