[FFmpeg-devel] [PATCH] AAC Encoder: clipping avoidance
Michael Niedermayer
michael at niedermayer.cc
Sat Jul 18 00:36:19 CEST 2015
On Fri, Jul 17, 2015 at 08:57:55AM -0300, Claudio Freire wrote:
> Avoid clipping due to quantization noise to produce audible
> artifacts, by detecting near-clipping signals and both attenuating
> them a little and encoding escape-encoded bands (usually the
> loudest) rounding towards zero instead of nearest, which tends to
> decrease overall energy and thus clipping.
>
> Currently fate tests measure numerical error so this change makes
> tests using asynth (which are near clipping) report higher error
> not less, because of window attenuation. Yet, they sound better,
> not worse (albeit subtle, other samples aren't subtle at all).
> Only measuring psychoacoustically weighted error would make for
> a representative test, so that will be left for a future patch.
> libavcodec/aac.h | 1
> libavcodec/aaccoder.c | 108 ++++++++++++++++++++++++++++++++------------------
> libavcodec/aacenc.c | 28 ++++++++++++
> libavcodec/aacenc.h | 2
> libavcodec/aacpsy.c | 31 ++++++++++++++
> libavcodec/psymodel.h | 1
> tests/fate/aac.mak | 2
> 7 files changed, 132 insertions(+), 41 deletions(-)
> 639d32c84ff9906d545e483673f70d57ef7bfa67 0001-AAC-Encoder-clipping-avoidance.patch
> From 9da94f02574b34025a56c225c11269802f49949b Mon Sep 17 00:00:00 2001
> From: Claudio Freire <klaussfreire at gmail.com>
> Date: Fri, 17 Jul 2015 05:47:25 -0300
> Subject: [PATCH] AAC Encoder: clipping avoidance
[...]
> diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
> index f05f51b..6ff95b1 100644
> --- a/libavcodec/aacenc.c
> +++ b/libavcodec/aacenc.c
> @@ -46,6 +46,7 @@
> #include "psymodel.h"
>
> #define AAC_MAX_CHANNELS 6
> +#define CLIP_AVOIDANCE_FACTOR 0.95f
>
> #define ERROR_IF(cond, ...) \
> if (cond) { \
> @@ -473,7 +474,29 @@ static void encode_spectral_coeffs(AACEncContext *s, SingleChannelElement *sce)
> sce->ics.swb_sizes[i],
> sce->sf_idx[w*16 + i],
> sce->band_type[w*16 + i],
> - s->lambda);
> + s->lambda, sce->ics.window_clipping[w]);
> + start += sce->ics.swb_sizes[i];
> + }
> + }
> +}
> +
> +/**
> + * Downscale spectral coefficients for near-clipping windows to avoid artifacts
> + */
> +static void avoid_clipping(AACEncContext *s, SingleChannelElement *sce)
> +{
> + int start, i, j, w, w2;
> +
> + for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
> + start = 0;
> + for (i = 0; i < sce->ics.max_sfb; i++) {
> + if (sce->ics.window_clipping[w]) {
> + for (w2 = w; w2 < w + sce->ics.group_len[w]; w2++) {
> + float *swb_coeffs = sce->coeffs + start + w2*128;
> + for (j = 0; j < sce->ics.swb_sizes[i]; j++)
> + swb_coeffs[j] *= CLIP_AVOIDANCE_FACTOR;
> + }
> + }
wouldnt it be better to transition smoothly instead of a hard
*0.95 vs. *1 ?
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
During times of universal deceit, telling the truth becomes a
revolutionary act. -- George Orwell
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150718/1d6a4b70/attachment.sig>
More information about the ffmpeg-devel
mailing list