summaryrefslogtreecommitdiffstats
path: root/libaf/af_resample.c
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-01-08 21:34:06 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-01-08 21:34:06 +0000
commit8ee78e87ce7961a5b02762fd71c6e348198307fe (patch)
tree757423509666fb2bb9afd8b94674e001fac3ac6f /libaf/af_resample.c
parentaae5663175bf24ff9a8a8ee5b01e46420f3f7357 (diff)
downloadmpv-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.c21
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;