]> git.sesse.net Git - ffmpeg/blobdiff - libavutil/rational.c
Increase buffer size to 16384 patch by Alexander E. Patrakov" patrakov gmail
[ffmpeg] / libavutil / rational.c
index 1924c687d019da92b5c7414116c87e2e221a6ac2..96a4c5462ef31749b33d2baf5ba0171c323bb3ec 100644 (file)
@@ -17,7 +17,6 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  */
 
 /**
 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){
     AVRational a0={0,1}, a1={1,0};
     int sign= (nom<0) ^ (den<0);
-    int64_t gcd= ff_gcd(ABS(nom), ABS(den));
+    int64_t gcd= ff_gcd(FFABS(nom), FFABS(den));
 
-    nom = ABS(nom)/gcd;
-    den = ABS(den)/gcd;
+    if(gcd){
+        nom = FFABS(nom)/gcd;
+        den = FFABS(den)/gcd;
+    }
     if(nom<=max && den<=max){
         a1= (AVRational){nom, den};
         den=0;
     }
 
     while(den){
-        int64_t x       = nom / den;
+        uint64_t x      = nom / den;
         int64_t next_den= nom - den*x;
         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);
+
+            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};
         nom= den;
         den= next_den;
     }
-    assert(ff_gcd(a1.num, a1.den) == 1);
+    assert(ff_gcd(a1.num, a1.den) <= 1U);
 
     *dst_nom = sign ? -a1.num : a1.num;
     *dst_den = a1.den;
@@ -66,40 +74,24 @@ int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max)
     return den==0;
 }
 
-/**
- * returns b*c.
- */
 AVRational av_mul_q(AVRational b, AVRational c){
     av_reduce(&b.num, &b.den, b.num * (int64_t)c.num, b.den * (int64_t)c.den, INT_MAX);
     return b;
 }
 
-/**
- * returns b/c.
- */
 AVRational av_div_q(AVRational b, AVRational c){
     return av_mul_q(b, (AVRational){c.den, c.num});
 }
 
-/**
- * returns b+c.
- */
 AVRational av_add_q(AVRational b, AVRational c){
     av_reduce(&b.num, &b.den, b.num * (int64_t)c.den + c.num * (int64_t)b.den, b.den * (int64_t)c.den, INT_MAX);
     return b;
 }
 
-/**
- * returns b-c.
- */
 AVRational av_sub_q(AVRational b, AVRational c){
     return av_add_q(b, (AVRational){-c.num, c.den});
 }
 
-/**
- * Converts a double precission floating point number to a AVRational.
- * @param max the maximum allowed numerator and denominator
- */
 AVRational av_d2q(double d, int max){
     AVRational a;
 #define LOG2  0.69314718055994530941723212145817656807550013436025