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

Git pushed a commit to branch master
in repository ffmpeg.

commit 770a1ef28de945b894c19c1066692b614f3de1f7
Author:     Niklas Haas <[email protected]>
AuthorDate: Tue Aug 4 14:43:29 2026 +0200
Commit:     Niklas Haas <[email protected]>
CommitDate: Sun Aug 9 21:03:33 2026 +0200

    swscale/ops_optimizer: eliminate unneeded SWS_OP_MIN/MAX components
    
    The current code only checks to see if the entire operation is a no-op,
    but doesn't allow removing unneeded components from the operation.
    
    Results in a large number of minor improvements, e.g.
    
     rgba 16x16 -> ya8 16x16:
       u8_read_packed_xyzw
       u8_to_f32_xyzw
       f32_linear_x_xxx00
       f32_dither_x_0_16x16
    -  f32_min_xw
    +  f32_min_x
       f32_to_u8_xw
       u8_permute_xyz_y_w
       u8_write_packed_xy
    
    or:
    
     rgba 16x16 -> yuva444p10le 16x16:
       u8_read_packed_xyzw
       u8_to_f32_xyzw
       f32_linear_xyzw_xxx0x_xxx0x_xxx0x_000x0
       f32_dither_xyzw_0_3_2_5_16x16
    -  f32_min_xyzw
    +  f32_min_w
       f32_to_u16_xyzw
       u16_write_planar_xyzw
    
    And some major ones, e.g.
    
     yuva444p 16x16 -> gbrap 16x16:
    -  u8_read_planar_xyzw
    -  u8_to_f32_xyzw
    +  u8_read_planar_x
    +  u8_write_planar_x
    + Sub-pass #1:
    +  u8_read_planar_xyz
    +  u8_to_f32_xyz
       f32_linear_xyz_x0x0x_xxx0x_xx00x
       f32_dither_xyz_0_3_2_16x16
    -  f32_max_xyzw
    -  f32_min_xyzw
    -  f32_to_u8_xyzw
    -  u8_write_planar_xyzw
    +  f32_max_xyz
    +  f32_min_xyz
    +  f32_to_u8_xyz
    +  u8_write_planar_xyz
    
    Which is now split between two subpasses, one for the no-op alpha
    copy and one for the yuv444 -> gbrp conversion. This has been
    previously blocked by the SWS_OP_MIN/MAX clamp on the RGB channels
    marking the alpha channel as dirty, even though it should be a no-op
    on the alpha channel.
    
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/aarch64/ops_entries.c |  4 ++++
 libswscale/ops_optimizer.c       |  8 ++++++--
 libswscale/uops_macros.h         | 10 ++++++++++
 tests/ref/fate/sws-ops-list      |  2 +-
 4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/libswscale/aarch64/ops_entries.c b/libswscale/aarch64/ops_entries.c
index 1718b0de11..6bb9db1613 100644
--- a/libswscale/aarch64/ops_entries.c
+++ b/libswscale/aarch64/ops_entries.c
@@ -243,8 +243,12 @@ ENTRY(ff_sws_scale_16_u8_0111_neon,                 { .uop 
= SWS_UOP_SCALE,
 ENTRY(ff_sws_scale_16_u16_0001_neon,                { .uop = SWS_UOP_SCALE,    
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x1 })
 ENTRY(ff_sws_scale_16_u16_0111_neon,                { .uop = SWS_UOP_SCALE,    
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x7 })
 ENTRY(ff_sws_min_8_f32_0001_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1 })
+ENTRY(ff_sws_min_8_f32_0010_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x2 })
 ENTRY(ff_sws_min_8_f32_0011_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x3 })
+ENTRY(ff_sws_min_8_f32_0100_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x4 })
+ENTRY(ff_sws_min_8_f32_0101_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x5 })
 ENTRY(ff_sws_min_8_f32_0111_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7 })
+ENTRY(ff_sws_min_8_f32_1000_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x8 })
 ENTRY(ff_sws_min_8_f32_1001_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9 })
 ENTRY(ff_sws_min_8_f32_1110_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xe })
 ENTRY(ff_sws_min_8_f32_1111_neon,                   { .uop = SWS_UOP_MIN,      
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf })
diff --git a/libswscale/ops_optimizer.c b/libswscale/ops_optimizer.c
index fd3b70deed..9cc5db9717 100644
--- a/libswscale/ops_optimizer.c
+++ b/libswscale/ops_optimizer.c
@@ -581,7 +581,9 @@ retry:
             for (int i = 0; i < 4; i++) {
                 if (!SWS_OP_NEEDED(op, i) || !op->clamp.limit[i].den)
                     continue;
-                if (av_cmp_q64(op->clamp.limit[i], prev->comps.max[i]) < 0)
+                if (av_cmp_q64(op->clamp.limit[i], prev->comps.max[i]) >= 0)
+                    op->clamp.limit[i] = (AVRational64) {0}; /* no-op */
+                else
                     noop = false;
             }
 
