/proc/self/cwd/libfaad/ps_dec.c
Line | Count | Source (jump to first uncovered line) |
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: ps_dec.c,v 1.16 2009/01/26 22:32:31 menno Exp $ |
29 | | **/ |
30 | | |
31 | | #include "common.h" |
32 | | |
33 | | #ifdef PS_DEC |
34 | | |
35 | | #include <stdlib.h> |
36 | | #include <stdio.h> |
37 | | #include "ps_dec.h" |
38 | | #include "ps_tables.h" |
39 | | |
40 | | /* constants */ |
41 | 0 | #define NEGATE_IPD_MASK (0x1000) |
42 | 0 | #define DECAY_SLOPE FRAC_CONST(0.05) |
43 | | #define COEF_SQRT2 COEF_CONST(1.4142135623731) |
44 | | |
45 | | /* tables */ |
46 | | /* filters are mirrored in coef 6, second half left out */ |
47 | | static const real_t p8_13_20[7] = |
48 | | { |
49 | | FRAC_CONST(0.00746082949812), |
50 | | FRAC_CONST(0.02270420949825), |
51 | | FRAC_CONST(0.04546865930473), |
52 | | FRAC_CONST(0.07266113929591), |
53 | | FRAC_CONST(0.09885108575264), |
54 | | FRAC_CONST(0.11793710567217), |
55 | | FRAC_CONST(0.125) |
56 | | }; |
57 | | |
58 | | static const real_t p2_13_20[7] = |
59 | | { |
60 | | FRAC_CONST(0.0), |
61 | | FRAC_CONST(0.01899487526049), |
62 | | FRAC_CONST(0.0), |
63 | | FRAC_CONST(-0.07293139167538), |
64 | | FRAC_CONST(0.0), |
65 | | FRAC_CONST(0.30596630545168), |
66 | | FRAC_CONST(0.5) |
67 | | }; |
68 | | |
69 | | static const real_t p12_13_34[7] = |
70 | | { |
71 | | FRAC_CONST(0.04081179924692), |
72 | | FRAC_CONST(0.03812810994926), |
73 | | FRAC_CONST(0.05144908135699), |
74 | | FRAC_CONST(0.06399831151592), |
75 | | FRAC_CONST(0.07428313801106), |
76 | | FRAC_CONST(0.08100347892914), |
77 | | FRAC_CONST(0.08333333333333) |
78 | | }; |
79 | | |
80 | | static const real_t p8_13_34[7] = |
81 | | { |
82 | | FRAC_CONST(0.01565675600122), |
83 | | FRAC_CONST(0.03752716391991), |
84 | | FRAC_CONST(0.05417891378782), |
85 | | FRAC_CONST(0.08417044116767), |
86 | | FRAC_CONST(0.10307344158036), |
87 | | FRAC_CONST(0.12222452249753), |
88 | | FRAC_CONST(0.125) |
89 | | }; |
90 | | |
91 | | static const real_t p4_13_34[7] = |
92 | | { |
93 | | FRAC_CONST(-0.05908211155639), |
94 | | FRAC_CONST(-0.04871498374946), |
95 | | FRAC_CONST(0.0), |
96 | | FRAC_CONST(0.07778723915851), |
97 | | FRAC_CONST(0.16486303567403), |
98 | | FRAC_CONST(0.23279856662996), |
99 | | FRAC_CONST(0.25) |
100 | | }; |
101 | | |
102 | | #ifdef PARAM_32KHZ |
103 | | static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = { |
104 | | { 1, 2, 3 } /* d_24kHz */, |
105 | | { 3, 4, 5 } /* d_48kHz */ |
106 | | }; |
107 | | #else |
108 | | static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = { |
109 | | 3, 4, 5 /* d_48kHz */ |
110 | | }; |
111 | | #endif |
112 | | static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */ |
113 | | FRAC_CONST(0.65143905753106), |
114 | | FRAC_CONST(0.56471812200776), |
115 | | FRAC_CONST(0.48954165955695) |
116 | | }; |
117 | | |
118 | | static const uint8_t group_border20[10+12 + 1] = |
119 | | { |
120 | | 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */ |
121 | | 9, 8, /* 2 subqmf subbands */ |
122 | | 10, 11, /* 2 subqmf subbands */ |
123 | | 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 |
124 | | }; |
125 | | |
126 | | static const uint8_t group_border34[32+18 + 1] = |
127 | | { |
128 | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */ |
129 | | 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */ |
130 | | 20, 21, 22, 23, /* 4 subqmf subbands */ |
131 | | 24, 25, 26, 27, /* 4 subqmf subbands */ |
132 | | 28, 29, 30, 31, /* 4 subqmf subbands */ |
133 | | 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27 |
134 | | }; |
135 | | |
136 | | static const uint16_t map_group2bk20[10+12] = |
137 | | { |
138 | | (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), |
139 | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 |
140 | | }; |
141 | | |
142 | | static const uint16_t map_group2bk34[32+18] = |
143 | | { |
144 | | 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), |
145 | | 10, 10, 4, 5, 6, 7, 8, 9, |
146 | | 10, 11, 12, 9, |
147 | | 14, 11, 12, 13, |
148 | | 14, 15, 16, 13, |
149 | | 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 |
150 | | }; |
151 | | |
152 | | /* type definitions */ |
153 | | typedef struct |
154 | | { |
155 | | uint8_t frame_len; |
156 | | uint8_t resolution20[3]; |
157 | | uint8_t resolution34[5]; |
158 | | |
159 | | qmf_t *work; |
160 | | qmf_t **buffer; |
161 | | qmf_t **temp; |
162 | | } hyb_info; |
163 | | |
164 | | /* static function declarations */ |
165 | | static void ps_data_decode(ps_info *ps); |
166 | | static hyb_info *hybrid_init(uint8_t numTimeSlotsRate); |
167 | | static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
168 | | qmf_t *buffer, qmf_t **X_hybrid); |
169 | | static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); |
170 | | static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
171 | | qmf_t *buffer, qmf_t **X_hybrid); |
172 | | static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
173 | | uint8_t use34, uint8_t numTimeSlotsRate); |
174 | | static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
175 | | uint8_t use34, uint8_t numTimeSlotsRate); |
176 | | static int8_t delta_clip(int8_t i, int8_t min, int8_t max); |
177 | | static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
178 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
179 | | int8_t min_index, int8_t max_index); |
180 | | static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
181 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
182 | | int8_t and_modulo); |
183 | | static void map20indexto34(int8_t *index, uint8_t bins); |
184 | | #ifdef PS_LOW_POWER |
185 | | static void map34indexto20(int8_t *index, uint8_t bins); |
186 | | #endif |
187 | | static void ps_data_decode(ps_info *ps); |
188 | | static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
189 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); |
190 | | static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
191 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); |
192 | | |
193 | | /* */ |
194 | | |
195 | | |
196 | | static hyb_info *hybrid_init(uint8_t numTimeSlotsRate) |
197 | 0 | { |
198 | 0 | uint8_t i; |
199 | |
|
200 | 0 | hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info)); |
201 | |
|
202 | 0 | hyb->resolution34[0] = 12; |
203 | 0 | hyb->resolution34[1] = 8; |
204 | 0 | hyb->resolution34[2] = 4; |
205 | 0 | hyb->resolution34[3] = 4; |
206 | 0 | hyb->resolution34[4] = 4; |
207 | |
|
208 | 0 | hyb->resolution20[0] = 8; |
209 | 0 | hyb->resolution20[1] = 2; |
210 | 0 | hyb->resolution20[2] = 2; |
211 | |
|
212 | 0 | hyb->frame_len = numTimeSlotsRate; |
213 | |
|
214 | 0 | hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t)); |
215 | 0 | memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t)); |
216 | |
|
217 | 0 | hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*)); |
218 | 0 | for (i = 0; i < 5; i++) |
219 | 0 | { |
220 | 0 | hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t)); |
221 | 0 | memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t)); |
222 | 0 | } |
223 | |
|
224 | 0 | hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*)); |
225 | 0 | for (i = 0; i < hyb->frame_len; i++) |
226 | 0 | { |
227 | 0 | hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t)); |
228 | 0 | } |
229 | |
|
230 | 0 | return hyb; |
231 | 0 | } |
232 | | |
233 | | static void hybrid_free(hyb_info *hyb) |
234 | 0 | { |
235 | 0 | uint8_t i; |
236 | |
|
237 | 0 | if (!hyb) return; |
238 | | |
239 | 0 | if (hyb->work) |
240 | 0 | faad_free(hyb->work); |
241 | |
|
242 | 0 | for (i = 0; i < 5; i++) |
243 | 0 | { |
244 | 0 | if (hyb->buffer[i]) |
245 | 0 | faad_free(hyb->buffer[i]); |
246 | 0 | } |
247 | 0 | if (hyb->buffer) |
248 | 0 | faad_free(hyb->buffer); |
249 | |
|
250 | 0 | for (i = 0; i < hyb->frame_len; i++) |
251 | 0 | { |
252 | 0 | if (hyb->temp[i]) |
253 | 0 | faad_free(hyb->temp[i]); |
254 | 0 | } |
255 | 0 | if (hyb->temp) |
256 | 0 | faad_free(hyb->temp); |
257 | |
|
258 | 0 | faad_free(hyb); |
259 | 0 | } |
260 | | |
261 | | /* real filter, size 2 */ |
262 | | static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
263 | | qmf_t *buffer, qmf_t **X_hybrid) |
264 | 0 | { |
265 | 0 | uint8_t i; |
266 | 0 | (void)hyb; /* TODO: remove parameter? */ |
267 | |
|
268 | 0 | for (i = 0; i < frame_len; i++) |
269 | 0 | { |
270 | 0 | real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); |
271 | 0 | real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); |
272 | 0 | real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); |
273 | 0 | real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); |
274 | 0 | real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); |
275 | 0 | real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); |
276 | 0 | real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); |
277 | 0 | real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); |
278 | 0 | real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); |
279 | 0 | real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); |
280 | 0 | real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); |
281 | 0 | real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); |
282 | 0 | real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); |
283 | 0 | real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); |
284 | | |
285 | | /* q = 0 */ |
286 | 0 | QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; |
287 | 0 | QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; |
288 | | |
289 | | /* q = 1 */ |
290 | 0 | QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; |
291 | 0 | QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; |
292 | 0 | } |
293 | 0 | } |
294 | | |
295 | | /* complex filter, size 4 */ |
296 | | static void channel_filter4(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
297 | | qmf_t *buffer, qmf_t **X_hybrid) |
298 | 0 | { |
299 | 0 | uint8_t i; |
300 | 0 | real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; |
301 | 0 | (void)hyb; /* TODO: remove parameter? */ |
302 | |
|
303 | 0 | for (i = 0; i < frame_len; i++) |
304 | 0 | { |
305 | 0 | input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + |
306 | 0 | MUL_F(filter[6], QMF_RE(buffer[i+6])); |
307 | 0 | input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), |
308 | 0 | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + |
309 | 0 | MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - |
310 | 0 | MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); |
311 | |
|
312 | 0 | input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - |
313 | 0 | MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); |
314 | 0 | input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), |
315 | 0 | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - |
316 | 0 | MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - |
317 | 0 | MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); |
318 | |
|
319 | 0 | input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - |
320 | 0 | MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); |
321 | 0 | input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), |
322 | 0 | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - |
323 | 0 | MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - |
324 | 0 | MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); |
325 | |
|
326 | 0 | input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + |
327 | 0 | MUL_F(filter[6], QMF_IM(buffer[i+6])); |
328 | 0 | input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), |
329 | 0 | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + |
330 | 0 | MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - |
331 | 0 | MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); |
332 | | |
333 | | /* q == 0 */ |
334 | 0 | QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; |
335 | 0 | QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; |
336 | | |
337 | | /* q == 1 */ |
338 | 0 | QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; |
339 | 0 | QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; |
340 | | |
341 | | /* q == 2 */ |
342 | 0 | QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; |
343 | 0 | QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; |
344 | | |
345 | | /* q == 3 */ |
346 | 0 | QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; |
347 | 0 | QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; |
348 | 0 | } |
349 | 0 | } |
350 | | |
351 | | static void INLINE DCT3_4_unscaled(real_t *y, real_t *x) |
352 | 0 | { |
353 | 0 | real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; |
354 | |
|
355 | 0 | f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); |
356 | 0 | f1 = x[0] - f0; |
357 | 0 | f2 = x[0] + f0; |
358 | 0 | f3 = x[1] + x[3]; |
359 | 0 | f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); |
360 | 0 | f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); |
361 | 0 | f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); |
362 | 0 | f7 = f4 + f5; |
363 | 0 | f8 = f6 - f5; |
364 | 0 | y[3] = f2 - f8; |
365 | 0 | y[0] = f2 + f8; |
366 | 0 | y[2] = f1 - f7; |
367 | 0 | y[1] = f1 + f7; |
368 | 0 | } |
369 | | |
370 | | /* complex filter, size 8 */ |
371 | | static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
372 | | qmf_t *buffer, qmf_t **X_hybrid) |
373 | 0 | { |
374 | 0 | uint8_t i, n; |
375 | 0 | real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; |
376 | 0 | real_t x[4]; |
377 | 0 | (void)hyb; /* TODO: remove parameter? */ |
378 | |
|
379 | 0 | for (i = 0; i < frame_len; i++) |
380 | 0 | { |
381 | 0 | input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); |
382 | 0 | input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); |
383 | 0 | input_re1[2] = -MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))) + MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); |
384 | 0 | input_re1[3] = -MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))) + MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); |
385 | |
|
386 | 0 | input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); |
387 | 0 | input_im1[1] = MUL_F(filter[0],(QMF_IM(buffer[12+i]) - QMF_IM(buffer[0+i]))) + MUL_F(filter[4],(QMF_IM(buffer[8+i]) - QMF_IM(buffer[4+i]))); |
388 | 0 | input_im1[2] = MUL_F(filter[1],(QMF_IM(buffer[11+i]) - QMF_IM(buffer[1+i]))) + MUL_F(filter[3],(QMF_IM(buffer[9+i]) - QMF_IM(buffer[3+i]))); |
389 | 0 | input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); |
390 | |
|
391 | 0 | for (n = 0; n < 4; n++) |
392 | 0 | { |
393 | 0 | x[n] = input_re1[n] - input_im1[3-n]; |
394 | 0 | } |
395 | 0 | DCT3_4_unscaled(x, x); |
396 | 0 | QMF_RE(X_hybrid[i][7]) = x[0]; |
397 | 0 | QMF_RE(X_hybrid[i][5]) = x[2]; |
398 | 0 | QMF_RE(X_hybrid[i][3]) = x[3]; |
399 | 0 | QMF_RE(X_hybrid[i][1]) = x[1]; |
400 | |
|
401 | 0 | for (n = 0; n < 4; n++) |
402 | 0 | { |
403 | 0 | x[n] = input_re1[n] + input_im1[3-n]; |
404 | 0 | } |
405 | 0 | DCT3_4_unscaled(x, x); |
406 | 0 | QMF_RE(X_hybrid[i][6]) = x[1]; |
407 | 0 | QMF_RE(X_hybrid[i][4]) = x[3]; |
408 | 0 | QMF_RE(X_hybrid[i][2]) = x[2]; |
409 | 0 | QMF_RE(X_hybrid[i][0]) = x[0]; |
410 | |
|
411 | 0 | input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); |
412 | 0 | input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); |
413 | 0 | input_im2[2] = -MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))) + MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); |
414 | 0 | input_im2[3] = -MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))) + MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); |
415 | |
|
416 | 0 | input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); |
417 | 0 | input_re2[1] = MUL_F(filter[0],(QMF_RE(buffer[12+i]) - QMF_RE(buffer[0+i]))) + MUL_F(filter[4],(QMF_RE(buffer[8+i]) - QMF_RE(buffer[4+i]))); |
418 | 0 | input_re2[2] = MUL_F(filter[1],(QMF_RE(buffer[11+i]) - QMF_RE(buffer[1+i]))) + MUL_F(filter[3],(QMF_RE(buffer[9+i]) - QMF_RE(buffer[3+i]))); |
419 | 0 | input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); |
420 | |
|
421 | 0 | for (n = 0; n < 4; n++) |
422 | 0 | { |
423 | 0 | x[n] = input_im2[n] + input_re2[3-n]; |
424 | 0 | } |
425 | 0 | DCT3_4_unscaled(x, x); |
426 | 0 | QMF_IM(X_hybrid[i][7]) = x[0]; |
427 | 0 | QMF_IM(X_hybrid[i][5]) = x[2]; |
428 | 0 | QMF_IM(X_hybrid[i][3]) = x[3]; |
429 | 0 | QMF_IM(X_hybrid[i][1]) = x[1]; |
430 | |
|
431 | 0 | for (n = 0; n < 4; n++) |
432 | 0 | { |
433 | 0 | x[n] = input_im2[n] - input_re2[3-n]; |
434 | 0 | } |
435 | 0 | DCT3_4_unscaled(x, x); |
436 | 0 | QMF_IM(X_hybrid[i][6]) = x[1]; |
437 | 0 | QMF_IM(X_hybrid[i][4]) = x[3]; |
438 | 0 | QMF_IM(X_hybrid[i][2]) = x[2]; |
439 | 0 | QMF_IM(X_hybrid[i][0]) = x[0]; |
440 | 0 | } |
441 | 0 | } |
442 | | |
443 | | static void INLINE DCT3_6_unscaled(real_t *y, real_t *x) |
444 | 0 | { |
445 | 0 | real_t f0, f1, f2, f3, f4, f5, f6, f7; |
446 | |
|
447 | 0 | f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); |
448 | 0 | f1 = x[0] + f0; |
449 | 0 | f2 = x[0] - f0; |
450 | 0 | f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); |
451 | 0 | f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); |
452 | 0 | f5 = f4 - x[4]; |
453 | 0 | f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); |
454 | 0 | f7 = f6 - f3; |
455 | 0 | y[0] = f1 + f6 + f4; |
456 | 0 | y[1] = f2 + f3 - x[4]; |
457 | 0 | y[2] = f7 + f2 - f5; |
458 | 0 | y[3] = f1 - f7 - f5; |
459 | 0 | y[4] = f1 - f3 - x[4]; |
460 | 0 | y[5] = f2 - f6 + f4; |
461 | 0 | } |
462 | | |
463 | | /* complex filter, size 12 */ |
464 | | static void channel_filter12(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
465 | | qmf_t *buffer, qmf_t **X_hybrid) |
466 | 0 | { |
467 | 0 | uint8_t i, n; |
468 | 0 | real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; |
469 | 0 | real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; |
470 | 0 | (void)hyb; /* TODO: remove parameter? */ |
471 | |
|
472 | 0 | for (i = 0; i < frame_len; i++) |
473 | 0 | { |
474 | 0 | for (n = 0; n < 6; n++) |
475 | 0 | { |
476 | 0 | if (n == 0) |
477 | 0 | { |
478 | 0 | input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); |
479 | 0 | input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); |
480 | 0 | } else { |
481 | 0 | input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); |
482 | 0 | input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); |
483 | 0 | } |
484 | 0 | input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); |
485 | 0 | input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); |
486 | 0 | } |
487 | |
|
488 | 0 | DCT3_6_unscaled(out_re1, input_re1); |
489 | 0 | DCT3_6_unscaled(out_re2, input_re2); |
490 | |
|
491 | 0 | DCT3_6_unscaled(out_im1, input_im1); |
492 | 0 | DCT3_6_unscaled(out_im2, input_im2); |
493 | |
|
494 | 0 | for (n = 0; n < 6; n += 2) |
495 | 0 | { |
496 | 0 | QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; |
497 | 0 | QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; |
498 | 0 | QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; |
499 | 0 | QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; |
500 | |
|
501 | 0 | QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; |
502 | 0 | QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; |
503 | 0 | QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; |
504 | 0 | QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; |
505 | 0 | } |
506 | 0 | } |
507 | 0 | } |
508 | | |
509 | | /* Hybrid analysis: further split up QMF subbands |
510 | | * to improve frequency resolution |
511 | | */ |
512 | | static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
513 | | uint8_t use34, uint8_t numTimeSlotsRate) |
514 | 0 | { |
515 | 0 | uint8_t k, n, band; |
516 | 0 | uint8_t offset = 0; |
517 | 0 | uint8_t qmf_bands = (use34) ? 5 : 3; |
518 | 0 | uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; |
519 | |
|
520 | 0 | for (band = 0; band < qmf_bands; band++) |
521 | 0 | { |
522 | | /* build working buffer */ |
523 | 0 | memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t)); |
524 | | |
525 | | /* add new samples */ |
526 | 0 | for (n = 0; n < hyb->frame_len; n++) |
527 | 0 | { |
528 | 0 | QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]); |
529 | 0 | QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]); |
530 | 0 | } |
531 | | |
532 | | /* store samples */ |
533 | 0 | memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t)); |
534 | | |
535 | |
|
536 | 0 | switch(resolution[band]) |
537 | 0 | { |
538 | 0 | case 2: |
539 | | /* Type B real filter, Q[p] = 2 */ |
540 | 0 | channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp); |
541 | 0 | break; |
542 | 0 | case 4: |
543 | | /* Type A complex filter, Q[p] = 4 */ |
544 | 0 | channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp); |
545 | 0 | break; |
546 | 0 | case 8: |
547 | | /* Type A complex filter, Q[p] = 8 */ |
548 | 0 | channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20, |
549 | 0 | hyb->work, hyb->temp); |
550 | 0 | break; |
551 | 0 | case 12: |
552 | | /* Type A complex filter, Q[p] = 12 */ |
553 | 0 | channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp); |
554 | 0 | break; |
555 | 0 | } |
556 | | |
557 | 0 | for (n = 0; n < hyb->frame_len; n++) |
558 | 0 | { |
559 | 0 | for (k = 0; k < resolution[band]; k++) |
560 | 0 | { |
561 | 0 | QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]); |
562 | 0 | QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]); |
563 | 0 | } |
564 | 0 | } |
565 | 0 | offset += resolution[band]; |
566 | 0 | } |
567 | | |
568 | | /* group hybrid channels */ |
569 | 0 | if (!use34) |
570 | 0 | { |
571 | 0 | for (n = 0; n < numTimeSlotsRate; n++) |
572 | 0 | { |
573 | 0 | QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]); |
574 | 0 | QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]); |
575 | 0 | QMF_RE(X_hybrid[n][4]) = 0; |
576 | 0 | QMF_IM(X_hybrid[n][4]) = 0; |
577 | |
|
578 | 0 | QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]); |
579 | 0 | QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]); |
580 | 0 | QMF_RE(X_hybrid[n][5]) = 0; |
581 | 0 | QMF_IM(X_hybrid[n][5]) = 0; |
582 | 0 | } |
583 | 0 | } |
584 | 0 | } |
585 | | |
586 | | static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
587 | | uint8_t use34, uint8_t numTimeSlotsRate) |
588 | 0 | { |
589 | 0 | uint8_t k, n, band; |
590 | 0 | uint8_t offset = 0; |
591 | 0 | uint8_t qmf_bands = (use34) ? 5 : 3; |
592 | 0 | uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; |
593 | 0 | (void)numTimeSlotsRate; /* TODO: remove parameter? */ |
594 | |
|
595 | 0 | for(band = 0; band < qmf_bands; band++) |
596 | 0 | { |
597 | 0 | for (n = 0; n < hyb->frame_len; n++) |
598 | 0 | { |
599 | 0 | QMF_RE(X[n][band]) = 0; |
600 | 0 | QMF_IM(X[n][band]) = 0; |
601 | |
|
602 | 0 | for (k = 0; k < resolution[band]; k++) |
603 | 0 | { |
604 | 0 | QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]); |
605 | 0 | QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]); |
606 | 0 | } |
607 | 0 | } |
608 | 0 | offset += resolution[band]; |
609 | 0 | } |
610 | 0 | } |
611 | | |
612 | | /* limits the value i to the range [min,max] */ |
613 | | static int8_t delta_clip(int8_t i, int8_t min, int8_t max) |
614 | 0 | { |
615 | 0 | if (i < min) |
616 | 0 | return min; |
617 | 0 | else if (i > max) |
618 | 0 | return max; |
619 | 0 | else |
620 | 0 | return i; |
621 | 0 | } |
622 | | |
623 | | //int iid = 0; |
624 | | |
625 | | /* delta decode array */ |
626 | | static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
627 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
628 | | int8_t min_index, int8_t max_index) |
629 | 0 | { |
630 | 0 | int8_t i; |
631 | |
|
632 | 0 | if (enable == 1) |
633 | 0 | { |
634 | 0 | if (dt_flag == 0) |
635 | 0 | { |
636 | | /* delta coded in frequency direction */ |
637 | 0 | index[0] = 0 + index[0]; |
638 | 0 | index[0] = delta_clip(index[0], min_index, max_index); |
639 | |
|
640 | 0 | for (i = 1; i < nr_par; i++) |
641 | 0 | { |
642 | 0 | index[i] = index[i-1] + index[i]; |
643 | 0 | index[i] = delta_clip(index[i], min_index, max_index); |
644 | 0 | } |
645 | 0 | } else { |
646 | | /* delta coded in time direction */ |
647 | 0 | for (i = 0; i < nr_par; i++) |
648 | 0 | { |
649 | | //int8_t tmp2; |
650 | | //int8_t tmp = index[i]; |
651 | | |
652 | | //printf("%d %d\n", index_prev[i*stride], index[i]); |
653 | | //printf("%d\n", index[i]); |
654 | |
|
655 | 0 | index[i] = index_prev[i*stride] + index[i]; |
656 | | //tmp2 = index[i]; |
657 | 0 | index[i] = delta_clip(index[i], min_index, max_index); |
658 | | |
659 | | //if (iid) |
660 | | //{ |
661 | | // if (index[i] == 7) |
662 | | // { |
663 | | // printf("%d %d %d\n", index_prev[i*stride], tmp, tmp2); |
664 | | // } |
665 | | //} |
666 | 0 | } |
667 | 0 | } |
668 | 0 | } else { |
669 | | /* set indices to zero */ |
670 | 0 | for (i = 0; i < nr_par; i++) |
671 | 0 | { |
672 | 0 | index[i] = 0; |
673 | 0 | } |
674 | 0 | } |
675 | | |
676 | | /* coarse */ |
677 | 0 | if (stride == 2) |
678 | 0 | { |
679 | 0 | for (i = (nr_par<<1)-1; i > 0; i--) |
680 | 0 | { |
681 | 0 | index[i] = index[i>>1]; |
682 | 0 | } |
683 | 0 | } |
684 | 0 | } |
685 | | |
686 | | /* delta modulo decode array */ |
687 | | /* in: log2 value of the modulo value to allow using AND instead of MOD */ |
688 | | static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
689 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
690 | | int8_t and_modulo) |
691 | 0 | { |
692 | 0 | int8_t i; |
693 | |
|
694 | 0 | if (enable == 1) |
695 | 0 | { |
696 | 0 | if (dt_flag == 0) |
697 | 0 | { |
698 | | /* delta coded in frequency direction */ |
699 | 0 | index[0] = 0 + index[0]; |
700 | 0 | index[0] &= and_modulo; |
701 | |
|
702 | 0 | for (i = 1; i < nr_par; i++) |
703 | 0 | { |
704 | 0 | index[i] = index[i-1] + index[i]; |
705 | 0 | index[i] &= and_modulo; |
706 | 0 | } |
707 | 0 | } else { |
708 | | /* delta coded in time direction */ |
709 | 0 | for (i = 0; i < nr_par; i++) |
710 | 0 | { |
711 | 0 | index[i] = index_prev[i*stride] + index[i]; |
712 | 0 | index[i] &= and_modulo; |
713 | 0 | } |
714 | 0 | } |
715 | 0 | } else { |
716 | | /* set indices to zero */ |
717 | 0 | for (i = 0; i < nr_par; i++) |
718 | 0 | { |
719 | 0 | index[i] = 0; |
720 | 0 | } |
721 | 0 | } |
722 | | |
723 | | /* coarse */ |
724 | 0 | if (stride == 2) |
725 | 0 | { |
726 | 0 | index[0] = 0; |
727 | 0 | for (i = (nr_par<<1)-1; i > 0; i--) |
728 | 0 | { |
729 | 0 | index[i] = index[i>>1]; |
730 | 0 | } |
731 | 0 | } |
732 | 0 | } |
733 | | |
734 | | #ifdef PS_LOW_POWER |
735 | | static void map34indexto20(int8_t *index, uint8_t bins) |
736 | | { |
737 | | index[0] = (2*index[0]+index[1])/3; |
738 | | index[1] = (index[1]+2*index[2])/3; |
739 | | index[2] = (2*index[3]+index[4])/3; |
740 | | index[3] = (index[4]+2*index[5])/3; |
741 | | index[4] = (index[6]+index[7])/2; |
742 | | index[5] = (index[8]+index[9])/2; |
743 | | index[6] = index[10]; |
744 | | index[7] = index[11]; |
745 | | index[8] = (index[12]+index[13])/2; |
746 | | index[9] = (index[14]+index[15])/2; |
747 | | index[10] = index[16]; |
748 | | |
749 | | if (bins == 34) |
750 | | { |
751 | | index[11] = index[17]; |
752 | | index[12] = index[18]; |
753 | | index[13] = index[19]; |
754 | | index[14] = (index[20]+index[21])/2; |
755 | | index[15] = (index[22]+index[23])/2; |
756 | | index[16] = (index[24]+index[25])/2; |
757 | | index[17] = (index[26]+index[27])/2; |
758 | | index[18] = (index[28]+index[29]+index[30]+index[31])/4; |
759 | | index[19] = (index[32]+index[33])/2; |
760 | | } |
761 | | } |
762 | | #endif |
763 | | |
764 | | static void map20indexto34(int8_t *index, uint8_t bins) |
765 | 0 | { |
766 | 0 | index[0] = index[0]; |
767 | 0 | index[1] = (index[0] + index[1])/2; |
768 | 0 | index[2] = index[1]; |
769 | 0 | index[3] = index[2]; |
770 | 0 | index[4] = (index[2] + index[3])/2; |
771 | 0 | index[5] = index[3]; |
772 | 0 | index[6] = index[4]; |
773 | 0 | index[7] = index[4]; |
774 | 0 | index[8] = index[5]; |
775 | 0 | index[9] = index[5]; |
776 | 0 | index[10] = index[6]; |
777 | 0 | index[11] = index[7]; |
778 | 0 | index[12] = index[8]; |
779 | 0 | index[13] = index[8]; |
780 | 0 | index[14] = index[9]; |
781 | 0 | index[15] = index[9]; |
782 | 0 | index[16] = index[10]; |
783 | |
|
784 | 0 | if (bins == 34) |
785 | 0 | { |
786 | 0 | index[17] = index[11]; |
787 | 0 | index[18] = index[12]; |
788 | 0 | index[19] = index[13]; |
789 | 0 | index[20] = index[14]; |
790 | 0 | index[21] = index[14]; |
791 | 0 | index[22] = index[15]; |
792 | 0 | index[23] = index[15]; |
793 | 0 | index[24] = index[16]; |
794 | 0 | index[25] = index[16]; |
795 | 0 | index[26] = index[17]; |
796 | 0 | index[27] = index[17]; |
797 | 0 | index[28] = index[18]; |
798 | 0 | index[29] = index[18]; |
799 | 0 | index[30] = index[18]; |
800 | 0 | index[31] = index[18]; |
801 | 0 | index[32] = index[19]; |
802 | 0 | index[33] = index[19]; |
803 | 0 | } |
804 | 0 | } |
805 | | |
806 | | /* parse the bitstream data decoded in ps_data() */ |
807 | | static void ps_data_decode(ps_info *ps) |
808 | 0 | { |
809 | 0 | uint8_t env, bin; |
810 | | |
811 | | /* ps data not available, use data from previous frame */ |
812 | 0 | if (ps->ps_data_available == 0) |
813 | 0 | { |
814 | 0 | ps->num_env = 0; |
815 | 0 | } |
816 | |
|
817 | 0 | for (env = 0; env < ps->num_env; env++) |
818 | 0 | { |
819 | 0 | int8_t *iid_index_prev; |
820 | 0 | int8_t *icc_index_prev; |
821 | 0 | int8_t *ipd_index_prev; |
822 | 0 | int8_t *opd_index_prev; |
823 | |
|
824 | 0 | int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/; |
825 | |
|
826 | 0 | if (env == 0) |
827 | 0 | { |
828 | | /* take last envelope from previous frame */ |
829 | 0 | iid_index_prev = ps->iid_index_prev; |
830 | 0 | icc_index_prev = ps->icc_index_prev; |
831 | 0 | ipd_index_prev = ps->ipd_index_prev; |
832 | 0 | opd_index_prev = ps->opd_index_prev; |
833 | 0 | } else { |
834 | | /* take index values from previous envelope */ |
835 | 0 | iid_index_prev = ps->iid_index[env - 1]; |
836 | 0 | icc_index_prev = ps->icc_index[env - 1]; |
837 | 0 | ipd_index_prev = ps->ipd_index[env - 1]; |
838 | 0 | opd_index_prev = ps->opd_index[env - 1]; |
839 | 0 | } |
840 | | |
841 | | // iid = 1; |
842 | | /* delta decode iid parameters */ |
843 | 0 | delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev, |
844 | 0 | ps->iid_dt[env], ps->nr_iid_par, |
845 | 0 | (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1, |
846 | 0 | -num_iid_steps, num_iid_steps); |
847 | | // iid = 0; |
848 | | |
849 | | /* delta decode icc parameters */ |
850 | 0 | delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev, |
851 | 0 | ps->icc_dt[env], ps->nr_icc_par, |
852 | 0 | (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1, |
853 | 0 | 0, 7); |
854 | | |
855 | | /* delta modulo decode ipd parameters */ |
856 | 0 | delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev, |
857 | 0 | ps->ipd_dt[env], ps->nr_ipdopd_par, 1, 7); |
858 | | |
859 | | /* delta modulo decode opd parameters */ |
860 | 0 | delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev, |
861 | 0 | ps->opd_dt[env], ps->nr_ipdopd_par, 1, 7); |
862 | 0 | } |
863 | | |
864 | | /* handle error case */ |
865 | 0 | if (ps->num_env == 0) |
866 | 0 | { |
867 | | /* force to 1 */ |
868 | 0 | ps->num_env = 1; |
869 | |
|
870 | 0 | if (ps->enable_iid) |
871 | 0 | { |
872 | 0 | for (bin = 0; bin < 34; bin++) |
873 | 0 | ps->iid_index[0][bin] = ps->iid_index_prev[bin]; |
874 | 0 | } else { |
875 | 0 | for (bin = 0; bin < 34; bin++) |
876 | 0 | ps->iid_index[0][bin] = 0; |
877 | 0 | } |
878 | |
|
879 | 0 | if (ps->enable_icc) |
880 | 0 | { |
881 | 0 | for (bin = 0; bin < 34; bin++) |
882 | 0 | ps->icc_index[0][bin] = ps->icc_index_prev[bin]; |
883 | 0 | } else { |
884 | 0 | for (bin = 0; bin < 34; bin++) |
885 | 0 | ps->icc_index[0][bin] = 0; |
886 | 0 | } |
887 | |
|
888 | 0 | if (ps->enable_ipdopd) |
889 | 0 | { |
890 | 0 | for (bin = 0; bin < 17; bin++) |
891 | 0 | { |
892 | 0 | ps->ipd_index[0][bin] = ps->ipd_index_prev[bin]; |
893 | 0 | ps->opd_index[0][bin] = ps->opd_index_prev[bin]; |
894 | 0 | } |
895 | 0 | } else { |
896 | 0 | for (bin = 0; bin < 17; bin++) |
897 | 0 | { |
898 | 0 | ps->ipd_index[0][bin] = 0; |
899 | 0 | ps->opd_index[0][bin] = 0; |
900 | 0 | } |
901 | 0 | } |
902 | 0 | } |
903 | | |
904 | | /* update previous indices */ |
905 | 0 | for (bin = 0; bin < 34; bin++) |
906 | 0 | ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin]; |
907 | 0 | for (bin = 0; bin < 34; bin++) |
908 | 0 | ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin]; |
909 | 0 | for (bin = 0; bin < 17; bin++) |
910 | 0 | { |
911 | 0 | ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin]; |
912 | 0 | ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin]; |
913 | 0 | } |
914 | |
|
915 | 0 | ps->ps_data_available = 0; |
916 | |
|
917 | 0 | if (ps->frame_class == 0) |
918 | 0 | { |
919 | 0 | ps->border_position[0] = 0; |
920 | 0 | for (env = 1; env < ps->num_env; env++) |
921 | 0 | { |
922 | 0 | ps->border_position[env] = (env * ps->numTimeSlotsRate) / ps->num_env; |
923 | 0 | } |
924 | 0 | ps->border_position[ps->num_env] = ps->numTimeSlotsRate; |
925 | 0 | } else { |
926 | 0 | ps->border_position[0] = 0; |
927 | |
|
928 | 0 | if (ps->border_position[ps->num_env] < ps->numTimeSlotsRate) |
929 | 0 | { |
930 | 0 | for (bin = 0; bin < 34; bin++) |
931 | 0 | { |
932 | 0 | ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin]; |
933 | 0 | ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin]; |
934 | 0 | } |
935 | 0 | for (bin = 0; bin < 17; bin++) |
936 | 0 | { |
937 | 0 | ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin]; |
938 | 0 | ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin]; |
939 | 0 | } |
940 | 0 | ps->num_env++; |
941 | 0 | ps->border_position[ps->num_env] = ps->numTimeSlotsRate; |
942 | 0 | } |
943 | |
|
944 | 0 | for (env = 1; env < ps->num_env; env++) |
945 | 0 | { |
946 | 0 | int8_t thr = ps->numTimeSlotsRate - (ps->num_env - env); |
947 | |
|
948 | 0 | if (ps->border_position[env] > thr) |
949 | 0 | { |
950 | 0 | ps->border_position[env] = thr; |
951 | 0 | } else { |
952 | 0 | thr = ps->border_position[env-1]+1; |
953 | 0 | if (ps->border_position[env] < thr) |
954 | 0 | { |
955 | 0 | ps->border_position[env] = thr; |
956 | 0 | } |
957 | 0 | } |
958 | 0 | } |
959 | 0 | } |
960 | | |
961 | | /* make sure that the indices of all parameters can be mapped |
962 | | * to the same hybrid synthesis filterbank |
963 | | */ |
964 | | #ifdef PS_LOW_POWER |
965 | | for (env = 0; env < ps->num_env; env++) |
966 | | { |
967 | | if (ps->iid_mode == 2 || ps->iid_mode == 5) |
968 | | map34indexto20(ps->iid_index[env], 34); |
969 | | if (ps->icc_mode == 2 || ps->icc_mode == 5) |
970 | | map34indexto20(ps->icc_index[env], 34); |
971 | | |
972 | | /* disable ipd/opd */ |
973 | | for (bin = 0; bin < 17; bin++) |
974 | | { |
975 | | ps->aaIpdIndex[env][bin] = 0; |
976 | | ps->aaOpdIndex[env][bin] = 0; |
977 | | } |
978 | | } |
979 | | #else |
980 | 0 | if (ps->use34hybrid_bands) |
981 | 0 | { |
982 | 0 | for (env = 0; env < ps->num_env; env++) |
983 | 0 | { |
984 | 0 | if (ps->iid_mode != 2 && ps->iid_mode != 5) |
985 | 0 | map20indexto34(ps->iid_index[env], 34); |
986 | 0 | if (ps->icc_mode != 2 && ps->icc_mode != 5) |
987 | 0 | map20indexto34(ps->icc_index[env], 34); |
988 | 0 | if (ps->ipd_mode != 2 && ps->ipd_mode != 5) |
989 | 0 | { |
990 | 0 | map20indexto34(ps->ipd_index[env], 17); |
991 | 0 | map20indexto34(ps->opd_index[env], 17); |
992 | 0 | } |
993 | 0 | } |
994 | 0 | } |
995 | 0 | #endif |
996 | |
|
997 | | #if 0 |
998 | | for (env = 0; env < ps->num_env; env++) |
999 | | { |
1000 | | printf("iid[env:%d]:", env); |
1001 | | for (bin = 0; bin < 34; bin++) |
1002 | | { |
1003 | | printf(" %d", ps->iid_index[env][bin]); |
1004 | | } |
1005 | | printf("\n"); |
1006 | | } |
1007 | | for (env = 0; env < ps->num_env; env++) |
1008 | | { |
1009 | | printf("icc[env:%d]:", env); |
1010 | | for (bin = 0; bin < 34; bin++) |
1011 | | { |
1012 | | printf(" %d", ps->icc_index[env][bin]); |
1013 | | } |
1014 | | printf("\n"); |
1015 | | } |
1016 | | for (env = 0; env < ps->num_env; env++) |
1017 | | { |
1018 | | printf("ipd[env:%d]:", env); |
1019 | | for (bin = 0; bin < 17; bin++) |
1020 | | { |
1021 | | printf(" %d", ps->ipd_index[env][bin]); |
1022 | | } |
1023 | | printf("\n"); |
1024 | | } |
1025 | | for (env = 0; env < ps->num_env; env++) |
1026 | | { |
1027 | | printf("opd[env:%d]:", env); |
1028 | | for (bin = 0; bin < 17; bin++) |
1029 | | { |
1030 | | printf(" %d", ps->opd_index[env][bin]); |
1031 | | } |
1032 | | printf("\n"); |
1033 | | } |
1034 | | printf("\n"); |
1035 | | #endif |
1036 | 0 | } |
1037 | | |
1038 | | /* decorrelate the mono signal using an allpass filter */ |
1039 | | static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
1040 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) |
1041 | 0 | { |
1042 | 0 | uint8_t gr, n, bk; |
1043 | 0 | uint8_t temp_delay = 0; |
1044 | 0 | uint8_t sb, maxsb; |
1045 | 0 | const complex_t *Phi_Fract_SubQmf; |
1046 | 0 | uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; |
1047 | 0 | real_t P_SmoothPeakDecayDiffNrg, nrg; |
1048 | 0 | real_t P[32][34]; |
1049 | 0 | real_t G_TransientRatio[32][34] = {{0}}; |
1050 | 0 | complex_t inputLeft; |
1051 | | |
1052 | | |
1053 | | /* chose hybrid filterbank: 20 or 34 band case */ |
1054 | 0 | if (ps->use34hybrid_bands) |
1055 | 0 | { |
1056 | 0 | Phi_Fract_SubQmf = Phi_Fract_SubQmf34; |
1057 | 0 | } else{ |
1058 | 0 | Phi_Fract_SubQmf = Phi_Fract_SubQmf20; |
1059 | 0 | } |
1060 | | |
1061 | | /* clear the energy values */ |
1062 | 0 | for (n = 0; n < 32; n++) |
1063 | 0 | { |
1064 | 0 | for (bk = 0; bk < 34; bk++) |
1065 | 0 | { |
1066 | 0 | P[n][bk] = 0; |
1067 | 0 | } |
1068 | 0 | } |
1069 | | |
1070 | | /* calculate the energy in each parameter band b(k) */ |
1071 | 0 | for (gr = 0; gr < ps->num_groups; gr++) |
1072 | 0 | { |
1073 | | /* select the parameter index b(k) to which this group belongs */ |
1074 | 0 | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; |
1075 | | |
1076 | | /* select the upper subband border for this group */ |
1077 | 0 | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; |
1078 | |
|
1079 | 0 | for (sb = ps->group_border[gr]; sb < maxsb; sb++) |
1080 | 0 | { |
1081 | 0 | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) |
1082 | 0 | { |
1083 | | #ifdef FIXED_POINT |
1084 | | uint32_t in_re, in_im; |
1085 | | #endif |
1086 | | |
1087 | | /* input from hybrid subbands or QMF subbands */ |
1088 | 0 | if (gr < ps->num_hybrid_groups) |
1089 | 0 | { |
1090 | 0 | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); |
1091 | 0 | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); |
1092 | 0 | } else { |
1093 | 0 | RE(inputLeft) = QMF_RE(X_left[n][sb]); |
1094 | 0 | IM(inputLeft) = QMF_IM(X_left[n][sb]); |
1095 | 0 | } |
1096 | | |
1097 | | /* accumulate energy */ |
1098 | | #ifdef FIXED_POINT |
1099 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF |
1100 | | * meaning that P will be scaled by 2^(-10) compared to floating point version |
1101 | | */ |
1102 | | in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); |
1103 | | in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); |
1104 | | P[n][bk] += in_re*in_re + in_im*in_im; |
1105 | | #else |
1106 | 0 | P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); |
1107 | 0 | #endif |
1108 | 0 | } |
1109 | 0 | } |
1110 | 0 | } |
1111 | |
|
1112 | | #if 0 |
1113 | | for (n = 0; n < 32; n++) |
1114 | | { |
1115 | | for (bk = 0; bk < 34; bk++) |
1116 | | { |
1117 | | #ifdef FIXED_POINT |
1118 | | printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); |
1119 | | #else |
1120 | | printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); |
1121 | | #endif |
1122 | | } |
1123 | | } |
1124 | | #endif |
1125 | | |
1126 | | /* calculate transient reduction ratio for each parameter band b(k) */ |
1127 | 0 | for (bk = 0; bk < ps->nr_par_bands; bk++) |
1128 | 0 | { |
1129 | 0 | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) |
1130 | 0 | { |
1131 | 0 | const real_t gamma = COEF_CONST(1.5); |
1132 | |
|
1133 | 0 | ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); |
1134 | 0 | if (ps->P_PeakDecayNrg[bk] < P[n][bk]) |
1135 | 0 | ps->P_PeakDecayNrg[bk] = P[n][bk]; |
1136 | | |
1137 | | /* apply smoothing filter to peak decay energy */ |
1138 | 0 | P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; |
1139 | 0 | P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); |
1140 | 0 | ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; |
1141 | | |
1142 | | /* apply smoothing filter to energy */ |
1143 | 0 | nrg = ps->P_prev[bk]; |
1144 | 0 | nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); |
1145 | 0 | ps->P_prev[bk] = nrg; |
1146 | | |
1147 | | /* calculate transient ratio */ |
1148 | 0 | if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) |
1149 | 0 | { |
1150 | 0 | G_TransientRatio[n][bk] = REAL_CONST(1.0); |
1151 | 0 | } else { |
1152 | 0 | G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); |
1153 | 0 | } |
1154 | 0 | } |
1155 | 0 | } |
1156 | |
|
1157 | | #if 0 |
1158 | | for (n = 0; n < 32; n++) |
1159 | | { |
1160 | | for (bk = 0; bk < 34; bk++) |
1161 | | { |
1162 | | #ifdef FIXED_POINT |
1163 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); |
1164 | | #else |
1165 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); |
1166 | | #endif |
1167 | | } |
1168 | | } |
1169 | | #endif |
1170 | | |
1171 | | /* apply stereo decorrelation filter to the signal */ |
1172 | 0 | for (gr = 0; gr < ps->num_groups; gr++) |
1173 | 0 | { |
1174 | 0 | if (gr < ps->num_hybrid_groups) |
1175 | 0 | maxsb = ps->group_border[gr] + 1; |
1176 | 0 | else |
1177 | 0 | maxsb = ps->group_border[gr + 1]; |
1178 | | |
1179 | | /* QMF channel */ |
1180 | 0 | for (sb = ps->group_border[gr]; sb < maxsb; sb++) |
1181 | 0 | { |
1182 | 0 | real_t g_DecaySlope; |
1183 | 0 | real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; |
1184 | | |
1185 | | /* g_DecaySlope: [0..1] */ |
1186 | 0 | if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) |
1187 | 0 | { |
1188 | 0 | g_DecaySlope = FRAC_CONST(1.0); |
1189 | 0 | } else { |
1190 | 0 | int8_t decay = ps->decay_cutoff - sb; |
1191 | 0 | if (decay <= -20 /* -1/DECAY_SLOPE */) |
1192 | 0 | { |
1193 | 0 | g_DecaySlope = 0; |
1194 | 0 | } else { |
1195 | | /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ |
1196 | 0 | g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; |
1197 | 0 | } |
1198 | 0 | } |
1199 | | |
1200 | | /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */ |
1201 | 0 | for (n = 0; n < NO_ALLPASS_LINKS; n++) |
1202 | 0 | { |
1203 | 0 | g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]); |
1204 | 0 | } |
1205 | | |
1206 | | |
1207 | | /* set delay indices */ |
1208 | 0 | temp_delay = ps->saved_delay; |
1209 | 0 | for (n = 0; n < NO_ALLPASS_LINKS; n++) |
1210 | 0 | temp_delay_ser[n] = ps->delay_buf_index_ser[n]; |
1211 | |
|
1212 | 0 | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) |
1213 | 0 | { |
1214 | 0 | complex_t tmp, tmp0, R0; |
1215 | 0 | uint8_t m; |
1216 | |
|
1217 | 0 | if (gr < ps->num_hybrid_groups) |
1218 | 0 | { |
1219 | | /* hybrid filterbank input */ |
1220 | 0 | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); |
1221 | 0 | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); |
1222 | 0 | } else { |
1223 | | /* QMF filterbank input */ |
1224 | 0 | RE(inputLeft) = QMF_RE(X_left[n][sb]); |
1225 | 0 | IM(inputLeft) = QMF_IM(X_left[n][sb]); |
1226 | 0 | } |
1227 | |
|
1228 | 0 | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) |
1229 | 0 | { |
1230 | | /* delay */ |
1231 | | |
1232 | | /* never hybrid subbands here, always QMF subbands */ |
1233 | 0 | RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); |
1234 | 0 | IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); |
1235 | 0 | RE(R0) = RE(tmp); |
1236 | 0 | IM(R0) = IM(tmp); |
1237 | 0 | RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); |
1238 | 0 | IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); |
1239 | 0 | } else { |
1240 | | /* allpass filter */ |
1241 | 0 | complex_t Phi_Fract; |
1242 | | |
1243 | | /* fetch parameters */ |
1244 | 0 | if (gr < ps->num_hybrid_groups) |
1245 | 0 | { |
1246 | | /* select data from the hybrid subbands */ |
1247 | 0 | RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); |
1248 | 0 | IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); |
1249 | |
|
1250 | 0 | RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); |
1251 | 0 | IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); |
1252 | |
|
1253 | 0 | RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); |
1254 | 0 | IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); |
1255 | 0 | } else { |
1256 | | /* select data from the QMF subbands */ |
1257 | 0 | RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); |
1258 | 0 | IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); |
1259 | |
|
1260 | 0 | RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); |
1261 | 0 | IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); |
1262 | |
|
1263 | 0 | RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); |
1264 | 0 | IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); |
1265 | 0 | } |
1266 | | |
1267 | | /* z^(-2) * Phi_Fract[k] */ |
1268 | 0 | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); |
1269 | |
|
1270 | 0 | RE(R0) = RE(tmp); |
1271 | 0 | IM(R0) = IM(tmp); |
1272 | 0 | for (m = 0; m < NO_ALLPASS_LINKS; m++) |
1273 | 0 | { |
1274 | 0 | complex_t Q_Fract_allpass, tmp2; |
1275 | | |
1276 | | /* fetch parameters */ |
1277 | 0 | if (gr < ps->num_hybrid_groups) |
1278 | 0 | { |
1279 | | /* select data from the hybrid subbands */ |
1280 | 0 | RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); |
1281 | 0 | IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); |
1282 | |
|
1283 | 0 | if (ps->use34hybrid_bands) |
1284 | 0 | { |
1285 | 0 | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); |
1286 | 0 | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); |
1287 | 0 | } else { |
1288 | 0 | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); |
1289 | 0 | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); |
1290 | 0 | } |
1291 | 0 | } else { |
1292 | | /* select data from the QMF subbands */ |
1293 | 0 | RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); |
1294 | 0 | IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); |
1295 | |
|
1296 | 0 | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); |
1297 | 0 | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); |
1298 | 0 | } |
1299 | | |
1300 | | /* delay by a fraction */ |
1301 | | /* z^(-d(m)) * Q_Fract_allpass[k,m] */ |
1302 | 0 | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); |
1303 | | |
1304 | | /* -a(m) * g_DecaySlope[k] */ |
1305 | 0 | RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); |
1306 | 0 | IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); |
1307 | | |
1308 | | /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ |
1309 | 0 | RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); |
1310 | 0 | IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); |
1311 | | |
1312 | | /* store sample */ |
1313 | 0 | if (gr < ps->num_hybrid_groups) |
1314 | 0 | { |
1315 | 0 | RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); |
1316 | 0 | IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); |
1317 | 0 | } else { |
1318 | 0 | RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); |
1319 | 0 | IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); |
1320 | 0 | } |
1321 | | |
1322 | | /* store for next iteration (or as output value if last iteration) */ |
1323 | 0 | RE(R0) = RE(tmp); |
1324 | 0 | IM(R0) = IM(tmp); |
1325 | 0 | } |
1326 | 0 | } |
1327 | | |
1328 | | /* select b(k) for reading the transient ratio */ |
1329 | 0 | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; |
1330 | | |
1331 | | /* duck if a past transient is found */ |
1332 | 0 | RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); |
1333 | 0 | IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); |
1334 | |
|
1335 | 0 | if (gr < ps->num_hybrid_groups) |
1336 | 0 | { |
1337 | | /* hybrid */ |
1338 | 0 | QMF_RE(X_hybrid_right[n][sb]) = RE(R0); |
1339 | 0 | QMF_IM(X_hybrid_right[n][sb]) = IM(R0); |
1340 | 0 | } else { |
1341 | | /* QMF */ |
1342 | 0 | QMF_RE(X_right[n][sb]) = RE(R0); |
1343 | 0 | QMF_IM(X_right[n][sb]) = IM(R0); |
1344 | 0 | } |
1345 | | |
1346 | | /* Update delay buffer index */ |
1347 | 0 | if (++temp_delay >= 2) |
1348 | 0 | { |
1349 | 0 | temp_delay = 0; |
1350 | 0 | } |
1351 | | |
1352 | | /* update delay indices */ |
1353 | 0 | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) |
1354 | 0 | { |
1355 | | /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ |
1356 | 0 | if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) |
1357 | 0 | { |
1358 | 0 | ps->delay_buf_index_delay[sb] = 0; |
1359 | 0 | } |
1360 | 0 | } |
1361 | |
|
1362 | 0 | for (m = 0; m < NO_ALLPASS_LINKS; m++) |
1363 | 0 | { |
1364 | 0 | if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) |
1365 | 0 | { |
1366 | 0 | temp_delay_ser[m] = 0; |
1367 | 0 | } |
1368 | 0 | } |
1369 | 0 | } |
1370 | 0 | } |
1371 | 0 | } |
1372 | | |
1373 | | /* update delay indices */ |
1374 | 0 | ps->saved_delay = temp_delay; |
1375 | 0 | for (n = 0; n < NO_ALLPASS_LINKS; n++) |
1376 | 0 | ps->delay_buf_index_ser[n] = temp_delay_ser[n]; |
1377 | 0 | } |
1378 | | |
1379 | | #if 0 |
1380 | | #ifdef FIXED_POINT |
1381 | | #define step(shift) \ |
1382 | | if ((0x40000000l >> shift) + root <= value) \ |
1383 | | { \ |
1384 | | value -= (0x40000000l >> shift) + root; \ |
1385 | | root = (root >> 1) | (0x40000000l >> shift); \ |
1386 | | } else { \ |
1387 | | root = root >> 1; \ |
1388 | | } |
1389 | | |
1390 | | /* fixed point square root approximation */ |
1391 | | static real_t ps_sqrt(real_t value) |
1392 | | { |
1393 | | real_t root = 0; |
1394 | | |
1395 | | step( 0); step( 2); step( 4); step( 6); |
1396 | | step( 8); step(10); step(12); step(14); |
1397 | | step(16); step(18); step(20); step(22); |
1398 | | step(24); step(26); step(28); step(30); |
1399 | | |
1400 | | if (root < value) |
1401 | | ++root; |
1402 | | |
1403 | | root <<= (REAL_BITS/2); |
1404 | | |
1405 | | return root; |
1406 | | } |
1407 | | #else |
1408 | | #define ps_sqrt(A) sqrt(A) |
1409 | | #endif |
1410 | | #endif |
1411 | | |
1412 | | static const real_t ipdopd_cos_tab[] = { |
1413 | | FRAC_CONST(1.000000000000000), |
1414 | | FRAC_CONST(0.707106781186548), |
1415 | | FRAC_CONST(0.000000000000000), |
1416 | | FRAC_CONST(-0.707106781186547), |
1417 | | FRAC_CONST(-1.000000000000000), |
1418 | | FRAC_CONST(-0.707106781186548), |
1419 | | FRAC_CONST(-0.000000000000000), |
1420 | | FRAC_CONST(0.707106781186547), |
1421 | | FRAC_CONST(1.000000000000000) |
1422 | | }; |
1423 | | |
1424 | | static const real_t ipdopd_sin_tab[] = { |
1425 | | FRAC_CONST(0.000000000000000), |
1426 | | FRAC_CONST(0.707106781186547), |
1427 | | FRAC_CONST(1.000000000000000), |
1428 | | FRAC_CONST(0.707106781186548), |
1429 | | FRAC_CONST(0.000000000000000), |
1430 | | FRAC_CONST(-0.707106781186547), |
1431 | | FRAC_CONST(-1.000000000000000), |
1432 | | FRAC_CONST(-0.707106781186548), |
1433 | | FRAC_CONST(-0.000000000000000) |
1434 | | }; |
1435 | | |
1436 | | static real_t magnitude_c(complex_t c) |
1437 | 0 | { |
1438 | | #ifdef FIXED_POINT |
1439 | | #define ps_abs(A) (((A) > 0) ? (A) : (-(A))) |
1440 | | #define ALPHA FRAC_CONST(0.948059448969) |
1441 | | #define BETA FRAC_CONST(0.392699081699) |
1442 | | |
1443 | | real_t abs_inphase = ps_abs(RE(c)); |
1444 | | real_t abs_quadrature = ps_abs(IM(c)); |
1445 | | |
1446 | | if (abs_inphase > abs_quadrature) { |
1447 | | return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA); |
1448 | | } else { |
1449 | | return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA); |
1450 | | } |
1451 | | #else |
1452 | 0 | return sqrt(RE(c)*RE(c) + IM(c)*IM(c)); |
1453 | 0 | #endif |
1454 | 0 | } |
1455 | | |
1456 | | static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
1457 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) |
1458 | 0 | { |
1459 | 0 | uint8_t n; |
1460 | 0 | uint8_t gr; |
1461 | 0 | uint8_t bk = 0; |
1462 | 0 | uint8_t sb, maxsb; |
1463 | 0 | uint8_t env; |
1464 | 0 | uint8_t nr_ipdopd_par; |
1465 | 0 | complex_t h11, h12, h21, h22; // COEF |
1466 | 0 | complex_t H11, H12, H21, H22; // COEF |
1467 | 0 | complex_t deltaH11, deltaH12, deltaH21, deltaH22; // COEF |
1468 | 0 | complex_t tempLeft, tempRight; // FRAC |
1469 | 0 | complex_t phaseLeft, phaseRight; // FRAC |
1470 | 0 | real_t L; |
1471 | 0 | const real_t *sf_iid; |
1472 | 0 | uint8_t no_iid_steps; |
1473 | |
|
1474 | 0 | if (ps->iid_mode >= 3) |
1475 | 0 | { |
1476 | 0 | no_iid_steps = 15; |
1477 | 0 | sf_iid = sf_iid_fine; |
1478 | 0 | } else { |
1479 | 0 | no_iid_steps = 7; |
1480 | 0 | sf_iid = sf_iid_normal; |
1481 | 0 | } |
1482 | |
|
1483 | 0 | if (ps->ipd_mode == 0 || ps->ipd_mode == 3) |
1484 | 0 | { |
1485 | 0 | nr_ipdopd_par = 11; /* resolution */ |
1486 | 0 | } else { |
1487 | 0 | nr_ipdopd_par = ps->nr_ipdopd_par; |
1488 | 0 | } |
1489 | |
|
1490 | 0 | for (gr = 0; gr < ps->num_groups; gr++) |
1491 | 0 | { |
1492 | 0 | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; |
1493 | | |
1494 | | /* use one channel per group in the subqmf domain */ |
1495 | 0 | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; |
1496 | |
|
1497 | 0 | for (env = 0; env < ps->num_env; env++) |
1498 | 0 | { |
1499 | 0 | uint8_t abs_iid = (uint8_t)abs(ps->iid_index[env][bk]); |
1500 | | /* index range is supposed to be -7...7 or -15...15 depending on iid_mode |
1501 | | (Table 8.24, ISO/IEC 14496-3:2005). |
1502 | | if it is outside these boundaries, this is most likely an error. sanitize |
1503 | | it and try to process further. */ |
1504 | 0 | if (ps->iid_index[env][bk] < -no_iid_steps) { |
1505 | 0 | fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk], |
1506 | 0 | -no_iid_steps); |
1507 | 0 | ps->iid_index[env][bk] = -no_iid_steps; |
1508 | 0 | abs_iid = no_iid_steps; |
1509 | 0 | } else if (ps->iid_index[env][bk] > no_iid_steps) { |
1510 | 0 | fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk], |
1511 | 0 | no_iid_steps); |
1512 | 0 | ps->iid_index[env][bk] = no_iid_steps; |
1513 | 0 | abs_iid = no_iid_steps; |
1514 | 0 | } |
1515 | 0 | if (ps->icc_index[env][bk] < 0) { |
1516 | 0 | fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]); |
1517 | 0 | ps->icc_index[env][bk] = 0; |
1518 | 0 | } else if (ps->icc_index[env][bk] > 7) { |
1519 | 0 | fprintf(stderr, "Warning: invalid icc_index: %d > 7\n", ps->icc_index[env][bk]); |
1520 | 0 | ps->icc_index[env][bk] = 7; |
1521 | 0 | } |
1522 | |
|
1523 | 0 | if (ps->icc_mode < 3) |
1524 | 0 | { |
1525 | | /* type 'A' mixing as described in 8.6.4.6.2.1 */ |
1526 | 0 | real_t c_1, c_2; // COEF |
1527 | 0 | real_t cosa, sina; // COEF |
1528 | 0 | real_t cosb, sinb; // COEF |
1529 | 0 | real_t ab1, ab2; // COEF |
1530 | 0 | real_t ab3, ab4; // COEF |
1531 | | |
1532 | | /* |
1533 | | c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); |
1534 | | c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); |
1535 | | alpha = 0.5 * acos(quant_rho[icc_index]); |
1536 | | beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); |
1537 | | */ |
1538 | | |
1539 | | //printf("%d\n", ps->iid_index[env][bk]); |
1540 | | |
1541 | | /* calculate the scalefactors c_1 and c_2 from the intensity differences */ |
1542 | 0 | c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; |
1543 | 0 | c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; |
1544 | | |
1545 | | /* calculate alpha and beta using the ICC parameters */ |
1546 | 0 | cosa = cos_alphas[ps->icc_index[env][bk]]; |
1547 | 0 | sina = sin_alphas[ps->icc_index[env][bk]]; |
1548 | |
|
1549 | 0 | if (ps->iid_mode >= 3) |
1550 | 0 | { |
1551 | 0 | cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]]; |
1552 | 0 | sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]]; |
1553 | 0 | } else { |
1554 | 0 | cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]]; |
1555 | 0 | sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]]; |
1556 | 0 | } |
1557 | |
|
1558 | 0 | ab1 = MUL_C(cosb, cosa); |
1559 | 0 | ab2 = MUL_C(sinb, sina); |
1560 | 0 | ab3 = MUL_C(sinb, cosa); |
1561 | 0 | ab4 = MUL_C(cosb, sina); |
1562 | | |
1563 | | /* h_xy: COEF */ |
1564 | 0 | RE(h11) = MUL_C(c_2, (ab1 - ab2)); |
1565 | 0 | RE(h12) = MUL_C(c_1, (ab1 + ab2)); |
1566 | 0 | RE(h21) = MUL_C(c_2, (ab3 + ab4)); |
1567 | 0 | RE(h22) = MUL_C(c_1, (ab3 - ab4)); |
1568 | 0 | } else { |
1569 | | /* type 'B' mixing as described in 8.6.4.6.2.2 */ |
1570 | 0 | real_t sina, cosa; // COEF |
1571 | 0 | real_t cosg, sing; // COEF |
1572 | | |
1573 | | /* |
1574 | | real_t c, rho, mu, alpha, gamma; |
1575 | | uint8_t i; |
1576 | | |
1577 | | i = ps->iid_index[env][bk]; |
1578 | | c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); |
1579 | | rho = quant_rho[ps->icc_index[env][bk]]; |
1580 | | |
1581 | | if (rho == 0.0f && c == 1.) |
1582 | | { |
1583 | | alpha = (real_t)M_PI/4.0f; |
1584 | | rho = 0.05f; |
1585 | | } else { |
1586 | | if (rho <= 0.05f) |
1587 | | { |
1588 | | rho = 0.05f; |
1589 | | } |
1590 | | alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); |
1591 | | |
1592 | | if (alpha < 0.) |
1593 | | { |
1594 | | alpha += (real_t)M_PI/2.0f; |
1595 | | } |
1596 | | if (rho < 0.) |
1597 | | { |
1598 | | alpha += (real_t)M_PI; |
1599 | | } |
1600 | | } |
1601 | | mu = c+1.0f/c; |
1602 | | mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); |
1603 | | gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); |
1604 | | */ |
1605 | |
|
1606 | 0 | if (ps->iid_mode >= 3) |
1607 | 0 | { |
1608 | 0 | cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; |
1609 | 0 | sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; |
1610 | 0 | cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; |
1611 | 0 | sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; |
1612 | 0 | } else { |
1613 | 0 | cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; |
1614 | 0 | sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; |
1615 | 0 | cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; |
1616 | 0 | sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; |
1617 | 0 | } |
1618 | |
|
1619 | 0 | RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); |
1620 | 0 | RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); |
1621 | 0 | RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); |
1622 | 0 | RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); |
1623 | 0 | } |
1624 | 0 | IM(h11) = IM(h12) = IM(h21) = IM(h22) = 0; |
1625 | | |
1626 | | /* calculate phase rotation parameters H_xy */ |
1627 | | /* note that the imaginary part of these parameters are only calculated when |
1628 | | IPD and OPD are enabled |
1629 | | */ |
1630 | 0 | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1631 | 0 | { |
1632 | 0 | int8_t i; |
1633 | 0 | real_t xy, pq, xypq; // FRAC |
1634 | | |
1635 | | /* ringbuffer index */ |
1636 | 0 | i = ps->phase_hist; |
1637 | | |
1638 | | /* previous value */ |
1639 | | #ifdef FIXED_POINT |
1640 | | /* divide by 4*2, shift right 3 bits; |
1641 | | extra halving to avoid overflows; it is ok, because result is normalized */ |
1642 | | RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 3; |
1643 | | IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 3; |
1644 | | RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3; |
1645 | | IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 3; |
1646 | | #else |
1647 | 0 | RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); |
1648 | 0 | IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); |
1649 | 0 | RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); |
1650 | 0 | IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); |
1651 | 0 | #endif |
1652 | | |
1653 | | /* save current value */ |
1654 | 0 | RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; |
1655 | 0 | IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; |
1656 | 0 | RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; |
1657 | 0 | IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; |
1658 | | |
1659 | | /* add current value */ |
1660 | | #ifdef FIXED_POINT |
1661 | | /* extra halving to avoid overflows */ |
1662 | | RE(tempLeft) += RE(ps->ipd_prev[bk][i]) >> 1; |
1663 | | IM(tempLeft) += IM(ps->ipd_prev[bk][i]) >> 1; |
1664 | | RE(tempRight) += RE(ps->opd_prev[bk][i]) >> 1; |
1665 | | IM(tempRight) += IM(ps->opd_prev[bk][i]) >> 1; |
1666 | | #else |
1667 | 0 | RE(tempLeft) += RE(ps->ipd_prev[bk][i]); |
1668 | 0 | IM(tempLeft) += IM(ps->ipd_prev[bk][i]); |
1669 | 0 | RE(tempRight) += RE(ps->opd_prev[bk][i]); |
1670 | 0 | IM(tempRight) += IM(ps->opd_prev[bk][i]); |
1671 | 0 | #endif |
1672 | | |
1673 | | /* ringbuffer index */ |
1674 | 0 | if (i == 0) |
1675 | 0 | { |
1676 | 0 | i = 2; |
1677 | 0 | } |
1678 | 0 | i--; |
1679 | | |
1680 | | /* get value before previous */ |
1681 | | #ifdef FIXED_POINT |
1682 | | /* dividing by 2*2, shift right 2 bits; extra halving to avoid overflows */ |
1683 | | RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 2); |
1684 | | IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 2); |
1685 | | RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 2); |
1686 | | IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 2); |
1687 | | #else |
1688 | 0 | RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); |
1689 | 0 | IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); |
1690 | 0 | RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); |
1691 | 0 | IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); |
1692 | 0 | #endif |
1693 | |
|
1694 | | #if 0 /* original code */ |
1695 | | ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); |
1696 | | opd = (float)atan2(IM(tempRight), RE(tempRight)); |
1697 | | |
1698 | | /* phase rotation */ |
1699 | | RE(phaseLeft) = (float)cos(opd); |
1700 | | IM(phaseLeft) = (float)sin(opd); |
1701 | | opd -= ipd; |
1702 | | RE(phaseRight) = (float)cos(opd); |
1703 | | IM(phaseRight) = (float)sin(opd); |
1704 | | #else |
1705 | | |
1706 | | // x = IM(tempLeft) |
1707 | | // y = RE(tempLeft) |
1708 | | // p = IM(tempRight) |
1709 | | // q = RE(tempRight) |
1710 | | // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y)) |
1711 | | // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y)) |
1712 | | // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); |
1713 | | // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); |
1714 | |
|
1715 | 0 | xy = magnitude_c(tempRight); |
1716 | 0 | pq = magnitude_c(tempLeft); |
1717 | |
|
1718 | 0 | if (xy != 0) |
1719 | 0 | { |
1720 | 0 | RE(phaseLeft) = DIV_F(RE(tempRight), xy); |
1721 | 0 | IM(phaseLeft) = DIV_F(IM(tempRight), xy); |
1722 | 0 | } else { |
1723 | 0 | RE(phaseLeft) = 0; |
1724 | 0 | IM(phaseLeft) = 0; |
1725 | 0 | } |
1726 | |
|
1727 | 0 | xypq = MUL_F(xy, pq); |
1728 | |
|
1729 | 0 | if (xypq != 0) |
1730 | 0 | { |
1731 | 0 | real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft)); |
1732 | 0 | real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft)); |
1733 | |
|
1734 | 0 | RE(phaseRight) = DIV_F(tmp1, xypq); |
1735 | 0 | IM(phaseRight) = DIV_F(tmp2, xypq); |
1736 | 0 | } else { |
1737 | 0 | RE(phaseRight) = 0; |
1738 | 0 | IM(phaseRight) = 0; |
1739 | 0 | } |
1740 | |
|
1741 | 0 | #endif |
1742 | | |
1743 | | /* MUL_F(COEF, REAL) = COEF */ |
1744 | 0 | IM(h11) = MUL_F(RE(h11), IM(phaseLeft)); |
1745 | 0 | IM(h12) = MUL_F(RE(h12), IM(phaseRight)); |
1746 | 0 | IM(h21) = MUL_F(RE(h21), IM(phaseLeft)); |
1747 | 0 | IM(h22) = MUL_F(RE(h22), IM(phaseRight)); |
1748 | |
|
1749 | 0 | RE(h11) = MUL_F(RE(h11), RE(phaseLeft)); |
1750 | 0 | RE(h12) = MUL_F(RE(h12), RE(phaseRight)); |
1751 | 0 | RE(h21) = MUL_F(RE(h21), RE(phaseLeft)); |
1752 | 0 | RE(h22) = MUL_F(RE(h22), RE(phaseRight)); |
1753 | 0 | } |
1754 | | |
1755 | | /* length of the envelope n_e+1 - n_e (in time samples) */ |
1756 | | /* 0 < L <= 32: integer */ |
1757 | 0 | L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); |
1758 | | |
1759 | | /* obtain final H_xy by means of linear interpolation */ |
1760 | 0 | RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; |
1761 | 0 | RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; |
1762 | 0 | RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; |
1763 | 0 | RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; |
1764 | |
|
1765 | 0 | RE(H11) = RE(ps->h11_prev[gr]); |
1766 | 0 | RE(H12) = RE(ps->h12_prev[gr]); |
1767 | 0 | RE(H21) = RE(ps->h21_prev[gr]); |
1768 | 0 | RE(H22) = RE(ps->h22_prev[gr]); |
1769 | 0 | IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0; |
1770 | |
|
1771 | 0 | RE(ps->h11_prev[gr]) = RE(h11); |
1772 | 0 | RE(ps->h12_prev[gr]) = RE(h12); |
1773 | 0 | RE(ps->h21_prev[gr]) = RE(h21); |
1774 | 0 | RE(ps->h22_prev[gr]) = RE(h22); |
1775 | | |
1776 | | /* only calculate imaginary part when needed */ |
1777 | 0 | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1778 | 0 | { |
1779 | | /* obtain final H_xy by means of linear interpolation */ |
1780 | 0 | IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; |
1781 | 0 | IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; |
1782 | 0 | IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; |
1783 | 0 | IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; |
1784 | |
|
1785 | 0 | IM(H11) = IM(ps->h11_prev[gr]); |
1786 | 0 | IM(H12) = IM(ps->h12_prev[gr]); |
1787 | 0 | IM(H21) = IM(ps->h21_prev[gr]); |
1788 | 0 | IM(H22) = IM(ps->h22_prev[gr]); |
1789 | |
|
1790 | 0 | if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) |
1791 | 0 | { |
1792 | 0 | IM(deltaH11) = -IM(deltaH11); |
1793 | 0 | IM(deltaH12) = -IM(deltaH12); |
1794 | 0 | IM(deltaH21) = -IM(deltaH21); |
1795 | 0 | IM(deltaH22) = -IM(deltaH22); |
1796 | |
|
1797 | 0 | IM(H11) = -IM(H11); |
1798 | 0 | IM(H12) = -IM(H12); |
1799 | 0 | IM(H21) = -IM(H21); |
1800 | 0 | IM(H22) = -IM(H22); |
1801 | 0 | } |
1802 | |
|
1803 | 0 | IM(ps->h11_prev[gr]) = IM(h11); |
1804 | 0 | IM(ps->h12_prev[gr]) = IM(h12); |
1805 | 0 | IM(ps->h21_prev[gr]) = IM(h21); |
1806 | 0 | IM(ps->h22_prev[gr]) = IM(h22); |
1807 | 0 | } |
1808 | | |
1809 | | /* apply H_xy to the current envelope band of the decorrelated subband */ |
1810 | 0 | for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) |
1811 | 0 | { |
1812 | | /* addition finalises the interpolation over every n */ |
1813 | 0 | RE(H11) += RE(deltaH11); |
1814 | 0 | RE(H12) += RE(deltaH12); |
1815 | 0 | RE(H21) += RE(deltaH21); |
1816 | 0 | RE(H22) += RE(deltaH22); |
1817 | 0 | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1818 | 0 | { |
1819 | 0 | IM(H11) += IM(deltaH11); |
1820 | 0 | IM(H12) += IM(deltaH12); |
1821 | 0 | IM(H21) += IM(deltaH21); |
1822 | 0 | IM(H22) += IM(deltaH22); |
1823 | 0 | } |
1824 | | |
1825 | | /* channel is an alias to the subband */ |
1826 | 0 | for (sb = ps->group_border[gr]; sb < maxsb; sb++) |
1827 | 0 | { |
1828 | 0 | complex_t inLeft, inRight; // precision_of in(Left|Right) == precision_of X_(left|right) |
1829 | | |
1830 | | /* load decorrelated samples */ |
1831 | 0 | if (gr < ps->num_hybrid_groups) |
1832 | 0 | { |
1833 | 0 | RE(inLeft) = RE(X_hybrid_left[n][sb]); |
1834 | 0 | IM(inLeft) = IM(X_hybrid_left[n][sb]); |
1835 | 0 | RE(inRight) = RE(X_hybrid_right[n][sb]); |
1836 | 0 | IM(inRight) = IM(X_hybrid_right[n][sb]); |
1837 | 0 | } else { |
1838 | 0 | RE(inLeft) = RE(X_left[n][sb]); |
1839 | 0 | IM(inLeft) = IM(X_left[n][sb]); |
1840 | 0 | RE(inRight) = RE(X_right[n][sb]); |
1841 | 0 | IM(inRight) = IM(X_right[n][sb]); |
1842 | 0 | } |
1843 | | |
1844 | | /* precision_of temp(Left|Right) == precision_of X_(left|right) */ |
1845 | | |
1846 | | /* apply mixing */ |
1847 | 0 | RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); |
1848 | 0 | IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); |
1849 | 0 | RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); |
1850 | 0 | IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); |
1851 | | |
1852 | | /* only perform imaginary operations when needed */ |
1853 | 0 | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1854 | 0 | { |
1855 | | /* apply rotation */ |
1856 | 0 | RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); |
1857 | 0 | IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); |
1858 | 0 | RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); |
1859 | 0 | IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); |
1860 | 0 | } |
1861 | | |
1862 | | /* store final samples */ |
1863 | 0 | if (gr < ps->num_hybrid_groups) |
1864 | 0 | { |
1865 | 0 | RE(X_hybrid_left[n][sb]) = RE(tempLeft); |
1866 | 0 | IM(X_hybrid_left[n][sb]) = IM(tempLeft); |
1867 | 0 | RE(X_hybrid_right[n][sb]) = RE(tempRight); |
1868 | 0 | IM(X_hybrid_right[n][sb]) = IM(tempRight); |
1869 | 0 | } else { |
1870 | 0 | RE(X_left[n][sb]) = RE(tempLeft); |
1871 | 0 | IM(X_left[n][sb]) = IM(tempLeft); |
1872 | 0 | RE(X_right[n][sb]) = RE(tempRight); |
1873 | 0 | IM(X_right[n][sb]) = IM(tempRight); |
1874 | 0 | } |
1875 | 0 | } |
1876 | 0 | } |
1877 | | |
1878 | | /* shift phase smoother's circular buffer index */ |
1879 | 0 | ps->phase_hist++; |
1880 | 0 | if (ps->phase_hist == 2) |
1881 | 0 | { |
1882 | 0 | ps->phase_hist = 0; |
1883 | 0 | } |
1884 | 0 | } |
1885 | 0 | } |
1886 | 0 | } |
1887 | | |
1888 | | void ps_free(ps_info *ps) |
1889 | 0 | { |
1890 | | /* free hybrid filterbank structures */ |
1891 | 0 | hybrid_free(ps->hyb); |
1892 | |
|
1893 | 0 | faad_free(ps); |
1894 | 0 | } |
1895 | | |
1896 | | ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate) |
1897 | 0 | { |
1898 | 0 | uint8_t i; |
1899 | 0 | uint8_t short_delay_band; |
1900 | |
|
1901 | 0 | ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); |
1902 | 0 | memset(ps, 0, sizeof(ps_info)); |
1903 | |
|
1904 | 0 | ps->hyb = hybrid_init(numTimeSlotsRate); |
1905 | 0 | ps->numTimeSlotsRate = numTimeSlotsRate; |
1906 | |
|
1907 | 0 | ps->ps_data_available = 0; |
1908 | | |
1909 | | /* delay stuff*/ |
1910 | 0 | ps->saved_delay = 0; |
1911 | |
|
1912 | 0 | for (i = 0; i < 64; i++) |
1913 | 0 | { |
1914 | 0 | ps->delay_buf_index_delay[i] = 0; |
1915 | 0 | } |
1916 | |
|
1917 | 0 | for (i = 0; i < NO_ALLPASS_LINKS; i++) |
1918 | 0 | { |
1919 | 0 | ps->delay_buf_index_ser[i] = 0; |
1920 | | #ifdef PARAM_32KHZ |
1921 | | if (sr_index <= 5) /* >= 32 kHz*/ |
1922 | | { |
1923 | | ps->num_sample_delay_ser[i] = delay_length_d[1][i]; |
1924 | | } else { |
1925 | | ps->num_sample_delay_ser[i] = delay_length_d[0][i]; |
1926 | | } |
1927 | | #else |
1928 | 0 | (void)sr_index; |
1929 | | /* THESE ARE CONSTANTS NOW */ |
1930 | 0 | ps->num_sample_delay_ser[i] = delay_length_d[i]; |
1931 | 0 | #endif |
1932 | 0 | } |
1933 | |
|
1934 | | #ifdef PARAM_32KHZ |
1935 | | if (sr_index <= 5) /* >= 32 kHz*/ |
1936 | | { |
1937 | | short_delay_band = 35; |
1938 | | ps->nr_allpass_bands = 22; |
1939 | | ps->alpha_decay = FRAC_CONST(0.76592833836465); |
1940 | | ps->alpha_smooth = FRAC_CONST(0.25); |
1941 | | } else { |
1942 | | short_delay_band = 64; |
1943 | | ps->nr_allpass_bands = 45; |
1944 | | ps->alpha_decay = FRAC_CONST(0.58664621951003); |
1945 | | ps->alpha_smooth = FRAC_CONST(0.6); |
1946 | | } |
1947 | | #else |
1948 | | /* THESE ARE CONSTANTS NOW */ |
1949 | 0 | short_delay_band = 35; |
1950 | 0 | ps->nr_allpass_bands = 22; |
1951 | 0 | ps->alpha_decay = FRAC_CONST(0.76592833836465); |
1952 | 0 | ps->alpha_smooth = FRAC_CONST(0.25); |
1953 | 0 | #endif |
1954 | | |
1955 | | /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ |
1956 | 0 | for (i = 0; i < short_delay_band; i++) |
1957 | 0 | { |
1958 | 0 | ps->delay_D[i] = 14; |
1959 | 0 | } |
1960 | 0 | for (i = short_delay_band; i < 64; i++) |
1961 | 0 | { |
1962 | 0 | ps->delay_D[i] = 1; |
1963 | 0 | } |
1964 | | |
1965 | | /* mixing and phase */ |
1966 | 0 | for (i = 0; i < 50; i++) |
1967 | 0 | { |
1968 | 0 | RE(ps->h11_prev[i]) = 1; |
1969 | 0 | IM(ps->h11_prev[i]) = 1; |
1970 | 0 | RE(ps->h12_prev[i]) = 1; |
1971 | 0 | IM(ps->h12_prev[i]) = 1; |
1972 | 0 | } |
1973 | |
|
1974 | 0 | ps->phase_hist = 0; |
1975 | |
|
1976 | 0 | for (i = 0; i < 20; i++) |
1977 | 0 | { |
1978 | 0 | RE(ps->ipd_prev[i][0]) = 0; |
1979 | 0 | IM(ps->ipd_prev[i][0]) = 0; |
1980 | 0 | RE(ps->ipd_prev[i][1]) = 0; |
1981 | 0 | IM(ps->ipd_prev[i][1]) = 0; |
1982 | 0 | RE(ps->opd_prev[i][0]) = 0; |
1983 | 0 | IM(ps->opd_prev[i][0]) = 0; |
1984 | 0 | RE(ps->opd_prev[i][1]) = 0; |
1985 | 0 | IM(ps->opd_prev[i][1]) = 0; |
1986 | 0 | } |
1987 | |
|
1988 | 0 | return ps; |
1989 | 0 | } |
1990 | | |
1991 | | /* main Parametric Stereo decoding function */ |
1992 | | uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) |
1993 | 0 | { |
1994 | 0 | qmf_t X_hybrid_left[32][32] = {{{0}}}; |
1995 | 0 | qmf_t X_hybrid_right[32][32] = {{{0}}}; |
1996 | | |
1997 | | /* delta decoding of the bitstream data */ |
1998 | 0 | ps_data_decode(ps); |
1999 | | |
2000 | | /* set up some parameters depending on filterbank type */ |
2001 | 0 | if (ps->use34hybrid_bands) |
2002 | 0 | { |
2003 | 0 | ps->group_border = (uint8_t*)group_border34; |
2004 | 0 | ps->map_group2bk = (uint16_t*)map_group2bk34; |
2005 | 0 | ps->num_groups = 32+18; |
2006 | 0 | ps->num_hybrid_groups = 32; |
2007 | 0 | ps->nr_par_bands = 34; |
2008 | 0 | ps->decay_cutoff = 5; |
2009 | 0 | } else { |
2010 | 0 | ps->group_border = (uint8_t*)group_border20; |
2011 | 0 | ps->map_group2bk = (uint16_t*)map_group2bk20; |
2012 | 0 | ps->num_groups = 10+12; |
2013 | 0 | ps->num_hybrid_groups = 10; |
2014 | 0 | ps->nr_par_bands = 20; |
2015 | 0 | ps->decay_cutoff = 3; |
2016 | 0 | } |
2017 | | |
2018 | | /* Perform further analysis on the lowest subbands to get a higher |
2019 | | * frequency resolution |
2020 | | */ |
2021 | 0 | hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left, |
2022 | 0 | ps->use34hybrid_bands, ps->numTimeSlotsRate); |
2023 | | |
2024 | | /* decorrelate mono signal */ |
2025 | 0 | ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); |
2026 | | |
2027 | | /* apply mixing and phase parameters */ |
2028 | 0 | ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); |
2029 | | |
2030 | | /* hybrid synthesis, to rebuild the SBR QMF matrices */ |
2031 | 0 | hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left, |
2032 | 0 | ps->use34hybrid_bands, ps->numTimeSlotsRate); |
2033 | |
|
2034 | 0 | hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right, |
2035 | 0 | ps->use34hybrid_bands, ps->numTimeSlotsRate); |
2036 | |
|
2037 | 0 | return 0; |
2038 | 0 | } |
2039 | | |
2040 | | #endif |