23 #ifndef AVCODEC_AACPS_TABLEGEN_H
24 #define AVCODEC_AACPS_TABLEGEN_H
29 #if CONFIG_HARDCODED_TABLES
30 #define ps_tableinit()
31 #define TABLE_CONST const
32 #include "libavcodec/aacps_tables.h"
38 #define NR_ALLPASS_BANDS20 30
39 #define NR_ALLPASS_BANDS34 50
44 static float HA[46][8][4];
45 static float HB[46][8][4];
54 0.00746082949812f, 0.02270420949825f, 0.04546865930473f, 0.07266113929591f,
55 0.09885108575264f, 0.11793710567217f, 0.125f
59 0.04081179924692f, 0.03812810994926f, 0.05144908135699f, 0.06399831151592f,
60 0.07428313801106f, 0.08100347892914f, 0.08333333333333f
64 0.01565675600122f, 0.03752716391991f, 0.05417891378782f, 0.08417044116767f,
65 0.10307344158036f, 0.12222452249753f, 0.125f
69 -0.05908211155639f, -0.04871498374946f, 0.0f, 0.07778723915851f,
70 0.16486303567403f, 0.23279856662996f, 0.25f
76 for (q = 0; q <
bands; q++) {
77 for (n = 0; n < 7; n++) {
78 double theta = 2 *
M_PI * (q + 0.5) * (n - 6) / bands;
79 filter[q][
n][0] = proto[
n] * cos(theta);
80 filter[q][
n][1] = proto[
n] * -sin(theta);
91 static const float iid_par_dequant[] = {
93 0.05623413251903, 0.12589254117942, 0.19952623149689, 0.31622776601684,
94 0.44668359215096, 0.63095734448019, 0.79432823472428, 1,
95 1.25892541179417, 1.58489319246111, 2.23872113856834, 3.16227766016838,
96 5.01187233627272, 7.94328234724282, 17.7827941003892,
98 0.00316227766017, 0.00562341325190, 0.01, 0.01778279410039,
99 0.03162277660168, 0.05623413251903, 0.07943282347243, 0.11220184543020,
100 0.15848931924611, 0.22387211385683, 0.31622776601684, 0.39810717055350,
101 0.50118723362727, 0.63095734448019, 0.79432823472428, 1,
102 1.25892541179417, 1.58489319246111, 1.99526231496888, 2.51188643150958,
103 3.16227766016838, 4.46683592150963, 6.30957344480193, 8.91250938133745,
104 12.5892541179417, 17.7827941003892, 31.6227766016838, 56.2341325190349,
105 100, 177.827941003892, 316.227766016837,
107 static const float icc_invq[] = {
108 1, 0.937, 0.84118, 0.60092, 0.36764, 0, -0.589, -1
110 static const float acos_icc_invq[] = {
111 0, 0.35685527, 0.57133466, 0.92614472, 1.1943263,
M_PI/2, 2.2006171,
M_PI
116 static const int8_t f_center_20[] = {
117 -3, -1, 1, 3, 5, 7, 10, 14, 18, 22,
119 static const int8_t f_center_34[] = {
120 2, 6, 10, 14, 18, 22, 26, 30,
121 34,-10, -6, -2, 51, 57, 15, 21,
122 27, 33, 39, 45, 54, 66, 78, 42,
123 102, 66, 78, 90,102,114,126, 90,
125 static const float fractional_delay_links[] = { 0.43f, 0.75f, 0.347f };
126 const float fractional_delay_gain = 0.39f;
128 for (pd0 = 0; pd0 < 8; pd0++) {
129 float pd0_re = ipdopd_cos[pd0];
130 float pd0_im = ipdopd_sin[pd0];
131 for (pd1 = 0; pd1 < 8; pd1++) {
132 float pd1_re = ipdopd_cos[pd1];
133 float pd1_im = ipdopd_sin[pd1];
134 for (pd2 = 0; pd2 < 8; pd2++) {
135 float pd2_re = ipdopd_cos[pd2];
136 float pd2_im = ipdopd_sin[pd2];
137 float re_smooth = 0.25f * pd0_re + 0.5f * pd1_re + pd2_re;
138 float im_smooth = 0.25f * pd0_im + 0.5f * pd1_im + pd2_im;
139 float pd_mag = 1 /
hypot(im_smooth, re_smooth);
146 for (iid = 0; iid < 46; iid++) {
147 float c = iid_par_dequant[iid];
148 float c1 = (float)
M_SQRT2 / sqrtf(1.0f + c*c);
150 for (icc = 0; icc < 8; icc++) {
152 float alpha = 0.5f * acos_icc_invq[icc];
154 HA[iid][icc][0] = c2 *
cosf(beta + alpha);
155 HA[iid][icc][1] = c1 *
cosf(beta - alpha);
156 HA[iid][icc][2] = c2 *
sinf(beta + alpha);
157 HA[iid][icc][3] = c1 *
sinf(beta - alpha);
159 float alpha, gamma, mu, rho;
160 float alpha_c, alpha_s, gamma_c, gamma_s;
161 rho =
FFMAX(icc_invq[icc], 0.05f);
162 alpha = 0.5f *
atan2f(2.0f * c * rho, c*c - 1.0f);
164 mu = sqrtf(1 + (4 * rho * rho - 4)/(mu * mu));
165 gamma =
atanf(sqrtf((1.0f - mu)/(1.0f + mu)));
166 if (alpha < 0) alpha +=
M_PI/2;
167 alpha_c =
cosf(alpha);
168 alpha_s =
sinf(alpha);
169 gamma_c =
cosf(gamma);
170 gamma_s =
sinf(gamma);
171 HB[iid][icc][0] =
M_SQRT2 * alpha_c * gamma_c;
172 HB[iid][icc][1] =
M_SQRT2 * alpha_s * gamma_c;
173 HB[iid][icc][2] = -
M_SQRT2 * alpha_s * gamma_s;
174 HB[iid][icc][3] =
M_SQRT2 * alpha_c * gamma_s;
180 double f_center, theta;
182 f_center = f_center_20[k] * 0.125;
186 theta = -
M_PI * fractional_delay_links[m] * f_center;
190 theta = -
M_PI*fractional_delay_gain*f_center;
195 double f_center, theta;
197 f_center = f_center_34[k] / 24.0;
199 f_center = k - 26.5f;
201 theta = -
M_PI * fractional_delay_links[m] * f_center;
205 theta = -
M_PI*fractional_delay_gain*f_center;
static float alpha(float a)
static const float g1_Q8[]
Memory handling functions.
#define NR_ALLPASS_BANDS34
static float pd_im_smooth[8 *8 *8]
static float f34_1_8[8][8][2]
static av_cold void make_filters_from_proto(float(*filter)[8][2], const float *proto, int bands)
static av_cold void ps_tableinit(void)
static void filter(int16_t *output, ptrdiff_t out_stride, int16_t *low, ptrdiff_t low_stride, int16_t *high, ptrdiff_t high_stride, int len, int clip)
static float f20_0_8[8][8][2]
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
#define NR_ALLPASS_BANDS20
static float phi_fract[2][50][2]
static const float g0_Q8[]
static float f34_2_4[4][8][2]
static av_const double hypot(double x, double y)
static float HA[46][8][4]
static float pd_re_smooth[8 *8 *8]
#define FF_ARRAY_ELEMS(a)
static const float bands[]
Replacements for frequently missing libm functions.
static TABLE_CONST float Q_fract_allpass[2][50][3][2]
static float HB[46][8][4]
static float f34_0_12[12][8][2]
common internal and external API header
static const float g0_Q12[]
static const float g2_Q4[]