aboutsummaryrefslogtreecommitdiffstats
path: root/libavutil/integer.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2015-12-01 12:41:43 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2015-12-06 12:40:50 +0100
commit5cc411022e49edad09aa3eb5faef14a2a51492f6 (patch)
tree4df515ccd96547f2120c9591859302de9e78c60a /libavutil/integer.c
parenta3ec4b307b4f688643b46aefb4b50584236a04d3 (diff)
downloadffmpeg-5cc411022e49edad09aa3eb5faef14a2a51492f6.tar.gz
avutil/integer: Fix av_mod_i() with negative dividend
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit 3a9cb18855d29c96a5d9d2f5ad30448cae3a2ddf) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavutil/integer.c')
-rw-r--r--libavutil/integer.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/libavutil/integer.c b/libavutil/integer.c
index 5bcde0dc6e..6d6855fa1b 100644
--- a/libavutil/integer.c
+++ b/libavutil/integer.c
@@ -29,6 +29,8 @@
#include "integer.h"
#include "avassert.h"
+static const AVInteger zero_i;
+
AVInteger av_add_i(AVInteger a, AVInteger b){
int i, carry=0;
@@ -111,6 +113,12 @@ AVInteger av_mod_i(AVInteger *quot, AVInteger a, AVInteger b){
AVInteger quot_temp;
if(!quot) quot = &quot_temp;
+ if ((int16_t)a.v[AV_INTEGER_SIZE-1] < 0) {
+ a = av_mod_i(quot, av_sub_i(zero_i, a), b);
+ *quot = av_sub_i(zero_i, *quot);
+ return av_sub_i(zero_i, a);
+ }
+
av_assert2((int16_t)a.v[AV_INTEGER_SIZE-1] >= 0 && (int16_t)b.v[AV_INTEGER_SIZE-1] >= 0);
av_assert2(av_log2_i(b)>=0);