#include "libavcodec/aacenc.h"
#include "libavcodec/aactab.h"
#include "libavcodec/aacenctab.h"
+#include "libavcodec/aacenc_utils.h"
#if HAVE_INLINE_ASM
typedef struct BandCodingPath {
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
};
-#define ROUND_STANDARD 0.4054f
-#define ROUND_TO_ZERO 0.1054f
-
-static void abs_pow34_v(float *out, const float *in, const int size) {
-#ifndef USE_REALLY_FULL_SEARCH
- int i;
- float a, b, c, d;
- float ax, bx, cx, dx;
-
- for (i = 0; i < size; i += 4) {
- a = fabsf(in[i ]);
- b = fabsf(in[i+1]);
- c = fabsf(in[i+2]);
- d = fabsf(in[i+3]);
-
- ax = sqrtf(a);
- bx = sqrtf(b);
- cx = sqrtf(c);
- dx = sqrtf(d);
-
- a = a * ax;
- b = b * bx;
- c = c * cx;
- d = d * dx;
-
- out[i ] = sqrtf(a);
- out[i+1] = sqrtf(b);
- out[i+2] = sqrtf(c);
- out[i+3] = sqrtf(d);
- }
-#endif /* USE_REALLY_FULL_SEARCH */
-}
-
-static float find_max_val(int group_len, int swb_size, const float *scaled) {
- float maxval = 0.0f;
- int w2, i;
- for (w2 = 0; w2 < group_len; w2++) {
- for (i = 0; i < swb_size; i++) {
- maxval = FFMAX(maxval, scaled[w2*128+i]);
- }
- }
- return maxval;
-}
-
-static int find_min_book(float maxval, int sf) {
- float Q = ff_aac_pow2sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512];
- float Q34 = sqrtf(Q * sqrtf(Q));
- int qmaxval, cb;
- qmaxval = maxval * Q34 + 0.4054f;
- if (qmaxval >= (FF_ARRAY_ELEMS(aac_maxval_cb)))
- cb = 11;
- else
- cb = aac_maxval_cb[qmaxval];
- return cb;
-}
-
/**
* Functions developed from template function and optimized for quantizing and encoding band
*/
unsigned int v_codes;
int c1, c2, c3, c4;
int t0, t1, t2, t3, t4;
- const float *vec1, *vec2;
qc1 = scaled[i ] * Q34 + ROUNDING;
qc2 = scaled[i+1] * Q34 + ROUNDING;
if (out || energy) {
float e1, e2, e3, e4;
- vec1 = &p_vectors[curidx*2];
- vec2 = &p_vectors[curidx2*2];
e1 = copysignf(c1 * cbrtf(c1) * IQ, in[i+0]);
e2 = copysignf(c2 * cbrtf(c2) * IQ, in[i+1]);
e3 = copysignf(c3 * cbrtf(c3) * IQ, in[i+2]);
#include "libavcodec/aacenc_quantization_misc.h"
-static float find_form_factor(int group_len, int swb_size, float thresh, const float *scaled, float nzslope) {
- const float iswb_size = 1.0f / swb_size;
- const float iswb_sizem1 = 1.0f / (swb_size - 1);
- const float ethresh = thresh, iethresh = 1.0f / ethresh;
- float form = 0.0f, weight = 0.0f;
- int w2, i;
- for (w2 = 0; w2 < group_len; w2++) {
- float e = 0.0f, e2 = 0.0f, var = 0.0f, maxval = 0.0f;
- float nzl = 0;
- for (i = 0; i < swb_size; i+=4) {
- float s1 = fabsf(scaled[w2*128+i ]);
- float s2 = fabsf(scaled[w2*128+i+1]);
- float s3 = fabsf(scaled[w2*128+i+2]);
- float s4 = fabsf(scaled[w2*128+i+3]);
- maxval = FFMAX(maxval, FFMAX(FFMAX(s1, s2), FFMAX(s3, s4)));
- e += (s1+s2)+(s3+s4);
- s1 *= s1;
- s2 *= s2;
- s3 *= s3;
- s4 *= s4;
- e2 += (s1+s2)+(s3+s4);
- /* We really don't want a hard non-zero-line count, since
- * even below-threshold lines do add up towards band spectral power.
- * So, fall steeply towards zero, but smoothly
- */
- if (s1 >= ethresh) {
- nzl += 1.0f;
- } else {
- nzl += powf(s1 * iethresh, nzslope);
- }
- if (s2 >= ethresh) {
- nzl += 1.0f;
- } else {
- nzl += powf(s2 * iethresh, nzslope);
- }
- if (s3 >= ethresh) {
- nzl += 1.0f;
- } else {
- nzl += powf(s3 * iethresh, nzslope);
- }
- if (s4 >= ethresh) {
- nzl += 1.0f;
- } else {
- nzl += powf(s4 * iethresh, nzslope);
- }
- }
- if (e2 > thresh) {
- float frm;
- e *= iswb_size;
-
- /** compute variance */
- for (i = 0; i < swb_size; i++) {
- float d = fabsf(scaled[w2*128+i]) - e;
- var += d*d;
- }
- var = sqrtf(var * iswb_sizem1);
-
- e2 *= iswb_size;
- frm = e / FFMIN(e+4*var,maxval);
- form += e2 * sqrtf(frm) / FFMAX(0.5f,nzl);
- weight += e2;
- }
- }
- if (weight > 0) {
- return form / weight;
- } else {
- return 1.0f;
- }
-}
-
#include "libavcodec/aaccoder_twoloop.h"
static void search_for_ms_mips(AACEncContext *s, ChannelElement *cpe)
#endif /* HAVE_INLINE_ASM */
void ff_aac_coder_init_mips(AACEncContext *c) {
-#if 0 // HAVE_INLINE_ASM
+#if HAVE_INLINE_ASM
AACCoefficientsEncoder *e = c->coder;
- int option = c->options.aac_coder;
+ int option = c->options.coder;
if (option == 2) {
e->quantize_and_encode_band = quantize_and_encode_band_mips;