aboutsummaryrefslogtreecommitdiffstats
path: root/libavutil
diff options
context:
space:
mode:
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/integer.c8
-rw-r--r--libavutil/mathematics.c15
-rw-r--r--libavutil/softfloat.h2
-rw-r--r--libavutil/timecode.c2
4 files changed, 21 insertions, 6 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);
diff --git a/libavutil/mathematics.c b/libavutil/mathematics.c
index 126cffc3f0..78a87d8457 100644
--- a/libavutil/mathematics.c
+++ b/libavutil/mathematics.c
@@ -76,8 +76,8 @@ int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
rnd -= AV_ROUND_PASS_MINMAX;
}
- if (a < 0 && a != INT64_MIN)
- return -av_rescale_rnd(-a, b, c, rnd ^ ((rnd >> 1) & 1));
+ if (a < 0)
+ return -(uint64_t)av_rescale_rnd(-FFMAX(a, -INT64_MAX), b, c, rnd ^ ((rnd >> 1) & 1));
if (rnd == AV_ROUND_NEAR_INF)
r = c / 2;
@@ -87,8 +87,13 @@ int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
if (b <= INT_MAX && c <= INT_MAX) {
if (a <= INT_MAX)
return (a * b + r) / c;
- else
- return a / c * b + (a % c * b + r) / c;
+ else {
+ int64_t ad = a / c;
+ int64_t a2 = (a % c * b + r) / c;
+ if (ad >= INT32_MAX && b && ad > (INT64_MAX - a2) / b)
+ return INT64_MIN;
+ return ad * b + a2;
+ }
} else {
#if 1
uint64_t a0 = a & 0xFFFFFFFF;
@@ -112,6 +117,8 @@ int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
t1++;
}
}
+ if (t1 > INT64_MAX)
+ return INT64_MIN;
return t1;
}
#else
diff --git a/libavutil/softfloat.h b/libavutil/softfloat.h
index 5b285e3d9b..7488753d64 100644
--- a/libavutil/softfloat.h
+++ b/libavutil/softfloat.h
@@ -180,7 +180,7 @@ static av_always_inline SoftFloat av_sqrt_sf(SoftFloat val)
if (val.mant == 0)
val.exp = MIN_EXP;
else if (val.mant < 0)
- av_assert0(0);
+ abort();
else
{
tabIndex = (val.mant - 0x20000000) >> 20;
diff --git a/libavutil/timecode.c b/libavutil/timecode.c
index 1dfd040868..bf463ed515 100644
--- a/libavutil/timecode.c
+++ b/libavutil/timecode.c
@@ -151,7 +151,7 @@ static int check_fps(int fps)
static int check_timecode(void *log_ctx, AVTimecode *tc)
{
- if (tc->fps <= 0) {
+ if ((int)tc->fps <= 0) {
av_log(log_ctx, AV_LOG_ERROR, "Timecode frame rate must be specified\n");
return AVERROR(EINVAL);
}