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); |