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]

Reply via email to