user selectable cutoff frequency

simplify resampling factor if possible, so more then one resampler can be used, libaf will still die if there are too many like it does with the default resampler (2 with sampling rates which are relative prime are too many ...)


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@13731 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
michael 2004-10-21 21:15:21 +00:00
parent a3fe03568b
commit de7f9318ad
1 changed files with 14 additions and 6 deletions

View File

@ -16,6 +16,8 @@
#define CHANS 6
int64_t ff_gcd(int64_t a, int64_t b);
// Data for specific instances of this filter
typedef struct af_resample_s{
struct AVResampleContext *avrctx;
@ -26,12 +28,14 @@ typedef struct af_resample_s{
int filter_length;
int linear;
int phase_shift;
double cutoff;
}af_resample_t;
// Initialization and runtime control
static int control(struct af_instance_s* af, int cmd, void* arg)
{
int g;
af_resample_t* s = (af_resample_t*)af->setup;
af_data_t *data= (af_data_t*)arg;
@ -46,16 +50,18 @@ static int control(struct af_instance_s* af, int cmd, void* arg)
af->data->nch = data->nch;
af->data->format = AF_FORMAT_SI | AF_FORMAT_NE;
af->data->bps = 2;
af->mul.n = af->data->rate;
af->mul.d = data->rate;
af->delay = 500*s->filter_length/(double)min(af->mul.n, af->mul.d);
g= ff_gcd(af->data->rate, data->rate);
af->mul.n = af->data->rate/g;
af->mul.d = data->rate/g;
af->delay = 500*s->filter_length/(double)min(af->data->rate, data->rate);
if(s->avrctx) av_resample_close(s->avrctx);
s->avrctx= av_resample_init(af->mul.n, /*in_rate*/af->mul.d, s->filter_length, s->phase_shift, s->linear);
s->avrctx= av_resample_init(af->mul.n, /*in_rate*/af->mul.d, s->filter_length, s->phase_shift, s->linear, s->cutoff);
return AF_OK;
case AF_CONTROL_COMMAND_LINE:{
sscanf((char*)arg,"%d:%d:%d:%d", &af->data->rate, &s->filter_length, &s->linear, &s->phase_shift);
sscanf((char*)arg,"%d:%d:%d:%d:%lf", &af->data->rate, &s->filter_length, &s->linear, &s->phase_shift, &s->cutoff);
if(s->cutoff <= 0.0) s->cutoff= max(1.0 - 1.0/s->filter_length, 0.80);
return AF_OK;
}
case AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET:
@ -94,6 +100,8 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data)
out= (int16_t*)af->data->audio;
out_len= min(out_len, af->data->len/(2*chans));
if(s->in_alloc < in_len + s->index){
s->in_alloc= in_len + s->index;
for(i=0; i<chans; i++){