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

Git pushed a commit to branch master
in repository ffmpeg.

commit 4b8790f1078e6c3b0506514bb8079e4c4c8af3a7
Author:     Niklas Haas <[email protected]>
AuthorDate: Tue Jan 13 21:02:12 2026 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Thu Feb 19 19:44:46 2026 +0000

    swscale/optimizer: allow commuting CLEAR past SWAP_BYTES
    
    This requires a bit of a manual check in the 32-bit integer case to
    make sure we don't exceed the value range of AVRational; but it still allows
    quite a number of optimizations despite that restriction.
    
    e.g.
    
    rgb24 -> yuva444p9be:
    -  [u16 ...X -> ++++] SWS_OP_CLEAR        : {_ _ _ 511}
    -  [u16 .... -> zzzz] SWS_OP_SWAP_BYTES
    -  [u16 .... -> zzzz] SWS_OP_WRITE        : 4 elem(s) planar >> 0
    +  [u16 ...X -> zzzX] SWS_OP_SWAP_BYTES
    +  [u16 ...X -> zzz+] SWS_OP_CLEAR        : {_ _ _ 65281}
    +  [u16 .... -> zzz+] SWS_OP_WRITE        : 4 elem(s) planar >> 0
    
    gray -> yuv444p12be:
    -  [u16 .XXX -> +++X] SWS_OP_CLEAR        : {_ 2048 2048 _}
    -  [u16 ...X -> zzzX] SWS_OP_SWAP_BYTES
    -  [u16 ...X -> zzzX] SWS_OP_WRITE        : 3 elem(s) planar >> 0
    +  [u16 .XXX -> zzXX] SWS_OP_SWAP_BYTES
    +  [u16 .XXX -> z++X] SWS_OP_CLEAR        : {_ 8 8 _}
    +  [u16 ...X -> z++X] SWS_OP_WRITE        : 3 elem(s) planar >> 0
    
    Ultimately, the benefit of this will only become relevant once we start
    splitting apart planes, since then we can have planes with only CLEAR
    operations.
    
    Sponsored-by: Sovereign Tech Fund
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/ops_optimizer.c  | 20 +++++++++++++++++++-
 tests/ref/fate/sws-ops-list |  2 +-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/libswscale/ops_optimizer.c b/libswscale/ops_optimizer.c
index 8b5a5c8e31..3bd2d12520 100644
--- a/libswscale/ops_optimizer.c
+++ b/libswscale/ops_optimizer.c
@@ -39,6 +39,8 @@
  */
 static bool op_commute_clear(SwsOp *op, SwsOp *next)
 {
+    SwsOp tmp;
+
     av_assert1(op->op == SWS_OP_CLEAR);
     switch (next->op) {
     case SWS_OP_CONVERT:
@@ -54,8 +56,24 @@ static bool op_commute_clear(SwsOp *op, SwsOp *next)
     case SWS_OP_SWIZZLE:
         ff_sws_apply_op_q(next, op->c.q4);
         return true;
-    case SWS_OP_INVALID:
     case SWS_OP_SWAP_BYTES:
+        switch (next->type) {
+        case SWS_PIXEL_U16:
+            ff_sws_apply_op_q(next, op->c.q4); /* always works */
+            return true;
+        case SWS_PIXEL_U32:
+            for (int i = 0; i < 4; i++) {
+                uint32_t v = av_bswap32(op->c.q4[i].num);
+                if (v > INT_MAX)
+                    return false; /* can't represent as AVRational anymore */
+                tmp.c.q4[i] = Q(v);
+            }
+            op->c = tmp.c;
+            return true;
+        default:
+            return false;
+        }
+    case SWS_OP_INVALID:
     case SWS_OP_WRITE:
     case SWS_OP_LINEAR:
     case SWS_OP_PACK:
diff --git a/tests/ref/fate/sws-ops-list b/tests/ref/fate/sws-ops-list
index bf2dacc154..b69b1ab299 100644
--- a/tests/ref/fate/sws-ops-list
+++ b/tests/ref/fate/sws-ops-list
@@ -1 +1 @@
-78416673c15226c0cac62ce4eb24f883
+8312bc72ff9e05a8a6ab8d1c394783d6

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

Reply via email to