diff options
author | Paul B Mahol <onemda@gmail.com> | 2022-12-12 01:55:06 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2022-12-12 20:29:07 +0100 |
commit | 91abbb9d024817f6e4cf064a0db21c4979912840 (patch) | |
tree | 20128d9f7b71ce0a9a0d0da33632be52797fee42 /libavfilter | |
parent | c3e20f78b05d78ed1d214ba40fa5133c16af6415 (diff) | |
download | ffmpeg-91abbb9d024817f6e4cf064a0db21c4979912840.tar.gz |
avfilter/af_afir: reduce output gain with default parameters
It was unreasonably high. Also change scaling to reduce
rare quantization errors.
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/af_afir.c | 41 | ||||
-rw-r--r-- | libavfilter/af_afir.h | 4 | ||||
-rw-r--r-- | libavfilter/afir_template.c | 3 |
3 files changed, 28 insertions, 20 deletions
diff --git a/libavfilter/af_afir.c b/libavfilter/af_afir.c index cb1332841f..83b9a1ba02 100644 --- a/libavfilter/af_afir.c +++ b/libavfilter/af_afir.c @@ -160,6 +160,8 @@ static int init_segment(AVFilterContext *ctx, AudioFIRSegment *seg, { AudioFIRContext *s = ctx->priv; const size_t cpu_align = av_cpu_max_align(); + union { double d; float f; } cscale, scale, iscale; + enum AVTXType tx_type; int ret; seg->tx = av_calloc(ctx->inputs[0]->ch_layout.nb_channels, sizeof(*seg->tx)); @@ -167,7 +169,7 @@ static int init_segment(AVFilterContext *ctx, AudioFIRSegment *seg, if (!seg->tx || !seg->itx) return AVERROR(ENOMEM); - seg->fft_length = part_size * 2 + 1; + seg->fft_length = part_size * 2 + 2; seg->part_size = part_size; seg->block_size = FFALIGN(seg->fft_length, cpu_align); seg->coeff_size = FFALIGN(seg->part_size + 1, cpu_align); @@ -180,22 +182,27 @@ static int init_segment(AVFilterContext *ctx, AudioFIRSegment *seg, if (!seg->part_index || !seg->output_offset) return AVERROR(ENOMEM); - for (int ch = 0; ch < ctx->inputs[0]->ch_layout.nb_channels && part_size >= 1; ch++) { - union { double d; float f; } scale, iscale; - enum AVTXType tx_type; + switch (s->format) { + case AV_SAMPLE_FMT_FLTP: + cscale.f = 1.f; + scale.f = 1.f / sqrtf(2.f * part_size); + iscale.f = 1.f / sqrtf(2.f * part_size); + tx_type = AV_TX_FLOAT_RDFT; + break; + case AV_SAMPLE_FMT_DBLP: + cscale.d = 1.0; + scale.d = 1.0 / sqrt(2.0 * part_size); + iscale.d = 1.0 / sqrt(2.0 * part_size); + tx_type = AV_TX_DOUBLE_RDFT; + break; + } - switch (s->format) { - case AV_SAMPLE_FMT_FLTP: - scale.f = 1.f; - iscale.f = 1.f / part_size; - tx_type = AV_TX_FLOAT_RDFT; - break; - case AV_SAMPLE_FMT_DBLP: - scale.d = 1.0; - iscale.d = 1.0 / part_size; - tx_type = AV_TX_DOUBLE_RDFT; - break; - } + ret = av_tx_init(&seg->ctx, &seg->ctx_fn, tx_type, + 0, 2 * part_size, &cscale, 0); + if (ret < 0) + return ret; + + for (int ch = 0; ch < ctx->inputs[0]->ch_layout.nb_channels && part_size >= 1; ch++) { ret = av_tx_init(&seg->tx[ch], &seg->tx_fn, tx_type, 0, 2 * part_size, &scale, 0); if (ret < 0) @@ -224,6 +231,8 @@ static void uninit_segment(AVFilterContext *ctx, AudioFIRSegment *seg) { AudioFIRContext *s = ctx->priv; + av_tx_uninit(&seg->ctx); + if (seg->tx) { for (int ch = 0; ch < s->nb_channels; ch++) { av_tx_uninit(&seg->tx[ch]); diff --git a/libavfilter/af_afir.h b/libavfilter/af_afir.h index e82fc58589..6a071eddf7 100644 --- a/libavfilter/af_afir.h +++ b/libavfilter/af_afir.h @@ -49,8 +49,8 @@ typedef struct AudioFIRSegment { AVFrame *input; AVFrame *output; - AVTXContext **tx, **itx; - av_tx_fn tx_fn, itx_fn; + AVTXContext *ctx, **tx, **itx; + av_tx_fn ctx_fn, tx_fn, itx_fn; } AudioFIRSegment; typedef struct AudioFIRContext { diff --git a/libavfilter/afir_template.c b/libavfilter/afir_template.c index 45055bba87..712f4b7417 100644 --- a/libavfilter/afir_template.c +++ b/libavfilter/afir_template.c @@ -159,7 +159,7 @@ static void fn(convert_channels)(AVFilterContext *ctx, AudioFIRContext *s) memset(blockin, 0, sizeof(*blockin) * seg->fft_length); memcpy(blockin, time + toffset, size * sizeof(*blockin)); - seg->tx_fn(seg->tx[0], blockout, blockin, sizeof(ftype)); + seg->ctx_fn(seg->ctx, blockout, blockin, sizeof(ftype)); for (int n = 0; n < seg->part_size + 1; n++) { coeff[coffset + n].re = blockout[2 * n]; @@ -316,7 +316,6 @@ static int fn(fir_quantum)(AVFilterContext *ctx, AVFrame *out, int ch, int offse #else s->afirdsp.dcmul_add(sumin, blockout, (const ftype *)coeff, part_size); #endif - if (j == 0) j = seg->nb_partitions; j--; |