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