comparison rational.c @ 641:41e4544b228b libavutil

cosmetics: Use 'num' instead of 'nom' as abbreviation for numerator.
author diego
date Sun, 01 Feb 2009 00:20:45 +0000
parents 8c48a1b999a3
children 70bdd5501662
comparison
equal deleted inserted replaced
640:48119878cea3 641:41e4544b228b
31 31
32 #include "common.h" 32 #include "common.h"
33 #include "mathematics.h" 33 #include "mathematics.h"
34 #include "rational.h" 34 #include "rational.h"
35 35
36 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ 36 int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max){
37 AVRational a0={0,1}, a1={1,0}; 37 AVRational a0={0,1}, a1={1,0};
38 int sign= (nom<0) ^ (den<0); 38 int sign= (num<0) ^ (den<0);
39 int64_t gcd= av_gcd(FFABS(nom), FFABS(den)); 39 int64_t gcd= av_gcd(FFABS(num), FFABS(den));
40 40
41 if(gcd){ 41 if(gcd){
42 nom = FFABS(nom)/gcd; 42 num = FFABS(num)/gcd;
43 den = FFABS(den)/gcd; 43 den = FFABS(den)/gcd;
44 } 44 }
45 if(nom<=max && den<=max){ 45 if(num<=max && den<=max){
46 a1= (AVRational){nom, den}; 46 a1= (AVRational){num, den};
47 den=0; 47 den=0;
48 } 48 }
49 49
50 while(den){ 50 while(den){
51 uint64_t x = nom / den; 51 uint64_t x = num / den;
52 int64_t next_den= nom - den*x; 52 int64_t next_den= num - den*x;
53 int64_t a2n= x*a1.num + a0.num; 53 int64_t a2n= x*a1.num + a0.num;
54 int64_t a2d= x*a1.den + a0.den; 54 int64_t a2d= x*a1.den + a0.den;
55 55
56 if(a2n > max || a2d > max){ 56 if(a2n > max || a2d > max){
57 if(a1.num) x= (max - a0.num) / a1.num; 57 if(a1.num) x= (max - a0.num) / a1.num;
58 if(a1.den) x= FFMIN(x, (max - a0.den) / a1.den); 58 if(a1.den) x= FFMIN(x, (max - a0.den) / a1.den);
59 59
60 if (den*(2*x*a1.den + a0.den) > nom*a1.den) 60 if (den*(2*x*a1.den + a0.den) > num*a1.den)
61 a1 = (AVRational){x*a1.num + a0.num, x*a1.den + a0.den}; 61 a1 = (AVRational){x*a1.num + a0.num, x*a1.den + a0.den};
62 break; 62 break;
63 } 63 }
64 64
65 a0= a1; 65 a0= a1;
66 a1= (AVRational){a2n, a2d}; 66 a1= (AVRational){a2n, a2d};
67 nom= den; 67 num= den;
68 den= next_den; 68 den= next_den;
69 } 69 }
70 assert(av_gcd(a1.num, a1.den) <= 1U); 70 assert(av_gcd(a1.num, a1.den) <= 1U);
71 71
72 *dst_nom = sign ? -a1.num : a1.num; 72 *dst_num = sign ? -a1.num : a1.num;
73 *dst_den = a1.den; 73 *dst_den = a1.den;
74 74
75 return den==0; 75 return den==0;
76 } 76 }
77 77