fix av_reduce() with things like 1/0 and 0/0
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 9 Jan 2007 11:58:06 +0000 (11:58 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 9 Jan 2007 11:58:06 +0000 (11:58 +0000)
Originally committed as revision 7431 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavutil/rational.c

index 0e018c41b6359c1d53d1411b25d99bd86770e9e1..0480aa882f1e449d16639368469389f5b16d205e 100644 (file)
@@ -38,8 +38,10 @@ int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max)
     int sign= (nom<0) ^ (den<0);
     int64_t gcd= ff_gcd(FFABS(nom), FFABS(den));
 
     int sign= (nom<0) ^ (den<0);
     int64_t gcd= ff_gcd(FFABS(nom), FFABS(den));
 
-    nom = FFABS(nom)/gcd;
-    den = FFABS(den)/gcd;
+    if(gcd){
+        nom = FFABS(nom)/gcd;
+        den = FFABS(den)/gcd;
+    }
     if(nom<=max && den<=max){
         a1= (AVRational){nom, den};
         den=0;
     if(nom<=max && den<=max){
         a1= (AVRational){nom, den};
         den=0;
@@ -65,7 +67,7 @@ int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max)
         nom= den;
         den= next_den;
     }
         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;
 
     *dst_nom = sign ? -a1.num : a1.num;
     *dst_den = a1.den;