PR #20521 opened by Agent45 URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20521 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20521.patch
Add a maximum energy check in mark_pns() , adapted from search_for_pns(). Extremely high-energy bands should be excluded early from PNS to prevent harsh artifacts. This resolves issue #20200. >From b116bf897cb68a076f19304e728d957835d32b2a Mon Sep 17 00:00:00 2001 From: Agent45 <agen...@noreply.code.ffmpeg.org> Date: Sun, 14 Sep 2025 21:03:37 +0000 Subject: [PATCH] avcodec/aacenc: add high energy check to exclude unsuitable bands from PNS Add a maximum energy check in mark_pns() , adapted from search_for_pns(). Extremely high-energy bands should be excluded early from PNS to prevent harsh artifacts. This resolves issue #20200. --- libavcodec/aaccoder.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c index 7f1c4cdcc1..346338331d 100644 --- a/libavcodec/aaccoder.c +++ b/libavcodec/aaccoder.c @@ -636,6 +636,7 @@ static void mark_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelEleme int bandwidth, cutoff; const float lambda = s->lambda; const float freq_mult = avctx->sample_rate*0.5f/wlen; + const float thr_mult = NOISE_LAMBDA_REPLACE*(100.0f/lambda); const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f)); const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f); @@ -690,7 +691,10 @@ static void mark_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelEleme * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS) */ sce->pns_ener[w*16+g] = sfb_energy; - if (sfb_energy < threshold*sqrtf(1.5f/freq_boost) || spread < spread_threshold || min_energy < pns_transient_energy_r * max_energy) { + if (sfb_energy < threshold*sqrtf(1.5f/freq_boost) || + sfb_energy > 100.0f * threshold*thr_mult*freq_boost || + spread < spread_threshold || + min_energy < pns_transient_energy_r * max_energy) { sce->can_pns[w*16+g] = 0; } else { sce->can_pns[w*16+g] = 1; -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-le...@ffmpeg.org