Go to the documentation of this file.
56 if (-126 <= x && x <= 128)
73 int k, previous, present;
76 base =
powf((
float)stop / start, 1.0
f / num_bands);
80 for (k = 0; k < num_bands-1; k++) {
83 bands[k] = present - previous;
86 bands[num_bands-1] = stop - previous;
94 static const double exp2_tab[2] = {1,
M_SQRT2};
99 float temp1, temp2, fac;
114 fac = temp1 / (1.0f + temp2);
120 for (k = 0; k < sbr->
n_q; k++) {
125 fac = temp1 / (1.0f + temp2);
131 for (ch = 0; ch < (id_aac ==
TYPE_CPE) + 1; ch++) {
146 for (k = 0; k < sbr->
n_q; k++)
158 float (*alpha0)[2],
float (*alpha1)[2],
159 const float X_low[32][40][2],
int k0)
162 for (k = 0; k < k0; k++) {
168 dk = phi[2][1][0] * phi[1][0][0] -
169 (phi[1][1][0] * phi[1][1][0] + phi[1][1][1] * phi[1][1][1]) / 1.000001
f;
175 float temp_real, temp_im;
176 temp_real = phi[0][0][0] * phi[1][1][0] -
177 phi[0][0][1] * phi[1][1][1] -
178 phi[0][1][0] * phi[1][0][0];
179 temp_im = phi[0][0][0] * phi[1][1][1] +
180 phi[0][0][1] * phi[1][1][0] -
181 phi[0][1][1] * phi[1][0][0];
183 alpha1[k][0] = temp_real / dk;
184 alpha1[k][1] = temp_im / dk;
191 float temp_real, temp_im;
192 temp_real = phi[0][0][0] + alpha1[k][0] * phi[1][1][0] +
193 alpha1[k][1] * phi[1][1][1];
194 temp_im = phi[0][0][1] + alpha1[k][1] * phi[1][1][0] -
195 alpha1[k][0] * phi[1][1][1];
197 alpha0[k][0] = -temp_real / phi[1][0][0];
198 alpha0[k][1] = -temp_im / phi[1][0][0];
201 if (alpha1[k][0] * alpha1[k][0] + alpha1[k][1] * alpha1[k][1] >= 16.0
f ||
202 alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0
f) {
216 static const float bw_tab[] = { 0.0f, 0.75f, 0.9f, 0.98f };
218 for (
i = 0;
i < sbr->
n_q;
i++) {
224 if (new_bw < ch_data->bw_array[
i]) {
225 new_bw = 0.75f * new_bw + 0.25f * ch_data->
bw_array[
i];
227 new_bw = 0.90625f * new_bw + 0.09375f * ch_data->
bw_array[
i];
228 ch_data->
bw_array[
i] = new_bw < 0.015625f ? 0.0f : new_bw;
237 SBRData *ch_data,
const int e_a[2])
241 static const float limgain[4] = { 0.70795, 1.0, 1.41254, 10000000000 };
244 int delta = !((e == e_a[1]) || (e == e_a[0]));
245 for (k = 0; k < sbr->
n_lim; k++) {
246 float gain_boost, gain_max;
247 float sum[2] = { 0.0f, 0.0f };
248 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
254 ((1.0f + sbr->
e_curr[e][m]) *
258 ((1.0f + sbr->
e_curr[e][m]) *
261 sbr->
gain[e][m] += FLT_MIN;
263 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
265 sum[1] += sbr->
e_curr[e][m];
268 gain_max =
FFMIN(100000.
f, gain_max);
269 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
270 float q_m_max = sbr->
q_m[e][m] * gain_max / sbr->
gain[e][m];
274 sum[0] = sum[1] = 0.0f;
275 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
278 + sbr->
s_m[e][m] * sbr->
s_m[e][m]
281 gain_boost =
sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1]));
282 gain_boost =
FFMIN(1.584893192
f, gain_boost);
283 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
284 sbr->
gain[e][m] *= gain_boost;
285 sbr->
q_m[e][m] *= gain_boost;
286 sbr->
s_m[e][m] *= gain_boost;
294 const float X_high[64][40][2],
300 const int kx = sbr->
kx[1];
301 const int m_max = sbr->
m[1];
302 static const float h_smooth[5] = {
314 for (
i = 0;
i < h_SL;
i++) {
315 memcpy(g_temp[
i + 2*ch_data->
t_env[0]], sbr->
gain[0], m_max *
sizeof(sbr->
gain[0][0]));
316 memcpy(q_temp[
i + 2*ch_data->
t_env[0]], sbr->
q_m[0], m_max *
sizeof(sbr->
q_m[0][0]));
319 for (
i = 0;
i < 4;
i++) {
320 memcpy(g_temp[
i + 2 * ch_data->
t_env[0]],
323 memcpy(q_temp[
i + 2 * ch_data->
t_env[0]],
330 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
331 memcpy(g_temp[h_SL +
i], sbr->
gain[e], m_max *
sizeof(sbr->
gain[0][0]));
332 memcpy(q_temp[h_SL +
i], sbr->
q_m[e], m_max *
sizeof(sbr->
q_m[0][0]));
337 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
340 float *g_filt, *q_filt;
342 if (h_SL && e != e_a[0] && e != e_a[1]) {
345 for (m = 0; m < m_max; m++) {
346 const int idx1 =
i + h_SL;
349 for (j = 0; j <= h_SL; j++) {
350 g_filt[m] += g_temp[idx1 - j][m] * h_smooth[j];
351 q_filt[m] += q_temp[idx1 - j][m] * h_smooth[j];
355 g_filt = g_temp[
i + h_SL];
362 if (e != e_a[0] && e != e_a[1]) {
367 int idx = indexsine&1;
368 int A = (1-((indexsine+(kx & 1))&2));
369 int B = (
A^(-idx)) + idx;
370 float *
out = &Y1[
i][kx][idx];
371 float *in = sbr->
s_m[e];
372 for (m = 0; m+1 < m_max; m+=2) {
373 out[2*m ] += in[m ] *
A;
374 out[2*m+2] += in[m+1] *
B;
377 out[2*m ] += in[m ] *
A;
379 indexnoise = (indexnoise + m_max) & 0x1ff;
380 indexsine = (indexsine + 1) & 3;
unsigned bs_limiter_gains
AAC_FLOAT e_origmapped[7][48]
Dequantized envelope scalefactors, remapped.
AAC_FLOAT env_facs[6][48]
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
Chirp Factors (14496-3 sp04 p214)
static void sbr_hf_inverse_filter(SBRDSPContext *dsp, float(*alpha0)[2], float(*alpha1)[2], const float X_low[32][40][2], int k0)
High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering (14496-3 sp04 p214) Warning: Thi...
AAC_SIGNE m[2]
M' and M respectively, M is the number of QMF subbands that use SBR.
AAC_FLOAT q_m[7][48]
Amplitude adjusted noise scalefactors.
uint8_t t_env_num_env_old
Envelope time border of the last envelope of the previous frame.
uint8_t t_env[8]
Envelope time borders.
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_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
AAC_FLOAT noise_facs[3][5]
static void sbr_hf_assemble(float Y1[38][64][2], const float X_high[64][40][2], SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Assembling HF Signals (14496-3 sp04 p220)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define LOCAL_ALIGNED_16(t, v,...)
#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])
static const float bands[]
AAC_FLOAT s_m[7][48]
Sinusoidal levels.
AAC_SIGNE n_lim
Number of limiter bands.
uint8_t env_facs_q[6][48]
Envelope scalefactors.
uint16_t f_tablelim[30]
Frequency borders for the limiter.
aacsbr functions pointers
static __device__ float sqrtf(float a)
void(* hf_g_filt)(INTFLOAT(*Y)[2], const INTFLOAT(*X_high)[40][2], const AAC_FLOAT *g_filt, int m_max, intptr_t ixh)
static void make_bands(int16_t *bands, int start, int stop, int num_bands)
AAC_SIGNE n[2]
N_Low and N_High respectively, the number of frequency bands for low and high resolution.
uint8_t s_indexmapped[8][48]
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
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.
AAC_FLOAT e_curr[7][48]
Estimated envelope.
#define i(width, name, range_min, range_max)
Spectral Band Replication per channel data.
INTFLOAT bw_array[5]
Chirp factors.
static void aacsbr_func_ptr_init(AACSBRContext *c)
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
Dequantization and stereo decoding (14496-3 sp04 p203)
uint8_t noise_facs_q[3][5]
Noise scalefactors.
static av_always_inline float exp2fi(int x)
2^(x) for integer x
#define ENVELOPE_ADJUSTMENT_OFFSET
AAC_FLOAT q_mapped[7][48]
Dequantized noise scalefactors, remapped.
AAC_SIGNE kx[2]
kx', and kx respectively, kx is the first QMF subband where SBR is used.
uint8_t s_mapped[7][48]
Sinusoidal presence, remapped.