summaryrefslogtreecommitdiffstats
path: root/libaf
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-10-21 21:15:21 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-10-21 21:15:21 +0000
commitde7f9318ad08c857183cdbf57a67898c6b8a9a84 (patch)
treeeda2af786b24e2093775a4a2cf980a0aa9050980 /libaf
parenta3fe03568b58f151a654a37e3dcdcae7ee40ad69 (diff)
downloadmpv-de7f9318ad08c857183cdbf57a67898c6b8a9a84.tar.bz2
mpv-de7f9318ad08c857183cdbf57a67898c6b8a9a84.tar.xz
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
Diffstat (limited to 'libaf')
-rw-r--r--libaf/af_lavcresample.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/libaf/af_lavcresample.c b/libaf/af_lavcresample.c
index e033c7e225..24222c5647 100644
--- a/libaf/af_lavcresample.c
+++ b/libaf/af_lavcresample.c
@@ -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:
@@ -93,7 +99,9 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data)
return NULL;
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++){