PR #21226 opened by michaelni URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21226 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21226.patch
Signed-off-by: Michael Niedermayer <[email protected]> >From 1c27203d1dc59900a98f9618f7bde442f1425845 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer <[email protected]> Date: Wed, 17 Dec 2025 02:10:55 +0100 Subject: [PATCH] avutil/integer: Add av_abs_i() and signed division Signed-off-by: Michael Niedermayer <[email protected]> --- libavutil/integer.c | 24 ++++++++++++++++++++++++ libavutil/integer.h | 10 ++++++++++ libavutil/tests/integer.c | 8 ++++++++ 3 files changed, 42 insertions(+) diff --git a/libavutil/integer.c b/libavutil/integer.c index ae87c467b2..3f8a5f5cd3 100644 --- a/libavutil/integer.c +++ b/libavutil/integer.c @@ -53,6 +53,21 @@ AVInteger av_sub_i(AVInteger a, AVInteger b){ return a; } +static AVInteger neg_i(AVInteger a) { + int i, carry=0; + for(i=0; i<AV_INTEGER_SIZE; i++){ + carry= (carry>>16) - a.v[i]; + a.v[i]= carry; + } + return a; +} + +AVInteger av_abs_i(AVInteger a){ + if ((int16_t)a.v[AV_INTEGER_SIZE-1] < 0) + a = neg_i(a); + return a; +} + int av_log2_i(AVInteger a){ int i; @@ -146,6 +161,15 @@ AVInteger av_div_i(AVInteger a, AVInteger b){ return quot; } +AVInteger av_idiv_i(AVInteger a, AVInteger b){ + int flip = (int16_t)(a.v[AV_INTEGER_SIZE-1]^b.v[AV_INTEGER_SIZE-1]) < 0; + a = av_div_i(av_abs_i(a), av_abs_i(b)); + if (flip) + a = neg_i(a); + + return a; +} + AVInteger av_int2i(int64_t a){ AVInteger out; int i; diff --git a/libavutil/integer.h b/libavutil/integer.h index 2d9b5bb10f..9ec21e1869 100644 --- a/libavutil/integer.h +++ b/libavutil/integer.h @@ -83,4 +83,14 @@ AVInteger av_int2i(int64_t a) av_const; */ int64_t av_i2int(AVInteger a) av_const; +/** + * returns |a| + */ +AVInteger av_abs_i(AVInteger a) av_const; + +/** + * signed division + */ +AVInteger av_idiv_i(AVInteger a, AVInteger b) av_const; + #endif /* AVUTIL_INTEGER_H */ diff --git a/libavutil/tests/integer.c b/libavutil/tests/integer.c index d2c8f2a903..96027c927e 100644 --- a/libavutil/tests/integer.c +++ b/libavutil/tests/integer.c @@ -31,6 +31,8 @@ int main(void){ for(b=3; b<256*256*256; b+=27118){ AVInteger ai= av_int2i(a); AVInteger bi= av_int2i(b); + AVInteger nai= av_int2i(-a); + AVInteger nbi= av_int2i(-b); av_assert0(av_i2int(ai) == a); av_assert0(av_i2int(bi) == b); @@ -43,6 +45,12 @@ int main(void){ av_assert0(av_i2int(av_shr_i(ai,-17)) == a<<17); av_assert0(av_log2_i(ai) == av_log2(a)); av_assert0(av_i2int(av_div_i(ai,bi)) == a/b); + av_assert0(av_i2int(av_idiv_i(ai , bi)) == a/b); + av_assert0(av_i2int(av_idiv_i(nai, bi)) == -a/b); + av_assert0(av_i2int(av_idiv_i(ai ,nbi)) == -a/b); + av_assert0(av_i2int(av_idiv_i(nai,nbi)) == a/b); + av_assert0(av_i2int(av_abs_i( ai)) == a); + av_assert0(av_i2int(av_abs_i(nai)) == a); } } return 0; -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
