From fbe6a51b11e20c5dfe076877f02d2bbb2300005d Mon Sep 17 00:00:00 2001 From: Lynne Date: Sat, 29 Oct 2022 14:01:01 +0200 Subject: [PATCH] aacsbr: convert to lavu/tx --- libavcodec/aacdec_template.c | 5 +++- libavcodec/aacsbr.h | 2 +- libavcodec/aacsbr_template.c | 56 +++++++++++++++++++++++++----------- libavcodec/sbr.h | 8 ++++-- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c index 40589dda2a..444dc4fa9d 100644 --- a/libavcodec/aacdec_template.c +++ b/libavcodec/aacdec_template.c @@ -135,9 +135,12 @@ static av_cold int che_configure(AACContext *ac, return AVERROR_INVALIDDATA; if (che_pos) { if (!ac->che[type][id]) { + int ret; if (!(ac->che[type][id] = av_mallocz(sizeof(ChannelElement)))) return AVERROR(ENOMEM); - AAC_RENAME(ff_aac_sbr_ctx_init)(ac, &ac->che[type][id]->sbr, type); + ret = AAC_RENAME(ff_aac_sbr_ctx_init)(ac, &ac->che[type][id]->sbr, type); + if (ret < 0) + return ret; } if (type != TYPE_CCE) { if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1))) { diff --git a/libavcodec/aacsbr.h b/libavcodec/aacsbr.h index dd8b66c7bb..d70b19e11c 100644 --- a/libavcodec/aacsbr.h +++ b/libavcodec/aacsbr.h @@ -81,7 +81,7 @@ static const int8_t vlc_sbr_lav[10] = /** Initialize SBR. */ void AAC_RENAME(ff_aac_sbr_init)(void); /** Initialize one SBR context. */ -void AAC_RENAME(ff_aac_sbr_ctx_init)(AACContext *ac, SpectralBandReplication *sbr, int id_aac); +int AAC_RENAME(ff_aac_sbr_ctx_init)(AACContext *ac, SpectralBandReplication *sbr, int id_aac); /** Close one SBR context. */ void AAC_RENAME(ff_aac_sbr_ctx_close)(SpectralBandReplication *sbr); /** Decode one SBR element. */ diff --git a/libavcodec/aacsbr_template.c b/libavcodec/aacsbr_template.c index dccae0526e..cdca402f04 100644 --- a/libavcodec/aacsbr_template.c +++ b/libavcodec/aacsbr_template.c @@ -89,10 +89,14 @@ static void sbr_turnoff(SpectralBandReplication *sbr) { memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters)); } -av_cold void AAC_RENAME(ff_aac_sbr_ctx_init)(AACContext *ac, SpectralBandReplication *sbr, int id_aac) +av_cold int AAC_RENAME(ff_aac_sbr_ctx_init)(AACContext *ac, SpectralBandReplication *sbr, int id_aac) { - if(sbr->mdct.mdct_bits) - return; + int ret; + float scale; + + if (sbr->mdct) + return 0; + sbr->kx[0] = sbr->kx[1]; sbr->id_aac = id_aac; sbr_turnoff(sbr); @@ -101,17 +105,32 @@ av_cold void AAC_RENAME(ff_aac_sbr_ctx_init)(AACContext *ac, SpectralBandReplica /* SBR requires samples to be scaled to +/-32768.0 to work correctly. * mdct scale factors are adjusted to scale up from +/-1.0 at analysis * and scale back down at synthesis. */ - AAC_RENAME_32(ff_mdct_init)(&sbr->mdct, 7, 1, 1.0 / (64 * 32768.0)); - AAC_RENAME_32(ff_mdct_init)(&sbr->mdct_ana, 7, 1, -2.0 * 32768.0); + + scale = USE_FIXED ? 1 : 1.0 / (64 * 32768); + ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn, + USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, + 1, 64, &scale, 0); + if (ret < 0) + return ret; + + scale = USE_FIXED ? -1.0 : -2.0 * 32768; + ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn, + USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, + 1, 64, &scale, 0); + if (ret < 0) + return ret; + AAC_RENAME(ff_ps_ctx_init)(&sbr->ps); AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp); aacsbr_func_ptr_init(&sbr->c); + + return 0; } av_cold void AAC_RENAME(ff_aac_sbr_ctx_close)(SpectralBandReplication *sbr) { - AAC_RENAME_32(ff_mdct_end)(&sbr->mdct); - AAC_RENAME_32(ff_mdct_end)(&sbr->mdct_ana); + av_tx_uninit(&sbr->mdct); + av_tx_uninit(&sbr->mdct_ana); } static int qsort_comparison_function_int16(const void *a, const void *b) @@ -1164,9 +1183,11 @@ int AAC_RENAME(ff_decode_sbr_extension)(AACContext *ac, SpectralBandReplication */ #ifndef sbr_qmf_analysis #if USE_FIXED -static void sbr_qmf_analysis(AVFixedDSPContext *dsp, FFTContext *mdct, +static void sbr_qmf_analysis(AVFixedDSPContext *dsp, AVTXContext *mdct, + av_tx_fn mdct_fn, #else -static void sbr_qmf_analysis(AVFloatDSPContext *dsp, FFTContext *mdct, +static void sbr_qmf_analysis(AVFloatDSPContext *dsp, AVTXContext *mdct, + av_tx_fn mdct_fn, #endif /* USE_FIXED */ SBRDSPContext *sbrdsp, const INTFLOAT *in, INTFLOAT *x, INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx) @@ -1197,7 +1218,7 @@ static void sbr_qmf_analysis(AVFloatDSPContext *dsp, FFTContext *mdct, } } #endif - mdct->imdct_half(mdct, z, z+64); + mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT)); sbrdsp->qmf_post_shuffle(W[buf_idx][i], z); x += 32; } @@ -1209,7 +1230,7 @@ static void sbr_qmf_analysis(AVFloatDSPContext *dsp, FFTContext *mdct, * (14496-3 sp04 p206) */ #ifndef sbr_qmf_synthesis -static void sbr_qmf_synthesis(FFTContext *mdct, +static void sbr_qmf_synthesis(AVTXContext *mdct, av_tx_fn mdct_fn, #if USE_FIXED SBRDSPContext *sbrdsp, AVFixedDSPContext *dsp, #else @@ -1237,12 +1258,12 @@ static void sbr_qmf_synthesis(FFTContext *mdct, X[0][i][ n] = -X[0][i][n]; X[0][i][32+n] = X[1][i][31-n]; } - mdct->imdct_half(mdct, mdct_buf[0], X[0][i]); + mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); sbrdsp->qmf_deint_neg(v, mdct_buf[0]); } else { sbrdsp->neg_odd_64(X[1][i]); - mdct->imdct_half(mdct, mdct_buf[0], X[0][i]); - mdct->imdct_half(mdct, mdct_buf[1], X[1][i]); + mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); + mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT)); sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]); } dsp->vector_fmul (out, v , sbr_qmf_window , 64 >> div); @@ -1507,7 +1528,8 @@ void AAC_RENAME(ff_sbr_apply)(AACContext *ac, SpectralBandReplication *sbr, int } for (ch = 0; ch < nch; ch++) { /* decode channel */ - sbr_qmf_analysis(ac->fdsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples, + sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp, + ch ? R : L, sbr->data[ch].analysis_filterbank_samples, (INTFLOAT*)sbr->qmf_filter_scratch, sbr->data[ch].W, sbr->data[ch].Ypos); sbr->c.sbr_lf_gen(ac, sbr, sbr->X_low, @@ -1554,13 +1576,13 @@ void AAC_RENAME(ff_sbr_apply)(AACContext *ac, SpectralBandReplication *sbr, int nch = 2; } - sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp, + sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, L, sbr->X[0], sbr->qmf_filter_scratch, sbr->data[0].synthesis_filterbank_samples, &sbr->data[0].synthesis_filterbank_samples_offset, downsampled); if (nch == 2) - sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp, + sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, R, sbr->X[1], sbr->qmf_filter_scratch, sbr->data[1].synthesis_filterbank_samples, &sbr->data[1].synthesis_filterbank_samples_offset, diff --git a/libavcodec/sbr.h b/libavcodec/sbr.h index f80f122c51..f949465ef5 100644 --- a/libavcodec/sbr.h +++ b/libavcodec/sbr.h @@ -32,8 +32,8 @@ #include #include "libavutil/mem_internal.h" +#include "libavutil/tx.h" -#include "fft.h" #include "aacps.h" #include "sbrdsp.h" @@ -211,8 +211,10 @@ struct SpectralBandReplication { AAC_FLOAT s_m[7][48]; AAC_FLOAT gain[7][48]; DECLARE_ALIGNED(32, INTFLOAT, qmf_filter_scratch)[5][64]; - FFTContext mdct_ana; - FFTContext mdct; + AVTXContext *mdct_ana; + av_tx_fn mdct_ana_fn; + AVTXContext *mdct; + av_tx_fn mdct_fn; SBRDSPContext dsp; AACSBRContext c; };