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

Git pushed a commit to branch master
in repository ffmpeg.

commit 091149b187b01f2a6cfb503c0189c0ace09e1c76
Author:     Niklas Haas <[email protected]>
AuthorDate: Tue Jun 2 14:28:56 2026 +0200
Commit:     Niklas Haas <[email protected]>
CommitDate: Thu Jun 11 16:27:47 2026 +0000

    swscale/ops: group filtered rw metadata into struct
    
    This is a minor cosmetic improvement that allows me to use more
    convenient names for a filter-related metadata fields, without
    confusion.
    
    Sponsored-by: Sovereign Tech Fund
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/aarch64/ops_impl_conv.c |  4 ++--
 libswscale/ops.c                   | 16 ++++++++--------
 libswscale/ops.h                   |  6 ++++--
 libswscale/ops_dispatch.c          |  6 +++---
 libswscale/ops_memcpy.c            |  4 ++--
 libswscale/ops_optimizer.c         | 20 ++++++++++----------
 libswscale/uops.c                  |  8 ++++----
 libswscale/vulkan/ops.c            | 32 ++++++++++++++++----------------
 tests/checkasm/sw_ops.c            | 14 ++++++++------
 9 files changed, 57 insertions(+), 53 deletions(-)

diff --git a/libswscale/aarch64/ops_impl_conv.c 
b/libswscale/aarch64/ops_impl_conv.c
index a66b91b6fb..b360e86a8d 100644
--- a/libswscale/aarch64/ops_impl_conv.c
+++ b/libswscale/aarch64/ops_impl_conv.c
@@ -78,7 +78,7 @@ static int convert_to_aarch64_impl(SwsContext *ctx, const 
SwsOpList *ops, int n,
     /* Map SwsOpType to SwsAArch64OpType */
     switch (op->op) {
     case SWS_OP_READ:
-        if (op->rw.filter)
+        if (op->rw.filter.op)
             return AVERROR(ENOTSUP);
         /**
          * The different types of read operations have been split into
@@ -94,7 +94,7 @@ static int convert_to_aarch64_impl(SwsContext *ctx, const 
SwsOpList *ops, int n,
             out->op = AARCH64_SWS_OP_READ_PLANAR;
         break;
     case SWS_OP_WRITE:
-        if (op->rw.filter)
+        if (op->rw.filter.op)
             return AVERROR(ENOTSUP);
         /**
          * The different types of write operations have been split into
diff --git a/libswscale/ops.c b/libswscale/ops.c
index b28dbec75f..f18249cc1f 100644
--- a/libswscale/ops.c
+++ b/libswscale/ops.c
@@ -382,9 +382,9 @@ void ff_sws_op_list_update_comps(SwsOpList *ops)
                 op->comps.max[i]   = prev.max[i];
             }
 
-            if (op->rw.filter) {
+            if (op->rw.filter.op) {
                 const SwsComps prev = op->comps;
-                apply_filter_weights(&op->comps, &prev, op->rw.kernel);
+                apply_filter_weights(&op->comps, &prev, op->rw.filter.kernel);
             }
             break;
         case SWS_OP_SWAP_BYTES:
@@ -590,7 +590,7 @@ static void op_uninit(SwsOp *op)
 {
     switch (op->op) {
     case SWS_OP_READ:
-        av_refstruct_unref(&op->rw.kernel);
+        av_refstruct_unref(&op->rw.filter.kernel);
         break;
     case SWS_OP_DITHER:
         av_refstruct_unref(&op->dither.matrix);
@@ -652,8 +652,8 @@ SwsOpList *ff_sws_op_list_duplicate(const SwsOpList *ops)
         const SwsOp *op = &copy->ops[i];
         switch (op->op) {
         case SWS_OP_READ:
-            if (op->rw.kernel)
-                av_refstruct_ref(op->rw.kernel);
+            if (op->rw.filter.kernel)
+                av_refstruct_ref(op->rw.filter.kernel);
             break;
         case SWS_OP_DITHER:
             av_refstruct_ref(op->dither.matrix);
@@ -866,12 +866,12 @@ void ff_sws_op_desc(AVBPrint *bp, const SwsOp *op)
         av_bprintf(bp, "%-20s: %d elem(s) %s >> %d", name,
                    op->rw.elems,  op->rw.packed ? "packed" : "planar",
                    op->rw.frac);
-        if (!op->rw.filter)
+        if (!op->rw.filter.op)
             break;
-        const SwsFilterWeights *kernel = op->rw.kernel;
+        const SwsFilterWeights *kernel = op->rw.filter.kernel;
         av_bprintf(bp, " + %d tap %s filter (%c)",
                    kernel->filter_size, kernel->name,
-                   op->rw.filter == SWS_OP_FILTER_H ? 'H' : 'V');
+                   op->rw.filter.op == SWS_OP_FILTER_H ? 'H' : 'V');
         break;
     case SWS_OP_LSHIFT:
         av_bprintf(bp, "%-20s: << %u", name, op->shift.amount);
diff --git a/libswscale/ops.h b/libswscale/ops.h
index ad0888f7a0..b58a060c6e 100644
--- a/libswscale/ops.h
+++ b/libswscale/ops.h
@@ -104,8 +104,10 @@ typedef struct SwsReadWriteOp {
      * Note: As with SWS_OP_FILTER_*, if a filter kernel is in use, the read
      * operation will always output floating point values.
      */
-    SwsOpType filter;         /* some value of SWS_OP_FILTER_* */
-    SwsFilterWeights *kernel; /* (refstruct) */
+    struct {
+        SwsOpType op;               /* some value of SWS_OP_FILTER_* */
+        SwsFilterWeights *kernel;   /* (refstruct) */
+    } filter;
 } SwsReadWriteOp;
 
 typedef struct SwsPackOp {
diff --git a/libswscale/ops_dispatch.c b/libswscale/ops_dispatch.c
index 7a9a527bcb..1186a8a73e 100644
--- a/libswscale/ops_dispatch.c
+++ b/libswscale/ops_dispatch.c
@@ -551,8 +551,8 @@ static int compile(SwsGraph *graph, const SwsOpBackend 
*backend,
         p->idx_out[i] = i < p->planes_out ? ops->plane_dst[i] : -1;
     }
 
-    const SwsFilterWeights *filter = read->rw.kernel;
-    if (read->rw.filter == SWS_OP_FILTER_V) {
+    const SwsFilterWeights *filter = read->rw.filter.kernel;
+    if (read->rw.filter.op == SWS_OP_FILTER_V) {
         p->offsets_y = av_refstruct_ref(filter->offsets);
 
         /* Compute relative pointer bumps for each output line */
@@ -570,7 +570,7 @@ static int compile(SwsGraph *graph, const SwsOpBackend 
*backend,
         }
         bump[filter->dst_size - 1] = 0;
         p->exec_base.in_bump_y = bump;
-    } else if (read->rw.filter == SWS_OP_FILTER_H) {
+    } else if (read->rw.filter.op == SWS_OP_FILTER_H) {
         /* Compute pixel offset map for each output line */
         const int pixels = FFALIGN(filter->dst_size, p->comp.block_size);
         int32_t *offset = av_malloc_array(pixels, sizeof(*offset));
diff --git a/libswscale/ops_memcpy.c b/libswscale/ops_memcpy.c
index cce7aa3013..00f3e79608 100644
--- a/libswscale/ops_memcpy.c
+++ b/libswscale/ops_memcpy.c
@@ -78,7 +78,7 @@ static int compile(SwsContext *ctx, const SwsOpList *ops, 
SwsCompiledOp *out)
         const SwsOp *op = &ops->ops[n];
         switch (op->op) {
         case SWS_OP_READ:
-            if ((op->rw.packed && op->rw.elems != 1) || op->rw.frac || 
op->rw.filter)
+            if ((op->rw.packed && op->rw.elems != 1) || op->rw.frac || 
op->rw.filter.op)
                 return AVERROR(ENOTSUP);
             for (int i = 0; i < op->rw.elems; i++)
                 p.index[i] = i;
@@ -121,7 +121,7 @@ static int compile(SwsContext *ctx, const SwsOpList *ops, 
SwsCompiledOp *out)
             break;
 
         case SWS_OP_WRITE:
-            if ((op->rw.packed && op->rw.elems != 1) || op->rw.frac || 
op->rw.filter)
+            if ((op->rw.packed && op->rw.elems != 1) || op->rw.frac || 
op->rw.filter.op)
                 return AVERROR(ENOTSUP);
             p.num_planes = op->rw.elems;
             break;
diff --git a/libswscale/ops_optimizer.c b/libswscale/ops_optimizer.c
index 619c6cf42b..829bd3d0c9 100644
--- a/libswscale/ops_optimizer.c
+++ b/libswscale/ops_optimizer.c
@@ -412,7 +412,7 @@ retry:
                     op->rw.elems = nb_planes;
                     RET(ff_sws_op_list_insert_at(ops, n + 1, &(SwsOp) {
                         .op = SWS_OP_SWIZZLE,
-                        .type = op->rw.filter ? SWS_PIXEL_F32 : op->type,
+                        .type = op->rw.filter.op ? SWS_PIXEL_F32 : op->type,
                         .swizzle = swiz,
                     }));
                     goto retry;
@@ -735,10 +735,10 @@ retry:
         case SWS_OP_FILTER_H:
         case SWS_OP_FILTER_V:
             /* Merge with prior simple planar read */
-            if (prev->op == SWS_OP_READ && !prev->rw.filter &&
+            if (prev->op == SWS_OP_READ && !prev->rw.filter.op &&
                 !prev->rw.packed && !prev->rw.frac) {
-                prev->rw.filter = op->op;
-                prev->rw.kernel = av_refstruct_ref(op->filter.kernel);
+                prev->rw.filter.op = op->op;
+                prev->rw.filter.kernel = av_refstruct_ref(op->filter.kernel);
                 ff_sws_op_list_remove_at(ops, n, 1);
                 goto retry;
             }
@@ -803,7 +803,7 @@ int ff_sws_solve_shuffle(const SwsOpList *const ops, 
uint8_t shuffle[],
         return AVERROR(EINVAL);
 
     const SwsOp *read = ff_sws_op_list_input(ops);
-    if (!read || read->rw.frac || read->rw.filter ||
+    if (!read || read->rw.frac || read->rw.filter.op ||
         (!read->rw.packed && read->rw.elems > 1))
         return AVERROR(ENOTSUP);
 
@@ -854,7 +854,7 @@ int ff_sws_solve_shuffle(const SwsOpList *const ops, 
uint8_t shuffle[],
         }
 
         case SWS_OP_WRITE: {
-            if (op->rw.frac || op->rw.filter ||
+            if (op->rw.frac || op->rw.filter.op ||
                 (!op->rw.packed && op->rw.elems > 1))
                 return AVERROR(ENOTSUP);
 
@@ -938,10 +938,10 @@ static void get_input_size(const SwsOpList *ops, 
SwsFormat *fmt)
     fmt->height = ops->src.height;
 
     const SwsOp *read = ff_sws_op_list_input(ops);
-    if (read && read->rw.filter == SWS_OP_FILTER_V) {
-        fmt->height = read->rw.kernel->dst_size;
-    } else if (read && read->rw.filter == SWS_OP_FILTER_H) {
-        fmt->width = read->rw.kernel->dst_size;
+    if (read && read->rw.filter.op == SWS_OP_FILTER_V) {
+        fmt->height = read->rw.filter.kernel->dst_size;
+    } else if (read && read->rw.filter.op == SWS_OP_FILTER_H) {
+        fmt->width = read->rw.filter.kernel->dst_size;
     }
 }
 
diff --git a/libswscale/uops.c b/libswscale/uops.c
index 7af8a8af51..2de9c33eac 100644
--- a/libswscale/uops.c
+++ b/libswscale/uops.c
@@ -475,16 +475,16 @@ static int translate_rw_op(SwsContext *ctx, SwsUOpList 
*ops, SwsUOpFlags flags,
     };
 
     /* Non-filtered reads don't care about the exact pixel contents */
-    if (!op->rw.filter)
+    if (!op->rw.filter.op)
         uop.type = pixel_type_to_int(op->type);
 
     const bool is_read = op->op == SWS_OP_READ;
-    if (op->rw.filter) {
+    if (op->rw.filter.op) {
         if (op->op == SWS_OP_WRITE || op->rw.frac || op->rw.packed)
             return AVERROR(ENOTSUP);
         uop.par.filter.type = SWS_PIXEL_F32;
-        uop.data.kernel = av_refstruct_ref(op->rw.kernel);
-        if (op->rw.filter == SWS_OP_FILTER_H) {
+        uop.data.kernel = av_refstruct_ref(op->rw.filter.kernel);
+        if (op->rw.filter.op == SWS_OP_FILTER_H) {
             uop.uop = SWS_UOP_READ_PLANAR_FH;
         } else if (check_filter_fma(ctx, flags, op)) {
             uop.uop = SWS_UOP_READ_PLANAR_FV_FMA;
diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 702bbdf38f..e4f815124e 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -272,9 +272,9 @@ static int create_bufs(FFVulkanOpsCtx *s, VulkanPriv *p, 
const SwsOpList *ops)
                 goto fail;
             p->nb_data_bufs++;
         } else if ((op->op == SWS_OP_READ ||
-                    op->op == SWS_OP_WRITE) && op->rw.filter) {
+                    op->op == SWS_OP_WRITE) && op->rw.filter.op) {
             av_assert0(p->nb_data_bufs + 1 <= FF_ARRAY_ELEMS(p->data_bufs));
-            err = create_filter_buf(s, p, op->rw.kernel,
+            err = create_filter_buf(s, p, op->rw.filter.kernel,
                                     &p->data_bufs[p->nb_data_bufs]);
             if (err < 0)
                 goto fail;
@@ -981,12 +981,12 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
             d->id        = spi_get_id(spi);
             d->binding   = nb_data_bufs;
             var_id       = d->id;
-        } else if (op->op == SWS_OP_READ && op->rw.filter) {
+        } else if (op->op == SWS_OP_READ && op->rw.filter.op) {
             if (id->nb_filter_bufs >= MAX_FILT_BUFS)
                 return AVERROR(ENOTSUP);
-            const SwsFilterWeights *wd = op->rw.kernel;
+            const SwsFilterWeights *wd = op->rw.filter.kernel;
             struct FilterData *f = &id->filt[id->nb_filter_bufs++];
-            f->filter       = op->rw.filter;
+            f->filter       = op->rw.filter.op;
             f->filter_size  = wd->filter_size;
             f->dst_size     = wd->dst_size;
             f->num_weights  = wd->num_weights;
@@ -1130,9 +1130,9 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
 
         switch (op->op) {
         case SWS_OP_READ:
-            if (op->rw.frac) {
+            if (op->rw.frac || op->rw.filter.op) {
                 return AVERROR(ENOTSUP);
-            } else if (op->rw.filter) {
+            } else if (op->rw.filter.op) {
                 data = read_filtered(spi, id, ops, op,
                                      &id->filt[nb_filter_used++],
                                      in_img, gid, gi2);
@@ -1152,7 +1152,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
             }
             break;
         case SWS_OP_WRITE:
-            if (op->rw.frac || op->rw.filter) {
+            if (op->rw.frac || op->rw.filter.op) {
                 return AVERROR(ENOTSUP);
             } else if (op->rw.packed) {
                 spi_OpImageWrite(spi, out_img[ops->plane_dst[0]], dst_gid, 
data,
@@ -1316,13 +1316,13 @@ static void read_glsl(const SwsOpList *ops, const SwsOp 
*op, FFVulkanShader *shd
                       int idx, const char *type_name,
                       const char *type_v, const char *type_s)
 {
-    const SwsFilterWeights *wd = op->rw.kernel;
+    const SwsFilterWeights *wd = op->rw.filter.kernel;
     const int interlaced = ops->src.interlaced;
-    if (op->rw.filter) {
-        const char *axis    = op->rw.filter == SWS_OP_FILTER_H ? "pos.x" : 
"pos.y";
-        const char *coord_x = op->rw.filter == SWS_OP_FILTER_H ? "o + i" : 
"pos.x";
+    if (op->rw.filter.op) {
+        const char *axis    = op->rw.filter.op == SWS_OP_FILTER_H ? "pos.x" : 
"pos.y";
+        const char *coord_x = op->rw.filter.op == SWS_OP_FILTER_H ? "o + i" : 
"pos.x";
         const char *coord_y;
-        if (op->rw.filter == SWS_OP_FILTER_H)
+        if (op->rw.filter.op == SWS_OP_FILTER_H)
             coord_y = interlaced ? "spos.y" : "pos.y";
         else
             coord_y = interlaced ? "((o + i) * 2 + int(params.field))" : "o + 
i";
@@ -1411,10 +1411,10 @@ static int add_ops_glsl(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
             nb_desc++;
         } else if (op->op == SWS_OP_FILTER_H || op->op == SWS_OP_FILTER_V ||
                    ((op->op == SWS_OP_READ || op->op == SWS_OP_WRITE) &&
-                    op->rw.filter)) {
+                    op->rw.filter.op)) {
             const SwsFilterWeights *wd = (op->op == SWS_OP_READ ||
                                           op->op == SWS_OP_WRITE) ?
-                                         op->rw.kernel : op->filter.kernel;
+                                         op->rw.filter.kernel : 
op->filter.kernel;
             snprintf(data_buf_name[nb_desc], 256, "filter_buf%i", n);
             snprintf(data_str_name[nb_desc], 256,
                      "float filter_w%i[%i][%i];\n"
@@ -1486,7 +1486,7 @@ static int add_ops_glsl(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
         }
         case SWS_OP_WRITE: {
             const char *dst_pos = ops->dst.interlaced ? "dpos" : "pos";
-            if (op->rw.frac || op->rw.filter) {
+            if (op->rw.frac || op->rw.filter.op) {
                 return AVERROR(ENOTSUP);
             } else if (op->rw.packed) {
                 GLSLF(1, imageStore(dst_img[%i], %s, %s(%s));                  
 ,
diff --git a/tests/checkasm/sw_ops.c b/tests/checkasm/sw_ops.c
index 90eb9d3fb7..01ffb0e048 100644
--- a/tests/checkasm/sw_ops.c
+++ b/tests/checkasm/sw_ops.c
@@ -173,8 +173,8 @@ static void check_compiled(const char *name,
     }
 
     int32_t in_bump_y[LINES];
-    if (read_op->rw.filter == SWS_OP_FILTER_V) {
-        const int *offsets = read_op->rw.kernel->offsets;
+    if (read_op->rw.filter.op == SWS_OP_FILTER_V) {
+        const int *offsets = read_op->rw.filter.kernel->offsets;
         for (int y = 0; y < LINES - 1; y++)
             in_bump_y[y] = offsets[y + 1] - offsets[y] - 1;
         in_bump_y[LINES - 1] = 0;
@@ -182,8 +182,8 @@ static void check_compiled(const char *name,
     }
 
     int32_t in_offset_x[PIXELS];
-    if (read_op->rw.filter == SWS_OP_FILTER_H) {
-        const int *offsets = read_op->rw.kernel->offsets;
+    if (read_op->rw.filter.op == SWS_OP_FILTER_H) {
+        const int *offsets = read_op->rw.filter.kernel->offsets;
         const int rw_bits = rw_pixel_bits(read_op);
         for (int x = 0; x < PIXELS; x++)
             in_offset_x[x] = offsets[x] * rw_bits >> 3;
@@ -466,8 +466,10 @@ static void check_filter(const char *name, const SwsUOp 
*uop)
                     .op        = SWS_OP_READ,
                     .type      = uop->type,
                     .rw.elems  = num,
-                    .rw.filter = is_vert ? SWS_OP_FILTER_V : SWS_OP_FILTER_H,
-                    .rw.kernel = filter,
+                    .rw.filter = {
+                        .op     = is_vert ? SWS_OP_FILTER_V : SWS_OP_FILTER_H,
+                        .kernel = filter,
+                    },
                 }, {
                     .op        = SWS_OP_WRITE,
                     .type      = SWS_PIXEL_F32,

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to