av_add_stable: Add fast special case where step can be represented exactly
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 2 Jun 2014 17:00:18 +0000 (19:00 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 2 Jun 2014 17:00:18 +0000 (19:00 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavutil/mathematics.c

index c8f1e1c..df7d0d8 100644 (file)
@@ -188,9 +188,17 @@ simple_round:
 
 int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc)
 {
+    int64_t m, d;
+
     if (inc != 1)
         inc_tb = av_mul_q(inc_tb, (AVRational) {inc, 1});
 
+    m = inc_tb.num * (int64_t)ts_tb.den;
+    d = inc_tb.den * (int64_t)ts_tb.num;
+
+    if (m % d == 0)
+        return ts + m / d;
+
     if (av_cmp_q(inc_tb, ts_tb) < 0) {
         //increase step is too small for even 1 step to be representable
         return ts;