diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-03-07 01:04:41 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-03-07 01:04:41 +0200 |
commit | e0172b96e3b6cc6a8b62ee5a52f780941a43de8b (patch) | |
tree | f652f6d15740667d5434e526db3fd12a0573aa0f /libaf | |
parent | 0c6f667896620943ee6ae899d6e36c3da5c98c54 (diff) | |
parent | 7e253f01715811e0c4f5f5b54317b098f2cd59d9 (diff) | |
download | mpv-e0172b96e3b6cc6a8b62ee5a52f780941a43de8b.tar.bz2 mpv-e0172b96e3b6cc6a8b62ee5a52f780941a43de8b.tar.xz |
Merge svn changes up to r28862
Diffstat (limited to 'libaf')
-rw-r--r-- | libaf/af_resample.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/libaf/af_resample.c b/libaf/af_resample.c index 2536c0706d..2844940000 100644 --- a/libaf/af_resample.c +++ b/libaf/af_resample.c @@ -33,7 +33,7 @@ Valid definitions are L8 and L16, where the number denotes the length of the filter. This definition affects the computational complexity (see play()), the performance (see filter.h) and the - memory usage. The filterlength is choosen to 8 if the machine is + memory usage. The filter length is chosen to 8 if the machine is slow and to 16 if the machine is fast and has MMX. */ @@ -174,16 +174,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) { switch(cmd){ case AF_CONTROL_REINIT:{ - af_resample_t* s = (af_resample_t*)af->setup; - af_data_t* n = (af_data_t*)arg; // New configureation + af_resample_t* s = af->setup; + af_data_t* n = arg; // New configuration int i,d = 0; int rv = AF_OK; - // Free space for circular bufers + // Free space for circular buffers if(s->xq){ - for(i=1;i<af->data->nch;i++) - if(s->xq[i]) - free(s->xq[i]); + free(s->xq[0]); free(s->xq); s->xq = NULL; } @@ -216,13 +214,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) d*=m; } - // Create space for circular bufers + // Create space for circular buffers s->xq = malloc(n->nch*sizeof(void*)); - for(i=0;i<n->nch;i++) - s->xq[i] = malloc(2*L*af->data->bps); + s->xq[0] = calloc(n->nch, 2*L*af->data->bps); + for(i=1;i<n->nch;i++) + s->xq[i] = (uint8_t *)s->xq[i-1] + 2*L*af->data->bps; s->xi = 0; - // Check if the the design needs to be redone + // Check if the design needs to be redone if(s->up != af->data->rate/d || s->dn != n->rate/d){ float* w; float* wt; @@ -233,9 +232,9 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->wi = 0; s->i = 0; - // Calculate cuttof frequency for filter + // Calculate cutoff frequency for filter fc = 1/(float)(max(s->up,s->dn)); - // Allocate space for polyphase filter bank and protptype filter + // Allocate space for polyphase filter bank and prototype filter w = malloc(sizeof(float) * s->up *L); if(NULL != s->w) free(s->w); @@ -271,7 +270,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) return rv; } case AF_CONTROL_COMMAND_LINE:{ - af_resample_t* s = (af_resample_t*)af->setup; + af_resample_t* s = af->setup; int rate=0; int type=RSMP_INT; int sloppy=1; @@ -306,6 +305,13 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Deallocate memory static void uninit(struct af_instance_s* af) { + af_resample_t *s = af->setup; + if (s) { + if (s->xq) free(s->xq[0]); + free(s->xq); + free(s->w); + free(s); + } if(af->data) free(af->data->audio); free(af->data); @@ -317,7 +323,7 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) int len = 0; // Length of output data af_data_t* c = data; // Current working data af_data_t* l = af->data; // Local data - af_resample_t* s = (af_resample_t*)af->setup; + af_resample_t* s = af->setup; if(AF_OK != RESIZE_LOCAL_BUFFER(af,data)) return NULL; |