23 #ifndef AACPS_TABLEGEN_H 24 #define AACPS_TABLEGEN_H 29 #if CONFIG_HARDCODED_TABLES 30 #define ps_tableinit() 31 #include "libavcodec/aacps_tables.h" 37 #define NR_ALLPASS_BANDS20 30 38 #define NR_ALLPASS_BANDS34 50 42 static float HA[46][8][4];
43 static float HB[46][8][4];
52 0.00746082949812f, 0.02270420949825f, 0.04546865930473f, 0.07266113929591f,
53 0.09885108575264f, 0.11793710567217f, 0.125f
57 0.04081179924692f, 0.03812810994926f, 0.05144908135699f, 0.06399831151592f,
58 0.07428313801106f, 0.08100347892914f, 0.08333333333333f
62 0.01565675600122f, 0.03752716391991f, 0.05417891378782f, 0.08417044116767f,
63 0.10307344158036f, 0.12222452249753f, 0.125f
67 -0.05908211155639f, -0.04871498374946f, 0.0f, 0.07778723915851f,
68 0.16486303567403f, 0.23279856662996f, 0.25f
74 for (q = 0; q < bands; q++) {
75 for (n = 0; n < 7; n++) {
76 double theta = 2 *
M_PI * (q + 0.5) * (n - 6) / bands;
77 filter[q][
n][0] = proto[
n] * cos(theta);
78 filter[q][
n][1] = proto[
n] * -sin(theta);
89 static const float iid_par_dequant[] = {
91 0.05623413251903, 0.12589254117942, 0.19952623149689, 0.31622776601684,
92 0.44668359215096, 0.63095734448019, 0.79432823472428, 1,
93 1.25892541179417, 1.58489319246111, 2.23872113856834, 3.16227766016838,
94 5.01187233627272, 7.94328234724282, 17.7827941003892,
96 0.00316227766017, 0.00562341325190, 0.01, 0.01778279410039,
97 0.03162277660168, 0.05623413251903, 0.07943282347243, 0.11220184543020,
98 0.15848931924611, 0.22387211385683, 0.31622776601684, 0.39810717055350,
99 0.50118723362727, 0.63095734448019, 0.79432823472428, 1,
100 1.25892541179417, 1.58489319246111, 1.99526231496888, 2.51188643150958,
101 3.16227766016838, 4.46683592150963, 6.30957344480193, 8.91250938133745,
102 12.5892541179417, 17.7827941003892, 31.6227766016838, 56.2341325190349,
103 100, 177.827941003892, 316.227766016837,
105 static const float icc_invq[] = {
106 1, 0.937, 0.84118, 0.60092, 0.36764, 0, -0.589, -1
108 static const float acos_icc_invq[] = {
109 0, 0.35685527, 0.57133466, 0.92614472, 1.1943263,
M_PI/2, 2.2006171,
M_PI 114 static const int8_t f_center_20[] = {
115 -3, -1, 1, 3, 5, 7, 10, 14, 18, 22,
117 static const int8_t f_center_34[] = {
118 2, 6, 10, 14, 18, 22, 26, 30,
119 34,-10, -6, -2, 51, 57, 15, 21,
120 27, 33, 39, 45, 54, 66, 78, 42,
121 102, 66, 78, 90,102,114,126, 90,
123 static const float fractional_delay_links[] = { 0.43f, 0.75f, 0.347f };
124 const float fractional_delay_gain = 0.39f;
126 for (pd0 = 0; pd0 < 8; pd0++) {
127 float pd0_re = ipdopd_cos[pd0];
128 float pd0_im = ipdopd_sin[pd0];
129 for (pd1 = 0; pd1 < 8; pd1++) {
130 float pd1_re = ipdopd_cos[pd1];
131 float pd1_im = ipdopd_sin[pd1];
132 for (pd2 = 0; pd2 < 8; pd2++) {
133 float pd2_re = ipdopd_cos[pd2];
134 float pd2_im = ipdopd_sin[pd2];
135 float re_smooth = 0.25f * pd0_re + 0.5f * pd1_re + pd2_re;
136 float im_smooth = 0.25f * pd0_im + 0.5f * pd1_im + pd2_im;
137 float pd_mag = 1 /
sqrt(im_smooth * im_smooth + re_smooth * re_smooth);
144 for (iid = 0; iid < 46; iid++) {
145 float c = iid_par_dequant[iid];
146 float c1 = (float)
M_SQRT2 / sqrtf(1.0
f + c*c);
148 for (icc = 0; icc < 8; icc++) {
150 float alpha = 0.5f * acos_icc_invq[icc];
152 HA[iid][icc][0] = c2 *
cosf(beta + alpha);
153 HA[iid][icc][1] = c1 *
cosf(beta - alpha);
154 HA[iid][icc][2] = c2 *
sinf(beta + alpha);
155 HA[iid][icc][3] = c1 *
sinf(beta - alpha);
157 float alpha, gamma, mu, rho;
158 float alpha_c, alpha_s, gamma_c, gamma_s;
159 rho =
FFMAX(icc_invq[icc], 0.05
f);
160 alpha = 0.5f *
atan2f(2.0
f * c * rho, c*c - 1.0
f);
162 mu = sqrtf(1 + (4 * rho * rho - 4)/(mu * mu));
163 gamma =
atanf(sqrtf((1.0
f - mu)/(1.0
f + mu)));
164 if (alpha < 0) alpha +=
M_PI/2;
165 alpha_c =
cosf(alpha);
166 alpha_s =
sinf(alpha);
167 gamma_c =
cosf(gamma);
168 gamma_s =
sinf(gamma);
169 HB[iid][icc][0] =
M_SQRT2 * alpha_c * gamma_c;
170 HB[iid][icc][1] =
M_SQRT2 * alpha_s * gamma_c;
171 HB[iid][icc][2] = -
M_SQRT2 * alpha_s * gamma_s;
172 HB[iid][icc][3] =
M_SQRT2 * alpha_c * gamma_s;
178 double f_center, theta;
180 f_center = f_center_20[
k] * 0.125;
184 theta = -
M_PI * fractional_delay_links[
m] * f_center;
185 Q_fract_allpass[0][
k][
m][0] = cos(theta);
186 Q_fract_allpass[0][
k][
m][1] = sin(theta);
188 theta = -
M_PI*fractional_delay_gain*f_center;
189 phi_fract[0][
k][0] = cos(theta);
190 phi_fract[0][
k][1] = sin(theta);
193 double f_center, theta;
195 f_center = f_center_34[
k] / 24.;
197 f_center = k - 26.5f;
199 theta = -
M_PI * fractional_delay_links[
m] * f_center;
200 Q_fract_allpass[1][
k][
m][0] = cos(theta);
201 Q_fract_allpass[1][
k][
m][1] = sin(theta);
203 theta = -
M_PI*fractional_delay_gain*f_center;
204 phi_fract[1][
k][0] = cos(theta);
205 phi_fract[1][
k][1] = sin(theta);
static const float g1_Q8[]
memory handling functions
#define NR_ALLPASS_BANDS34
#define FF_ARRAY_ELEMS(a)
static float pd_im_smooth[8 *8 *8]
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
#define NR_ALLPASS_BANDS20
static void make_filters_from_proto(float(*filter)[8][2], const float *proto, int bands)
static double alpha(void *priv, double x, double y)
static const float g0_Q8[]
static float HA[46][8][4]
static float pd_re_smooth[8 *8 *8]
Replacements for frequently missing libm functions.
static void ps_tableinit(void)
static float HB[46][8][4]
common internal and external API header
static const float g0_Q12[]
static const float g2_Q4[]
static DECLARE_ALIGNED(16, float, f20_0_8)[8][8][2]