* [FFmpeg-devel] [PATCH] avutil/integer: Add av_abs_i() and signed division (PR #21226)
@ 2025-12-17 1:52 michaelni via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: michaelni via ffmpeg-devel @ 2025-12-17 1:52 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: michaelni
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 <michael@niedermayer.cc>
>From 1c27203d1dc59900a98f9618f7bde442f1425845 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michael@niedermayer.cc>
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 <michael@niedermayer.cc>
---
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 -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-17 3:50 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-17 1:52 [FFmpeg-devel] [PATCH] avutil/integer: Add av_abs_i() and signed division (PR #21226) michaelni via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git