diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-01-08 21:34:06 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-01-08 21:34:06 +0000 |
commit | 8ee78e87ce7961a5b02762fd71c6e348198307fe (patch) | |
tree | 757423509666fb2bb9afd8b94674e001fac3ac6f /libaf/af_resample.c | |
parent | aae5663175bf24ff9a8a8ee5b01e46420f3f7357 (diff) | |
download | mpv-8ee78e87ce7961a5b02762fd71c6e348198307fe.tar.bz2 mpv-8ee78e87ce7961a5b02762fd71c6e348198307fe.tar.xz |
always cancel down fractions (frac_t) to avoid overflows and playback
problems (e.g. when using resample and equalizer filters together, see
http://mplayerhq.hu/pipermail/mplayer-users/2004-December/050058.html)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14434 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libaf/af_resample.c')
-rw-r--r-- | libaf/af_resample.c | 21 |
1 files changed, 3 insertions, 18 deletions
diff --git a/libaf/af_resample.c b/libaf/af_resample.c index 4611d103da..97df54b8b5 100644 --- a/libaf/af_resample.c +++ b/libaf/af_resample.c @@ -62,22 +62,6 @@ typedef struct af_resample_s int setup; // Setup parameters cmdline or through postcreate } af_resample_t; -// Euclids algorithm for calculating Greatest Common Divisor GCD(a,b) -static inline int gcd(register int a, register int b) -{ - register int r = min(a,b); - a=max(a,b); - b=r; - - r=a%b; - while(r!=0){ - a=b; - b=r; - r=a%b; - } - return b; -} - // Fast linear interpolation resample with modest audio quality static int linint(af_data_t* c,af_data_t* l, af_resample_t* s) { @@ -202,11 +186,12 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->step); af->mul.n = af->data->rate; af->mul.d = n->rate; + af_frac_cancel(&af->mul); return rv; } // Calculate up and down sampling factors - d=gcd(af->data->rate,n->rate); + d=af_gcd(af->data->rate,n->rate); // If sloppy resampling is enabled limit the upsampling factor if(((s->setup & FREQ_MASK) == FREQ_SLOPPY) && (af->data->rate/d > 5000)){ @@ -214,7 +199,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) int dn=n->rate/2; int m=2; while(af->data->rate/(d*m) > 5000){ - d=gcd(up,dn); + d=af_gcd(up,dn); up/=2; dn/=2; m*=2; } d*=m; |