Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [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