Unverified Commit fbe6a51b authored by Lynne's avatar Lynne

aacsbr: convert to lavu/tx

parent 5f1111e4
......@@ -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))) {
......
......@@ -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. */
......
......@@ -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,
......
......@@ -32,8 +32,8 @@
#include <stdint.h>
#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;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment