diff options
author | joey <joey@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-11-11 02:47:21 +0000 |
---|---|---|
committer | joey <joey@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-11-11 02:47:21 +0000 |
commit | 8572f14094cf62da9bb6d89dbcc3a7a23a66c06b (patch) | |
tree | b6d2e708abce48b2dd27a3d6f55119bb2e9b0739 /libaf | |
parent | 0c187db220981d89f94570fb76b25266c962a7a6 (diff) | |
download | mpv-8572f14094cf62da9bb6d89dbcc3a7a23a66c06b.tar.bz2 mpv-8572f14094cf62da9bb6d89dbcc3a7a23a66c06b.tar.xz |
Adds a target parameter to the volnorm filter.
This is useful to avoid clipping when processing data,
but less important when watching a clip live.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16972 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libaf')
-rw-r--r-- | libaf/af_volnorm.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/libaf/af_volnorm.c b/libaf/af_volnorm.c index 60485118b0..eb427dc028 100644 --- a/libaf/af_volnorm.c +++ b/libaf/af_volnorm.c @@ -38,9 +38,6 @@ #define MUL_INIT 1.0 #define MUL_MIN 0.1 #define MUL_MAX 5.0 -// "Ideal" level -#define MID_S16 (SHRT_MAX * 0.25) -#define MID_FLOAT (INT_MAX * 0.25) // Silence level // FIXME: should be relative to the level of the samples @@ -51,6 +48,8 @@ #define SMOOTH_MUL 0.06 #define SMOOTH_LASTAVG 0.06 +#define DEFAULT_TARGET 0.25 + // Data for specific instances of this filter typedef struct af_volume_s { @@ -64,6 +63,9 @@ typedef struct af_volume_s float avg; // average level of the sample int len; // sample size (weight) } mem[NSAMPLES]; + // "Ideal" level + float mid_s16; + float mid_float; }af_volnorm_t; // Initialization and runtime control @@ -88,11 +90,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) } return af_test_output(af,(af_data_t*)arg); case AF_CONTROL_COMMAND_LINE:{ - int i; - sscanf((char*)arg,"%d", &i); + int i = 0; + float target = DEFAULT_TARGET; + sscanf((char*)arg,"%d:%f", &i, &target); if (i != 1 && i != 2) return AF_ERROR; s->method = i-1; + s->mid_s16 = ((float)SHRT_MAX) * target; + s->mid_float = ((float)INT_MAX) * target; return AF_OK; } } @@ -128,7 +133,7 @@ static void method1_int16(af_volnorm_t *s, af_data_t *c) if (curavg > SIL_S16) { - neededmul = MID_S16 / (curavg * s->mul); + neededmul = s->mid_s16 / (curavg * s->mul); s->mul = (1.0 - SMOOTH_MUL) * s->mul + SMOOTH_MUL * neededmul; // clamp the mul coefficient @@ -169,7 +174,7 @@ static void method1_float(af_volnorm_t *s, af_data_t *c) if (curavg > SIL_FLOAT) // FIXME { - neededmul = MID_FLOAT / (curavg * s->mul); + neededmul = s->mid_float / (curavg * s->mul); s->mul = (1.0 - SMOOTH_MUL) * s->mul + SMOOTH_MUL * neededmul; // clamp the mul coefficient @@ -215,7 +220,7 @@ static void method2_int16(af_volnorm_t *s, af_data_t *c) avg /= (float)totallen; if (avg >= SIL_S16) { - s->mul = MID_S16 / avg; + s->mul = s->mid_s16 / avg; s->mul = clamp(s->mul, MUL_MIN, MUL_MAX); } } @@ -265,7 +270,7 @@ static void method2_float(af_volnorm_t *s, af_data_t *c) avg /= (float)totallen; if (avg >= SIL_FLOAT) { - s->mul = MID_FLOAT / avg; + s->mul = s->mid_float / avg; s->mul = clamp(s->mul, MUL_MIN, MUL_MAX); } } @@ -319,8 +324,10 @@ static int open(af_instance_t* af){ return AF_ERROR; ((af_volnorm_t*)af->setup)->mul = MUL_INIT; - ((af_volnorm_t*)af->setup)->lastavg = MID_S16; + ((af_volnorm_t*)af->setup)->lastavg = ((float)SHRT_MAX) * DEFAULT_TARGET; ((af_volnorm_t*)af->setup)->idx = 0; + ((af_volnorm_t*)af->setup)->mid_s16 = ((float)SHRT_MAX) * DEFAULT_TARGET; + ((af_volnorm_t*)af->setup)->mid_float = ((float)INT_MAX) * DEFAULT_TARGET; for (i = 0; i < NSAMPLES; i++) { ((af_volnorm_t*)af->setup)->mem[i].len = 0; |