Commit 80a3e508 authored by michael's avatar michael

use continued fractions to approximate a fraction if its numerator or denominator is too large


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@2405 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 8fdbf12e
......@@ -684,7 +684,7 @@ char av_get_pict_type_char(int pict_type){
int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){
int exact=1, sign=0;
int64_t gcd, larger;
int64_t gcd;
assert(den != 0);
......@@ -698,21 +698,33 @@ int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max)
sign= 1;
}
for(;;){ //note is executed 1 or 2 times
gcd = ff_gcd(nom, den);
nom /= gcd;
den /= gcd;
larger= FFMAX(nom, den);
if(larger > max){
int64_t div= (larger + max - 1) / max;
nom = (nom + div/2)/div;
den = (den + div/2)/div;
if(nom > max || den > max){
AVRational a0={0,1}, a1={1,0};
exact=0;
}else
break;
for(;;){
int64_t x= nom / den;
int64_t a2n= x*a1.num + a0.num;
int64_t a2d= x*a1.den + a0.den;
if(a2n > max || a2d > max) break;
nom %= den;
a0= a1;
a1= (AVRational){a2n, a2d};
if(nom==0) break;
x= nom; nom=den; den=x;
}
nom= a1.num;
den= a1.den;
}
assert(ff_gcd(nom, den) == 1);
if(sign) nom= -nom;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment