Skip to content

Commit

Permalink
avcodec/mips/aaccoder_mips: Sync with the generic code
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nedeljko Babic authored and michaelni committed Oct 13, 2015
1 parent e578638 commit de262d0
Showing 1 changed file with 3 additions and 131 deletions.
134 changes: 3 additions & 131 deletions libavcodec/mips/aaccoder_mips.c
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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]);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit de262d0

Please sign in to comment.