@@ -595,7 +597,9 @@ retry:
             for (int i = 0; i < 4; i++) {
                 if (!SWS_OP_NEEDED(op, i) || !op->clamp.limit[i].den)
                     continue;
-                if (av_cmp_q64(prev->comps.min[i], op->clamp.limit[i]) < 0)
+                if (av_cmp_q64(prev->comps.min[i], op->clamp.limit[i]) >= 0)
+                    op->clamp.limit[i] = (AVRational64) {0};
+                else
                     noop = false;
             }
 
diff --git a/libswscale/uops_macros.h b/libswscale/uops_macros.h
index 84fbd3b073..d2f9793692 100644
--- a/libswscale/uops_macros.h
+++ b/libswscale/uops_macros.h
@@ -987,15 +987,23 @@
     MACRO(__VA_ARGS__, f32_add_xyzw                            , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_ADD             , .mask = 0xf)
 #define SWS_FOR_F32_MIN(MACRO, ...) \
     MACRO(__VA_ARGS__, f32_min_x                               , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x1) \
+    MACRO(__VA_ARGS__, f32_min_y                               , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x2) \
     MACRO(__VA_ARGS__, f32_min_xy                              , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x3) \
+    MACRO(__VA_ARGS__, f32_min_z                               , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x4) \
+    MACRO(__VA_ARGS__, f32_min_xz                              , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x5) \
     MACRO(__VA_ARGS__, f32_min_xyz                             , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x7) \
+    MACRO(__VA_ARGS__, f32_min_w                               , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x8) \
     MACRO(__VA_ARGS__, f32_min_xw                              , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0x9) \
     MACRO(__VA_ARGS__, f32_min_yzw                             , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0xe) \
     MACRO(__VA_ARGS__, f32_min_xyzw                            , 
SWS_PIXEL_F32, SWS_UOP_MIN             , 0xf)
 #define SWS_FOR_STRUCT_F32_MIN(MACRO, ...) \
     MACRO(__VA_ARGS__, f32_min_x                               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x1) \
+    MACRO(__VA_ARGS__, f32_min_y                               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x2) \
     MACRO(__VA_ARGS__, f32_min_xy                              , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x3) \
+    MACRO(__VA_ARGS__, f32_min_z                               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x4) \
+    MACRO(__VA_ARGS__, f32_min_xz                              , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x5) \
     MACRO(__VA_ARGS__, f32_min_xyz                             , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x7) \
+    MACRO(__VA_ARGS__, f32_min_w                               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x8) \
     MACRO(__VA_ARGS__, f32_min_xw                              , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0x9) \
     MACRO(__VA_ARGS__, f32_min_yzw                             , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0xe) \
     MACRO(__VA_ARGS__, f32_min_xyzw                            , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MIN             , .mask = 0xf)
@@ -1003,12 +1011,14 @@
     MACRO(__VA_ARGS__, f32_max_x                               , 
SWS_PIXEL_F32, SWS_UOP_MAX             , 0x1) \
     MACRO(__VA_ARGS__, f32_max_xy                              , 
SWS_PIXEL_F32, SWS_UOP_MAX             , 0x3) \
     MACRO(__VA_ARGS__, f32_max_xyz                             , 
SWS_PIXEL_F32, SWS_UOP_MAX             , 0x7) \
+    MACRO(__VA_ARGS__, f32_max_w                               , 
SWS_PIXEL_F32, SWS_UOP_MAX             , 0x8) \
     MACRO(__VA_ARGS__, f32_max_xw                              , 
SWS_PIXEL_F32, SWS_UOP_MAX             , 0x9) \
     MACRO(__VA_ARGS__, f32_max_xyzw                            , 
SWS_PIXEL_F32, SWS_UOP_MAX             , 0xf)
 #define SWS_FOR_STRUCT_F32_MAX(MACRO, ...) \
     MACRO(__VA_ARGS__, f32_max_x                               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MAX             , .mask = 0x1) \
     MACRO(__VA_ARGS__, f32_max_xy                              , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MAX             , .mask = 0x3) \
     MACRO(__VA_ARGS__, f32_max_xyz                             , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MAX             , .mask = 0x7) \
+    MACRO(__VA_ARGS__, f32_max_w                               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MAX             , .mask = 0x8) \
     MACRO(__VA_ARGS__, f32_max_xw                              , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MAX             , .mask = 0x9) \
     MACRO(__VA_ARGS__, f32_max_xyzw                            , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_MAX             , .mask = 0xf)
 #define SWS_FOR_F32_UNPACK(MACRO, ...)
diff --git a/tests/ref/fate/sws-ops-list b/tests/ref/fate/sws-ops-list
index 08a6931637..aa7baa23f8 100644
--- a/tests/ref/fate/sws-ops-list
+++ b/tests/ref/fate/sws-ops-list
@@ -1 +1 @@
-b1ad61c3b7751b8d88c8036076bac1e4
+3dec8ca0edbf6a301f53b7782932c98f

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

Reply via email to