Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
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".

      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