Mercurial > libavcodec.hg
comparison utils.c @ 2125:b415b42d3c80 libavcodec
simplify
| author | michael |
|---|---|
| date | Wed, 14 Jul 2004 18:23:49 +0000 |
| parents | 586a6e8f3290 |
| children | ef47c0b1ff28 |
comparison
equal
deleted
inserted
replaced
| 2124:6f44ab5ad03c | 2125:b415b42d3c80 |
|---|---|
| 784 default: return '?'; | 784 default: return '?'; |
| 785 } | 785 } |
| 786 } | 786 } |
| 787 | 787 |
| 788 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ | 788 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ |
| 789 int exact=1, sign=0; | 789 AVRational a0={0,1}, a1={1,0}; |
| 790 int64_t gcd; | 790 int sign= (nom<0) ^ (den<0); |
| 791 | 791 int64_t gcd= ff_gcd(ABS(nom), ABS(den)); |
| 792 assert(den != 0); | 792 |
| 793 | 793 nom = ABS(nom)/gcd; |
| 794 if(den < 0) | 794 den = ABS(den)/gcd; |
| 795 return av_reduce(dst_nom, dst_den, -nom, -den, max); | 795 if(nom<=max && den<=max){ |
| 796 | 796 a1= (AVRational){nom, den}; |
| 797 sign= nom < 0; | 797 den=0; |
| 798 nom= ABS(nom); | 798 } |
| 799 | 799 |
| 800 gcd = ff_gcd(nom, den); | 800 while(den){ |
| 801 nom /= gcd; | 801 int64_t x = nom / den; |
| 802 den /= gcd; | 802 int64_t next_den= nom - den*x; |
| 803 | 803 int64_t a2n= x*a1.num + a0.num; |
| 804 if(nom > max || den > max){ | 804 int64_t a2d= x*a1.den + a0.den; |
| 805 AVRational a0={0,1}, a1={1,0}; | 805 |
| 806 exact=0; | 806 if(a2n > max || a2d > max) break; |
| 807 | 807 |
| 808 for(;;){ | 808 a0= a1; |
| 809 int64_t x= nom / den; | 809 a1= (AVRational){a2n, a2d}; |
| 810 int64_t a2n= x*a1.num + a0.num; | 810 nom= den; |
| 811 int64_t a2d= x*a1.den + a0.den; | 811 den= next_den; |
| 812 | 812 } |
| 813 if(a2n > max || a2d > max) break; | 813 assert(ff_gcd(a1.num, a1.den) == 1); |
| 814 | 814 |
| 815 nom %= den; | 815 *dst_nom = sign ? -a1.num : a1.num; |
| 816 | 816 *dst_den = a1.den; |
| 817 a0= a1; | 817 |
| 818 a1= (AVRational){a2n, a2d}; | 818 return den==0; |
| 819 if(nom==0) break; | |
| 820 x= nom; nom=den; den=x; | |
| 821 } | |
| 822 nom= a1.num; | |
| 823 den= a1.den; | |
| 824 } | |
| 825 | |
| 826 assert(ff_gcd(nom, den) == 1); | |
| 827 | |
| 828 *dst_nom = sign ? -nom : nom; | |
| 829 *dst_den = den; | |
| 830 | |
| 831 return exact; | |
| 832 } | 819 } |
| 833 | 820 |
| 834 int64_t av_rescale(int64_t a, int64_t b, int64_t c){ | 821 int64_t av_rescale(int64_t a, int64_t b, int64_t c){ |
| 835 AVInteger ai, ci; | 822 AVInteger ai, ci; |
| 836 assert(c > 0); | 823 assert(c > 0); |
