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