[FFmpeg-soc] [soc]: r2591 - in aacenc: aacenc.c aacpsy.c
kostya
subversion at mplayerhq.hu
Mon Jun 30 07:37:17 CEST 2008
Author: kostya
Date: Mon Jun 30 07:37:17 2008
New Revision: 2591
Log:
Create one common coefficient conversion function for all models.
And since it should quantize coefficients, remove quantizing from encoder.
Modified:
aacenc/aacenc.c
aacenc/aacpsy.c
Modified: aacenc/aacenc.c
==============================================================================
--- aacenc/aacenc.c (original)
+++ aacenc/aacenc.c Mon Jun 30 07:37:17 2008
@@ -264,9 +264,6 @@ static void analyze(AVCodecContext *avct
ff_mdct_calc(&s->mdct128, cpe->ch[channel].coeffs + k, s->output, s->tmp);
}
}
- //convert coefficients into form used by AAC
- for(i = 0; i < 1024; i++)
- cpe->ch[channel].coeffs[i] = -copysignf(pow(fabsf(cpe->ch[channel].coeffs[i]), 0.75f), cpe->ch[channel].coeffs[i]);
}
/**
Modified: aacenc/aacpsy.c
==============================================================================
--- aacenc/aacpsy.c (original)
+++ aacenc/aacpsy.c Mon Jun 30 07:37:17 2008
@@ -29,13 +29,32 @@
#include "aacpsy.h"
//borrowed from aac.c
-static float pow2sf_tab[316];
+static float pow2sf_tab[340];
#define SCALE_ONE_POS 140
#define SCALE_MAX_POS 255
#define SCALE_MAX_DIFF 60
+
+/**
+ * Convert coefficients to integers.
+ * @return sum of coefficients
+ * @see 3GPP TS26.403 5.6.2
+ */
+static inline int convert_coeffs(float *in, int *out, int size, int scale_idx)
+{
+ int i, sign, sum = 0;
+ for(i = 0; i < size; i++){
+ sign = in[i] > 0.0;
+ out[i] = (int)(pow(FFABS(in[i]) * pow2sf_tab[200 - scale_idx + SCALE_ONE_POS], 0.75) + 0.4054);
+ if(out[i] > 8191) out[i] = 8191;
+ sum += out[i];
+ if(sign) out[i] = -out[i];
+ }
+ return sum;
+}
+
static void psy_null_window(AACPsyContext *apc, int16_t *audio, int channel, cpe_struct *cpe)
{
int ch;
@@ -73,7 +92,6 @@ static void psy_null_process(AACPsyConte
cpe->ch[ch].gain = SCALE_ONE_POS;
cpe->ch[ch].pulse.present = 0;
for(g = 0; g < apc->num_bands1024; g++){
- sum = 0;
cpe->ch[ch].sf_idx[0][g] = SCALE_ONE_POS;
//apply M/S
if(!ch && cpe->ms.mask[0][g]){
@@ -82,10 +100,7 @@ static void psy_null_process(AACPsyConte
cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
}
}
- for(i = 0; i < apc->bands1024[g]; i++){
- cpe->ch[ch].icoefs[start+i] = av_clip((int)(roundf(cpe->ch[ch].coeffs[start+i] / pow2sf_tab[cpe->ch[ch].sf_idx[0][g]+60])), -8191, 8191);
- sum += !!cpe->ch[ch].icoefs[start+i];
- }
+ sum = convert_coeffs(cpe->ch[ch].coeffs + start, cpe->ch[ch].icoefs + start, apc->bands1024[g], cpe->ch[ch].sf_idx[0][g]);
cpe->ch[ch].zeroes[0][g] = !sum;
//try finding pulses
if(!cpe->ch[ch].pulse.present){
@@ -180,10 +195,7 @@ static void psy_null8_process(AACPsyCont
cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
}
}
- for(i = 0; i < cpe->ch[ch].ics.swb_sizes[g]; i++){
- cpe->ch[ch].icoefs[start+i] = av_clip((int)(roundf(cpe->ch[ch].coeffs[start+i] / pow2sf_tab[cpe->ch[ch].sf_idx[w][g]+60])), -8191, 8191);
- sum += !!cpe->ch[ch].icoefs[start+i];
- }
+ sum = convert_coeffs(cpe->ch[ch].coeffs + start, cpe->ch[ch].icoefs + start, cpe->ch[ch].ics.swb_sizes[g], cpe->ch[ch].sf_idx[w][g]);
cpe->ch[ch].zeroes[w][g] = !sum;
start += cpe->ch[ch].ics.swb_sizes[g];
}
@@ -249,7 +261,7 @@ int ff_aac_psy_init(AACPsyContext *ctx,
return -1;
}
- for (i = 0; i < 316; i++)
+ for (i = 0; i < 340; i++)
pow2sf_tab[i] = pow(2, (i - 200)/4.);
ctx->avctx = avctx;
More information about the FFmpeg-soc
mailing list