avcodec/mips/aaccoder_mips: Sync with the generic code

This patch fixes build of AAC encoder optimized for mips that was broken due
 to some changes in generic code that were not propagated to the optimized code.

Also, some functions in the optimized code are basically duplicate of functions
 from generic code. Since they do not bring enough improvement to the optimized
 code to justify their existence, they are removed (which improves
 maintainability of the optimized code).

Optimizations disabled in 97437bd are enabled again.

Signed-off-by: Nedeljko Babic <nedeljko.babic@imgtec.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Nedeljko Babic 2015-10-13 16:14:51 +02:00 committed by Michael Niedermayer
parent e578638382
commit de262d018d

View File

@ -63,6 +63,7 @@
#include "libavcodec/aacenc.h"
#include "libavcodec/aactab.h"
#include "libavcodec/aacenctab.h"
#include "libavcodec/aacenc_utils.h"
#if HAVE_INLINE_ASM
typedef struct BandCodingPath {
@ -130,62 +131,6 @@ static const uint8_t esc_sign_bits[289] = {
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
*/
@ -860,7 +805,6 @@ static void quantize_and_encode_band_cost_ESC_mips(struct AACEncContext *s,
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;
@ -965,8 +909,6 @@ static void quantize_and_encode_band_cost_ESC_mips(struct AACEncContext *s,
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]);
@ -2390,76 +2332,6 @@ static float quantize_band_cost(struct AACEncContext *s, const float *in,
#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)
@ -2543,9 +2415,9 @@ 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;