Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Lynne <dev@lynne.ee>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH 2/2] aacenc: remove support for AAC LTP profile
Date: Wed, 26 Feb 2025 17:22:05 +0100
Message-ID: <78404d16-8065-4df5-8826-923bb001824e@lynne.ee> (raw)
In-Reply-To: <20250208041258.217102-2-dev@lynne.ee>


[-- Attachment #1.1.1.1: Type: text/plain, Size: 25818 bytes --]

Pushed these two patches, along with the patch to remove the ARNR coder.

The patch to move the encoder into libavcodec/aac/ will be resent.

On 08/02/2025 05:12, Lynne wrote:
> The LTP profile of AAC is... terrible.
> It was an early 90's attempt at bridging the gap between speech
> codecs and general purpose codecs. It did so by trying to exploit the fact
> that most speech patterns are regular.
> 
> Unfortunately, it went about it the same way as AAC Main, by taking
> the previous frame's samples, modifying them through an LPC filter,
> transforming them back using a forward MDCT, putting the output
> coefficients back into the current frame, and using delta coding.
> But once again, they ignored basic mathematics and MDCT leakage.
> Thankfully, because AAC LTP is meant to operate at very low bitrates,
> the extreme quantization results in most leakage being irrelevant.
> 
> Unfortunately, the result is that the output sounds pretty much
> terrible regardless of whether LTP is enabled or not.
> 
> This was the first attempt at trying to couple speech coding into AAC.
> No, the second attempt did not succeed either.
> Nnnneither did the third. Or fourth.
> 
> For the fifth one, they literally just jammed a speech codec into AAC
> with USAC once they saw Opus do it.
> 
> Just drop support for encoding AAC LTP. It was always experimental
> to begin with.
> ---
>   libavcodec/Makefile     |   1 -
>   libavcodec/aaccoder.c   |  16 ---
>   libavcodec/aacenc.c     |  41 +------
>   libavcodec/aacenc.h     |  20 ----
>   libavcodec/aacenc_ltp.c | 236 ----------------------------------------
>   libavcodec/aacenc_ltp.h |  41 -------
>   libavcodec/aacenctab.h  |   1 -
>   7 files changed, 1 insertion(+), 355 deletions(-)
>   delete mode 100644 libavcodec/aacenc_ltp.c
>   delete mode 100644 libavcodec/aacenc_ltp.h
> 
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 82fc9c9dc6..499f826635 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -198,7 +198,6 @@ OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o aacenctab.o    \
>                                             aacpsy.o aactab.o      \
>                                             aacenc_is.o \
>                                             aacenc_tns.o \
> -                                          aacenc_ltp.o \
>                                             psymodel.o kbdwin.o \
>                                             mpeg4audio_sample_rates.o
>   OBJS-$(CONFIG_AAC_MEDIACODEC_DECODER)  += mediacodecdec.o
> diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c
> index 1999f588e4..478eda86f3 100644
> --- a/libavcodec/aaccoder.c
> +++ b/libavcodec/aaccoder.c
> @@ -47,7 +47,6 @@
>   
>   #include "aacenc_is.h"
>   #include "aacenc_tns.h"
> -#include "aacenc_ltp.h"
>   
>   #include "libavcodec/aaccoder_twoloop.h"
>   
> @@ -1121,16 +1120,11 @@ const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = {
>           encode_window_bands_info,
>           quantize_and_encode_band,
>           ff_aac_encode_tns_info,
> -        ff_aac_encode_ltp_info,
> -        ff_aac_adjust_common_ltp,
>           ff_aac_apply_tns,
> -        ff_aac_update_ltp,
> -        ff_aac_ltp_insert_new_frame,
>           set_special_band_scalefactors,
>           search_for_pns,
>           mark_pns,
>           ff_aac_search_for_tns,
> -        ff_aac_search_for_ltp,
>           search_for_ms,
>           ff_aac_search_for_is,
>       },
> @@ -1139,16 +1133,11 @@ const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = {
>           codebook_trellis_rate,
>           quantize_and_encode_band,
>           ff_aac_encode_tns_info,
> -        ff_aac_encode_ltp_info,
> -        ff_aac_adjust_common_ltp,
>           ff_aac_apply_tns,
> -        ff_aac_update_ltp,
> -        ff_aac_ltp_insert_new_frame,
>           set_special_band_scalefactors,
>           search_for_pns,
>           mark_pns,
>           ff_aac_search_for_tns,
> -        ff_aac_search_for_ltp,
>           search_for_ms,
>           ff_aac_search_for_is,
>       },
> @@ -1157,16 +1146,11 @@ const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = {
>           codebook_trellis_rate,
>           quantize_and_encode_band,
>           ff_aac_encode_tns_info,
> -        ff_aac_encode_ltp_info,
> -        ff_aac_adjust_common_ltp,
>           ff_aac_apply_tns,
> -        ff_aac_update_ltp,
> -        ff_aac_ltp_insert_new_frame,
>           set_special_band_scalefactors,
>           search_for_pns,
>           mark_pns,
>           ff_aac_search_for_tns,
> -        ff_aac_search_for_ltp,
>           search_for_ms,
>           ff_aac_search_for_is,
>       },
> diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
> index f1bc078cb0..5ed54dbcb3 100644
> --- a/libavcodec/aacenc.c
> +++ b/libavcodec/aacenc.c
> @@ -762,11 +762,8 @@ static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s,
>                                        int common_window)
>   {
>       put_bits(&s->pb, 8, sce->sf_idx[0]);
> -    if (!common_window) {
> +    if (!common_window)
>           put_ics_info(s, &sce->ics);
> -        if (s->coder->encode_ltp_info)
> -            s->coder->encode_ltp_info(s, sce, 0);
> -    }
>       encode_band_info(s, sce);
>       encode_scale_factors(avctx, s, sce);
>       encode_pulses(s, &sce->pulse);
> @@ -933,12 +930,6 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
>   
>               apply_window_and_mdct(s, sce, overlap);
>   
> -            if (s->options.ltp && s->coder->update_ltp) {
> -                s->coder->update_ltp(s, sce);
> -                apply_window[sce->ics.window_sequence[0]](s->fdsp, sce, &sce->ltp_state[0]);
> -                s->mdct1024_fn(s->mdct1024, sce->lcoeffs, sce->ret_buf, sizeof(float));
> -            }
> -
>               for (k = 0; k < 1024; k++) {
>                   if (!(fabs(cpe->ch[ch].coeffs[k]) < 1E16)) { // Ensure headroom for energy calculation
>                       av_log(avctx, AV_LOG_ERROR, "Input contains (near) NaN/+-Inf\n");
> @@ -974,8 +965,6 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
>               for (ch = 0; ch < chans; ch++) {
>                   sce = &cpe->ch[ch];
>                   coeffs[ch] = sce->coeffs;
> -                sce->ics.ltp.present = 0;
> -                memset(sce->ics.ltp.used, 0, sizeof(sce->ics.ltp.used));
>                   memset(&sce->tns, 0, sizeof(TemporalNoiseShaping));
>                   for (w = 0; w < 128; w++)
>                       if (sce->band_type[w] > RESERVED_BT)
> @@ -1036,24 +1025,10 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
>                   apply_mid_side_stereo(cpe);
>               }
>               adjust_frame_information(cpe, chans);
> -            if (s->options.ltp) { /* LTP */
> -                for (ch = 0; ch < chans; ch++) {
> -                    sce = &cpe->ch[ch];
> -                    s->cur_channel = start_ch + ch;
> -                    if (s->coder->search_for_ltp)
> -                        s->coder->search_for_ltp(s, sce, cpe->common_window);
> -                    if (sce->ics.ltp.present) pred_mode = 1;
> -                }
> -                s->cur_channel = start_ch;
> -                if (s->coder->adjust_common_ltp)
> -                    s->coder->adjust_common_ltp(s, cpe);
> -            }
>               if (chans == 2) {
>                   put_bits(&s->pb, 1, cpe->common_window);
>                   if (cpe->common_window) {
>                       put_ics_info(s, &cpe->ch[0].ics);
> -                    if (s->coder->encode_ltp_info)
> -                        s->coder->encode_ltp_info(s, &cpe->ch[0], 1);
>                       encode_ms_info(&s->pb, cpe);
>                       if (cpe->ms_mode) ms_mode = 1;
>                   }
> @@ -1138,9 +1113,6 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
>           }
>       } while (1);
>   
> -    if (s->options.ltp && s->coder->ltp_insert_new_frame)
> -        s->coder->ltp_insert_new_frame(s);
> -
>       put_bits(&s->pb, 3, TYPE_END);
>       flush_put_bits(&s->pb);
>   
> @@ -1289,17 +1261,9 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
>       ERROR_IF(i == FF_ARRAY_ELEMS(aacenc_profiles), "Profile not supported!\n");
>       if (avctx->profile == AV_PROFILE_MPEG2_AAC_LOW) {
>           avctx->profile = AV_PROFILE_AAC_LOW;
> -        ERROR_IF(s->options.ltp,
> -                 "LTP prediction unavailable in the \"mpeg2_aac_low\" profile\n");
>           WARN_IF(s->options.pns,
>                   "PNS unavailable in the \"mpeg2_aac_low\" profile, turning off\n");
>           s->options.pns = 0;
> -    } else if (avctx->profile == AV_PROFILE_AAC_LTP) {
> -        s->options.ltp = 1;
> -    } else if (s->options.ltp) {
> -        avctx->profile = AV_PROFILE_AAC_LTP;
> -        WARN_IF(1,
> -                "Chainging profile to \"aac_ltp\"\n");
>       }
>       s->profile = avctx->profile;
>   
> @@ -1311,8 +1275,6 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
>           s->options.intensity_stereo = 0;
>           s->options.pns = 0;
>       }
> -    ERROR_IF(s->options.ltp && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL,
> -             "The LPT profile requires experimental compliance, add -strict -2 to enable!\n");
>   
>       /* M/S introduces horrible artifacts with multichannel files, this is temporary */
>       if (s->channels > 3)
> @@ -1360,7 +1322,6 @@ static const AVOption aacenc_options[] = {
>       {"aac_is", "Intensity stereo coding", offsetof(AACEncContext, options.intensity_stereo), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AACENC_FLAGS},
>       {"aac_pns", "Perceptual noise substitution", offsetof(AACEncContext, options.pns), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AACENC_FLAGS},
>       {"aac_tns", "Temporal noise shaping", offsetof(AACEncContext, options.tns), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, AACENC_FLAGS},
> -    {"aac_ltp", "Long term prediction", offsetof(AACEncContext, options.ltp), AV_OPT_TYPE_BOOL, {.i64 = 0}, -1, 1, AACENC_FLAGS},
>       {"aac_pce", "Forces the use of PCEs", offsetof(AACEncContext, options.pce), AV_OPT_TYPE_BOOL, {.i64 = 0}, -1, 1, AACENC_FLAGS},
>       FF_AAC_PROFILE_OPTS
>       {NULL}
> diff --git a/libavcodec/aacenc.h b/libavcodec/aacenc.h
> index 8389699141..360402a06e 100644
> --- a/libavcodec/aacenc.h
> +++ b/libavcodec/aacenc.h
> @@ -67,23 +67,11 @@ typedef struct AACEncOptions {
>       int coder;
>       int pns;
>       int tns;
> -    int ltp;
>       int pce;
>       int mid_side;
>       int intensity_stereo;
>   } AACEncOptions;
>   
> -/**
> - * Long Term Prediction
> - */
> -typedef struct LongTermPrediction {
> -    int8_t present;
> -    int16_t lag;
> -    int coef_idx;
> -    float coef;
> -    int8_t used[MAX_LTP_LONG_SFB];
> -} LongTermPrediction;
> -
>   /**
>    * Individual Channel Stream
>    */
> @@ -92,7 +80,6 @@ typedef struct IndividualChannelStream {
>       enum WindowSequence window_sequence[2];
>       uint8_t use_kb_window[2];   ///< If set, use Kaiser-Bessel window, otherwise use a sine window.
>       uint8_t group_len[8];
> -    LongTermPrediction ltp;
>       const uint16_t *swb_offset; ///< table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular window
>       const uint8_t *swb_sizes;   ///< table of scalefactor band sizes for a particular window
>       int num_swb;                ///< number of scalefactor window bands
> @@ -132,8 +119,6 @@ typedef struct SingleChannelElement {
>       DECLARE_ALIGNED(32, float, pcoeffs)[1024];      ///< coefficients for IMDCT, pristine
>       DECLARE_ALIGNED(32, float, coeffs)[1024];       ///< coefficients for IMDCT, maybe processed
>       DECLARE_ALIGNED(32, float, ret_buf)[2048];      ///< PCM output buffer
> -    DECLARE_ALIGNED(16, float, ltp_state)[3072];    ///< time signal for LTP
> -    DECLARE_ALIGNED(32, float, lcoeffs)[1024];      ///< MDCT of LTP coefficients
>       PredictorState predictor_state[MAX_PREDICTORS];
>   } SingleChannelElement;
>   
> @@ -161,16 +146,11 @@ typedef struct AACCoefficientsEncoder {
>       void (*quantize_and_encode_band)(struct AACEncContext *s, PutBitContext *pb, const float *in, float *out, int size,
>                                        int scale_idx, int cb, const float lambda, int rtz);
>       void (*encode_tns_info)(struct AACEncContext *s, SingleChannelElement *sce);
> -    void (*encode_ltp_info)(struct AACEncContext *s, SingleChannelElement *sce, int common_window);
> -    void (*adjust_common_ltp)(struct AACEncContext *s, ChannelElement *cpe);
>       void (*apply_tns_filt)(struct AACEncContext *s, SingleChannelElement *sce);
> -    void (*update_ltp)(struct AACEncContext *s, SingleChannelElement *sce);
> -    void (*ltp_insert_new_frame)(struct AACEncContext *s);
>       void (*set_special_band_scalefactors)(struct AACEncContext *s, SingleChannelElement *sce);
>       void (*search_for_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce);
>       void (*mark_pns)(struct AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce);
>       void (*search_for_tns)(struct AACEncContext *s, SingleChannelElement *sce);
> -    void (*search_for_ltp)(struct AACEncContext *s, SingleChannelElement *sce, int common_window);
>       void (*search_for_ms)(struct AACEncContext *s, ChannelElement *cpe);
>       void (*search_for_is)(struct AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe);
>   } AACCoefficientsEncoder;
> diff --git a/libavcodec/aacenc_ltp.c b/libavcodec/aacenc_ltp.c
> deleted file mode 100644
> index 58f7921074..0000000000
> --- a/libavcodec/aacenc_ltp.c
> +++ /dev/null
> @@ -1,236 +0,0 @@
> -/*
> - * AAC encoder long term prediction extension
> - * Copyright (C) 2015 Rostislav Pehlivanov
> - *
> - * This file is part of FFmpeg.
> - *
> - * FFmpeg is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * FFmpeg is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with FFmpeg; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> - */
> -
> -/**
> - * @file
> - * AAC encoder long term prediction extension
> - * @author Rostislav Pehlivanov ( atomnuker gmail com )
> - */
> -
> -#include "aacenc_ltp.h"
> -#include "aacenc_quantization.h"
> -#include "aacenc_utils.h"
> -
> -/**
> - * Encode LTP data.
> - */
> -void ff_aac_encode_ltp_info(AACEncContext *s, SingleChannelElement *sce,
> -                            int common_window)
> -{
> -    int i;
> -    IndividualChannelStream *ics = &sce->ics;
> -    if (s->profile != AV_PROFILE_AAC_LTP || !ics->predictor_present)
> -        return;
> -    if (common_window)
> -        put_bits(&s->pb, 1, 0);
> -    put_bits(&s->pb, 1, ics->ltp.present);
> -    if (!ics->ltp.present)
> -        return;
> -    put_bits(&s->pb, 11, ics->ltp.lag);
> -    put_bits(&s->pb, 3,  ics->ltp.coef_idx);
> -    for (i = 0; i < FFMIN(ics->max_sfb, MAX_LTP_LONG_SFB); i++)
> -        put_bits(&s->pb, 1, ics->ltp.used[i]);
> -}
> -
> -void ff_aac_ltp_insert_new_frame(AACEncContext *s)
> -{
> -    int i, ch, tag, chans, cur_channel, start_ch = 0;
> -    ChannelElement *cpe;
> -    SingleChannelElement *sce;
> -    for (i = 0; i < s->chan_map[0]; i++) {
> -        cpe = &s->cpe[i];
> -        tag      = s->chan_map[i+1];
> -        chans    = tag == TYPE_CPE ? 2 : 1;
> -        for (ch = 0; ch < chans; ch++) {
> -            sce = &cpe->ch[ch];
> -            cur_channel = start_ch + ch;
> -            /* New sample + overlap */
> -            memcpy(&sce->ltp_state[0],    &sce->ltp_state[1024], 1024*sizeof(sce->ltp_state[0]));
> -            memcpy(&sce->ltp_state[1024], &s->planar_samples[cur_channel][2048], 1024*sizeof(sce->ltp_state[0]));
> -            memcpy(&sce->ltp_state[2048], &sce->ret_buf[0], 1024*sizeof(sce->ltp_state[0]));
> -            sce->ics.ltp.lag = 0;
> -        }
> -        start_ch += chans;
> -    }
> -}
> -
> -static void get_lag(float *buf, const float *new, LongTermPrediction *ltp)
> -{
> -    int i, j, lag = 0, max_corr = 0;
> -    float max_ratio = 0.0f;
> -    for (i = 0; i < 2048; i++) {
> -        float corr, s0 = 0.0f, s1 = 0.0f;
> -        const int start = FFMAX(0, i - 1024);
> -        for (j = start; j < 2048; j++) {
> -            const int idx = j - i + 1024;
> -            s0 += new[j]*buf[idx];
> -            s1 += buf[idx]*buf[idx];
> -        }
> -        corr = s1 > 0.0f ? s0/sqrt(s1) : 0.0f;
> -        if (corr > max_corr) {
> -            max_corr = corr;
> -            lag = i;
> -            max_ratio = corr/(2048-start);
> -        }
> -    }
> -    ltp->lag = FFMAX(av_clip_uintp2(lag, 11), 0);
> -    ltp->coef_idx = quant_array_idx(max_ratio, ff_ltp_coef, 8);
> -    ltp->coef     = ff_ltp_coef[ltp->coef_idx];
> -}
> -
> -static void generate_samples(float *buf, LongTermPrediction *ltp)
> -{
> -    int i, samples_num = 2048;
> -    if (!ltp->lag) {
> -        ltp->present = 0;
> -        return;
> -    } else if (ltp->lag < 1024) {
> -        samples_num = ltp->lag + 1024;
> -    }
> -    for (i = 0; i < samples_num; i++)
> -        buf[i] = ltp->coef*buf[i + 2048 - ltp->lag];
> -    memset(&buf[i], 0, (2048 - i)*sizeof(float));
> -}
> -
> -/**
> - * Process LTP parameters
> - * @see Patent WO2006070265A1
> - */
> -void ff_aac_update_ltp(AACEncContext *s, SingleChannelElement *sce)
> -{
> -    float *pred_signal = &sce->ltp_state[0];
> -    const float *samples = &s->planar_samples[s->cur_channel][1024];
> -
> -    if (s->profile != AV_PROFILE_AAC_LTP)
> -        return;
> -
> -    /* Calculate lag */
> -    get_lag(pred_signal, samples, &sce->ics.ltp);
> -    generate_samples(pred_signal, &sce->ics.ltp);
> -}
> -
> -void ff_aac_adjust_common_ltp(AACEncContext *s, ChannelElement *cpe)
> -{
> -    int sfb, count = 0;
> -    SingleChannelElement *sce0 = &cpe->ch[0];
> -    SingleChannelElement *sce1 = &cpe->ch[1];
> -
> -    if (!cpe->common_window ||
> -        sce0->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE ||
> -        sce1->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
> -        sce0->ics.ltp.present = 0;
> -        return;
> -    }
> -
> -    for (sfb = 0; sfb < FFMIN(sce0->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++) {
> -        int sum = sce0->ics.ltp.used[sfb] + sce1->ics.ltp.used[sfb];
> -        if (sum != 2) {
> -            sce0->ics.ltp.used[sfb] = 0;
> -        } else {
> -            count++;
> -        }
> -    }
> -
> -    sce0->ics.ltp.present = !!count;
> -    sce0->ics.predictor_present = !!count;
> -}
> -
> -/**
> - * Mark LTP sfb's
> - */
> -void ff_aac_search_for_ltp(AACEncContext *s, SingleChannelElement *sce,
> -                           int common_window)
> -{
> -    int w, g, w2, i, start = 0, count = 0;
> -    int saved_bits = -(15 + FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB));
> -    float *C34 = &s->scoefs[128*0], *PCD = &s->scoefs[128*1];
> -    float *PCD34 = &s->scoefs[128*2];
> -    const int max_ltp = FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB);
> -
> -    if (sce->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
> -        if (sce->ics.ltp.lag) {
> -            memset(&sce->ltp_state[0], 0, 3072*sizeof(sce->ltp_state[0]));
> -            memset(&sce->ics.ltp, 0, sizeof(LongTermPrediction));
> -        }
> -        return;
> -    }
> -
> -    if (!sce->ics.ltp.lag || s->lambda > 120.0f)
> -        return;
> -
> -    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
> -        start = 0;
> -        for (g = 0;  g < sce->ics.num_swb; g++) {
> -            int bits1 = 0, bits2 = 0;
> -            float dist1 = 0.0f, dist2 = 0.0f;
> -            if (w*16+g > max_ltp) {
> -                start += sce->ics.swb_sizes[g];
> -                continue;
> -            }
> -            for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
> -                int bits_tmp1, bits_tmp2;
> -                FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
> -                for (i = 0; i < sce->ics.swb_sizes[g]; i++)
> -                    PCD[i] = sce->coeffs[start+(w+w2)*128+i] - sce->lcoeffs[start+(w+w2)*128+i];
> -                s->aacdsp.abs_pow34(C34,  &sce->coeffs[start+(w+w2)*128],  sce->ics.swb_sizes[g]);
> -                s->aacdsp.abs_pow34(PCD34, PCD, sce->ics.swb_sizes[g]);
> -                dist1 += quantize_band_cost(s, &sce->coeffs[start+(w+w2)*128], C34, sce->ics.swb_sizes[g],
> -                                            sce->sf_idx[(w+w2)*16+g], sce->band_type[(w+w2)*16+g],
> -                                            s->lambda/band->threshold, INFINITY, &bits_tmp1, NULL);
> -                dist2 += quantize_band_cost(s, PCD, PCD34, sce->ics.swb_sizes[g],
> -                                            sce->sf_idx[(w+w2)*16+g],
> -                                            sce->band_type[(w+w2)*16+g],
> -                                            s->lambda/band->threshold, INFINITY, &bits_tmp2, NULL);
> -                bits1 += bits_tmp1;
> -                bits2 += bits_tmp2;
> -            }
> -            if (dist2 < dist1 && bits2 < bits1) {
> -                for (w2 = 0; w2 < sce->ics.group_len[w]; w2++)
> -                    for (i = 0; i < sce->ics.swb_sizes[g]; i++)
> -                        sce->coeffs[start+(w+w2)*128+i] -= sce->lcoeffs[start+(w+w2)*128+i];
> -                sce->ics.ltp.used[w*16+g] = 1;
> -                saved_bits += bits1 - bits2;
> -                count++;
> -            }
> -            start += sce->ics.swb_sizes[g];
> -        }
> -    }
> -
> -    sce->ics.ltp.present = !!count && (saved_bits >= 0);
> -    sce->ics.predictor_present = !!sce->ics.ltp.present;
> -
> -    /* Reset any marked sfbs */
> -    if (!sce->ics.ltp.present && !!count) {
> -        for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
> -            start = 0;
> -            for (g = 0;  g < sce->ics.num_swb; g++) {
> -                if (sce->ics.ltp.used[w*16+g]) {
> -                    for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
> -                        for (i = 0; i < sce->ics.swb_sizes[g]; i++) {
> -                            sce->coeffs[start+(w+w2)*128+i] += sce->lcoeffs[start+(w+w2)*128+i];
> -                        }
> -                    }
> -                }
> -                start += sce->ics.swb_sizes[g];
> -            }
> -        }
> -    }
> -}
> diff --git a/libavcodec/aacenc_ltp.h b/libavcodec/aacenc_ltp.h
> deleted file mode 100644
> index 7276878427..0000000000
> --- a/libavcodec/aacenc_ltp.h
> +++ /dev/null
> @@ -1,41 +0,0 @@
> -/*
> - * AAC encoder long term prediction extension
> - * Copyright (C) 2015 Rostislav Pehlivanov
> - *
> - * This file is part of FFmpeg.
> - *
> - * FFmpeg is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2.1 of the License, or (at your option) any later version.
> - *
> - * FFmpeg is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with FFmpeg; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> - */
> -
> -/**
> - * @file
> - * AAC encoder long term prediction extension
> - * @author Rostislav Pehlivanov ( atomnuker gmail com )
> - */
> -
> -#ifndef AVCODEC_AACENC_LTP_H
> -#define AVCODEC_AACENC_LTP_H
> -
> -#include "aacenc.h"
> -
> -void ff_aac_encode_ltp_info(AACEncContext *s, SingleChannelElement *sce,
> -                            int common_window);
> -void ff_aac_update_ltp(AACEncContext *s, SingleChannelElement *sce);
> -void ff_aac_adjust_common_ltp(AACEncContext *s, ChannelElement *cpe);
> -void ff_aac_ltp_insert_new_frame(AACEncContext *s);
> -void ff_aac_search_for_ltp(AACEncContext *s, SingleChannelElement *sce,
> -                           int common_window);
> -
> -#endif /* AVCODEC_AACENC_LTP_H */
> diff --git a/libavcodec/aacenctab.h b/libavcodec/aacenctab.h
> index 78e424a675..60e1f22387 100644
> --- a/libavcodec/aacenctab.h
> +++ b/libavcodec/aacenctab.h
> @@ -126,7 +126,6 @@ static const unsigned char aac_maxval_cb[] = {
>   
>   static const int aacenc_profiles[] = {
>       AV_PROFILE_AAC_LOW,
> -    AV_PROFILE_AAC_LTP,
>       AV_PROFILE_MPEG2_AAC_LOW,
>   };
>   


[-- Attachment #1.1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 637 bytes --]

[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
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-02-26 16:22 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-08  4:12 [FFmpeg-devel] [PATCH 1/2] aacenc: remove support for AAC Main profile Lynne
2025-02-08  4:12 ` [FFmpeg-devel] [PATCH 2/2] aacenc: remove support for AAC LTP profile Lynne
2025-02-26 16:22   ` Lynne [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=78404d16-8065-4df5-8826-923bb001824e@lynne.ee \
    --to=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