From: michaelni via ffmpeg-devel <ffmpeg-devel@ffmpeg.org>
To: ffmpeg-devel@ffmpeg.org
Cc: michaelni <code@ffmpeg.org>
Subject: [FFmpeg-devel] [PATCH] avutil/integer: Add av_abs_i() and signed division (PR #21226)
Date: Wed, 17 Dec 2025 01:52:00 -0000
Message-ID: <176593632052.60.4259764624763111882@2cb04c0e5124> (raw)
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
reply other threads:[~2025-12-17 3:50 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=176593632052.60.4259764624763111882@2cb04c0e5124 \
--to=ffmpeg-devel@ffmpeg.org \
--cc=code@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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