mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
aac: avoid a memcpy in sbr_qmf_analysis
Swapping buffer indices allows saving one memcpy that accounts for 1% of the runtime, according to oprofile. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
parent
7e9e7cc236
commit
e32bea8eb4
@ -1153,10 +1153,9 @@ static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
|
|||||||
*/
|
*/
|
||||||
static void sbr_qmf_analysis(DSPContext *dsp, FFTContext *mdct,
|
static void sbr_qmf_analysis(DSPContext *dsp, FFTContext *mdct,
|
||||||
SBRDSPContext *sbrdsp, const float *in, float *x,
|
SBRDSPContext *sbrdsp, const float *in, float *x,
|
||||||
float z[320], float W[2][32][32][2])
|
float z[320], float W[2][32][32][2], int buf_idx)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
memcpy(W[0], W[1], sizeof(W[0]));
|
|
||||||
memcpy(x , x+1024, (320-32)*sizeof(x[0]));
|
memcpy(x , x+1024, (320-32)*sizeof(x[0]));
|
||||||
memcpy(x+288, in, 1024*sizeof(x[0]));
|
memcpy(x+288, in, 1024*sizeof(x[0]));
|
||||||
for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames
|
for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames
|
||||||
@ -1165,7 +1164,7 @@ static void sbr_qmf_analysis(DSPContext *dsp, FFTContext *mdct,
|
|||||||
sbrdsp->sum64x5(z);
|
sbrdsp->sum64x5(z);
|
||||||
sbrdsp->qmf_pre_shuffle(z);
|
sbrdsp->qmf_pre_shuffle(z);
|
||||||
mdct->imdct_half(mdct, z, z+64);
|
mdct->imdct_half(mdct, z, z+64);
|
||||||
sbrdsp->qmf_post_shuffle(W[1][i], z);
|
sbrdsp->qmf_post_shuffle(W[buf_idx][i], z);
|
||||||
x += 32;
|
x += 32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1301,7 +1300,8 @@ static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
|
|||||||
|
|
||||||
/// Generate the subband filtered lowband
|
/// Generate the subband filtered lowband
|
||||||
static int sbr_lf_gen(AACContext *ac, SpectralBandReplication *sbr,
|
static int sbr_lf_gen(AACContext *ac, SpectralBandReplication *sbr,
|
||||||
float X_low[32][40][2], const float W[2][32][32][2])
|
float X_low[32][40][2], const float W[2][32][32][2],
|
||||||
|
int buf_idx)
|
||||||
{
|
{
|
||||||
int i, k;
|
int i, k;
|
||||||
const int t_HFGen = 8;
|
const int t_HFGen = 8;
|
||||||
@ -1309,14 +1309,15 @@ static int sbr_lf_gen(AACContext *ac, SpectralBandReplication *sbr,
|
|||||||
memset(X_low, 0, 32*sizeof(*X_low));
|
memset(X_low, 0, 32*sizeof(*X_low));
|
||||||
for (k = 0; k < sbr->kx[1]; k++) {
|
for (k = 0; k < sbr->kx[1]; k++) {
|
||||||
for (i = t_HFGen; i < i_f + t_HFGen; i++) {
|
for (i = t_HFGen; i < i_f + t_HFGen; i++) {
|
||||||
X_low[k][i][0] = W[1][i - t_HFGen][k][0];
|
X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0];
|
||||||
X_low[k][i][1] = W[1][i - t_HFGen][k][1];
|
X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
buf_idx = 1-buf_idx;
|
||||||
for (k = 0; k < sbr->kx[0]; k++) {
|
for (k = 0; k < sbr->kx[0]; k++) {
|
||||||
for (i = 0; i < t_HFGen; i++) {
|
for (i = 0; i < t_HFGen; i++) {
|
||||||
X_low[k][i][0] = W[0][i + i_f - t_HFGen][k][0];
|
X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0];
|
||||||
X_low[k][i][1] = W[0][i + i_f - t_HFGen][k][1];
|
X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1665,8 +1666,8 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
|||||||
/* decode channel */
|
/* decode channel */
|
||||||
sbr_qmf_analysis(&ac->dsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
sbr_qmf_analysis(&ac->dsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
||||||
(float*)sbr->qmf_filter_scratch,
|
(float*)sbr->qmf_filter_scratch,
|
||||||
sbr->data[ch].W);
|
sbr->data[ch].W, sbr->data[ch].Ypos);
|
||||||
sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W);
|
sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W, sbr->data[ch].Ypos);
|
||||||
sbr->data[ch].Ypos ^= 1;
|
sbr->data[ch].Ypos ^= 1;
|
||||||
if (sbr->start) {
|
if (sbr->start) {
|
||||||
sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, sbr->X_low, sbr->k[0]);
|
sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, sbr->X_low, sbr->k[0]);
|
||||||
|
Loading…
Reference in New Issue
Block a user