From: Lynne <dev@lynne.ee> To: ffmpeg-devel@ffmpeg.org Cc: Lynne <dev@lynne.ee> Subject: [FFmpeg-devel] [PATCH 2/2] aacenc: remove support for AAC LTP profile Date: Sat, 8 Feb 2025 05:12:53 +0100 Message-ID: <20250208041258.217102-2-dev@lynne.ee> (raw) In-Reply-To: <20250208041258.217102-1-dev@lynne.ee> 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, }; -- 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".
prev parent reply other threads:[~2025-02-08 4:13 UTC|newest] Thread overview: 2+ 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 ` 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=20250208041258.217102-2-dev@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