diff rational.c @ 148:e299e867a485 libavutil

return optimal fraction based on a patch by Uoti Urpala
author michael
date Thu, 30 Nov 2006 01:18:57 +0000
parents f42a6347df1d
children a7b367ec551a
line wrap: on
line diff
--- a/rational.c	Sun Nov 19 09:43:26 2006 +0000
+++ b/rational.c	Thu Nov 30 01:18:57 2006 +0000
@@ -51,7 +51,15 @@
         int64_t a2n= x*a1.num + a0.num;
         int64_t a2d= x*a1.den + a0.den;
 
-        if(a2n > max || a2d > max) break;
+        if(a2n > max || a2d > max){
+            if(a1.num) x= (max - a0.num) / a1.num;
+            if(a1.den) x= FFMIN(x, (max - a0.den) / a1.den);
+
+            // Won't overflow, sum == original denominator
+            if (den*(2*x*a1.den + a0.den) > nom*a1.den)
+                a1 = (AVRational){x*a1.num + a0.num, x*a1.den + a0.den};
+            break;
+        }
 
         a0= a1;
         a1= (AVRational){a2n, a2d};