This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit d0b91101832beac6f76a5b2a7de4a356dd513294 Author: Andreas Rheinhardt <[email protected]> AuthorDate: Thu Nov 5 10:37:47 2026 +0100 Commit: Andreas Rheinhardt <[email protected]> CommitDate: Sat Nov 7 21:41:23 2026 +0100 avfilter/vf_limiter_init: Avoid unnecessary shift/mask The limiter DSP functions use the common pattern of passing byte-strides and uint8_t* pointers which then get immediately converted to the proper type (i.e. uint16_t* for bitdepth >8) with the stride being converted via /= sizeof(type). There are several issues with this pattern: a) Strides are signed and use ptrdiff_t, yet sizeof(type) is size_t, so that the division is (on most systems) performed in an unsigned type, leading to logical right shifts. This is wrong and UB for negative strides, but it happens to work in practice, because pointer arithmetic entails an implicit multiplication by sizeof(type). b) Due to this, compilers (like GCC-16 here) actually do not shift at all; but they nevertheless need to mask the lowest bit of the strides (which would be eliminated by the division). This is unnecessary and eliminated by this commit. c) On systems without alignment requirements, it would even be possible for the strides for uint16_t to be odd. In this case, the current pattern would just be wrong. So change the code to convert to the byte-pointer to the actually used types in the outer loop and increment the byte-pointers using the byte-strides. Reviewed-by: Marvin Scholz <[email protected]> Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavfilter/vf_limiter_init.h | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libavfilter/vf_limiter_init.h b/libavfilter/vf_limiter_init.h index a33b4dcc65..f257e706ad 100644 --- a/libavfilter/vf_limiter_init.h +++ b/libavfilter/vf_limiter_init.h @@ -25,23 +25,19 @@ #include "limiter.h" #define LIMITER(n, type) \ -static void limiter##n(const uint8_t *ssrc, uint8_t *ddst, \ +static void limiter##n(const uint8_t *src8, uint8_t *dst8, \ ptrdiff_t slinesize, ptrdiff_t dlinesize,\ int w, int h, int min, int max) \ { \ - const type *src = (const type *)ssrc; \ - type *dst = (type *)ddst; \ - \ - dlinesize /= sizeof(type); \ - slinesize /= sizeof(type); \ - \ for (int y = 0; y < h; y++) { \ + const type *src = (const type *)src8; \ + type *dst = (type *)dst8; \ for (int x = 0; x < w; x++) { \ dst[x] = av_clip(src[x], min, max); \ } \ \ - dst += dlinesize; \ - src += slinesize; \ + dst8 += dlinesize; \ + src8 += slinesize; \ } \ } -- To stop receiving notification emails like this one, please contact [email protected]. _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
