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]
