FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aacps_tablegen.h
Date: 2026-09-14 03:06:03
Exec Total Coverage
Lines: 75 75 100.0%
Functions: 2 2 100.0%
Branches: 29 30 96.7%

Line Branch Exec Source
1 /*
2 * Header file for hardcoded Parametric Stereo tables
3 *
4 * Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #ifndef AVCODEC_AACPS_TABLEGEN_H
24 #define AVCODEC_AACPS_TABLEGEN_H
25
26 #include <math.h>
27 #include <stdint.h>
28
29 #if CONFIG_HARDCODED_TABLES
30 #define ps_tableinit()
31 #define TABLE_CONST const
32 #include "libavcodec/aacps_tables.h"
33 #else
34 #include "libavutil/common.h"
35 #include "libavutil/mathematics.h"
36 #include "libavutil/mem_internal.h"
37 #define NR_ALLPASS_BANDS20 30
38 #define NR_ALLPASS_BANDS34 50
39 #define PS_AP_LINKS 3
40 #define TABLE_CONST
41 static float pd_re_smooth[8*8*8];
42 static float pd_im_smooth[8*8*8];
43 static float HA[46][8][4];
44 static float HB[46][8][4];
45 static DECLARE_ALIGNED(16, float, f20_0_8) [ 8][8][2];
46 static DECLARE_ALIGNED(16, float, f34_0_12)[12][8][2];
47 static DECLARE_ALIGNED(16, float, f34_1_8) [ 8][8][2];
48 static DECLARE_ALIGNED(16, float, f34_2_4) [ 4][8][2];
49 static TABLE_CONST DECLARE_ALIGNED(16, float, Q_fract_allpass)[2][50][3][2];
50 static DECLARE_ALIGNED(16, float, phi_fract)[2][50][2];
51
52 static const float g0_Q8[] = {
53 0.00746082949812f, 0.02270420949825f, 0.04546865930473f, 0.07266113929591f,
54 0.09885108575264f, 0.11793710567217f, 0.125f
55 };
56
57 static const float g0_Q12[] = {
58 0.04081179924692f, 0.03812810994926f, 0.05144908135699f, 0.06399831151592f,
59 0.07428313801106f, 0.08100347892914f, 0.08333333333333f
60 };
61
62 static const float g1_Q8[] = {
63 0.01565675600122f, 0.03752716391991f, 0.05417891378782f, 0.08417044116767f,
64 0.10307344158036f, 0.12222452249753f, 0.125f
65 };
66
67 static const float g2_Q4[] = {
68 -0.05908211155639f, -0.04871498374946f, 0.0f, 0.07778723915851f,
69 0.16486303567403f, 0.23279856662996f, 0.25f
70 };
71
72 944 static av_cold void make_filters_from_proto(float (*filter)[8][2], const float *proto, int bands)
73 {
74 int q, n;
75
2/2
✓ Branch 0 taken 7552 times.
✓ Branch 1 taken 944 times.
8496 for (q = 0; q < bands; q++) {
76
2/2
✓ Branch 0 taken 52864 times.
✓ Branch 1 taken 7552 times.
60416 for (n = 0; n < 7; n++) {
77 52864 double theta = 2 * M_PI * (q + 0.5) * (n - 6) / bands;
78 52864 filter[q][n][0] = proto[n] * cos(theta);
79 52864 filter[q][n][1] = proto[n] * -sin(theta);
80 }
81 }
82 944 }
83
84 236 static av_cold void ps_tableinit(void)
85 {
86 static const float ipdopd_sin[] = { 0, M_SQRT1_2, 1, M_SQRT1_2, 0, -M_SQRT1_2, -1, -M_SQRT1_2 };
87 static const float ipdopd_cos[] = { 1, M_SQRT1_2, 0, -M_SQRT1_2, -1, -M_SQRT1_2, 0, M_SQRT1_2 };
88 int pd0, pd1, pd2;
89
90 static const float iid_par_dequant[] = {
91 //iid_par_dequant_default
92 0.05623413251903, 0.12589254117942, 0.19952623149689, 0.31622776601684,
93 0.44668359215096, 0.63095734448019, 0.79432823472428, 1,
94 1.25892541179417, 1.58489319246111, 2.23872113856834, 3.16227766016838,
95 5.01187233627272, 7.94328234724282, 17.7827941003892,
96 //iid_par_dequant_fine
97 0.00316227766017, 0.00562341325190, 0.01, 0.01778279410039,
98 0.03162277660168, 0.05623413251903, 0.07943282347243, 0.11220184543020,
99 0.15848931924611, 0.22387211385683, 0.31622776601684, 0.39810717055350,
100 0.50118723362727, 0.63095734448019, 0.79432823472428, 1,
101 1.25892541179417, 1.58489319246111, 1.99526231496888, 2.51188643150958,
102 3.16227766016838, 4.46683592150963, 6.30957344480193, 8.91250938133745,
103 12.5892541179417, 17.7827941003892, 31.6227766016838, 56.2341325190349,
104 100, 177.827941003892, 316.227766016837,
105 };
106 static const float icc_invq[] = {
107 1, 0.937, 0.84118, 0.60092, 0.36764, 0, -0.589, -1
108 };
109 static const float acos_icc_invq[] = {
110 0, 0.35685527, 0.57133466, 0.92614472, 1.1943263, M_PI/2, 2.2006171, M_PI
111 };
112 int iid, icc;
113
114 int k, m;
115 static const int8_t f_center_20[] = {
116 -3, -1, 1, 3, 5, 7, 10, 14, 18, 22,
117 };
118 static const int8_t f_center_34[] = {
119 2, 6, 10, 14, 18, 22, 26, 30,
120 34,-10, -6, -2, 51, 57, 15, 21,
121 27, 33, 39, 45, 54, 66, 78, 42,
122 102, 66, 78, 90,102,114,126, 90,
123 };
124 static const float fractional_delay_links[] = { 0.43f, 0.75f, 0.347f };
125 236 const float fractional_delay_gain = 0.39f;
126
127
2/2
✓ Branch 0 taken 1888 times.
✓ Branch 1 taken 236 times.
2124 for (pd0 = 0; pd0 < 8; pd0++) {
128 1888 float pd0_re = ipdopd_cos[pd0];
129 1888 float pd0_im = ipdopd_sin[pd0];
130
2/2
✓ Branch 0 taken 15104 times.
✓ Branch 1 taken 1888 times.
16992 for (pd1 = 0; pd1 < 8; pd1++) {
131 15104 float pd1_re = ipdopd_cos[pd1];
132 15104 float pd1_im = ipdopd_sin[pd1];
133
2/2
✓ Branch 0 taken 120832 times.
✓ Branch 1 taken 15104 times.
135936 for (pd2 = 0; pd2 < 8; pd2++) {
134 120832 float pd2_re = ipdopd_cos[pd2];
135 120832 float pd2_im = ipdopd_sin[pd2];
136 120832 float re_smooth = 0.25f * pd0_re + 0.5f * pd1_re + pd2_re;
137 120832 float im_smooth = 0.25f * pd0_im + 0.5f * pd1_im + pd2_im;
138 120832 float pd_mag = 1 / hypot(im_smooth, re_smooth);
139 120832 pd_re_smooth[pd0*64+pd1*8+pd2] = re_smooth * pd_mag;
140 120832 pd_im_smooth[pd0*64+pd1*8+pd2] = im_smooth * pd_mag;
141 }
142 }
143 }
144
145
2/2
✓ Branch 0 taken 10856 times.
✓ Branch 1 taken 236 times.
11092 for (iid = 0; iid < 46; iid++) {
146 10856 float c = iid_par_dequant[iid]; ///< Linear Inter-channel Intensity Difference
147 10856 float c1 = (float)M_SQRT2 / sqrtf(1.0f + c*c);
148 10856 float c2 = c * c1;
149
2/2
✓ Branch 0 taken 86848 times.
✓ Branch 1 taken 10856 times.
97704 for (icc = 0; icc < 8; icc++) {
150 /*if (PS_BASELINE || ps->icc_mode < 3)*/ {
151 86848 float alpha = 0.5f * acos_icc_invq[icc];
152 86848 float beta = alpha * (c1 - c2) * (float)M_SQRT1_2;
153 86848 HA[iid][icc][0] = c2 * cosf(beta + alpha);
154 86848 HA[iid][icc][1] = c1 * cosf(beta - alpha);
155 86848 HA[iid][icc][2] = c2 * sinf(beta + alpha);
156 86848 HA[iid][icc][3] = c1 * sinf(beta - alpha);
157 } /* else */ {
158 float alpha, gamma, mu, rho;
159 float alpha_c, alpha_s, gamma_c, gamma_s;
160
2/2
✓ Branch 0 taken 54280 times.
✓ Branch 1 taken 32568 times.
86848 rho = FFMAX(icc_invq[icc], 0.05f);
161 86848 alpha = 0.5f * atan2f(2.0f * c * rho, c*c - 1.0f);
162 86848 mu = c + 1.0f / c;
163 86848 mu = sqrtf(1 + (4 * rho * rho - 4)/(mu * mu));
164 86848 gamma = atanf(sqrtf((1.0f - mu)/(1.0f + mu)));
165
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86848 times.
86848 if (alpha < 0) alpha += M_PI/2;
166 86848 alpha_c = cosf(alpha);
167 86848 alpha_s = sinf(alpha);
168 86848 gamma_c = cosf(gamma);
169 86848 gamma_s = sinf(gamma);
170 86848 HB[iid][icc][0] = M_SQRT2 * alpha_c * gamma_c;
171 86848 HB[iid][icc][1] = M_SQRT2 * alpha_s * gamma_c;
172 86848 HB[iid][icc][2] = -M_SQRT2 * alpha_s * gamma_s;
173 86848 HB[iid][icc][3] = M_SQRT2 * alpha_c * gamma_s;
174 }
175 }
176 }
177
178
2/2
✓ Branch 0 taken 7080 times.
✓ Branch 1 taken 236 times.
7316 for (k = 0; k < NR_ALLPASS_BANDS20; k++) {
179 double f_center, theta;
180
2/2
✓ Branch 0 taken 2360 times.
✓ Branch 1 taken 4720 times.
7080 if (k < FF_ARRAY_ELEMS(f_center_20))
181 2360 f_center = f_center_20[k] * 0.125;
182 else
183 4720 f_center = k - 6.5f;
184
2/2
✓ Branch 0 taken 21240 times.
✓ Branch 1 taken 7080 times.
28320 for (m = 0; m < PS_AP_LINKS; m++) {
185 21240 theta = -M_PI * fractional_delay_links[m] * f_center;
186 21240 Q_fract_allpass[0][k][m][0] = cos(theta);
187 21240 Q_fract_allpass[0][k][m][1] = sin(theta);
188 }
189 7080 theta = -M_PI*fractional_delay_gain*f_center;
190 7080 phi_fract[0][k][0] = cos(theta);
191 7080 phi_fract[0][k][1] = sin(theta);
192 }
193
2/2
✓ Branch 0 taken 11800 times.
✓ Branch 1 taken 236 times.
12036 for (k = 0; k < NR_ALLPASS_BANDS34; k++) {
194 double f_center, theta;
195
2/2
✓ Branch 0 taken 7552 times.
✓ Branch 1 taken 4248 times.
11800 if (k < FF_ARRAY_ELEMS(f_center_34))
196 7552 f_center = f_center_34[k] / 24.0;
197 else
198 4248 f_center = k - 26.5f;
199
2/2
✓ Branch 0 taken 35400 times.
✓ Branch 1 taken 11800 times.
47200 for (m = 0; m < PS_AP_LINKS; m++) {
200 35400 theta = -M_PI * fractional_delay_links[m] * f_center;
201 35400 Q_fract_allpass[1][k][m][0] = cos(theta);
202 35400 Q_fract_allpass[1][k][m][1] = sin(theta);
203 }
204 11800 theta = -M_PI*fractional_delay_gain*f_center;
205 11800 phi_fract[1][k][0] = cos(theta);
206 11800 phi_fract[1][k][1] = sin(theta);
207 }
208
209 236 make_filters_from_proto(f20_0_8, g0_Q8, 8);
210 236 make_filters_from_proto(f34_0_12, g0_Q12, 12);
211 236 make_filters_from_proto(f34_1_8, g1_Q8, 8);
212 236 make_filters_from_proto(f34_2_4, g2_Q4, 4);
213 236 }
214 #endif /* CONFIG_HARDCODED_TABLES */
215
216 #endif /* AVCODEC_AACPS_TABLEGEN_H */
217