#include <math.h>
#include <string.h>
+#if ARCH_ARM
+# include "arm/aac.h"
+#endif
+
union float754 {
float f;
uint32_t i;
avccontext->sample_fmt = SAMPLE_FMT_S16;
avccontext->frame_size = 1024;
- AAC_INIT_VLC_STATIC( 0, 144);
- AAC_INIT_VLC_STATIC( 1, 114);
- AAC_INIT_VLC_STATIC( 2, 188);
- AAC_INIT_VLC_STATIC( 3, 180);
- AAC_INIT_VLC_STATIC( 4, 172);
- AAC_INIT_VLC_STATIC( 5, 140);
- AAC_INIT_VLC_STATIC( 6, 168);
- AAC_INIT_VLC_STATIC( 7, 114);
- AAC_INIT_VLC_STATIC( 8, 262);
- AAC_INIT_VLC_STATIC( 9, 248);
- AAC_INIT_VLC_STATIC(10, 384);
+ AAC_INIT_VLC_STATIC( 0, 304);
+ AAC_INIT_VLC_STATIC( 1, 270);
+ AAC_INIT_VLC_STATIC( 2, 550);
+ AAC_INIT_VLC_STATIC( 3, 300);
+ AAC_INIT_VLC_STATIC( 4, 328);
+ AAC_INIT_VLC_STATIC( 5, 294);
+ AAC_INIT_VLC_STATIC( 6, 306);
+ AAC_INIT_VLC_STATIC( 7, 268);
+ AAC_INIT_VLC_STATIC( 8, 510);
+ AAC_INIT_VLC_STATIC( 9, 366);
+ AAC_INIT_VLC_STATIC(10, 462);
dsputil_init(&ac->dsp, avccontext);
}
}
+#ifndef VMUL2
static inline float *VMUL2(float *dst, const float *v, unsigned idx,
const float *scale)
{
*dst++ = v[idx>>4 & 15] * s;
return dst;
}
+#endif
+#ifndef VMUL4
static inline float *VMUL4(float *dst, const float *v, unsigned idx,
const float *scale)
{
*dst++ = v[idx>>6 & 3] * s;
return dst;
}
+#endif
+#ifndef VMUL2S
static inline float *VMUL2S(float *dst, const float *v, unsigned idx,
unsigned sign, const float *scale)
{
return dst;
}
+#endif
+#ifndef VMUL4S
static inline float *VMUL4S(float *dst, const float *v, unsigned idx,
unsigned sign, const float *scale)
{
return dst;
}
+#endif
/**
* Decode spectral data; reference: table 4.50.
memset(coef + g * 128 + offsets[ics->max_sfb], 0, sizeof(float) * (c - offsets[ics->max_sfb]));
for (g = 0; g < ics->num_window_groups; g++) {
+ unsigned g_len = ics->group_len[g];
+
for (i = 0; i < ics->max_sfb; i++, idx++) {
- const int cur_band_type = band_type[idx];
+ const unsigned cbt_m1 = band_type[idx] - 1;
+ float *cfo = coef + offsets[i];
+ int off_len = offsets[i + 1] - offsets[i];
int group;
- if (cur_band_type == ZERO_BT || cur_band_type == INTENSITY_BT2 || cur_band_type == INTENSITY_BT) {
- for (group = 0; group < ics->group_len[g]; group++) {
- memset(coef + group * 128 + offsets[i], 0, (offsets[i + 1] - offsets[i]) * sizeof(float));
+
+ if (cbt_m1 >= INTENSITY_BT2 - 1) {
+ for (group = 0; group < g_len; group++, cfo+=128) {
+ memset(cfo, 0, off_len * sizeof(float));
}
- } else if (cur_band_type == NOISE_BT) {
- for (group = 0; group < ics->group_len[g]; group++) {
+ } else if (cbt_m1 == NOISE_BT - 1) {
+ for (group = 0; group < g_len; group++, cfo+=128) {
float scale;
float band_energy;
- float *cf = coef + group * 128 + offsets[i];
- int len = offsets[i+1] - offsets[i];
- for (k = 0; k < len; k++) {
+ for (k = 0; k < off_len; k++) {
ac->random_state = lcg_random(ac->random_state);
- cf[k] = ac->random_state;
+ cfo[k] = ac->random_state;
}
- band_energy = ac->dsp.scalarproduct_float(cf, cf, len);
+ band_energy = ac->dsp.scalarproduct_float(cfo, cfo, off_len);
scale = sf[idx] / sqrtf(band_energy);
- ac->dsp.vector_fmul_scalar(cf, cf, scale, len);
+ ac->dsp.vector_fmul_scalar(cfo, cfo, scale, off_len);
}
} else {
- const float *vq = ff_aac_codebook_vector_vals[cur_band_type-1];
- const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cur_band_type-1];
- VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cur_band_type - 1].table;
- const int cb_size = ff_aac_spectral_sizes[cur_band_type-1];
-
- for (group = 0; group < ics->group_len[g]; group++) {
- float *cf = coef + (group << 7) + offsets[i];
- uint32_t *icf = (uint32_t *) cf;
- int len = offsets[i + 1] - offsets[i];
+ const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
+ const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cbt_m1];
+ VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table;
+ const int cb_size = ff_aac_spectral_sizes[cbt_m1];
+ OPEN_READER(re, gb);
+
+ switch (cbt_m1 >> 1) {
+ case 0:
+ for (group = 0; group < g_len; group++, cfo+=128) {
+ float *cf = cfo;
+ int len = off_len;
- switch ((cur_band_type-1) >> 1) {
- case 0:
do {
- const int index = get_vlc2(gb, vlc_tab, 6, 3);
+ int code;
unsigned cb_idx;
- if (index >= cb_size) {
- err_idx = index;
+ UPDATE_CACHE(re, gb);
+ GET_VLC(code, re, gb, vlc_tab, 8, 2);
+
+ if (code >= cb_size) {
+ err_idx = code;
goto err_cb_overflow;
}
- cb_idx = cb_vector_idx[index];
+ cb_idx = cb_vector_idx[code];
cf = VMUL4(cf, vq, cb_idx, sf + idx);
} while (len -= 4);
- break;
- case 1:
+ }
+ break;
+
+ case 1:
+ for (group = 0; group < g_len; group++, cfo+=128) {
+ float *cf = cfo;
+ int len = off_len;
+
do {
- const int index = get_vlc2(gb, vlc_tab, 6, 3);
+ int code;
unsigned nnz;
unsigned cb_idx;
uint32_t bits;
- if (index >= cb_size) {
- err_idx = index;
+ UPDATE_CACHE(re, gb);
+ GET_VLC(code, re, gb, vlc_tab, 8, 2);
+
+ if (code >= cb_size) {
+ err_idx = code;
goto err_cb_overflow;
}
- cb_idx = cb_vector_idx[index];
+#if MIN_CACHE_BITS < 20
+ UPDATE_CACHE(re, gb);
+#endif
+ cb_idx = cb_vector_idx[code];
nnz = cb_idx >> 8 & 15;
- bits = get_bits(gb, nnz) << (32-nnz);
+ bits = SHOW_UBITS(re, gb, nnz) << (32-nnz);
+ LAST_SKIP_BITS(re, gb, nnz);
cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx);
} while (len -= 4);
- break;
- case 2:
+ }
+ break;
+
+ case 2:
+ for (group = 0; group < g_len; group++, cfo+=128) {
+ float *cf = cfo;
+ int len = off_len;
+
do {
- const int index = get_vlc2(gb, vlc_tab, 6, 3);
+ int code;
unsigned cb_idx;
- if (index >= cb_size) {
- err_idx = index;
+ UPDATE_CACHE(re, gb);
+ GET_VLC(code, re, gb, vlc_tab, 8, 2);
+
+ if (code >= cb_size) {
+ err_idx = code;
goto err_cb_overflow;
}
- cb_idx = cb_vector_idx[index];
+ cb_idx = cb_vector_idx[code];
cf = VMUL2(cf, vq, cb_idx, sf + idx);
} while (len -= 2);
- break;
- case 3:
- case 4:
+ }
+ break;
+
+ case 3:
+ case 4:
+ for (group = 0; group < g_len; group++, cfo+=128) {
+ float *cf = cfo;
+ int len = off_len;
+
do {
- const int index = get_vlc2(gb, vlc_tab, 6, 3);
+ int code;
unsigned nnz;
unsigned cb_idx;
unsigned sign;
- if (index >= cb_size) {
- err_idx = index;
+ UPDATE_CACHE(re, gb);
+ GET_VLC(code, re, gb, vlc_tab, 8, 2);
+
+ if (code >= cb_size) {
+ err_idx = code;
goto err_cb_overflow;
}
- cb_idx = cb_vector_idx[index];
+ cb_idx = cb_vector_idx[code];
nnz = cb_idx >> 8 & 15;
- sign = get_bits(gb, nnz) << (cb_idx >> 12);
+ sign = SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12);
+ LAST_SKIP_BITS(re, gb, nnz);
cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx);
} while (len -= 2);
- break;
- default:
- for (k = 0; k < len; k += 2, icf += 2) {
- const int index = get_vlc2(gb, vlc_tab, 6, 3);
+ }
+ break;
+
+ default:
+ for (group = 0; group < g_len; group++, cfo+=128) {
+ float *cf = cfo;
+ uint32_t *icf = (uint32_t *) cf;
+ int len = off_len;
+
+ do {
+ int code;
unsigned nzt, nnz;
unsigned cb_idx;
uint32_t bits;
int j;
- if (!index) {
- icf[0] = icf[1] = 0;
+ UPDATE_CACHE(re, gb);
+ GET_VLC(code, re, gb, vlc_tab, 8, 2);
+
+ if (!code) {
+ *icf++ = 0;
+ *icf++ = 0;
continue;
}
- if (index >= cb_size) {
- err_idx = index;
+ if (code >= cb_size) {
+ err_idx = code;
goto err_cb_overflow;
}
- cb_idx = cb_vector_idx[index];
+ cb_idx = cb_vector_idx[code];
nnz = cb_idx >> 12;
nzt = cb_idx >> 8;
- bits = get_bits(gb, nnz) << (32-nnz);
+ bits = SHOW_UBITS(re, gb, nnz) << (32-nnz);
+ LAST_SKIP_BITS(re, gb, nnz);
for (j = 0; j < 2; j++) {
if (nzt & 1<<j) {
- int n = 4;
+ uint32_t b;
+ int n;
/* The total length of escape_sequence must be < 22 bits according
to the specification (i.e. max is 111111110xxxxxxxxxxxx). */
- while (get_bits1(gb) && n < 13) n++;
- if (n == 13) {
+ UPDATE_CACHE(re, gb);
+ b = GET_CACHE(re, gb);
+ b = 31 - av_log2(~b);
+
+ if (b > 8) {
av_log(ac->avccontext, AV_LOG_ERROR, "error in spectral data, ESC overflow\n");
return -1;
}
- n = (1 << n) + get_bits(gb, n);
- icf[j] = cbrt_tab[n] | (bits & 1<<31);
+
+#if MIN_CACHE_BITS < 21
+ LAST_SKIP_BITS(re, gb, b + 1);
+ UPDATE_CACHE(re, gb);
+#else
+ SKIP_BITS(re, gb, b + 1);
+#endif
+ b += 4;
+ n = (1 << b) + SHOW_UBITS(re, gb, b);
+ LAST_SKIP_BITS(re, gb, b);
+ *icf++ = cbrt_tab[n] | (bits & 1<<31);
bits <<= 1;
} else {
unsigned v = ((const uint32_t*)vq)[cb_idx & 15];
- icf[j] = (bits & 1<<31) | v;
+ *icf++ = (bits & 1<<31) | v;
bits <<= !!v;
}
cb_idx >>= 4;
}
- }
+ } while (len -= 2);
- ac->dsp.vector_fmul_scalar(cf, cf, sf[idx], len);
+ ac->dsp.vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
}
}
+
+ CLOSE_READER(re, gb);
}
}
- coef += ics->group_len[g] << 7;
+ coef += g_len << 7;
}
if (pulse_present) {
spectral_to_sample(ac);
- if (!ac->is_saved) {
- ac->is_saved = 1;
- *data_size = 0;
- return buf_size;
- }
-
data_size_tmp = 1024 * avccontext->channels * sizeof(int16_t);
if (*data_size < data_size_tmp) {
av_log(avccontext, AV_LOG_ERROR,