From: Thierry Foucu <tfoucu-at-gmail.com@ffmpeg.org>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Cc: Lynne <dev@lynne.ee>
Subject: Re: [FFmpeg-devel] [PATCH] aacenc_tns: clamp filter direction energy measurement
Date: Mon, 30 Jun 2025 12:52:00 -0700
Message-ID: <CACXFHsTijB=0=14jqYF0s-iGZf-U9AYp033XL9K__6gJuC_Dqg@mail.gmail.com> (raw)
In-Reply-To: <20250208033542.213725-1-dev@lynne.ee>
On Fri, Feb 7, 2025 at 7:36 PM Lynne <dev@lynne.ee> wrote:
> The issue is that:
>
> float en[2];
> ...
> tns->n_filt[w] = is8 ? 1 : order != TNS_MAX_ORDER ? 2 : 3;
> for (g = 0; g < tns->n_filt[w]; g++) {
> tns->direction[w][g] = slant != 2 ? slant : en[g] < en[!g];
>
> When using the AAC Main profile, n_filt = 3, and slant is by
> default 2 (normal long frames), g can go above 1.
>
> en is the evolution of energy in the frequency domain for every
> band at the given window. E.g. whether the energy is concentrated
> at the top of each band, or the bottom.
>
> For 2-pole filters, its straightforward.
> For 3-pole filters, we need more than 2 measurements.
>
> This commit properly implements support for 3-pole filters, by measuring
> the band energy across three areas.
>
> Do note that even xHE-AAC caps n_filt to 2, and only AAC Main allows
> n_filt == 3.
>
> Fixes https://trac.ffmpeg.org/ticket/11418
> ---
> libavcodec/aacenc_tns.c | 33 ++++++++++++++++++++++++---------
> 1 file changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/libavcodec/aacenc_tns.c b/libavcodec/aacenc_tns.c
> index fa3cd2af39..f9bc033b26 100644
> --- a/libavcodec/aacenc_tns.c
> +++ b/libavcodec/aacenc_tns.c
> @@ -173,6 +173,7 @@ void ff_aac_search_for_tns(AACEncContext *s,
> SingleChannelElement *sce)
> sce->ics.window_sequence[0] == LONG_START_SEQUENCE
> ? 0 : 2;
> const int sfb_len = sfb_end - sfb_start;
> const int coef_len = sce->ics.swb_offset[sfb_end] -
> sce->ics.swb_offset[sfb_start];
> + const int n_filt = is8 ? 1 : order != TNS_MAX_ORDER ? 2 : 3;
>
> if (coef_len <= 0 || sfb_len <= 0) {
> sce->tns.present = 0;
> @@ -180,16 +181,30 @@ void ff_aac_search_for_tns(AACEncContext *s,
> SingleChannelElement *sce)
> }
>
> for (w = 0; w < sce->ics.num_windows; w++) {
> - float en[2] = {0.0f, 0.0f};
> + float en[4] = {0.0f, 0.0f, 0.0f, 0.0f};
> int oc_start = 0;
> int coef_start = sce->ics.swb_offset[sfb_start];
>
> - for (g = sfb_start; g < sce->ics.num_swb && g <= sfb_end; g++) {
> - FFPsyBand *band = &s->psy.ch
> [s->cur_channel].psy_bands[w*16+g];
> - if (g > sfb_start + (sfb_len/2))
> - en[1] += band->energy;
> - else
> - en[0] += band->energy;
> + if (n_filt == 2) {
> + for (g = sfb_start; g < sce->ics.num_swb && g <= sfb_end;
> g++) {
> + FFPsyBand *band = &s->psy.ch
> [s->cur_channel].psy_bands[w*16+g];
> + if (g > sfb_start + (sfb_len/2))
> + en[1] += band->energy; /* End */
> + else
> + en[0] += band->energy; /* Start */
> + }
> + en[2] = en[0];
> + } else {
> + for (g = sfb_start; g < sce->ics.num_swb && g <= sfb_end;
> g++) {
> + FFPsyBand *band = &s->psy.ch
> [s->cur_channel].psy_bands[w*16+g];
> + if (g > sfb_start + (sfb_len/2) + (sfb_len/4))
> + en[2] += band->energy; /* End */
> + else if (g > sfb_start + (sfb_len/2) - (sfb_len/4))
> + en[1] += band->energy; /* Middle */
> + else
> + en[0] += band->energy; /* Start */
> + }
> + en[3] = en[0];
> }
>
> /* LPC */
> @@ -199,9 +214,9 @@ void ff_aac_search_for_tns(AACEncContext *s,
> SingleChannelElement *sce)
> if (!order || !isfinite(gain) || gain < TNS_GAIN_THRESHOLD_LOW ||
> gain > TNS_GAIN_THRESHOLD_HIGH)
> continue;
>
> - tns->n_filt[w] = is8 ? 1 : order != TNS_MAX_ORDER ? 2 : 3;
> + tns->n_filt[w] = n_filt;
> for (g = 0; g < tns->n_filt[w]; g++) {
> - tns->direction[w][g] = slant != 2 ? slant : en[g] < en[!g];
> + tns->direction[w][g] = slant != 2 ? slant : en[g] < en[g + 1];
> tns->order[w][g] = order/tns->n_filt[w];
> tns->length[w][g] = sfb_len/tns->n_filt[w];
> quantize_coefs(&coefs[oc_start], tns->coef_idx[w][g],
> tns->coef[w][g],
> --
> 2.47.2
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
Any chance to have this patch submitted to close the issue?
thanks.
--
Thierry Foucu
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
prev parent reply other threads:[~2025-06-30 19:52 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-08 3:35 Lynne
2025-06-30 19:52 ` Thierry Foucu [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CACXFHsTijB=0=14jqYF0s-iGZf-U9AYp033XL9K__6gJuC_Dqg@mail.gmail.com' \
--to=tfoucu-at-gmail.com@ffmpeg.org \
--cc=dev@lynne.ee \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git