mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-24 16:22:37 +00:00
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:
parent
e578638382
commit
de262d018d
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user