/proc/self/cwd/libfaad/drm_dec.c
Line | Count | Source |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | | ** |
5 | | ** This program is free software; you can redistribute it and/or modify |
6 | | ** it under the terms of the GNU General Public License as published by |
7 | | ** the Free Software Foundation; either version 2 of the License, or |
8 | | ** (at your option) any later version. |
9 | | ** |
10 | | ** This program is distributed in the hope that it will be useful, |
11 | | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | ** GNU General Public License for more details. |
14 | | ** |
15 | | ** You should have received a copy of the GNU General Public License |
16 | | ** along with this program; if not, write to the Free Software |
17 | | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | | ** |
19 | | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | | ** forbidden. |
21 | | ** |
22 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $ |
29 | | **/ |
30 | | |
31 | | #include <stdlib.h> |
32 | | #include <stdio.h> |
33 | | #include <string.h> |
34 | | #include <math.h> |
35 | | #include "common.h" |
36 | | |
37 | | #ifdef DRM |
38 | | |
39 | | #include "sbr_dec.h" |
40 | | #include "drm_dec.h" |
41 | | #include "bits.h" |
42 | | |
43 | | /* constants */ |
44 | | #define DECAY_CUTOFF 3 |
45 | | #define DECAY_SLOPE 0.05f |
46 | | |
47 | | /* type definitaions */ |
48 | | typedef const int8_t (*drm_ps_huff_tab)[2]; |
49 | | |
50 | | |
51 | | /* binary search huffman tables */ |
52 | | static const int8_t f_huffman_sa[][2] = |
53 | | { |
54 | | { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ |
55 | | { 2, 3 }, /* index 1: 2 bits: 1x */ |
56 | | { /*7*/ -8, 4 }, /* index 2: 3 bits: 10x */ |
57 | | { 5, 6 }, /* index 3: 3 bits: 11x */ |
58 | | { /*1*/ -14, /*-1*/ -16 }, /* index 4: 4 bits: 101x */ |
59 | | { /*-2*/ -17, 7 }, /* index 5: 4 bits: 110x */ |
60 | | { 8, 9 }, /* index 6: 4 bits: 111x */ |
61 | | { /*2*/ -13, /*-3*/ -18 }, /* index 7: 5 bits: 1101x */ |
62 | | { /*3*/ -12, 10 }, /* index 8: 5 bits: 1110x */ |
63 | | { 11, 12 }, /* index 9: 5 bits: 1111x */ |
64 | | { /*4*/ -11, /*5*/ -10 }, /* index 10: 6 bits: 11101x */ |
65 | | { /*-4*/ -19, /*-5*/ -20 }, /* index 11: 6 bits: 11110x */ |
66 | | { /*6*/ -9, 13 }, /* index 12: 6 bits: 11111x */ |
67 | | { /*-7*/ -22, /*-6*/ -21 } /* index 13: 7 bits: 111111x */ |
68 | | }; |
69 | | |
70 | | static const int8_t t_huffman_sa[][2] = |
71 | | { |
72 | | { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ |
73 | | { 2, 3 }, /* index 1: 2 bits: 1x */ |
74 | | { /*-1*/ -16, /*1*/ -14 }, /* index 2: 3 bits: 10x */ |
75 | | { 4, 5 }, /* index 3: 3 bits: 11x */ |
76 | | { /*-2*/ -17, /*2*/ -13 }, /* index 4: 4 bits: 110x */ |
77 | | { 6, 7 }, /* index 5: 4 bits: 111x */ |
78 | | { /*-3*/ -18, /*3*/ -12 }, /* index 6: 5 bits: 1110x */ |
79 | | { 8, 9 }, /* index 7: 5 bits: 1111x */ |
80 | | { /*-4*/ -19, /*4*/ -11 }, /* index 8: 6 bits: 11110x */ |
81 | | { 10, 11 }, /* index 9: 6 bits: 11111x */ |
82 | | { /*-5*/ -20, /*5*/ -10 }, /* index 10: 7 bits: 111110x */ |
83 | | { /*-6*/ -21, 12 }, /* index 11: 7 bits: 111111x */ |
84 | | { /*-7*/ -22, 13 }, /* index 12: 8 bits: 1111111x */ |
85 | | { /*6*/ -9, /*7*/ -8 } /* index 13: 9 bits: 11111111x */ |
86 | | }; |
87 | | |
88 | | static const int8_t f_huffman_pan[][2] = |
89 | | { |
90 | | { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ |
91 | | { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ |
92 | | { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ |
93 | | { 4, 5 }, /* index 3: 4 bits: 111x */ |
94 | | { /*-2*/ -17, /*2*/ -13 }, /* index 4: 5 bits: 1110x */ |
95 | | { 6, 7 }, /* index 5: 5 bits: 1111x */ |
96 | | { /*-3*/ -18, /*3*/ -12 }, /* index 6: 6 bits: 11110x */ |
97 | | { 8, 9 }, /* index 7: 6 bits: 11111x */ |
98 | | { /*-4*/ -19, /*4*/ -11 }, /* index 8: 7 bits: 111110x */ |
99 | | { 10, 11 }, /* index 9: 7 bits: 111111x */ |
100 | | { /*-5*/ -20, /*5*/ -10 }, /* index 10: 8 bits: 1111110x */ |
101 | | { 12, 13 }, /* index 11: 8 bits: 1111111x */ |
102 | | { /*-6*/ -21, /*6*/ -9 }, /* index 12: 9 bits: 11111110x */ |
103 | | { /*-7*/ -22, 14 }, /* index 13: 9 bits: 11111111x */ |
104 | | { /*7*/ -8, 15 }, /* index 14: 10 bits: 111111111x */ |
105 | | { 16, 17 }, /* index 15: 11 bits: 1111111111x */ |
106 | | { /*-8*/ -23, /*8*/ -7 }, /* index 16: 12 bits: 11111111110x */ |
107 | | { 18, 19 }, /* index 17: 12 bits: 11111111111x */ |
108 | | { /*-10*/ -25, 20 }, /* index 18: 13 bits: 111111111110x */ |
109 | | { 21, 22 }, /* index 19: 13 bits: 111111111111x */ |
110 | | { /*-9*/ -24, /*9*/ -6 }, /* index 20: 14 bits: 1111111111101x */ |
111 | | { /*10*/ -5, 23 }, /* index 21: 14 bits: 1111111111110x */ |
112 | | { 24, 25 }, /* index 22: 14 bits: 1111111111111x */ |
113 | | { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */ |
114 | | { /*11*/ -4, /*13*/ -2 }, /* index 24: 15 bits: 11111111111110x */ |
115 | | { 26, 27 }, /* index 25: 15 bits: 11111111111111x */ |
116 | | { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */ |
117 | | { /*12*/ -3, /*14*/ -1 } /* index 27: 16 bits: 111111111111111x */ |
118 | | }; |
119 | | |
120 | | static const int8_t t_huffman_pan[][2] = |
121 | | { |
122 | | { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ |
123 | | { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ |
124 | | { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ |
125 | | { /*-2*/ -17, 4 }, /* index 3: 4 bits: 111x */ |
126 | | { /*2*/ -13, 5 }, /* index 4: 5 bits: 1111x */ |
127 | | { /*-3*/ -18, 6 }, /* index 5: 6 bits: 11111x */ |
128 | | { /*3*/ -12, 7 }, /* index 6: 7 bits: 111111x */ |
129 | | { /*-4*/ -19, 8 }, /* index 7: 8 bits: 1111111x */ |
130 | | { /*4*/ -11, 9 }, /* index 8: 9 bits: 11111111x */ |
131 | | { 10, 11 }, /* index 9: 10 bits: 111111111x */ |
132 | | { /*-5*/ -20, /*5*/ -10 }, /* index 10: 11 bits: 1111111110x */ |
133 | | { 12, 13 }, /* index 11: 11 bits: 1111111111x */ |
134 | | { /*-6*/ -21, /*6*/ -9 }, /* index 12: 12 bits: 11111111110x */ |
135 | | { 14, 15 }, /* index 13: 12 bits: 11111111111x */ |
136 | | { /*-7*/ -22, /*7*/ -8 }, /* index 14: 13 bits: 111111111110x */ |
137 | | { 16, 17 }, /* index 15: 13 bits: 111111111111x */ |
138 | | { /*-8*/ -23, /*8*/ -7 }, /* index 16: 14 bits: 1111111111110x */ |
139 | | { 18, 19 }, /* index 17: 14 bits: 1111111111111x */ |
140 | | { /*-10*/ -25, /*10*/ -5 }, /* index 18: 15 bits: 11111111111110x */ |
141 | | { 20, 21 }, /* index 19: 15 bits: 11111111111111x */ |
142 | | { /*-9*/ -24, /*9*/ -6 }, /* index 20: 16 bits: 111111111111110x */ |
143 | | { 22, 23 }, /* index 21: 16 bits: 111111111111111x */ |
144 | | { 24, 25 }, /* index 22: 17 bits: 1111111111111110x */ |
145 | | { 26, 27 }, /* index 23: 17 bits: 1111111111111111x */ |
146 | | { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */ |
147 | | { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */ |
148 | | { /*11*/ -4, /*12*/ -3 }, /* index 26: 18 bits: 11111111111111110x */ |
149 | | { /*13*/ -2, /*14*/ -1 } /* index 27: 18 bits: 11111111111111111x */ |
150 | | }; |
151 | | |
152 | | /* There are 3 classes in the standard but the last 2 are identical */ |
153 | | static const real_t sa_quant[8][2] = |
154 | | { |
155 | | { FRAC_CONST(0.0000), FRAC_CONST(0.0000) }, |
156 | | { FRAC_CONST(0.0501), FRAC_CONST(0.1778) }, |
157 | | { FRAC_CONST(0.0706), FRAC_CONST(0.2818) }, |
158 | | { FRAC_CONST(0.0995), FRAC_CONST(0.4467) }, |
159 | | { FRAC_CONST(0.1399), FRAC_CONST(0.5623) }, |
160 | | { FRAC_CONST(0.1957), FRAC_CONST(0.7079) }, |
161 | | { FRAC_CONST(0.2713), FRAC_CONST(0.8913) }, |
162 | | { FRAC_CONST(0.3699), FRAC_CONST(1.0000) }, |
163 | | }; |
164 | | |
165 | | /* We don't need the actual quantizer values */ |
166 | | #if 0 |
167 | | static const real_t pan_quant[8][5] = |
168 | | { |
169 | | { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) }, |
170 | | { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) }, |
171 | | { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) }, |
172 | | { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) }, |
173 | | { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) }, |
174 | | { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) }, |
175 | | { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) }, |
176 | | { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) }, |
177 | | }; |
178 | | #endif |
179 | | |
180 | | /* 2^(pan_quant[x][y] */ |
181 | | static const real_t pan_pow_2_pos[8][5] = { |
182 | | { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) }, |
183 | | { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) }, |
184 | | { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) }, |
185 | | { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) }, |
186 | | { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) }, |
187 | | { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) }, |
188 | | { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) }, |
189 | | { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) } |
190 | | }; |
191 | | |
192 | | /* 2^(-pan_quant[x][y] */ |
193 | | static const real_t pan_pow_2_neg[8][5] = { |
194 | | { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) }, |
195 | | { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) }, |
196 | | { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) }, |
197 | | { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) }, |
198 | | { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) }, |
199 | | { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) }, |
200 | | { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) }, |
201 | | { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) } |
202 | | }; |
203 | | |
204 | | /* 2^(pan_quant[x][y]/30) */ |
205 | | static const real_t pan_pow_2_30_pos[8][5] = { |
206 | | { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, |
207 | | { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) }, |
208 | | { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) }, |
209 | | { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) }, |
210 | | { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) }, |
211 | | { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) }, |
212 | | { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) }, |
213 | | { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) } |
214 | | }; |
215 | | |
216 | | /* 2^(-pan_quant[x][y]/30) */ |
217 | | static const real_t pan_pow_2_30_neg[8][5] = { |
218 | | { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, |
219 | | { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) }, |
220 | | { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) }, |
221 | | { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) }, |
222 | | { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) }, |
223 | | { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) }, |
224 | | { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) }, |
225 | | { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) } |
226 | | }; |
227 | | |
228 | | static const real_t g_decayslope[MAX_SA_BAND] = { |
229 | | FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8), |
230 | | FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5), FRAC_CONST(0.45), |
231 | | FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1), |
232 | | FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), |
233 | | FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), |
234 | | FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), |
235 | | FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0) |
236 | | }; |
237 | | |
238 | | static const real_t sa_sqrt_1_minus[8][2] = { |
239 | | { FRAC_CONST(1), FRAC_CONST(1) }, |
240 | | { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) }, |
241 | | { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) }, |
242 | | { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) }, |
243 | | { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) }, |
244 | | { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) }, |
245 | | { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) }, |
246 | | { FRAC_CONST(0.929071574), FRAC_CONST(0) } |
247 | | }; |
248 | | |
249 | | static const uint8_t sa_freq_scale[9] = |
250 | | { |
251 | | 0, 1, 2, 3, 5, 7, 10, 13, 23 |
252 | | }; |
253 | | |
254 | | //static const uint8_t pan_freq_scale[21] = |
255 | | //{ |
256 | | // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, |
257 | | // 11, 12, 13, 14, 15, 18, 22, 26, 32, 64 |
258 | | //}; |
259 | | |
260 | | static const uint8_t pan_quant_class[20] = |
261 | | { |
262 | | 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
263 | | 2, 2, 2, 2, 3, 3, 3, 4, 4, 4 |
264 | | }; |
265 | | |
266 | | /* Inverse mapping lookup */ |
267 | | static const uint8_t pan_inv_freq[64] = { |
268 | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
269 | | 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, |
270 | | 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, |
271 | | 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 |
272 | | }; |
273 | | |
274 | | static const uint8_t sa_inv_freq[MAX_SA_BAND] = { |
275 | | 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, |
276 | | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, |
277 | | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, |
278 | | 7, 7, 7, 7, 7, 7, 7 |
279 | | }; |
280 | | |
281 | | static const real_t filter_coeff[] = |
282 | | { |
283 | | FRAC_CONST(0.65143905754106), |
284 | | FRAC_CONST(0.56471812200776), |
285 | | FRAC_CONST(0.48954165955695) |
286 | | }; |
287 | | |
288 | | static const uint8_t delay_length[3] = |
289 | | { |
290 | | 3, 4, 5 |
291 | | }; |
292 | | |
293 | | //static const real_t delay_fraction[] = |
294 | | //{ |
295 | | // FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) |
296 | | //}; |
297 | | |
298 | | static const real_t peak_decay = FRAC_CONST(0.76592833836465); |
299 | | |
300 | | static const real_t smooth_coeff = FRAC_CONST(0.25); |
301 | | |
302 | | /* Please note that these are the same tables as in plain PS */ |
303 | | static const complex_t Q_Fract_allpass_Qmf[][3] = { |
304 | | { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, |
305 | | { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, |
306 | | { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, |
307 | | { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, |
308 | | { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, |
309 | | { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, |
310 | | { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, |
311 | | { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, |
312 | | { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, |
313 | | { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, |
314 | | { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, |
315 | | { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, |
316 | | { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, |
317 | | { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, |
318 | | { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, |
319 | | { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, |
320 | | { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, |
321 | | { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, |
322 | | { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, |
323 | | { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, |
324 | | { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, |
325 | | { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, |
326 | | { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, |
327 | | { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, |
328 | | { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, |
329 | | { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, |
330 | | { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, |
331 | | { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, |
332 | | { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, |
333 | | { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, |
334 | | { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, |
335 | | { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, |
336 | | { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, |
337 | | { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, |
338 | | { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, |
339 | | { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, |
340 | | { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, |
341 | | { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, |
342 | | { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, |
343 | | { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, |
344 | | { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, |
345 | | { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, |
346 | | { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, |
347 | | { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, |
348 | | { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, |
349 | | { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, |
350 | | { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, |
351 | | { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, |
352 | | { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, |
353 | | { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, |
354 | | { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, |
355 | | { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, |
356 | | { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, |
357 | | { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, |
358 | | { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, |
359 | | { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, |
360 | | { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, |
361 | | { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, |
362 | | { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, |
363 | | { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, |
364 | | { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, |
365 | | { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, |
366 | | { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, |
367 | | { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } |
368 | | }; |
369 | | |
370 | | static const complex_t Phi_Fract_Qmf[] = { |
371 | | { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, |
372 | | { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, |
373 | | { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, |
374 | | { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, |
375 | | { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, |
376 | | { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, |
377 | | { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, |
378 | | { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, |
379 | | { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, |
380 | | { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, |
381 | | { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, |
382 | | { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, |
383 | | { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, |
384 | | { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, |
385 | | { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, |
386 | | { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, |
387 | | { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, |
388 | | { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, |
389 | | { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, |
390 | | { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, |
391 | | { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, |
392 | | { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, |
393 | | { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, |
394 | | { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, |
395 | | { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, |
396 | | { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, |
397 | | { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, |
398 | | { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, |
399 | | { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, |
400 | | { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, |
401 | | { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, |
402 | | { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, |
403 | | { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, |
404 | | { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, |
405 | | { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, |
406 | | { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, |
407 | | { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, |
408 | | { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, |
409 | | { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, |
410 | | { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, |
411 | | { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, |
412 | | { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, |
413 | | { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, |
414 | | { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, |
415 | | { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, |
416 | | { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, |
417 | | { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, |
418 | | { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, |
419 | | { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, |
420 | | { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, |
421 | | { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, |
422 | | { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, |
423 | | { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, |
424 | | { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, |
425 | | { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, |
426 | | { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, |
427 | | { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, |
428 | | { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, |
429 | | { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, |
430 | | { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, |
431 | | { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, |
432 | | { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, |
433 | | { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, |
434 | | { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } |
435 | | }; |
436 | | |
437 | | |
438 | | /* static function declarations */ |
439 | | static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld); |
440 | | static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld); |
441 | | static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff); |
442 | | |
443 | | |
444 | | uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld) |
445 | 793k | { |
446 | 793k | uint16_t bits = (uint16_t)faad_get_processed_bits(ld); |
447 | | |
448 | 793k | ps->drm_ps_data_available = 1; |
449 | | |
450 | 793k | ps->bs_enable_sa = faad_get1bit(ld); |
451 | 793k | ps->bs_enable_pan = faad_get1bit(ld); |
452 | | |
453 | 793k | if (ps->bs_enable_sa) |
454 | 17.3k | { |
455 | 17.3k | drm_ps_sa_element(ps, ld); |
456 | 17.3k | } |
457 | | |
458 | 793k | if (ps->bs_enable_pan) |
459 | 16.1k | { |
460 | 16.1k | drm_ps_pan_element(ps, ld); |
461 | 16.1k | } |
462 | | |
463 | 793k | bits = (uint16_t)faad_get_processed_bits(ld) - bits; |
464 | | |
465 | 793k | return bits; |
466 | 793k | } |
467 | | |
468 | | static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld) |
469 | 17.3k | { |
470 | 17.3k | drm_ps_huff_tab huff; |
471 | 17.3k | uint8_t band; |
472 | | |
473 | 17.3k | ps->bs_sa_dt_flag = faad_get1bit(ld); |
474 | 17.3k | if (ps->bs_sa_dt_flag) |
475 | 8.06k | { |
476 | 8.06k | huff = t_huffman_sa; |
477 | 9.25k | } else { |
478 | 9.25k | huff = f_huffman_sa; |
479 | 9.25k | } |
480 | | |
481 | 155k | for (band = 0; band < DRM_NUM_SA_BANDS; band++) |
482 | 138k | { |
483 | 138k | ps->bs_sa_data[band] = huff_dec(ld, huff); |
484 | 138k | } |
485 | 17.3k | } |
486 | | |
487 | | static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld) |
488 | 16.1k | { |
489 | 16.1k | drm_ps_huff_tab huff; |
490 | 16.1k | uint8_t band; |
491 | | |
492 | 16.1k | ps->bs_pan_dt_flag = faad_get1bit(ld); |
493 | 16.1k | if (ps->bs_pan_dt_flag) |
494 | 4.81k | { |
495 | 4.81k | huff = t_huffman_pan; |
496 | 11.3k | } else { |
497 | 11.3k | huff = f_huffman_pan; |
498 | 11.3k | } |
499 | | |
500 | 339k | for (band = 0; band < DRM_NUM_PAN_BANDS; band++) |
501 | 323k | { |
502 | 323k | ps->bs_pan_data[band] = huff_dec(ld, huff); |
503 | 323k | } |
504 | 16.1k | } |
505 | | |
506 | | /* binary search huffman decoding */ |
507 | | static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff) |
508 | 461k | { |
509 | 461k | uint8_t bit; |
510 | 461k | int8_t index = 0; |
511 | | |
512 | 1.27M | while (index >= 0) |
513 | 817k | { |
514 | 817k | bit = (uint8_t)faad_get1bit(ld); |
515 | 817k | index = huff[index][bit]; |
516 | 817k | } |
517 | | |
518 | 461k | return index + 15; |
519 | 461k | } |
520 | | |
521 | | |
522 | | static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i) |
523 | 688 | { |
524 | 688 | if (i < 0) { |
525 | | /* printf(" SAminclip %d", i); */ |
526 | 163 | ps->sa_decode_error = 1; |
527 | 163 | return 0; |
528 | 525 | } else if (i > 7) { |
529 | | /* printf(" SAmaxclip %d", i); */ |
530 | 73 | ps->sa_decode_error = 1; |
531 | 73 | return 7; |
532 | 73 | } else |
533 | 452 | return i; |
534 | 688 | } |
535 | | |
536 | | static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i) |
537 | 1.96k | { |
538 | 1.96k | if (i < -7) { |
539 | | /* printf(" PANminclip %d", i); */ |
540 | 192 | ps->pan_decode_error = 1; |
541 | 192 | return -7; |
542 | 1.76k | } else if (i > 7) { |
543 | | /* printf(" PANmaxclip %d", i); */ |
544 | 191 | ps->pan_decode_error = 1; |
545 | 191 | return 7; |
546 | 191 | } else |
547 | 1.57k | return i; |
548 | 1.96k | } |
549 | | |
550 | | static void drm_ps_delta_decode(drm_ps_info *ps) |
551 | 129 | { |
552 | 129 | uint8_t band; |
553 | | |
554 | 129 | if (ps->bs_enable_sa) |
555 | 110 | { |
556 | 110 | if (ps->bs_sa_dt_flag && !ps->g_last_had_sa) |
557 | 24 | { |
558 | | /* wait until we get a DT frame */ |
559 | 24 | ps->bs_enable_sa = 0; |
560 | 86 | } else if (ps->bs_sa_dt_flag) { |
561 | | /* DT frame, we have a last frame, so we can decode */ |
562 | 19 | ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]); |
563 | 67 | } else { |
564 | | /* DF always decodable */ |
565 | 67 | ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]); |
566 | 67 | } |
567 | | |
568 | 880 | for (band = 1; band < DRM_NUM_SA_BANDS; band++) |
569 | 770 | { |
570 | 770 | if (ps->bs_sa_dt_flag && ps->g_last_had_sa) |
571 | 133 | { |
572 | 133 | ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]); |
573 | 637 | } else if (!ps->bs_sa_dt_flag) { |
574 | 469 | ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]); |
575 | 469 | } |
576 | 770 | } |
577 | 110 | } |
578 | | |
579 | | /* An error during SA decoding implies PAN data will be undecodable, too */ |
580 | | /* Also, we don't like on/off switching in PS, so we force to last settings */ |
581 | 129 | if (ps->sa_decode_error) { |
582 | 61 | ps->pan_decode_error = 1; |
583 | 61 | ps->bs_enable_pan = ps->g_last_had_pan; |
584 | 61 | ps->bs_enable_sa = ps->g_last_had_sa; |
585 | 61 | } |
586 | | |
587 | | |
588 | 129 | if (ps->bs_enable_sa) |
589 | 61 | { |
590 | 61 | if (ps->sa_decode_error) { |
591 | 324 | for (band = 0; band < DRM_NUM_SA_BANDS; band++) |
592 | 288 | { |
593 | 288 | ps->g_sa_index[band] = ps->g_last_good_sa_index[band]; |
594 | 288 | } |
595 | 36 | } else { |
596 | 225 | for (band = 0; band < DRM_NUM_SA_BANDS; band++) |
597 | 200 | { |
598 | 200 | ps->g_last_good_sa_index[band] = ps->g_sa_index[band]; |
599 | 200 | } |
600 | 25 | } |
601 | 61 | } |
602 | | |
603 | 129 | if (ps->bs_enable_pan) |
604 | 103 | { |
605 | 103 | if (ps->bs_pan_dt_flag && !ps->g_last_had_pan) |
606 | 5 | { |
607 | 5 | ps->bs_enable_pan = 0; |
608 | 98 | } else if (ps->bs_pan_dt_flag) { |
609 | 34 | ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]); |
610 | 64 | } else { |
611 | 64 | ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]); |
612 | 64 | } |
613 | | |
614 | 2.06k | for (band = 1; band < DRM_NUM_PAN_BANDS; band++) |
615 | 1.95k | { |
616 | 1.95k | if (ps->bs_pan_dt_flag && ps->g_last_had_pan) |
617 | 646 | { |
618 | 646 | ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]); |
619 | 1.31k | } else if (!ps->bs_pan_dt_flag) { |
620 | 1.21k | ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]); |
621 | 1.21k | } |
622 | 1.95k | } |
623 | | |
624 | 103 | if (ps->pan_decode_error) { |
625 | 1.30k | for (band = 0; band < DRM_NUM_PAN_BANDS; band++) |
626 | 1.24k | { |
627 | 1.24k | ps->g_pan_index[band] = ps->g_last_good_pan_index[band]; |
628 | 1.24k | } |
629 | 62 | } else { |
630 | 861 | for (band = 0; band < DRM_NUM_PAN_BANDS; band++) |
631 | 820 | { |
632 | 820 | ps->g_last_good_pan_index[band] = ps->g_pan_index[band]; |
633 | 820 | } |
634 | 41 | } |
635 | 103 | } |
636 | 129 | } |
637 | | |
638 | | static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64]) |
639 | 237 | { |
640 | 237 | uint8_t s, b, k; |
641 | 237 | complex_t qfrac, tmp0, tmp, in, R0; |
642 | 237 | real_t peakdiff; |
643 | 237 | real_t nrg; |
644 | 237 | real_t power; |
645 | 237 | real_t transratio; |
646 | 237 | real_t new_delay_slopes[NUM_OF_LINKS]; |
647 | 237 | uint8_t temp_delay_ser[NUM_OF_LINKS]; |
648 | 237 | complex_t Phi_Fract; |
649 | | #ifdef FIXED_POINT |
650 | | uint32_t in_re, in_im; |
651 | | #endif |
652 | | |
653 | 5.68k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) |
654 | 5.45k | { |
655 | | /* set delay indices */ |
656 | 21.8k | for (k = 0; k < NUM_OF_LINKS; k++) |
657 | 16.3k | temp_delay_ser[k] = ps->delay_buf_index_ser[k]; |
658 | | |
659 | 5.45k | RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); |
660 | 5.45k | IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); |
661 | | |
662 | 168k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) |
663 | 163k | { |
664 | 163k | const real_t gamma = REAL_CONST(1.5); |
665 | 163k | const real_t sigma = REAL_CONST(1.5625); |
666 | | |
667 | 163k | RE(in) = QMF_RE(X[s][b]); |
668 | 163k | IM(in) = QMF_IM(X[s][b]); |
669 | | |
670 | | #ifdef FIXED_POINT |
671 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF |
672 | | * meaning that P will be scaled by 2^(-10) compared to floating point version |
673 | | */ |
674 | 18.6k | in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); |
675 | 18.6k | in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); |
676 | | power = in_re*in_re + in_im*in_im; |
677 | | #else |
678 | 144k | power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); |
679 | | #endif |
680 | | |
681 | 163k | ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay); |
682 | 163k | if (ps->peakdecay_fast[b] < power) |
683 | 10.0k | ps->peakdecay_fast[b] = power; |
684 | | |
685 | 163k | peakdiff = ps->prev_peakdiff[b]; |
686 | 163k | peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff); |
687 | 163k | ps->prev_peakdiff[b] = peakdiff; |
688 | | |
689 | 163k | nrg = ps->prev_nrg[b]; |
690 | 163k | nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff); |
691 | 163k | ps->prev_nrg[b] = nrg; |
692 | | |
693 | 163k | if (MUL_R(peakdiff, gamma) <= nrg) { |
694 | 156k | transratio = sigma; |
695 | 156k | } else { |
696 | 7.49k | transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); |
697 | 7.49k | } |
698 | | |
699 | 654k | for (k = 0; k < NUM_OF_LINKS; k++) |
700 | 490k | { |
701 | 490k | new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); |
702 | 490k | } |
703 | | |
704 | 163k | RE(tmp0) = RE(ps->d_buff[0][b]); |
705 | 163k | IM(tmp0) = IM(ps->d_buff[0][b]); |
706 | | |
707 | 163k | RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); |
708 | 163k | IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); |
709 | | |
710 | 163k | RE(ps->d_buff[1][b]) = RE(in); |
711 | 163k | IM(ps->d_buff[1][b]) = IM(in); |
712 | | |
713 | 163k | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); |
714 | | |
715 | 163k | RE(R0) = RE(tmp); |
716 | 163k | IM(R0) = IM(tmp); |
717 | | |
718 | 654k | for (k = 0; k < NUM_OF_LINKS; k++) |
719 | 490k | { |
720 | 490k | RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); |
721 | 490k | IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); |
722 | | |
723 | 490k | RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); |
724 | 490k | IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); |
725 | | |
726 | 490k | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); |
727 | | |
728 | 490k | RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); |
729 | 490k | IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); |
730 | | |
731 | 490k | RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); |
732 | 490k | IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); |
733 | | |
734 | 490k | RE(R0) = RE(tmp); |
735 | 490k | IM(R0) = IM(tmp); |
736 | 490k | } |
737 | | |
738 | 163k | QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); |
739 | 163k | QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); |
740 | | |
741 | 654k | for (k = 0; k < NUM_OF_LINKS; k++) |
742 | 490k | { |
743 | 490k | if (++temp_delay_ser[k] >= delay_length[k]) |
744 | 127k | temp_delay_ser[k] = 0; |
745 | 490k | } |
746 | 163k | } |
747 | 5.45k | } |
748 | | |
749 | 948 | for (k = 0; k < NUM_OF_LINKS; k++) |
750 | 711 | ps->delay_buf_index_ser[k] = temp_delay_ser[k]; |
751 | 237 | } drm_dec.c:drm_calc_sa_side_signal Line | Count | Source | 639 | 27 | { | 640 | 27 | uint8_t s, b, k; | 641 | 27 | complex_t qfrac, tmp0, tmp, in, R0; | 642 | 27 | real_t peakdiff; | 643 | 27 | real_t nrg; | 644 | 27 | real_t power; | 645 | 27 | real_t transratio; | 646 | 27 | real_t new_delay_slopes[NUM_OF_LINKS]; | 647 | 27 | uint8_t temp_delay_ser[NUM_OF_LINKS]; | 648 | 27 | complex_t Phi_Fract; | 649 | 27 | #ifdef FIXED_POINT | 650 | 27 | uint32_t in_re, in_im; | 651 | 27 | #endif | 652 | | | 653 | 648 | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) | 654 | 621 | { | 655 | | /* set delay indices */ | 656 | 2.48k | for (k = 0; k < NUM_OF_LINKS; k++) | 657 | 1.86k | temp_delay_ser[k] = ps->delay_buf_index_ser[k]; | 658 | | | 659 | 621 | RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); | 660 | 621 | IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); | 661 | | | 662 | 19.2k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 663 | 18.6k | { | 664 | 18.6k | const real_t gamma = REAL_CONST(1.5); | 665 | 18.6k | const real_t sigma = REAL_CONST(1.5625); | 666 | | | 667 | 18.6k | RE(in) = QMF_RE(X[s][b]); | 668 | 18.6k | IM(in) = QMF_IM(X[s][b]); | 669 | | | 670 | 18.6k | #ifdef FIXED_POINT | 671 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF | 672 | | * meaning that P will be scaled by 2^(-10) compared to floating point version | 673 | | */ | 674 | 18.6k | in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 675 | 18.6k | in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 676 | 18.6k | power = in_re*in_re + in_im*in_im; | 677 | | #else | 678 | | power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); | 679 | | #endif | 680 | | | 681 | 18.6k | ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay); | 682 | 18.6k | if (ps->peakdecay_fast[b] < power) | 683 | 2.13k | ps->peakdecay_fast[b] = power; | 684 | | | 685 | 18.6k | peakdiff = ps->prev_peakdiff[b]; | 686 | 18.6k | peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff); | 687 | 18.6k | ps->prev_peakdiff[b] = peakdiff; | 688 | | | 689 | 18.6k | nrg = ps->prev_nrg[b]; | 690 | 18.6k | nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff); | 691 | 18.6k | ps->prev_nrg[b] = nrg; | 692 | | | 693 | 18.6k | if (MUL_R(peakdiff, gamma) <= nrg) { | 694 | 17.6k | transratio = sigma; | 695 | 17.6k | } else { | 696 | 1.02k | transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); | 697 | 1.02k | } | 698 | | | 699 | 74.5k | for (k = 0; k < NUM_OF_LINKS; k++) | 700 | 55.8k | { | 701 | 55.8k | new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); | 702 | 55.8k | } | 703 | | | 704 | 18.6k | RE(tmp0) = RE(ps->d_buff[0][b]); | 705 | 18.6k | IM(tmp0) = IM(ps->d_buff[0][b]); | 706 | | | 707 | 18.6k | RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); | 708 | 18.6k | IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); | 709 | | | 710 | 18.6k | RE(ps->d_buff[1][b]) = RE(in); | 711 | 18.6k | IM(ps->d_buff[1][b]) = IM(in); | 712 | | | 713 | 18.6k | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); | 714 | | | 715 | 18.6k | RE(R0) = RE(tmp); | 716 | 18.6k | IM(R0) = IM(tmp); | 717 | | | 718 | 74.5k | for (k = 0; k < NUM_OF_LINKS; k++) | 719 | 55.8k | { | 720 | 55.8k | RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); | 721 | 55.8k | IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); | 722 | | | 723 | 55.8k | RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); | 724 | 55.8k | IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); | 725 | | | 726 | 55.8k | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); | 727 | | | 728 | 55.8k | RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); | 729 | 55.8k | IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); | 730 | | | 731 | 55.8k | RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); | 732 | 55.8k | IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); | 733 | | | 734 | 55.8k | RE(R0) = RE(tmp); | 735 | 55.8k | IM(R0) = IM(tmp); | 736 | 55.8k | } | 737 | | | 738 | 18.6k | QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); | 739 | 18.6k | QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); | 740 | | | 741 | 74.5k | for (k = 0; k < NUM_OF_LINKS; k++) | 742 | 55.8k | { | 743 | 55.8k | if (++temp_delay_ser[k] >= delay_length[k]) | 744 | 14.3k | temp_delay_ser[k] = 0; | 745 | 55.8k | } | 746 | 18.6k | } | 747 | 621 | } | 748 | | | 749 | 108 | for (k = 0; k < NUM_OF_LINKS; k++) | 750 | 81 | ps->delay_buf_index_ser[k] = temp_delay_ser[k]; | 751 | 27 | } |
drm_dec.c:drm_calc_sa_side_signal Line | Count | Source | 639 | 210 | { | 640 | 210 | uint8_t s, b, k; | 641 | 210 | complex_t qfrac, tmp0, tmp, in, R0; | 642 | 210 | real_t peakdiff; | 643 | 210 | real_t nrg; | 644 | 210 | real_t power; | 645 | 210 | real_t transratio; | 646 | 210 | real_t new_delay_slopes[NUM_OF_LINKS]; | 647 | 210 | uint8_t temp_delay_ser[NUM_OF_LINKS]; | 648 | 210 | complex_t Phi_Fract; | 649 | | #ifdef FIXED_POINT | 650 | | uint32_t in_re, in_im; | 651 | | #endif | 652 | | | 653 | 5.04k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) | 654 | 4.83k | { | 655 | | /* set delay indices */ | 656 | 19.3k | for (k = 0; k < NUM_OF_LINKS; k++) | 657 | 14.4k | temp_delay_ser[k] = ps->delay_buf_index_ser[k]; | 658 | | | 659 | 4.83k | RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); | 660 | 4.83k | IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); | 661 | | | 662 | 149k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 663 | 144k | { | 664 | 144k | const real_t gamma = REAL_CONST(1.5); | 665 | 144k | const real_t sigma = REAL_CONST(1.5625); | 666 | | | 667 | 144k | RE(in) = QMF_RE(X[s][b]); | 668 | 144k | IM(in) = QMF_IM(X[s][b]); | 669 | | | 670 | | #ifdef FIXED_POINT | 671 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF | 672 | | * meaning that P will be scaled by 2^(-10) compared to floating point version | 673 | | */ | 674 | | in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 675 | | in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 676 | | power = in_re*in_re + in_im*in_im; | 677 | | #else | 678 | 144k | power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); | 679 | 144k | #endif | 680 | | | 681 | 144k | ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay); | 682 | 144k | if (ps->peakdecay_fast[b] < power) | 683 | 7.91k | ps->peakdecay_fast[b] = power; | 684 | | | 685 | 144k | peakdiff = ps->prev_peakdiff[b]; | 686 | 144k | peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff); | 687 | 144k | ps->prev_peakdiff[b] = peakdiff; | 688 | | | 689 | 144k | nrg = ps->prev_nrg[b]; | 690 | 144k | nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff); | 691 | 144k | ps->prev_nrg[b] = nrg; | 692 | | | 693 | 144k | if (MUL_R(peakdiff, gamma) <= nrg) { | 694 | 138k | transratio = sigma; | 695 | 138k | } else { | 696 | 6.47k | transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); | 697 | 6.47k | } | 698 | | | 699 | 579k | for (k = 0; k < NUM_OF_LINKS; k++) | 700 | 434k | { | 701 | 434k | new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); | 702 | 434k | } | 703 | | | 704 | 144k | RE(tmp0) = RE(ps->d_buff[0][b]); | 705 | 144k | IM(tmp0) = IM(ps->d_buff[0][b]); | 706 | | | 707 | 144k | RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); | 708 | 144k | IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); | 709 | | | 710 | 144k | RE(ps->d_buff[1][b]) = RE(in); | 711 | 144k | IM(ps->d_buff[1][b]) = IM(in); | 712 | | | 713 | 144k | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); | 714 | | | 715 | 144k | RE(R0) = RE(tmp); | 716 | 144k | IM(R0) = IM(tmp); | 717 | | | 718 | 579k | for (k = 0; k < NUM_OF_LINKS; k++) | 719 | 434k | { | 720 | 434k | RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); | 721 | 434k | IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); | 722 | | | 723 | 434k | RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); | 724 | 434k | IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); | 725 | | | 726 | 434k | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); | 727 | | | 728 | 434k | RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); | 729 | 434k | IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); | 730 | | | 731 | 434k | RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); | 732 | 434k | IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); | 733 | | | 734 | 434k | RE(R0) = RE(tmp); | 735 | 434k | IM(R0) = IM(tmp); | 736 | 434k | } | 737 | | | 738 | 144k | QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); | 739 | 144k | QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); | 740 | | | 741 | 579k | for (k = 0; k < NUM_OF_LINKS; k++) | 742 | 434k | { | 743 | 434k | if (++temp_delay_ser[k] >= delay_length[k]) | 744 | 112k | temp_delay_ser[k] = 0; | 745 | 434k | } | 746 | 144k | } | 747 | 4.83k | } | 748 | | | 749 | 840 | for (k = 0; k < NUM_OF_LINKS; k++) | 750 | 630 | ps->delay_buf_index_ser[k] = temp_delay_ser[k]; | 751 | 210 | } |
|
752 | | |
753 | | static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) |
754 | 237 | { |
755 | 237 | uint8_t s, b, ifreq, qclass; |
756 | 237 | real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; |
757 | 237 | real_t new_dir_map, new_sa_map; |
758 | | |
759 | 237 | if (ps->bs_enable_sa) |
760 | 116 | { |
761 | | /* Instead of dequantization and mapping, we use an inverse mapping |
762 | | to look up all the values we need */ |
763 | 2.78k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) |
764 | 2.66k | { |
765 | 2.66k | const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); |
766 | | |
767 | 2.66k | ifreq = sa_inv_freq[b]; |
768 | 2.66k | qclass = (b != 0); |
769 | | |
770 | 2.66k | sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; |
771 | 2.66k | new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; |
772 | | |
773 | 2.66k | k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); |
774 | | |
775 | 2.66k | sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; |
776 | 2.66k | new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; |
777 | | |
778 | 2.66k | k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); |
779 | | |
780 | 2.66k | } |
781 | | |
782 | 3.59k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) |
783 | 3.48k | { |
784 | 83.5k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) |
785 | 80.0k | { |
786 | 80.0k | QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); |
787 | 80.0k | QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); |
788 | 80.0k | QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); |
789 | 80.0k | QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); |
790 | | |
791 | 80.0k | sa_map[b] += k_sa_map[b]; |
792 | 80.0k | sa_dir_map[b] += k_sa_dir_map[b]; |
793 | 80.0k | } |
794 | 146k | for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++) |
795 | 142k | { |
796 | 142k | QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); |
797 | 142k | QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); |
798 | 142k | } |
799 | 3.48k | } |
800 | 116 | } |
801 | 121 | else { |
802 | 3.75k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) |
803 | 3.63k | { |
804 | 235k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) |
805 | 232k | { |
806 | 232k | QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); |
807 | 232k | QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); |
808 | 232k | } |
809 | 3.63k | } |
810 | 121 | } |
811 | 237 | } drm_dec.c:drm_add_ambiance Line | Count | Source | 754 | 27 | { | 755 | 27 | uint8_t s, b, ifreq, qclass; | 756 | 27 | real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; | 757 | 27 | real_t new_dir_map, new_sa_map; | 758 | | | 759 | 27 | if (ps->bs_enable_sa) | 760 | 10 | { | 761 | | /* Instead of dequantization and mapping, we use an inverse mapping | 762 | | to look up all the values we need */ | 763 | 240 | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) | 764 | 230 | { | 765 | 230 | const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); | 766 | | | 767 | 230 | ifreq = sa_inv_freq[b]; | 768 | 230 | qclass = (b != 0); | 769 | | | 770 | 230 | sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; | 771 | 230 | new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; | 772 | | | 773 | 230 | k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); | 774 | | | 775 | 230 | sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; | 776 | 230 | new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; | 777 | | | 778 | 230 | k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); | 779 | | | 780 | 230 | } | 781 | | | 782 | 310 | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 783 | 300 | { | 784 | 7.20k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) | 785 | 6.90k | { | 786 | 6.90k | QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); | 787 | 6.90k | QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); | 788 | 6.90k | QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); | 789 | 6.90k | QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); | 790 | | | 791 | 6.90k | sa_map[b] += k_sa_map[b]; | 792 | 6.90k | sa_dir_map[b] += k_sa_dir_map[b]; | 793 | 6.90k | } | 794 | 12.6k | for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++) | 795 | 12.3k | { | 796 | 12.3k | QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); | 797 | 12.3k | QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); | 798 | 12.3k | } | 799 | 300 | } | 800 | 10 | } | 801 | 17 | else { | 802 | 527 | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 803 | 510 | { | 804 | 33.1k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) | 805 | 32.6k | { | 806 | 32.6k | QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); | 807 | 32.6k | QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); | 808 | 32.6k | } | 809 | 510 | } | 810 | 17 | } | 811 | 27 | } |
drm_dec.c:drm_add_ambiance Line | Count | Source | 754 | 210 | { | 755 | 210 | uint8_t s, b, ifreq, qclass; | 756 | 210 | real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; | 757 | 210 | real_t new_dir_map, new_sa_map; | 758 | | | 759 | 210 | if (ps->bs_enable_sa) | 760 | 106 | { | 761 | | /* Instead of dequantization and mapping, we use an inverse mapping | 762 | | to look up all the values we need */ | 763 | 2.54k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) | 764 | 2.43k | { | 765 | 2.43k | const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); | 766 | | | 767 | 2.43k | ifreq = sa_inv_freq[b]; | 768 | 2.43k | qclass = (b != 0); | 769 | | | 770 | 2.43k | sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; | 771 | 2.43k | new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; | 772 | | | 773 | 2.43k | k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); | 774 | | | 775 | 2.43k | sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; | 776 | 2.43k | new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; | 777 | | | 778 | 2.43k | k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); | 779 | | | 780 | 2.43k | } | 781 | | | 782 | 3.28k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 783 | 3.18k | { | 784 | 76.3k | for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) | 785 | 73.1k | { | 786 | 73.1k | QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); | 787 | 73.1k | QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); | 788 | 73.1k | QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); | 789 | 73.1k | QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); | 790 | | | 791 | 73.1k | sa_map[b] += k_sa_map[b]; | 792 | 73.1k | sa_dir_map[b] += k_sa_dir_map[b]; | 793 | 73.1k | } | 794 | 133k | for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++) | 795 | 130k | { | 796 | 130k | QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); | 797 | 130k | QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); | 798 | 130k | } | 799 | 3.18k | } | 800 | 106 | } | 801 | 104 | else { | 802 | 3.22k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 803 | 3.12k | { | 804 | 202k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) | 805 | 199k | { | 806 | 199k | QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); | 807 | 199k | QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); | 808 | 199k | } | 809 | 3.12k | } | 810 | 104 | } | 811 | 210 | } |
|
812 | | |
813 | | static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) |
814 | 154 | { |
815 | 154 | uint8_t s, b, qclass, ifreq; |
816 | 154 | real_t tmp, coeff1, coeff2; |
817 | 154 | real_t pan_base[MAX_PAN_BAND]; |
818 | 154 | real_t pan_delta[MAX_PAN_BAND]; |
819 | 154 | qmf_t temp_l, temp_r; |
820 | | |
821 | 154 | if (ps->bs_enable_pan) |
822 | 154 | { |
823 | 10.0k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) |
824 | 9.85k | { |
825 | | /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an |
826 | | inverse mapping 64->20 and look up the 2^G(x,y) values directly */ |
827 | 9.85k | ifreq = pan_inv_freq[b]; |
828 | 9.85k | qclass = pan_quant_class[ifreq]; |
829 | | |
830 | 9.85k | if (ps->g_prev_pan_index[ifreq] >= 0) |
831 | 9.32k | { |
832 | 9.32k | pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; |
833 | 9.32k | } else { |
834 | 536 | pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; |
835 | 536 | } |
836 | | |
837 | | /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ |
838 | | /* a en b can be negative so we may need to inverse parts */ |
839 | 9.85k | if (ps->g_pan_index[ifreq] >= 0) |
840 | 8.42k | { |
841 | 8.42k | if (ps->g_prev_pan_index[ifreq] >= 0) |
842 | 8.33k | { |
843 | 8.33k | pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], |
844 | 8.33k | pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); |
845 | 8.33k | } else { |
846 | 91 | pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], |
847 | 91 | pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); |
848 | 91 | } |
849 | 8.42k | } else { |
850 | 1.43k | if (ps->g_prev_pan_index[ifreq] >= 0) |
851 | 985 | { |
852 | 985 | pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], |
853 | 985 | pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); |
854 | 985 | } else { |
855 | 445 | pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], |
856 | 445 | pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); |
857 | 445 | } |
858 | 1.43k | } |
859 | 9.85k | } |
860 | | |
861 | 4.77k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) |
862 | 4.62k | { |
863 | | /* PAN always uses all 64 channels */ |
864 | 300k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) |
865 | 295k | { |
866 | 295k | tmp = pan_base[b]; |
867 | | |
868 | 295k | coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); |
869 | 295k | coeff1 = MUL_R(coeff2, tmp); |
870 | | |
871 | 295k | QMF_RE(temp_l) = QMF_RE(X_left[s][b]); |
872 | 295k | QMF_IM(temp_l) = QMF_IM(X_left[s][b]); |
873 | 295k | QMF_RE(temp_r) = QMF_RE(X_right[s][b]); |
874 | 295k | QMF_IM(temp_r) = QMF_IM(X_right[s][b]); |
875 | | |
876 | 295k | QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); |
877 | 295k | QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); |
878 | 295k | QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); |
879 | 295k | QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); |
880 | | |
881 | | /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ |
882 | | /* ^^^^^^^^^^^^^^^ k times */ |
883 | 295k | pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); |
884 | 295k | } |
885 | 4.62k | } |
886 | 154 | } |
887 | 154 | } Line | Count | Source | 814 | 14 | { | 815 | 14 | uint8_t s, b, qclass, ifreq; | 816 | 14 | real_t tmp, coeff1, coeff2; | 817 | 14 | real_t pan_base[MAX_PAN_BAND]; | 818 | 14 | real_t pan_delta[MAX_PAN_BAND]; | 819 | 14 | qmf_t temp_l, temp_r; | 820 | | | 821 | 14 | if (ps->bs_enable_pan) | 822 | 14 | { | 823 | 910 | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) | 824 | 896 | { | 825 | | /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an | 826 | | inverse mapping 64->20 and look up the 2^G(x,y) values directly */ | 827 | 896 | ifreq = pan_inv_freq[b]; | 828 | 896 | qclass = pan_quant_class[ifreq]; | 829 | | | 830 | 896 | if (ps->g_prev_pan_index[ifreq] >= 0) | 831 | 896 | { | 832 | 896 | pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; | 833 | 896 | } else { | 834 | 0 | pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; | 835 | 0 | } | 836 | | | 837 | | /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ | 838 | | /* a en b can be negative so we may need to inverse parts */ | 839 | 896 | if (ps->g_pan_index[ifreq] >= 0) | 840 | 778 | { | 841 | 778 | if (ps->g_prev_pan_index[ifreq] >= 0) | 842 | 778 | { | 843 | 778 | pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], | 844 | 778 | pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); | 845 | 778 | } else { | 846 | 0 | pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], | 847 | 0 | pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); | 848 | 0 | } | 849 | 778 | } else { | 850 | 118 | if (ps->g_prev_pan_index[ifreq] >= 0) | 851 | 118 | { | 852 | 118 | pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], | 853 | 118 | pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); | 854 | 118 | } else { | 855 | 0 | pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], | 856 | 0 | pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); | 857 | 0 | } | 858 | 118 | } | 859 | 896 | } | 860 | | | 861 | 434 | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 862 | 420 | { | 863 | | /* PAN always uses all 64 channels */ | 864 | 27.3k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) | 865 | 26.8k | { | 866 | 26.8k | tmp = pan_base[b]; | 867 | | | 868 | 26.8k | coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); | 869 | 26.8k | coeff1 = MUL_R(coeff2, tmp); | 870 | | | 871 | 26.8k | QMF_RE(temp_l) = QMF_RE(X_left[s][b]); | 872 | 26.8k | QMF_IM(temp_l) = QMF_IM(X_left[s][b]); | 873 | 26.8k | QMF_RE(temp_r) = QMF_RE(X_right[s][b]); | 874 | 26.8k | QMF_IM(temp_r) = QMF_IM(X_right[s][b]); | 875 | | | 876 | 26.8k | QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); | 877 | 26.8k | QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); | 878 | 26.8k | QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); | 879 | 26.8k | QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); | 880 | | | 881 | | /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ | 882 | | /* ^^^^^^^^^^^^^^^ k times */ | 883 | 26.8k | pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); | 884 | 26.8k | } | 885 | 420 | } | 886 | 14 | } | 887 | 14 | } |
Line | Count | Source | 814 | 140 | { | 815 | 140 | uint8_t s, b, qclass, ifreq; | 816 | 140 | real_t tmp, coeff1, coeff2; | 817 | 140 | real_t pan_base[MAX_PAN_BAND]; | 818 | 140 | real_t pan_delta[MAX_PAN_BAND]; | 819 | 140 | qmf_t temp_l, temp_r; | 820 | | | 821 | 140 | if (ps->bs_enable_pan) | 822 | 140 | { | 823 | 9.10k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) | 824 | 8.96k | { | 825 | | /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an | 826 | | inverse mapping 64->20 and look up the 2^G(x,y) values directly */ | 827 | 8.96k | ifreq = pan_inv_freq[b]; | 828 | 8.96k | qclass = pan_quant_class[ifreq]; | 829 | | | 830 | 8.96k | if (ps->g_prev_pan_index[ifreq] >= 0) | 831 | 8.42k | { | 832 | 8.42k | pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; | 833 | 8.42k | } else { | 834 | 536 | pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; | 835 | 536 | } | 836 | | | 837 | | /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ | 838 | | /* a en b can be negative so we may need to inverse parts */ | 839 | 8.96k | if (ps->g_pan_index[ifreq] >= 0) | 840 | 7.64k | { | 841 | 7.64k | if (ps->g_prev_pan_index[ifreq] >= 0) | 842 | 7.55k | { | 843 | 7.55k | pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], | 844 | 7.55k | pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); | 845 | 7.55k | } else { | 846 | 91 | pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], | 847 | 91 | pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); | 848 | 91 | } | 849 | 7.64k | } else { | 850 | 1.31k | if (ps->g_prev_pan_index[ifreq] >= 0) | 851 | 867 | { | 852 | 867 | pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], | 853 | 867 | pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); | 854 | 867 | } else { | 855 | 445 | pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], | 856 | 445 | pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); | 857 | 445 | } | 858 | 1.31k | } | 859 | 8.96k | } | 860 | | | 861 | 4.34k | for (s = 0; s < NUM_OF_SUBSAMPLES; s++) | 862 | 4.20k | { | 863 | | /* PAN always uses all 64 channels */ | 864 | 273k | for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) | 865 | 268k | { | 866 | 268k | tmp = pan_base[b]; | 867 | | | 868 | 268k | coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); | 869 | 268k | coeff1 = MUL_R(coeff2, tmp); | 870 | | | 871 | 268k | QMF_RE(temp_l) = QMF_RE(X_left[s][b]); | 872 | 268k | QMF_IM(temp_l) = QMF_IM(X_left[s][b]); | 873 | 268k | QMF_RE(temp_r) = QMF_RE(X_right[s][b]); | 874 | 268k | QMF_IM(temp_r) = QMF_IM(X_right[s][b]); | 875 | | | 876 | 268k | QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); | 877 | 268k | QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); | 878 | 268k | QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); | 879 | 268k | QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); | 880 | | | 881 | | /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ | 882 | | /* ^^^^^^^^^^^^^^^ k times */ | 883 | 268k | pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); | 884 | 268k | } | 885 | 4.20k | } | 886 | 140 | } | 887 | 140 | } |
|
888 | | |
889 | | drm_ps_info *drm_ps_init(void) |
890 | 6.48k | { |
891 | 6.48k | drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info)); |
892 | | |
893 | 6.48k | memset(ps, 0, sizeof(drm_ps_info)); |
894 | | |
895 | 6.48k | return ps; |
896 | 6.48k | } |
897 | | |
898 | | void drm_ps_free(drm_ps_info *ps) |
899 | 6.48k | { |
900 | 6.48k | faad_free(ps); |
901 | 6.48k | } |
902 | | |
903 | | /* main DRM PS decoding function */ |
904 | | uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]) |
905 | 251 | { |
906 | 251 | if (ps == NULL) |
907 | 13 | { |
908 | 13 | memcpy(X_right, X_left, sizeof(qmf_t)*30*64); |
909 | 13 | return 0; |
910 | 13 | } |
911 | | |
912 | 238 | if (!ps->drm_ps_data_available && !guess) |
913 | 1 | { |
914 | 1 | memcpy(X_right, X_left, sizeof(qmf_t)*30*64); |
915 | 1 | memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index)); |
916 | 1 | memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index)); |
917 | 1 | return 0; |
918 | 1 | } |
919 | | |
920 | | /* if SBR CRC doesn't match out, we can assume decode errors to start with, |
921 | | and we'll guess what the parameters should be */ |
922 | 237 | if (!guess) |
923 | 129 | { |
924 | 129 | ps->sa_decode_error = 0; |
925 | 129 | ps->pan_decode_error = 0; |
926 | 129 | drm_ps_delta_decode(ps); |
927 | 129 | } else |
928 | 108 | { |
929 | 108 | ps->sa_decode_error = 1; |
930 | 108 | ps->pan_decode_error = 1; |
931 | | /* don't even bother decoding */ |
932 | 108 | } |
933 | | |
934 | 237 | ps->drm_ps_data_available = 0; |
935 | | |
936 | 237 | drm_calc_sa_side_signal(ps, X_left); |
937 | 237 | drm_add_ambiance(ps, X_left, X_right); |
938 | | |
939 | 237 | if (ps->bs_enable_sa) |
940 | 116 | { |
941 | 116 | ps->g_last_had_sa = 1; |
942 | | |
943 | 116 | memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS); |
944 | | |
945 | 121 | } else { |
946 | 121 | ps->g_last_had_sa = 0; |
947 | 121 | } |
948 | | |
949 | 237 | if (ps->bs_enable_pan) |
950 | 154 | { |
951 | 154 | drm_add_pan(ps, X_left, X_right); |
952 | | |
953 | 154 | ps->g_last_had_pan = 1; |
954 | | |
955 | 154 | memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS); |
956 | | |
957 | 154 | } else { |
958 | 83 | ps->g_last_had_pan = 0; |
959 | 83 | } |
960 | | |
961 | | |
962 | 237 | return 0; |
963 | 238 | } |
964 | | |
965 | | #endif |