Go to the documentation of this file.
90 for (
i=0;
i<10;
i+=2){
91 xpow = (int)(((
int64_t)xpow * x + 0x40000000) >> 31);
95 xpow = (int)(((
int64_t)xpow * x + 0x40000000) >> 31);
106 Q31(1.0/720),
Q31(1.0/5040),
Q31(1.0/40320)
116 xpow = (int)(((
int64_t)xpow * x + 0x400000) >> 23);
126 int k, previous, present;
127 int base, prod, nz = 0;
129 base = (stop << 23) / start;
130 while (
base < 0x40000000){
141 for (k = 0; k < num_bands-1; k++) {
142 prod = (int)(((
int64_t)prod *
base + 0x400000) >> 23);
143 present = (prod + 0x400000) >> 23;
144 bands[k] = present - previous;
147 bands[num_bands-1] = stop - previous;
165 temp1.
mant = 759250125;
167 temp1.
mant = 0x20000000;
168 temp1.
exp = (temp1.
exp >> 1) + 1;
169 if (temp1.
exp > 66) {
176 temp2.
mant = 759250125;
178 temp2.
mant = 0x20000000;
179 temp2.
exp = (temp2.
exp >> 1) + 1;
186 for (k = 0; k < sbr->
n_q; k++) {
190 sbr->data[0].noise_facs_q[e][k] + 2;
191 temp1.
mant = 0x20000000;
194 temp2.
mant = 0x20000000;
201 for (ch = 0; ch < (id_aac ==
TYPE_CPE) + 1; ch++) {
209 temp1.
mant = 759250125;
211 temp1.
mant = 0x20000000;
212 temp1.
exp = (temp1.
exp >> 1) + 1;
213 if (temp1.
exp > 66) {
220 for (k = 0; k < sbr->
n_q; k++){
222 sbr->data[ch].noise_facs_q[e][k] + 1;
234 int (*alpha0)[2],
int (*alpha1)[2],
235 const int X_low[32][40][2],
int k0)
240 for (k = 0; k < k0; k++) {
267 if (!phi[1][0][0].mant) {
281 a00 =
av_div_sf(temp_real, phi[1][0][0]);
287 alpha0[k][0] = 0x7fffffff;
288 else if (
shift <= -30)
302 alpha0[k][1] = 0x7fffffff;
303 else if (
shift <= -30)
316 alpha1[k][0] = 0x7fffffff;
317 else if (
shift <= -30)
331 alpha1[k][1] = 0x7fffffff;
332 else if (
shift <= -30)
344 shift = (int)(((
int64_t)(alpha1[k][0]>>1) * (alpha1[k][0]>>1) + \
345 (
int64_t)(alpha1[k][1]>>1) * (alpha1[k][1]>>1) + \
347 if (
shift >= 0x20000000){
354 shift = (int)(((
int64_t)(alpha0[k][0]>>1) * (alpha0[k][0]>>1) + \
355 (
int64_t)(alpha0[k][1]>>1) * (alpha0[k][1]>>1) + \
357 if (
shift >= 0x20000000){
371 static const int bw_tab[] = { 0, 1610612736, 1932735283, 2104533975 };
374 for (
i = 0;
i < sbr->
n_q;
i++) {
380 if (new_bw < ch_data->bw_array[
i]){
381 accu = (
int64_t)new_bw * 1610612736;
383 new_bw = (
int)((accu + 0x40000000) >> 31);
385 accu = (
int64_t)new_bw * 1946157056;
387 new_bw = (
int)((accu + 0x40000000) >> 31);
389 ch_data->
bw_array[
i] = new_bw < 0x2000000 ? 0 : new_bw;
398 SBRData *ch_data,
const int e_a[2])
402 static const SoftFloat limgain[4] = { { 760155524, 0 }, { 0x20000000, 1 },
403 { 758351638, 1 }, { 625000000, 34 } };
406 int delta = !((e == e_a[1]) || (e == e_a[0]));
407 for (k = 0; k < sbr->
n_lim; k++) {
411 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
435 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
446 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
451 sbr->
q_m[e][m] = q_m_max;
453 sbr->
gain[e][m] = gain_max;
456 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
476 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
487 const int X_high[64][40][2],
493 const int kx = sbr->
kx[1];
494 const int m_max = sbr->
m[1];
507 for (
i = 0;
i < h_SL;
i++) {
508 memcpy(g_temp[
i + 2*ch_data->
t_env[0]], sbr->
gain[0], m_max *
sizeof(sbr->
gain[0][0]));
509 memcpy(q_temp[
i + 2*ch_data->
t_env[0]], sbr->
q_m[0], m_max *
sizeof(sbr->
q_m[0][0]));
512 for (
i = 0;
i < 4;
i++) {
513 memcpy(g_temp[
i + 2 * ch_data->
t_env[0]],
516 memcpy(q_temp[
i + 2 * ch_data->
t_env[0]],
523 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
524 memcpy(g_temp[h_SL +
i], sbr->
gain[e], m_max *
sizeof(sbr->
gain[0][0]));
525 memcpy(q_temp[h_SL +
i], sbr->
q_m[e], m_max *
sizeof(sbr->
q_m[0][0]));
530 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
535 if (h_SL && e != e_a[0] && e != e_a[1]) {
538 for (m = 0; m < m_max; m++) {
539 const int idx1 =
i + h_SL;
540 g_filt[m].
mant = g_filt[m].
exp = 0;
541 q_filt[m].
mant = q_filt[m].
exp = 0;
542 for (j = 0; j <= h_SL; j++) {
552 g_filt = g_temp[
i + h_SL];
559 if (e != e_a[0] && e != e_a[1]) {
564 int idx = indexsine&1;
565 int A = (1-((indexsine+(kx & 1))&2));
566 int B = (
A^(-idx)) + idx;
567 unsigned *
out = &Y1[
i][kx][idx];
572 for (m = 0; m+1 < m_max; m+=2) {
596 }
else if (
shift < 32) {
602 indexnoise = (indexnoise + m_max) & 0x1ff;
603 indexsine = (indexsine + 1) & 3;
unsigned bs_limiter_gains
static const SoftFloat FLOAT_EPSILON
A small value.
static void aacsbr_func_ptr_init(AACSBRContext *c)
AAC_SIGNE m[2]
M' and M respectively, M is the number of QMF subbands that use SBR.
static av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b)
uint8_t t_env_num_env_old
Envelope time border of the last envelope of the previous frame.
uint8_t env_facs_q[9][48]
Envelope scalefactors.
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
Chirp Factors (14496-3 sp04 p214)
uint8_t s_mapped[8][48]
Sinusoidal presence, remapped.
static const SoftFloat FLOAT_1
1.0
static av_const int av_gt_sf(SoftFloat a, SoftFloat b)
Compares two SoftFloats.
uint8_t t_env[9]
Envelope time borders.
static av_always_inline SoftFloat av_sqrt_sf(SoftFloat val)
Rounding-to-nearest used.
static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b)
b has to be normalized and not zero.
static void sbr_hf_assemble(int Y1[38][64][2], const int X_high[64][40][2], SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Assembling HF Signals (14496-3 sp04 p220)
AAC_FLOAT noise_facs[3][5]
static void sbr_hf_inverse_filter(SBRDSPContext *dsp, int(*alpha0)[2], int(*alpha1)[2], const int X_low[32][40][2], int k0)
High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering (14496-3 sp04 p214) Warning: Thi...
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const SoftFloat FLOAT_MIN
AAC_FLOAT env_facs[9][48]
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define NOISE_FLOOR_OFFSET
void(* autocorrelate)(const INTFLOAT x[40][2], AAC_FLOAT phi[3][2][2])
AAC_FLOAT e_origmapped[8][48]
Dequantized envelope scalefactors, remapped.
static const float bands[]
AAC_SIGNE n_lim
Number of limiter bands.
static const SoftFloat FLOAT_0
0.0
uint16_t f_tablelim[30]
Frequency borders for the limiter.
aacsbr functions pointers
static int fixed_log(int x)
void(* hf_g_filt)(INTFLOAT(*Y)[2], const INTFLOAT(*X_high)[40][2], const AAC_FLOAT *g_filt, int m_max, intptr_t ixh)
AAC_SIGNE n[2]
N_Low and N_High respectively, the number of frequency bands for low and high resolution.
unsigned bs_smoothing_mode
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static const SoftFloat FLOAT_0999999
0.999999
static int shift(int a, int b)
static const SoftFloat FLOAT_1584893192
1.584893192 (10^.2)
AAC_FLOAT q_m[8][48]
Amplitude adjusted noise scalefactors.
static const SoftFloat FLOAT_100000
100000
Spectral Band Replication.
uint8_t bs_invf_mode[2][5]
void(* hf_apply_noise[4])(INTFLOAT(*Y)[2], const AAC_FLOAT *s_m, const AAC_FLOAT *q_filt, int noise, int kx, int m_max)
AAC_SIGNE n_q
Number of noise floor bands.
static int fixed_exp(int x)
static const int CONST_076923
static const int CONST_RECIP_LN2
AAC_FLOAT q_mapped[8][48]
Dequantized noise scalefactors, remapped.
#define i(width, name, range_min, range_max)
static av_always_inline av_const double round(double x)
Spectral Band Replication per channel data.
INTFLOAT bw_array[5]
Chirp factors.
static av_const SoftFloat av_int2sf(int v, int frac_bits)
Converts a mantisse and exponent to a SoftFloat.
static const uint8_t shift2[6]
static void sbr_gain_calc(SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Calculation of levels of additional HF signal components (14496-3 sp04 p219) and Calculation of gain ...
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
static const int fixed_exp_table[7]
static void make_bands(int16_t *bands, int start, int stop, int num_bands)
uint8_t noise_facs_q[3][5]
Noise scalefactors.
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
Dequantization and stereo decoding (14496-3 sp04 p203)
static const int CONST_LN2
#define ENVELOPE_ADJUSTMENT_OFFSET
static const int16_t alpha[]
AAC_FLOAT s_m[8][48]
Sinusoidal levels.
static const int fixed_log_table[10]
uint8_t s_indexmapped[9][48]
AAC_SIGNE kx[2]
kx', and kx respectively, kx is the first QMF subband where SBR is used.
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
AAC_FLOAT e_curr[8][48]
Estimated envelope.