/proc/self/cwd/libfaad/specrec.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: specrec.c,v 1.63 2010/06/04 20:47:56 menno Exp $ |
29 | | **/ |
30 | | |
31 | | /* |
32 | | Spectral reconstruction: |
33 | | - grouping/sectioning |
34 | | - inverse quantization |
35 | | - applying scalefactors |
36 | | */ |
37 | | |
38 | | #include "common.h" |
39 | | #include "structs.h" |
40 | | |
41 | | #include <stdlib.h> |
42 | | #include "specrec.h" |
43 | | #include "filtbank.h" |
44 | | #include "syntax.h" |
45 | | #include "iq_table.h" |
46 | | #include "ms.h" |
47 | | #include "is.h" |
48 | | #include "pns.h" |
49 | | #include "tns.h" |
50 | | #include "drc.h" |
51 | | #include "lt_predict.h" |
52 | | #include "ic_predict.h" |
53 | | #ifdef SSR_DEC |
54 | | #include "ssr.h" |
55 | | #include "ssr_fb.h" |
56 | | #endif |
57 | | |
58 | | |
59 | | /* static function declarations */ |
60 | | static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, |
61 | | ic_stream *ics, int16_t *quant_data, |
62 | | real_t *spec_data, uint16_t frame_len); |
63 | | |
64 | | |
65 | | #ifdef LD_DEC |
66 | | ALIGN static const uint8_t num_swb_512_window[] = |
67 | | { |
68 | | 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0 |
69 | | }; |
70 | | ALIGN static const uint8_t num_swb_480_window[] = |
71 | | { |
72 | | 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0 |
73 | | }; |
74 | | #endif |
75 | | |
76 | | ALIGN static const uint8_t num_swb_960_window[] = |
77 | | { |
78 | | 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40 |
79 | | }; |
80 | | |
81 | | ALIGN static const uint8_t num_swb_1024_window[] = |
82 | | { |
83 | | 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 |
84 | | }; |
85 | | |
86 | | ALIGN static const uint8_t num_swb_128_window[] = |
87 | | { |
88 | | 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 |
89 | | }; |
90 | | |
91 | | ALIGN static const uint16_t swb_offset_1024_96[] = |
92 | | { |
93 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, |
94 | | 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, |
95 | | 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024 |
96 | | }; |
97 | | |
98 | | ALIGN static const uint16_t swb_offset_128_96[] = |
99 | | { |
100 | | 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 |
101 | | }; |
102 | | |
103 | | ALIGN static const uint16_t swb_offset_1024_64[] = |
104 | | { |
105 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, |
106 | | 64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, |
107 | | 304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, |
108 | | 864, 904, 944, 984, 1024 |
109 | | }; |
110 | | |
111 | | ALIGN static const uint16_t swb_offset_128_64[] = |
112 | | { |
113 | | 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 |
114 | | }; |
115 | | |
116 | | ALIGN static const uint16_t swb_offset_1024_48[] = |
117 | | { |
118 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, |
119 | | 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, |
120 | | 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, |
121 | | 768, 800, 832, 864, 896, 928, 1024 |
122 | | }; |
123 | | |
124 | | #ifdef LD_DEC |
125 | | ALIGN static const uint16_t swb_offset_512_48[] = |
126 | | { |
127 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, |
128 | | 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, |
129 | | 428, 460, 512 |
130 | | }; |
131 | | |
132 | | ALIGN static const uint16_t swb_offset_480_48[] = |
133 | | { |
134 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88, |
135 | | 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400, |
136 | | 432, 480 |
137 | | }; |
138 | | #endif |
139 | | |
140 | | ALIGN static const uint16_t swb_offset_128_48[] = |
141 | | { |
142 | | 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 |
143 | | }; |
144 | | |
145 | | ALIGN static const uint16_t swb_offset_1024_32[] = |
146 | | { |
147 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, |
148 | | 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, |
149 | | 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, |
150 | | 768, 800, 832, 864, 896, 928, 960, 992, 1024 |
151 | | }; |
152 | | |
153 | | #ifdef LD_DEC |
154 | | ALIGN static const uint16_t swb_offset_512_32[] = |
155 | | { |
156 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, |
157 | | 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, |
158 | | 384, 416, 448, 480, 512 |
159 | | }; |
160 | | |
161 | | ALIGN static const uint16_t swb_offset_480_32[] = |
162 | | { |
163 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, |
164 | | 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, |
165 | | 384, 416, 448, 480 |
166 | | }; |
167 | | #endif |
168 | | |
169 | | ALIGN static const uint16_t swb_offset_1024_24[] = |
170 | | { |
171 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, |
172 | | 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, |
173 | | 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, |
174 | | 768, 832, 896, 960, 1024 |
175 | | }; |
176 | | |
177 | | #ifdef LD_DEC |
178 | | ALIGN static const uint16_t swb_offset_512_24[] = |
179 | | { |
180 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, |
181 | | 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, |
182 | | 448, 480, 512 |
183 | | }; |
184 | | |
185 | | ALIGN static const uint16_t swb_offset_480_24[] = |
186 | | { |
187 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, |
188 | | 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 |
189 | | }; |
190 | | #endif |
191 | | |
192 | | ALIGN static const uint16_t swb_offset_128_24[] = |
193 | | { |
194 | | 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 |
195 | | }; |
196 | | |
197 | | ALIGN static const uint16_t swb_offset_1024_16[] = |
198 | | { |
199 | | 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, |
200 | | 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, |
201 | | 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024 |
202 | | }; |
203 | | |
204 | | ALIGN static const uint16_t swb_offset_128_16[] = |
205 | | { |
206 | | 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 |
207 | | }; |
208 | | |
209 | | ALIGN static const uint16_t swb_offset_1024_8[] = |
210 | | { |
211 | | 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, |
212 | | 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, |
213 | | 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 |
214 | | }; |
215 | | |
216 | | ALIGN static const uint16_t swb_offset_128_8[] = |
217 | | { |
218 | | 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 |
219 | | }; |
220 | | |
221 | | ALIGN static const uint16_t *swb_offset_1024_window[] = |
222 | | { |
223 | | swb_offset_1024_96, /* 96000 */ |
224 | | swb_offset_1024_96, /* 88200 */ |
225 | | swb_offset_1024_64, /* 64000 */ |
226 | | swb_offset_1024_48, /* 48000 */ |
227 | | swb_offset_1024_48, /* 44100 */ |
228 | | swb_offset_1024_32, /* 32000 */ |
229 | | swb_offset_1024_24, /* 24000 */ |
230 | | swb_offset_1024_24, /* 22050 */ |
231 | | swb_offset_1024_16, /* 16000 */ |
232 | | swb_offset_1024_16, /* 12000 */ |
233 | | swb_offset_1024_16, /* 11025 */ |
234 | | swb_offset_1024_8 /* 8000 */ |
235 | | }; |
236 | | |
237 | | #ifdef LD_DEC |
238 | | ALIGN static const uint16_t *swb_offset_512_window[] = |
239 | | { |
240 | | 0, /* 96000 */ |
241 | | 0, /* 88200 */ |
242 | | 0, /* 64000 */ |
243 | | swb_offset_512_48, /* 48000 */ |
244 | | swb_offset_512_48, /* 44100 */ |
245 | | swb_offset_512_32, /* 32000 */ |
246 | | swb_offset_512_24, /* 24000 */ |
247 | | swb_offset_512_24, /* 22050 */ |
248 | | 0, /* 16000 */ |
249 | | 0, /* 12000 */ |
250 | | 0, /* 11025 */ |
251 | | 0 /* 8000 */ |
252 | | }; |
253 | | |
254 | | ALIGN static const uint16_t *swb_offset_480_window[] = |
255 | | { |
256 | | 0, /* 96000 */ |
257 | | 0, /* 88200 */ |
258 | | 0, /* 64000 */ |
259 | | swb_offset_480_48, /* 48000 */ |
260 | | swb_offset_480_48, /* 44100 */ |
261 | | swb_offset_480_32, /* 32000 */ |
262 | | swb_offset_480_24, /* 24000 */ |
263 | | swb_offset_480_24, /* 22050 */ |
264 | | 0, /* 16000 */ |
265 | | 0, /* 12000 */ |
266 | | 0, /* 11025 */ |
267 | | 0 /* 8000 */ |
268 | | }; |
269 | | #endif |
270 | | |
271 | | ALIGN static const uint16_t *swb_offset_128_window[] = |
272 | | { |
273 | | swb_offset_128_96, /* 96000 */ |
274 | | swb_offset_128_96, /* 88200 */ |
275 | | swb_offset_128_64, /* 64000 */ |
276 | | swb_offset_128_48, /* 48000 */ |
277 | | swb_offset_128_48, /* 44100 */ |
278 | | swb_offset_128_48, /* 32000 */ |
279 | | swb_offset_128_24, /* 24000 */ |
280 | | swb_offset_128_24, /* 22050 */ |
281 | | swb_offset_128_16, /* 16000 */ |
282 | | swb_offset_128_16, /* 12000 */ |
283 | | swb_offset_128_16, /* 11025 */ |
284 | | swb_offset_128_8 /* 8000 */ |
285 | | }; |
286 | | |
287 | 416k | #define bit_set(A, B) ((A) & (1<<(B))) |
288 | | |
289 | | /* 4.5.2.3.4 */ |
290 | | /* |
291 | | - determine the number of windows in a window_sequence named num_windows |
292 | | - determine the number of window_groups named num_window_groups |
293 | | - determine the number of windows in each group named window_group_length[g] |
294 | | - determine the total number of scalefactor window bands named num_swb for |
295 | | the actual window type |
296 | | - determine swb_offset[swb], the offset of the first coefficient in |
297 | | scalefactor window band named swb of the window actually used |
298 | | - determine sect_sfb_offset[g][section],the offset of the first coefficient |
299 | | in section named section. This offset depends on window_sequence and |
300 | | scale_factor_grouping and is needed to decode the spectral_data(). |
301 | | */ |
302 | | uint8_t window_grouping_info(NeAACDecStruct *hDecoder, ic_stream *ics) |
303 | 598k | { |
304 | 598k | uint8_t i, g; |
305 | | |
306 | 598k | uint8_t sf_index = hDecoder->sf_index; |
307 | | |
308 | 598k | if (sf_index >= 12) |
309 | 10 | return 32; |
310 | | |
311 | 598k | switch (ics->window_sequence) { |
312 | 499k | case ONLY_LONG_SEQUENCE: |
313 | 527k | case LONG_START_SEQUENCE: |
314 | 538k | case LONG_STOP_SEQUENCE: |
315 | 538k | ics->num_windows = 1; |
316 | 538k | ics->num_window_groups = 1; |
317 | 538k | ics->window_group_length[ics->num_window_groups-1] = 1; |
318 | | #ifdef LD_DEC |
319 | 398k | if (hDecoder->object_type == LD) |
320 | 4.19k | { |
321 | 4.19k | if (hDecoder->frameLength == 512) |
322 | 2.02k | ics->num_swb = num_swb_512_window[sf_index]; |
323 | 2.17k | else /* if (hDecoder->frameLength == 480) */ |
324 | 2.17k | ics->num_swb = num_swb_480_window[sf_index]; |
325 | 394k | } else { |
326 | 394k | #endif |
327 | 534k | if (hDecoder->frameLength == 1024) |
328 | 453k | ics->num_swb = num_swb_1024_window[sf_index]; |
329 | 81.2k | else /* if (hDecoder->frameLength == 960) */ |
330 | 81.2k | ics->num_swb = num_swb_960_window[sf_index]; |
331 | | #ifdef LD_DEC |
332 | | } |
333 | | #endif |
334 | | |
335 | 538k | if (ics->max_sfb > ics->num_swb) |
336 | 288 | { |
337 | 288 | return 32; |
338 | 288 | } |
339 | | |
340 | | /* preparation of sect_sfb_offset for long blocks */ |
341 | | /* also copy the last value! */ |
342 | | #ifdef LD_DEC |
343 | 398k | if (hDecoder->object_type == LD) |
344 | 4.18k | { |
345 | 4.18k | if (hDecoder->frameLength == 512) |
346 | 2.01k | { |
347 | 57.9k | for (i = 0; i < ics->num_swb; i++) |
348 | 55.9k | { |
349 | 55.9k | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; |
350 | 55.9k | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; |
351 | 55.9k | } |
352 | 2.17k | } else /* if (hDecoder->frameLength == 480) */ { |
353 | 65.8k | for (i = 0; i < ics->num_swb; i++) |
354 | 63.6k | { |
355 | 63.6k | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; |
356 | 63.6k | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; |
357 | 63.6k | } |
358 | 2.17k | } |
359 | 4.18k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; |
360 | 4.18k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; |
361 | 4.18k | ics->swb_offset_max = hDecoder->frameLength; |
362 | 394k | } else { |
363 | 394k | #endif |
364 | 23.2M | for (i = 0; i < ics->num_swb; i++) |
365 | 22.6M | { |
366 | 22.6M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; |
367 | 22.6M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; |
368 | 22.6M | } |
369 | 140k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; |
370 | 140k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; |
371 | 140k | ics->swb_offset_max = hDecoder->frameLength; |
372 | | #ifdef LD_DEC |
373 | | } |
374 | | #endif |
375 | 140k | return 0; |
376 | 59.5k | case EIGHT_SHORT_SEQUENCE: |
377 | 59.5k | ics->num_windows = 8; |
378 | 59.5k | ics->num_window_groups = 1; |
379 | 59.5k | ics->window_group_length[ics->num_window_groups-1] = 1; |
380 | 59.5k | ics->num_swb = num_swb_128_window[sf_index]; |
381 | | |
382 | 59.5k | if (ics->max_sfb > ics->num_swb) |
383 | 19 | { |
384 | 19 | return 32; |
385 | 19 | } |
386 | | |
387 | 883k | for (i = 0; i < ics->num_swb; i++) |
388 | 824k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; |
389 | 59.5k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; |
390 | 59.5k | ics->swb_offset_max = hDecoder->frameLength/8; |
391 | | |
392 | 476k | for (i = 0; i < ics->num_windows-1; i++) { |
393 | 416k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) |
394 | 341k | { |
395 | 341k | ics->num_window_groups += 1; |
396 | 341k | ics->window_group_length[ics->num_window_groups-1] = 1; |
397 | 341k | } else { |
398 | 75.2k | ics->window_group_length[ics->num_window_groups-1] += 1; |
399 | 75.2k | } |
400 | 416k | } |
401 | | |
402 | | /* preparation of sect_sfb_offset for short blocks */ |
403 | 460k | for (g = 0; g < ics->num_window_groups; g++) |
404 | 401k | { |
405 | 401k | uint16_t width; |
406 | 401k | uint8_t sect_sfb = 0; |
407 | 401k | uint16_t offset = 0; |
408 | | |
409 | 5.94M | for (i = 0; i < ics->num_swb; i++) |
410 | 5.54M | { |
411 | 5.54M | if (i+1 == ics->num_swb) |
412 | 401k | { |
413 | 401k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; |
414 | 5.14M | } else { |
415 | 5.14M | width = swb_offset_128_window[sf_index][i+1] - |
416 | 5.14M | swb_offset_128_window[sf_index][i]; |
417 | 5.14M | } |
418 | 5.54M | width *= ics->window_group_length[g]; |
419 | 5.54M | ics->sect_sfb_offset[g][sect_sfb++] = offset; |
420 | 5.54M | offset += width; |
421 | 5.54M | } |
422 | 401k | ics->sect_sfb_offset[g][sect_sfb] = offset; |
423 | 401k | } |
424 | 59.5k | return 0; |
425 | 0 | default: |
426 | 0 | return 32; |
427 | 598k | } |
428 | 598k | } Line | Count | Source | 303 | 163k | { | 304 | 163k | uint8_t i, g; | 305 | | | 306 | 163k | uint8_t sf_index = hDecoder->sf_index; | 307 | | | 308 | 163k | if (sf_index >= 12) | 309 | 3 | return 32; | 310 | | | 311 | 163k | switch (ics->window_sequence) { | 312 | 126k | case ONLY_LONG_SEQUENCE: | 313 | 135k | case LONG_START_SEQUENCE: | 314 | 140k | case LONG_STOP_SEQUENCE: | 315 | 140k | ics->num_windows = 1; | 316 | 140k | ics->num_window_groups = 1; | 317 | 140k | ics->window_group_length[ics->num_window_groups-1] = 1; | 318 | | #ifdef LD_DEC | 319 | | if (hDecoder->object_type == LD) | 320 | | { | 321 | | if (hDecoder->frameLength == 512) | 322 | | ics->num_swb = num_swb_512_window[sf_index]; | 323 | | else /* if (hDecoder->frameLength == 480) */ | 324 | | ics->num_swb = num_swb_480_window[sf_index]; | 325 | | } else { | 326 | | #endif | 327 | 140k | if (hDecoder->frameLength == 1024) | 328 | 113k | ics->num_swb = num_swb_1024_window[sf_index]; | 329 | 27.0k | else /* if (hDecoder->frameLength == 960) */ | 330 | 27.0k | ics->num_swb = num_swb_960_window[sf_index]; | 331 | | #ifdef LD_DEC | 332 | | } | 333 | | #endif | 334 | | | 335 | 140k | if (ics->max_sfb > ics->num_swb) | 336 | 91 | { | 337 | 91 | return 32; | 338 | 91 | } | 339 | | | 340 | | /* preparation of sect_sfb_offset for long blocks */ | 341 | | /* also copy the last value! */ | 342 | | #ifdef LD_DEC | 343 | | if (hDecoder->object_type == LD) | 344 | | { | 345 | | if (hDecoder->frameLength == 512) | 346 | | { | 347 | | for (i = 0; i < ics->num_swb; i++) | 348 | | { | 349 | | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; | 350 | | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; | 351 | | } | 352 | | } else /* if (hDecoder->frameLength == 480) */ { | 353 | | for (i = 0; i < ics->num_swb; i++) | 354 | | { | 355 | | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; | 356 | | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; | 357 | | } | 358 | | } | 359 | | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 360 | | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 361 | | ics->swb_offset_max = hDecoder->frameLength; | 362 | | } else { | 363 | | #endif | 364 | 6.15M | for (i = 0; i < ics->num_swb; i++) | 365 | 6.01M | { | 366 | 6.01M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | 367 | 6.01M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | 368 | 6.01M | } | 369 | 140k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 370 | 140k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 371 | 140k | ics->swb_offset_max = hDecoder->frameLength; | 372 | | #ifdef LD_DEC | 373 | | } | 374 | | #endif | 375 | 140k | return 0; | 376 | 23.4k | case EIGHT_SHORT_SEQUENCE: | 377 | 23.4k | ics->num_windows = 8; | 378 | 23.4k | ics->num_window_groups = 1; | 379 | 23.4k | ics->window_group_length[ics->num_window_groups-1] = 1; | 380 | 23.4k | ics->num_swb = num_swb_128_window[sf_index]; | 381 | | | 382 | 23.4k | if (ics->max_sfb > ics->num_swb) | 383 | 7 | { | 384 | 7 | return 32; | 385 | 7 | } | 386 | | | 387 | 354k | for (i = 0; i < ics->num_swb; i++) | 388 | 330k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | 389 | 23.4k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | 390 | 23.4k | ics->swb_offset_max = hDecoder->frameLength/8; | 391 | | | 392 | 187k | for (i = 0; i < ics->num_windows-1; i++) { | 393 | 164k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | 394 | 134k | { | 395 | 134k | ics->num_window_groups += 1; | 396 | 134k | ics->window_group_length[ics->num_window_groups-1] = 1; | 397 | 134k | } else { | 398 | 29.6k | ics->window_group_length[ics->num_window_groups-1] += 1; | 399 | 29.6k | } | 400 | 164k | } | 401 | | | 402 | | /* preparation of sect_sfb_offset for short blocks */ | 403 | 181k | for (g = 0; g < ics->num_window_groups; g++) | 404 | 158k | { | 405 | 158k | uint16_t width; | 406 | 158k | uint8_t sect_sfb = 0; | 407 | 158k | uint16_t offset = 0; | 408 | | | 409 | 2.38M | for (i = 0; i < ics->num_swb; i++) | 410 | 2.22M | { | 411 | 2.22M | if (i+1 == ics->num_swb) | 412 | 158k | { | 413 | 158k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | 414 | 2.06M | } else { | 415 | 2.06M | width = swb_offset_128_window[sf_index][i+1] - | 416 | 2.06M | swb_offset_128_window[sf_index][i]; | 417 | 2.06M | } | 418 | 2.22M | width *= ics->window_group_length[g]; | 419 | 2.22M | ics->sect_sfb_offset[g][sect_sfb++] = offset; | 420 | 2.22M | offset += width; | 421 | 2.22M | } | 422 | 158k | ics->sect_sfb_offset[g][sect_sfb] = offset; | 423 | 158k | } | 424 | 23.4k | return 0; | 425 | 0 | default: | 426 | 0 | return 32; | 427 | 163k | } | 428 | 163k | } |
Line | Count | Source | 303 | 434k | { | 304 | 434k | uint8_t i, g; | 305 | | | 306 | 434k | uint8_t sf_index = hDecoder->sf_index; | 307 | | | 308 | 434k | if (sf_index >= 12) | 309 | 7 | return 32; | 310 | | | 311 | 434k | switch (ics->window_sequence) { | 312 | 372k | case ONLY_LONG_SEQUENCE: | 313 | 392k | case LONG_START_SEQUENCE: | 314 | 398k | case LONG_STOP_SEQUENCE: | 315 | 398k | ics->num_windows = 1; | 316 | 398k | ics->num_window_groups = 1; | 317 | 398k | ics->window_group_length[ics->num_window_groups-1] = 1; | 318 | 398k | #ifdef LD_DEC | 319 | 398k | if (hDecoder->object_type == LD) | 320 | 4.19k | { | 321 | 4.19k | if (hDecoder->frameLength == 512) | 322 | 2.02k | ics->num_swb = num_swb_512_window[sf_index]; | 323 | 2.17k | else /* if (hDecoder->frameLength == 480) */ | 324 | 2.17k | ics->num_swb = num_swb_480_window[sf_index]; | 325 | 394k | } else { | 326 | 394k | #endif | 327 | 394k | if (hDecoder->frameLength == 1024) | 328 | 340k | ics->num_swb = num_swb_1024_window[sf_index]; | 329 | 54.2k | else /* if (hDecoder->frameLength == 960) */ | 330 | 54.2k | ics->num_swb = num_swb_960_window[sf_index]; | 331 | 394k | #ifdef LD_DEC | 332 | 394k | } | 333 | 398k | #endif | 334 | | | 335 | 398k | if (ics->max_sfb > ics->num_swb) | 336 | 197 | { | 337 | 197 | return 32; | 338 | 197 | } | 339 | | | 340 | | /* preparation of sect_sfb_offset for long blocks */ | 341 | | /* also copy the last value! */ | 342 | 398k | #ifdef LD_DEC | 343 | 398k | if (hDecoder->object_type == LD) | 344 | 4.18k | { | 345 | 4.18k | if (hDecoder->frameLength == 512) | 346 | 2.01k | { | 347 | 57.9k | for (i = 0; i < ics->num_swb; i++) | 348 | 55.9k | { | 349 | 55.9k | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; | 350 | 55.9k | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; | 351 | 55.9k | } | 352 | 2.17k | } else /* if (hDecoder->frameLength == 480) */ { | 353 | 65.8k | for (i = 0; i < ics->num_swb; i++) | 354 | 63.6k | { | 355 | 63.6k | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; | 356 | 63.6k | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; | 357 | 63.6k | } | 358 | 2.17k | } | 359 | 4.18k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 360 | 4.18k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 361 | 4.18k | ics->swb_offset_max = hDecoder->frameLength; | 362 | 394k | } else { | 363 | 394k | #endif | 364 | 17.0M | for (i = 0; i < ics->num_swb; i++) | 365 | 16.6M | { | 366 | 16.6M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | 367 | 16.6M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | 368 | 16.6M | } | 369 | 394k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 370 | 394k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 371 | 394k | ics->swb_offset_max = hDecoder->frameLength; | 372 | 394k | #ifdef LD_DEC | 373 | 394k | } | 374 | 398k | #endif | 375 | 398k | return 0; | 376 | 36.0k | case EIGHT_SHORT_SEQUENCE: | 377 | 36.0k | ics->num_windows = 8; | 378 | 36.0k | ics->num_window_groups = 1; | 379 | 36.0k | ics->window_group_length[ics->num_window_groups-1] = 1; | 380 | 36.0k | ics->num_swb = num_swb_128_window[sf_index]; | 381 | | | 382 | 36.0k | if (ics->max_sfb > ics->num_swb) | 383 | 12 | { | 384 | 12 | return 32; | 385 | 12 | } | 386 | | | 387 | 529k | for (i = 0; i < ics->num_swb; i++) | 388 | 493k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | 389 | 36.0k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | 390 | 36.0k | ics->swb_offset_max = hDecoder->frameLength/8; | 391 | | | 392 | 288k | for (i = 0; i < ics->num_windows-1; i++) { | 393 | 252k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | 394 | 206k | { | 395 | 206k | ics->num_window_groups += 1; | 396 | 206k | ics->window_group_length[ics->num_window_groups-1] = 1; | 397 | 206k | } else { | 398 | 45.6k | ics->window_group_length[ics->num_window_groups-1] += 1; | 399 | 45.6k | } | 400 | 252k | } | 401 | | | 402 | | /* preparation of sect_sfb_offset for short blocks */ | 403 | 278k | for (g = 0; g < ics->num_window_groups; g++) | 404 | 242k | { | 405 | 242k | uint16_t width; | 406 | 242k | uint8_t sect_sfb = 0; | 407 | 242k | uint16_t offset = 0; | 408 | | | 409 | 3.56M | for (i = 0; i < ics->num_swb; i++) | 410 | 3.31M | { | 411 | 3.31M | if (i+1 == ics->num_swb) | 412 | 242k | { | 413 | 242k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | 414 | 3.07M | } else { | 415 | 3.07M | width = swb_offset_128_window[sf_index][i+1] - | 416 | 3.07M | swb_offset_128_window[sf_index][i]; | 417 | 3.07M | } | 418 | 3.31M | width *= ics->window_group_length[g]; | 419 | 3.31M | ics->sect_sfb_offset[g][sect_sfb++] = offset; | 420 | 3.31M | offset += width; | 421 | 3.31M | } | 422 | 242k | ics->sect_sfb_offset[g][sect_sfb] = offset; | 423 | 242k | } | 424 | 36.0k | return 0; | 425 | 0 | default: | 426 | 0 | return 32; | 427 | 434k | } | 428 | 434k | } |
|
429 | | |
430 | | /* iquant() * output = sign(input)*abs(input)^(4/3) */ |
431 | | static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) |
432 | 632M | { |
433 | | #ifdef FIXED_POINT |
434 | | /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ |
435 | | /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not |
436 | | * defined a 1026 value table and interpolation will be used |
437 | | */ |
438 | | #ifndef BIG_IQ_TABLE |
439 | | static const real_t errcorr[] = { |
440 | 226M | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), |
441 | 226M | REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), |
442 | 226M | REAL_CONST(0) |
443 | | }; |
444 | | real_t x1, x2; |
445 | | #endif |
446 | | int16_t sgn = 1; |
447 | | |
448 | 226M | if (q < 0) |
449 | 123k | { |
450 | 123k | q = -q; |
451 | 123k | sgn = -1; |
452 | 123k | } |
453 | | |
454 | 226M | if (q < IQ_TABLE_SIZE) |
455 | 226M | { |
456 | | //#define IQUANT_PRINT |
457 | | #ifdef IQUANT_PRINT |
458 | | //printf("0x%.8X\n", sgn * tab[q]); |
459 | | printf("%d\n", sgn * tab[q]); |
460 | | #endif |
461 | 226M | return sgn * tab[q]; |
462 | 226M | } |
463 | | |
464 | 1.57k | #ifndef BIG_IQ_TABLE |
465 | 1.57k | if (q >= 8192) |
466 | 670 | { |
467 | 670 | *error = 17; |
468 | 670 | return 0; |
469 | 670 | } |
470 | | |
471 | | /* linear interpolation */ |
472 | 902 | x1 = tab[q>>3]; |
473 | 902 | x2 = tab[(q>>3) + 1]; |
474 | 902 | return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); |
475 | | #else |
476 | | *error = 17; |
477 | | return 0; |
478 | | #endif |
479 | | |
480 | | #else |
481 | 405M | if (q < 0) |
482 | 110k | { |
483 | | /* tab contains a value for all possible q [0,8192] */ |
484 | 110k | if (-q < IQ_TABLE_SIZE) |
485 | 109k | return -tab[-q]; |
486 | | |
487 | 1.17k | *error = 17; |
488 | 1.17k | return 0; |
489 | 405M | } else { |
490 | | /* tab contains a value for all possible q [0,8192] */ |
491 | 405M | if (q < IQ_TABLE_SIZE) |
492 | 405M | return tab[q]; |
493 | | |
494 | 1.07k | *error = 17; |
495 | 1.07k | return 0; |
496 | 405M | } |
497 | | #endif |
498 | 1.57k | } Line | Count | Source | 432 | 226M | { | 433 | 226M | #ifdef FIXED_POINT | 434 | | /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ | 435 | | /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not | 436 | | * defined a 1026 value table and interpolation will be used | 437 | | */ | 438 | 226M | #ifndef BIG_IQ_TABLE | 439 | 226M | static const real_t errcorr[] = { | 440 | 226M | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), | 441 | 226M | REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), | 442 | 226M | REAL_CONST(0) | 443 | 226M | }; | 444 | 226M | real_t x1, x2; | 445 | 226M | #endif | 446 | 226M | int16_t sgn = 1; | 447 | | | 448 | 226M | if (q < 0) | 449 | 123k | { | 450 | 123k | q = -q; | 451 | 123k | sgn = -1; | 452 | 123k | } | 453 | | | 454 | 226M | if (q < IQ_TABLE_SIZE) | 455 | 226M | { | 456 | | //#define IQUANT_PRINT | 457 | | #ifdef IQUANT_PRINT | 458 | | //printf("0x%.8X\n", sgn * tab[q]); | 459 | | printf("%d\n", sgn * tab[q]); | 460 | | #endif | 461 | 226M | return sgn * tab[q]; | 462 | 226M | } | 463 | | | 464 | 1.57k | #ifndef BIG_IQ_TABLE | 465 | 1.57k | if (q >= 8192) | 466 | 670 | { | 467 | 670 | *error = 17; | 468 | 670 | return 0; | 469 | 670 | } | 470 | | | 471 | | /* linear interpolation */ | 472 | 902 | x1 = tab[q>>3]; | 473 | 902 | x2 = tab[(q>>3) + 1]; | 474 | 902 | return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); | 475 | | #else | 476 | | *error = 17; | 477 | | return 0; | 478 | | #endif | 479 | | | 480 | | #else | 481 | | if (q < 0) | 482 | | { | 483 | | /* tab contains a value for all possible q [0,8192] */ | 484 | | if (-q < IQ_TABLE_SIZE) | 485 | | return -tab[-q]; | 486 | | | 487 | | *error = 17; | 488 | | return 0; | 489 | | } else { | 490 | | /* tab contains a value for all possible q [0,8192] */ | 491 | | if (q < IQ_TABLE_SIZE) | 492 | | return tab[q]; | 493 | | | 494 | | *error = 17; | 495 | | return 0; | 496 | | } | 497 | | #endif | 498 | 1.57k | } |
Line | Count | Source | 432 | 405M | { | 433 | | #ifdef FIXED_POINT | 434 | | /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ | 435 | | /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not | 436 | | * defined a 1026 value table and interpolation will be used | 437 | | */ | 438 | | #ifndef BIG_IQ_TABLE | 439 | | static const real_t errcorr[] = { | 440 | | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), | 441 | | REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), | 442 | | REAL_CONST(0) | 443 | | }; | 444 | | real_t x1, x2; | 445 | | #endif | 446 | | int16_t sgn = 1; | 447 | | | 448 | | if (q < 0) | 449 | | { | 450 | | q = -q; | 451 | | sgn = -1; | 452 | | } | 453 | | | 454 | | if (q < IQ_TABLE_SIZE) | 455 | | { | 456 | | //#define IQUANT_PRINT | 457 | | #ifdef IQUANT_PRINT | 458 | | //printf("0x%.8X\n", sgn * tab[q]); | 459 | | printf("%d\n", sgn * tab[q]); | 460 | | #endif | 461 | | return sgn * tab[q]; | 462 | | } | 463 | | | 464 | | #ifndef BIG_IQ_TABLE | 465 | | if (q >= 8192) | 466 | | { | 467 | | *error = 17; | 468 | | return 0; | 469 | | } | 470 | | | 471 | | /* linear interpolation */ | 472 | | x1 = tab[q>>3]; | 473 | | x2 = tab[(q>>3) + 1]; | 474 | | return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); | 475 | | #else | 476 | | *error = 17; | 477 | | return 0; | 478 | | #endif | 479 | | | 480 | | #else | 481 | 405M | if (q < 0) | 482 | 110k | { | 483 | | /* tab contains a value for all possible q [0,8192] */ | 484 | 110k | if (-q < IQ_TABLE_SIZE) | 485 | 109k | return -tab[-q]; | 486 | | | 487 | 1.17k | *error = 17; | 488 | 1.17k | return 0; | 489 | 405M | } else { | 490 | | /* tab contains a value for all possible q [0,8192] */ | 491 | 405M | if (q < IQ_TABLE_SIZE) | 492 | 405M | return tab[q]; | 493 | | | 494 | 1.07k | *error = 17; | 495 | 1.07k | return 0; | 496 | 405M | } | 497 | 405M | #endif | 498 | 405M | } |
|
499 | | |
500 | | #ifndef FIXED_POINT |
501 | | ALIGN static const real_t pow2sf_tab[] = { |
502 | | 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, |
503 | | 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, |
504 | | 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, |
505 | | 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, |
506 | | 0.0001220703125, 0.000244140625, 0.00048828125, |
507 | | 0.0009765625, 0.001953125, 0.00390625, |
508 | | 0.0078125, 0.015625, 0.03125, |
509 | | 0.0625, 0.125, 0.25, |
510 | | 0.5, 1.0, 2.0, |
511 | | 4.0, 8.0, 16.0, 32.0, |
512 | | 64.0, 128.0, 256.0, |
513 | | 512.0, 1024.0, 2048.0, |
514 | | 4096.0, 8192.0, 16384.0, |
515 | | 32768.0, 65536.0, 131072.0, |
516 | | 262144.0, 524288.0, 1048576.0, |
517 | | 2097152.0, 4194304.0, 8388608.0, |
518 | | 16777216.0, 33554432.0, 67108864.0, |
519 | | 134217728.0, 268435456.0, 536870912.0, |
520 | | 1073741824.0, 2147483648.0, 4294967296.0, |
521 | | 8589934592.0, 17179869184.0, 34359738368.0, |
522 | | 68719476736.0, 137438953472.0, 274877906944.0 |
523 | | }; |
524 | | #endif |
525 | | |
526 | | /* quant_to_spec: perform dequantisation and scaling |
527 | | * and in case of short block it also does the deinterleaving |
528 | | */ |
529 | | /* |
530 | | For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, |
531 | | window_group_length[0] = 1) the spectral data is in ascending spectral |
532 | | order. |
533 | | For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the |
534 | | grouping in the following manner: |
535 | | - Groups are ordered sequentially |
536 | | - Within a group, a scalefactor band consists of the spectral data of all |
537 | | grouped SHORT_WINDOWs for the associated scalefactor window band. To |
538 | | clarify via example, the length of a group is in the range of one to eight |
539 | | SHORT_WINDOWs. |
540 | | - If there are eight groups each with length one (num_window_groups = 8, |
541 | | window_group_length[0..7] = 1), the result is a sequence of eight spectra, |
542 | | each in ascending spectral order. |
543 | | - If there is only one group with length eight (num_window_groups = 1, |
544 | | window_group_length[0] = 8), the result is that spectral data of all eight |
545 | | SHORT_WINDOWs is interleaved by scalefactor window bands. |
546 | | - Within a scalefactor window band, the coefficients are in ascending |
547 | | spectral order. |
548 | | */ |
549 | | static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, |
550 | | ic_stream *ics, int16_t *quant_data, |
551 | | real_t *spec_data, uint16_t frame_len) |
552 | 625k | { |
553 | 625k | ALIGN static const real_t pow2_table[] = |
554 | 625k | { |
555 | 625k | COEF_CONST(1.0), |
556 | 625k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ |
557 | 625k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ |
558 | 625k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ |
559 | 625k | }; |
560 | 625k | const real_t *tab = iq_table; |
561 | | |
562 | 625k | uint8_t g, sfb, win; |
563 | 625k | uint16_t width, bin, k, gindex; |
564 | 625k | uint8_t error = 0; /* Init error flag */ |
565 | | #ifndef FIXED_POINT |
566 | | real_t scf; |
567 | | #else |
568 | | int32_t sat_shift_mask = 0; |
569 | | #endif |
570 | | |
571 | 625k | k = 0; |
572 | 625k | gindex = 0; |
573 | | |
574 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. |
575 | | * Without peeking into AAC specification, there is no strong evidence if |
576 | | * such streams are invalid -> just calm down MSAN. */ |
577 | 625k | if (ics->num_swb == 0) |
578 | 830 | memset(spec_data, 0, frame_len * sizeof(real_t)); |
579 | | |
580 | 1.60M | for (g = 0; g < ics->num_window_groups; g++) |
581 | 978k | { |
582 | 978k | uint16_t j = 0; |
583 | 978k | uint16_t gincrease = 0; |
584 | 978k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; |
585 | | |
586 | 30.5M | for (sfb = 0; sfb < ics->num_swb; sfb++) |
587 | 29.5M | { |
588 | 29.5M | int32_t exp, frac; |
589 | 29.5M | uint16_t wa = gindex + j; |
590 | 29.5M | int16_t scale_factor = ics->scale_factors[g][sfb]; |
591 | | |
592 | 29.5M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; |
593 | | |
594 | | #ifdef FIXED_POINT |
595 | | scale_factor -= 100; |
596 | | /* IMDCT pre-scaling */ |
597 | 10.4M | if (hDecoder->object_type == LD) |
598 | 49.4k | { |
599 | 49.4k | scale_factor -= 24 /*9*/; |
600 | 10.4M | } else { |
601 | 10.4M | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
602 | 1.87M | scale_factor -= 16 /*7*/; |
603 | 8.54M | else |
604 | 8.54M | scale_factor -= 28 /*10*/; |
605 | 10.4M | } |
606 | 10.4M | if (scale_factor > 120) |
607 | 823 | scale_factor = 120; /* => exp <= 30 */ |
608 | | #else |
609 | | (void)hDecoder; |
610 | | #endif |
611 | | |
612 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ |
613 | 29.5M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) |
614 | 58.6k | { |
615 | 58.6k | scale_factor = 0; |
616 | 58.6k | } |
617 | | |
618 | | /* scale_factor must be between 0 and 255 */ |
619 | 29.5M | exp = (scale_factor /* - 100 */) >> 2; |
620 | | /* frac must always be > 0 */ |
621 | 29.5M | frac = (scale_factor /* - 100 */) & 3; |
622 | | |
623 | | #ifndef FIXED_POINT |
624 | | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; |
625 | | #else |
626 | 10.4M | if (exp > 0) |
627 | 23.4k | sat_shift_mask = SAT_SHIFT_MASK(exp); |
628 | | #endif |
629 | | |
630 | 60.2M | for (win = 0; win < ics->window_group_length[g]; win++) |
631 | 30.7M | { |
632 | 188M | for (bin = 0; bin < width; bin += 4) |
633 | 158M | { |
634 | 158M | uint16_t wb = wa + bin; |
635 | | #ifndef FIXED_POINT |
636 | | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; |
637 | | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; |
638 | | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; |
639 | | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; |
640 | | #else |
641 | | real_t iq0 = iquant(quant_data[k+0], tab, &error); |
642 | | real_t iq1 = iquant(quant_data[k+1], tab, &error); |
643 | | real_t iq2 = iquant(quant_data[k+2], tab, &error); |
644 | | real_t iq3 = iquant(quant_data[k+3], tab, &error); |
645 | | |
646 | 56.7M | if (exp == -32) |
647 | 51.2M | { |
648 | 51.2M | spec_data[wb+0] = 0; |
649 | 51.2M | spec_data[wb+1] = 0; |
650 | 51.2M | spec_data[wb+2] = 0; |
651 | 51.2M | spec_data[wb+3] = 0; |
652 | 51.2M | } else if (exp <= 0) { |
653 | 5.35M | spec_data[wb+0] = iq0 >> -exp; |
654 | 5.35M | spec_data[wb+1] = iq1 >> -exp; |
655 | 5.35M | spec_data[wb+2] = iq2 >> -exp; |
656 | 5.35M | spec_data[wb+3] = iq3 >> -exp; |
657 | 5.35M | } else { /* exp > 0 */ |
658 | 104k | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); |
659 | 104k | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); |
660 | 104k | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); |
661 | 104k | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); |
662 | 104k | } |
663 | 56.7M | if (frac != 0) |
664 | 176k | { |
665 | 176k | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); |
666 | 176k | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); |
667 | 176k | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); |
668 | 176k | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); |
669 | 176k | } |
670 | | |
671 | | //#define SCFS_PRINT |
672 | | #ifdef SCFS_PRINT |
673 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
674 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); |
675 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); |
676 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); |
677 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
678 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); |
679 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); |
680 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); |
681 | | #endif |
682 | | #endif |
683 | | |
684 | 158M | gincrease += 4; |
685 | 158M | k += 4; |
686 | 158M | } |
687 | 30.7M | wa += win_inc; |
688 | 30.7M | } |
689 | 29.5M | j += width; |
690 | 29.5M | } |
691 | 978k | gindex += gincrease; |
692 | 978k | } |
693 | | |
694 | 625k | return error; |
695 | 625k | } Line | Count | Source | 552 | 224k | { | 553 | 224k | ALIGN static const real_t pow2_table[] = | 554 | 224k | { | 555 | 224k | COEF_CONST(1.0), | 556 | 224k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ | 557 | 224k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ | 558 | 224k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ | 559 | 224k | }; | 560 | 224k | const real_t *tab = iq_table; | 561 | | | 562 | 224k | uint8_t g, sfb, win; | 563 | 224k | uint16_t width, bin, k, gindex; | 564 | 224k | uint8_t error = 0; /* Init error flag */ | 565 | | #ifndef FIXED_POINT | 566 | | real_t scf; | 567 | | #else | 568 | 224k | int32_t sat_shift_mask = 0; | 569 | 224k | #endif | 570 | | | 571 | 224k | k = 0; | 572 | 224k | gindex = 0; | 573 | | | 574 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. | 575 | | * Without peeking into AAC specification, there is no strong evidence if | 576 | | * such streams are invalid -> just calm down MSAN. */ | 577 | 224k | if (ics->num_swb == 0) | 578 | 342 | memset(spec_data, 0, frame_len * sizeof(real_t)); | 579 | | | 580 | 564k | for (g = 0; g < ics->num_window_groups; g++) | 581 | 339k | { | 582 | 339k | uint16_t j = 0; | 583 | 339k | uint16_t gincrease = 0; | 584 | 339k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; | 585 | | | 586 | 10.8M | for (sfb = 0; sfb < ics->num_swb; sfb++) | 587 | 10.4M | { | 588 | 10.4M | int32_t exp, frac; | 589 | 10.4M | uint16_t wa = gindex + j; | 590 | 10.4M | int16_t scale_factor = ics->scale_factors[g][sfb]; | 591 | | | 592 | 10.4M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; | 593 | | | 594 | 10.4M | #ifdef FIXED_POINT | 595 | 10.4M | scale_factor -= 100; | 596 | | /* IMDCT pre-scaling */ | 597 | 10.4M | if (hDecoder->object_type == LD) | 598 | 49.4k | { | 599 | 49.4k | scale_factor -= 24 /*9*/; | 600 | 10.4M | } else { | 601 | 10.4M | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 602 | 1.87M | scale_factor -= 16 /*7*/; | 603 | 8.54M | else | 604 | 8.54M | scale_factor -= 28 /*10*/; | 605 | 10.4M | } | 606 | 10.4M | if (scale_factor > 120) | 607 | 823 | scale_factor = 120; /* => exp <= 30 */ | 608 | | #else | 609 | | (void)hDecoder; | 610 | | #endif | 611 | | | 612 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ | 613 | 10.4M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) | 614 | 28.7k | { | 615 | 28.7k | scale_factor = 0; | 616 | 28.7k | } | 617 | | | 618 | | /* scale_factor must be between 0 and 255 */ | 619 | 10.4M | exp = (scale_factor /* - 100 */) >> 2; | 620 | | /* frac must always be > 0 */ | 621 | 10.4M | frac = (scale_factor /* - 100 */) & 3; | 622 | | | 623 | | #ifndef FIXED_POINT | 624 | | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | 625 | | #else | 626 | 10.4M | if (exp > 0) | 627 | 23.4k | sat_shift_mask = SAT_SHIFT_MASK(exp); | 628 | 10.4M | #endif | 629 | | | 630 | 21.2M | for (win = 0; win < ics->window_group_length[g]; win++) | 631 | 10.8M | { | 632 | 67.5M | for (bin = 0; bin < width; bin += 4) | 633 | 56.7M | { | 634 | 56.7M | uint16_t wb = wa + bin; | 635 | | #ifndef FIXED_POINT | 636 | | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | 637 | | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | 638 | | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | 639 | | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | 640 | | #else | 641 | 56.7M | real_t iq0 = iquant(quant_data[k+0], tab, &error); | 642 | 56.7M | real_t iq1 = iquant(quant_data[k+1], tab, &error); | 643 | 56.7M | real_t iq2 = iquant(quant_data[k+2], tab, &error); | 644 | 56.7M | real_t iq3 = iquant(quant_data[k+3], tab, &error); | 645 | | | 646 | 56.7M | if (exp == -32) | 647 | 51.2M | { | 648 | 51.2M | spec_data[wb+0] = 0; | 649 | 51.2M | spec_data[wb+1] = 0; | 650 | 51.2M | spec_data[wb+2] = 0; | 651 | 51.2M | spec_data[wb+3] = 0; | 652 | 51.2M | } else if (exp <= 0) { | 653 | 5.35M | spec_data[wb+0] = iq0 >> -exp; | 654 | 5.35M | spec_data[wb+1] = iq1 >> -exp; | 655 | 5.35M | spec_data[wb+2] = iq2 >> -exp; | 656 | 5.35M | spec_data[wb+3] = iq3 >> -exp; | 657 | 5.35M | } else { /* exp > 0 */ | 658 | 104k | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); | 659 | 104k | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); | 660 | 104k | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); | 661 | 104k | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); | 662 | 104k | } | 663 | 56.7M | if (frac != 0) | 664 | 176k | { | 665 | 176k | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | 666 | 176k | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | 667 | 176k | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | 668 | 176k | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | 669 | 176k | } | 670 | | | 671 | | //#define SCFS_PRINT | 672 | | #ifdef SCFS_PRINT | 673 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 674 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 675 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 676 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 677 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 678 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 679 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 680 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 681 | | #endif | 682 | 56.7M | #endif | 683 | | | 684 | 56.7M | gincrease += 4; | 685 | 56.7M | k += 4; | 686 | 56.7M | } | 687 | 10.8M | wa += win_inc; | 688 | 10.8M | } | 689 | 10.4M | j += width; | 690 | 10.4M | } | 691 | 339k | gindex += gincrease; | 692 | 339k | } | 693 | | | 694 | 224k | return error; | 695 | 224k | } |
Line | Count | Source | 552 | 401k | { | 553 | 401k | ALIGN static const real_t pow2_table[] = | 554 | 401k | { | 555 | 401k | COEF_CONST(1.0), | 556 | 401k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ | 557 | 401k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ | 558 | 401k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ | 559 | 401k | }; | 560 | 401k | const real_t *tab = iq_table; | 561 | | | 562 | 401k | uint8_t g, sfb, win; | 563 | 401k | uint16_t width, bin, k, gindex; | 564 | 401k | uint8_t error = 0; /* Init error flag */ | 565 | 401k | #ifndef FIXED_POINT | 566 | 401k | real_t scf; | 567 | | #else | 568 | | int32_t sat_shift_mask = 0; | 569 | | #endif | 570 | | | 571 | 401k | k = 0; | 572 | 401k | gindex = 0; | 573 | | | 574 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. | 575 | | * Without peeking into AAC specification, there is no strong evidence if | 576 | | * such streams are invalid -> just calm down MSAN. */ | 577 | 401k | if (ics->num_swb == 0) | 578 | 488 | memset(spec_data, 0, frame_len * sizeof(real_t)); | 579 | | | 580 | 1.04M | for (g = 0; g < ics->num_window_groups; g++) | 581 | 638k | { | 582 | 638k | uint16_t j = 0; | 583 | 638k | uint16_t gincrease = 0; | 584 | 638k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; | 585 | | | 586 | 19.7M | for (sfb = 0; sfb < ics->num_swb; sfb++) | 587 | 19.1M | { | 588 | 19.1M | int32_t exp, frac; | 589 | 19.1M | uint16_t wa = gindex + j; | 590 | 19.1M | int16_t scale_factor = ics->scale_factors[g][sfb]; | 591 | | | 592 | 19.1M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; | 593 | | | 594 | | #ifdef FIXED_POINT | 595 | | scale_factor -= 100; | 596 | | /* IMDCT pre-scaling */ | 597 | | if (hDecoder->object_type == LD) | 598 | | { | 599 | | scale_factor -= 24 /*9*/; | 600 | | } else { | 601 | | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 602 | | scale_factor -= 16 /*7*/; | 603 | | else | 604 | | scale_factor -= 28 /*10*/; | 605 | | } | 606 | | if (scale_factor > 120) | 607 | | scale_factor = 120; /* => exp <= 30 */ | 608 | | #else | 609 | 19.1M | (void)hDecoder; | 610 | 19.1M | #endif | 611 | | | 612 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ | 613 | 19.1M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) | 614 | 29.9k | { | 615 | 29.9k | scale_factor = 0; | 616 | 29.9k | } | 617 | | | 618 | | /* scale_factor must be between 0 and 255 */ | 619 | 19.1M | exp = (scale_factor /* - 100 */) >> 2; | 620 | | /* frac must always be > 0 */ | 621 | 19.1M | frac = (scale_factor /* - 100 */) & 3; | 622 | | | 623 | 19.1M | #ifndef FIXED_POINT | 624 | 19.1M | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | 625 | | #else | 626 | | if (exp > 0) | 627 | | sat_shift_mask = SAT_SHIFT_MASK(exp); | 628 | | #endif | 629 | | | 630 | 39.0M | for (win = 0; win < ics->window_group_length[g]; win++) | 631 | 19.9M | { | 632 | 121M | for (bin = 0; bin < width; bin += 4) | 633 | 101M | { | 634 | 101M | uint16_t wb = wa + bin; | 635 | 101M | #ifndef FIXED_POINT | 636 | 101M | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | 637 | 101M | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | 638 | 101M | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | 639 | 101M | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | 640 | | #else | 641 | | real_t iq0 = iquant(quant_data[k+0], tab, &error); | 642 | | real_t iq1 = iquant(quant_data[k+1], tab, &error); | 643 | | real_t iq2 = iquant(quant_data[k+2], tab, &error); | 644 | | real_t iq3 = iquant(quant_data[k+3], tab, &error); | 645 | | | 646 | | if (exp == -32) | 647 | | { | 648 | | spec_data[wb+0] = 0; | 649 | | spec_data[wb+1] = 0; | 650 | | spec_data[wb+2] = 0; | 651 | | spec_data[wb+3] = 0; | 652 | | } else if (exp <= 0) { | 653 | | spec_data[wb+0] = iq0 >> -exp; | 654 | | spec_data[wb+1] = iq1 >> -exp; | 655 | | spec_data[wb+2] = iq2 >> -exp; | 656 | | spec_data[wb+3] = iq3 >> -exp; | 657 | | } else { /* exp > 0 */ | 658 | | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); | 659 | | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); | 660 | | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); | 661 | | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); | 662 | | } | 663 | | if (frac != 0) | 664 | | { | 665 | | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | 666 | | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | 667 | | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | 668 | | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | 669 | | } | 670 | | | 671 | | //#define SCFS_PRINT | 672 | | #ifdef SCFS_PRINT | 673 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 674 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 675 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 676 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 677 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 678 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 679 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 680 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 681 | | #endif | 682 | | #endif | 683 | | | 684 | 101M | gincrease += 4; | 685 | 101M | k += 4; | 686 | 101M | } | 687 | 19.9M | wa += win_inc; | 688 | 19.9M | } | 689 | 19.1M | j += width; | 690 | 19.1M | } | 691 | 638k | gindex += gincrease; | 692 | 638k | } | 693 | | | 694 | 401k | return error; | 695 | 401k | } |
|
696 | | |
697 | | static uint8_t allocate_single_channel(NeAACDecStruct *hDecoder, uint8_t channel, |
698 | | uint8_t output_channels) |
699 | 292k | { |
700 | 292k | int mul = 1; |
701 | | |
702 | | #ifdef MAIN_DEC |
703 | | /* MAIN object type prediction */ |
704 | 187k | if (hDecoder->object_type == MAIN) |
705 | 73.0k | { |
706 | | /* allocate the state only when needed */ |
707 | 73.0k | if (hDecoder->pred_stat[channel] != NULL) |
708 | 1.06k | { |
709 | 1.06k | faad_free(hDecoder->pred_stat[channel]); |
710 | 1.06k | hDecoder->pred_stat[channel] = NULL; |
711 | 1.06k | } |
712 | | |
713 | 73.0k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
714 | 73.0k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
715 | 73.0k | } |
716 | | #endif |
717 | | |
718 | | #ifdef LTP_DEC |
719 | 187k | if (is_ltp_ot(hDecoder->object_type)) |
720 | 55.4k | { |
721 | | /* allocate the state only when needed */ |
722 | 55.4k | if (hDecoder->lt_pred_stat[channel] != NULL) |
723 | 1.62k | { |
724 | 1.62k | faad_free(hDecoder->lt_pred_stat[channel]); |
725 | 1.62k | hDecoder->lt_pred_stat[channel] = NULL; |
726 | 1.62k | } |
727 | | |
728 | 55.4k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
729 | 55.4k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
730 | 55.4k | } |
731 | | #endif |
732 | | |
733 | 292k | if (hDecoder->time_out[channel] != NULL) |
734 | 4.35k | { |
735 | 4.35k | faad_free(hDecoder->time_out[channel]); |
736 | 4.35k | hDecoder->time_out[channel] = NULL; |
737 | 4.35k | } |
738 | | |
739 | 292k | { |
740 | 292k | mul = 1; |
741 | 292k | #ifdef SBR_DEC |
742 | 292k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; |
743 | 292k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
744 | 229k | { |
745 | | /* SBR requires 2 times as much output data */ |
746 | 229k | mul = 2; |
747 | 229k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; |
748 | 229k | } |
749 | 292k | #endif |
750 | 292k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
751 | 292k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
752 | 292k | } |
753 | | |
754 | 292k | #if (defined(PS_DEC) || defined(DRM_PS)) |
755 | 292k | if (output_channels == 2) |
756 | 109k | { |
757 | 109k | if (hDecoder->time_out[channel+1] != NULL) |
758 | 1.18k | { |
759 | 1.18k | faad_free(hDecoder->time_out[channel+1]); |
760 | 1.18k | hDecoder->time_out[channel+1] = NULL; |
761 | 1.18k | } |
762 | | |
763 | 109k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
764 | 109k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
765 | 109k | } |
766 | 292k | #endif |
767 | | |
768 | 292k | if (hDecoder->fb_intermed[channel] != NULL) |
769 | 3.75k | { |
770 | 3.75k | faad_free(hDecoder->fb_intermed[channel]); |
771 | 3.75k | hDecoder->fb_intermed[channel] = NULL; |
772 | 3.75k | } |
773 | | |
774 | 292k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
775 | 292k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
776 | | |
777 | | #ifdef SSR_DEC |
778 | | if (hDecoder->object_type == SSR) |
779 | | { |
780 | | if (hDecoder->ssr_overlap[channel] == NULL) |
781 | | { |
782 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
783 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
784 | | } |
785 | | if (hDecoder->prev_fmd[channel] == NULL) |
786 | | { |
787 | | uint16_t k; |
788 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
789 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
790 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); |
791 | | } |
792 | | } |
793 | | #endif |
794 | | |
795 | 292k | return 0; |
796 | 292k | } specrec.c:allocate_single_channel Line | Count | Source | 699 | 105k | { | 700 | 105k | int mul = 1; | 701 | | | 702 | | #ifdef MAIN_DEC | 703 | | /* MAIN object type prediction */ | 704 | | if (hDecoder->object_type == MAIN) | 705 | | { | 706 | | /* allocate the state only when needed */ | 707 | | if (hDecoder->pred_stat[channel] != NULL) | 708 | | { | 709 | | faad_free(hDecoder->pred_stat[channel]); | 710 | | hDecoder->pred_stat[channel] = NULL; | 711 | | } | 712 | | | 713 | | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 714 | | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 715 | | } | 716 | | #endif | 717 | | | 718 | | #ifdef LTP_DEC | 719 | | if (is_ltp_ot(hDecoder->object_type)) | 720 | | { | 721 | | /* allocate the state only when needed */ | 722 | | if (hDecoder->lt_pred_stat[channel] != NULL) | 723 | | { | 724 | | faad_free(hDecoder->lt_pred_stat[channel]); | 725 | | hDecoder->lt_pred_stat[channel] = NULL; | 726 | | } | 727 | | | 728 | | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 729 | | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 730 | | } | 731 | | #endif | 732 | | | 733 | 105k | if (hDecoder->time_out[channel] != NULL) | 734 | 0 | { | 735 | 0 | faad_free(hDecoder->time_out[channel]); | 736 | 0 | hDecoder->time_out[channel] = NULL; | 737 | 0 | } | 738 | | | 739 | 105k | { | 740 | 105k | mul = 1; | 741 | 105k | #ifdef SBR_DEC | 742 | 105k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 743 | 105k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 744 | 90.4k | { | 745 | | /* SBR requires 2 times as much output data */ | 746 | 90.4k | mul = 2; | 747 | 90.4k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 748 | 90.4k | } | 749 | 105k | #endif | 750 | 105k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 751 | 105k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 752 | 105k | } | 753 | | | 754 | 105k | #if (defined(PS_DEC) || defined(DRM_PS)) | 755 | 105k | if (output_channels == 2) | 756 | 105k | { | 757 | 105k | if (hDecoder->time_out[channel+1] != NULL) | 758 | 0 | { | 759 | 0 | faad_free(hDecoder->time_out[channel+1]); | 760 | 0 | hDecoder->time_out[channel+1] = NULL; | 761 | 0 | } | 762 | | | 763 | 105k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 764 | 105k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 765 | 105k | } | 766 | 105k | #endif | 767 | | | 768 | 105k | if (hDecoder->fb_intermed[channel] != NULL) | 769 | 0 | { | 770 | 0 | faad_free(hDecoder->fb_intermed[channel]); | 771 | 0 | hDecoder->fb_intermed[channel] = NULL; | 772 | 0 | } | 773 | | | 774 | 105k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 775 | 105k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 776 | | | 777 | | #ifdef SSR_DEC | 778 | | if (hDecoder->object_type == SSR) | 779 | | { | 780 | | if (hDecoder->ssr_overlap[channel] == NULL) | 781 | | { | 782 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 783 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 784 | | } | 785 | | if (hDecoder->prev_fmd[channel] == NULL) | 786 | | { | 787 | | uint16_t k; | 788 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 789 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 790 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | 791 | | } | 792 | | } | 793 | | #endif | 794 | | | 795 | 105k | return 0; | 796 | 105k | } |
specrec.c:allocate_single_channel Line | Count | Source | 699 | 187k | { | 700 | 187k | int mul = 1; | 701 | | | 702 | 187k | #ifdef MAIN_DEC | 703 | | /* MAIN object type prediction */ | 704 | 187k | if (hDecoder->object_type == MAIN) | 705 | 73.0k | { | 706 | | /* allocate the state only when needed */ | 707 | 73.0k | if (hDecoder->pred_stat[channel] != NULL) | 708 | 1.06k | { | 709 | 1.06k | faad_free(hDecoder->pred_stat[channel]); | 710 | 1.06k | hDecoder->pred_stat[channel] = NULL; | 711 | 1.06k | } | 712 | | | 713 | 73.0k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 714 | 73.0k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 715 | 73.0k | } | 716 | 187k | #endif | 717 | | | 718 | 187k | #ifdef LTP_DEC | 719 | 187k | if (is_ltp_ot(hDecoder->object_type)) | 720 | 55.4k | { | 721 | | /* allocate the state only when needed */ | 722 | 55.4k | if (hDecoder->lt_pred_stat[channel] != NULL) | 723 | 1.62k | { | 724 | 1.62k | faad_free(hDecoder->lt_pred_stat[channel]); | 725 | 1.62k | hDecoder->lt_pred_stat[channel] = NULL; | 726 | 1.62k | } | 727 | | | 728 | 55.4k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 729 | 55.4k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 730 | 55.4k | } | 731 | 187k | #endif | 732 | | | 733 | 187k | if (hDecoder->time_out[channel] != NULL) | 734 | 4.35k | { | 735 | 4.35k | faad_free(hDecoder->time_out[channel]); | 736 | 4.35k | hDecoder->time_out[channel] = NULL; | 737 | 4.35k | } | 738 | | | 739 | 187k | { | 740 | 187k | mul = 1; | 741 | 187k | #ifdef SBR_DEC | 742 | 187k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 743 | 187k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 744 | 139k | { | 745 | | /* SBR requires 2 times as much output data */ | 746 | 139k | mul = 2; | 747 | 139k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 748 | 139k | } | 749 | 187k | #endif | 750 | 187k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 751 | 187k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 752 | 187k | } | 753 | | | 754 | 187k | #if (defined(PS_DEC) || defined(DRM_PS)) | 755 | 187k | if (output_channels == 2) | 756 | 4.10k | { | 757 | 4.10k | if (hDecoder->time_out[channel+1] != NULL) | 758 | 1.18k | { | 759 | 1.18k | faad_free(hDecoder->time_out[channel+1]); | 760 | 1.18k | hDecoder->time_out[channel+1] = NULL; | 761 | 1.18k | } | 762 | | | 763 | 4.10k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 764 | 4.10k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 765 | 4.10k | } | 766 | 187k | #endif | 767 | | | 768 | 187k | if (hDecoder->fb_intermed[channel] != NULL) | 769 | 3.75k | { | 770 | 3.75k | faad_free(hDecoder->fb_intermed[channel]); | 771 | 3.75k | hDecoder->fb_intermed[channel] = NULL; | 772 | 3.75k | } | 773 | | | 774 | 187k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 775 | 187k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 776 | | | 777 | | #ifdef SSR_DEC | 778 | | if (hDecoder->object_type == SSR) | 779 | | { | 780 | | if (hDecoder->ssr_overlap[channel] == NULL) | 781 | | { | 782 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 783 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 784 | | } | 785 | | if (hDecoder->prev_fmd[channel] == NULL) | 786 | | { | 787 | | uint16_t k; | 788 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 789 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 790 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | 791 | | } | 792 | | } | 793 | | #endif | 794 | | | 795 | 187k | return 0; | 796 | 187k | } |
|
797 | | |
798 | | static uint8_t allocate_channel_pair(NeAACDecStruct *hDecoder, |
799 | | uint8_t channel, uint8_t paired_channel) |
800 | 41.4k | { |
801 | 41.4k | int mul = 1; |
802 | | |
803 | | #ifdef MAIN_DEC |
804 | | /* MAIN object type prediction */ |
805 | 19.1k | if (hDecoder->object_type == MAIN) |
806 | 9.03k | { |
807 | | /* allocate the state only when needed */ |
808 | 9.03k | if (hDecoder->pred_stat[channel] == NULL) |
809 | 9.01k | { |
810 | 9.01k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
811 | 9.01k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
812 | 9.01k | } |
813 | 9.03k | if (hDecoder->pred_stat[paired_channel] == NULL) |
814 | 9.01k | { |
815 | 9.01k | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
816 | 9.01k | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); |
817 | 9.01k | } |
818 | 9.03k | } |
819 | | #endif |
820 | | |
821 | | #ifdef LTP_DEC |
822 | 19.1k | if (is_ltp_ot(hDecoder->object_type)) |
823 | 7.38k | { |
824 | | /* allocate the state only when needed */ |
825 | 7.38k | if (hDecoder->lt_pred_stat[channel] == NULL) |
826 | 7.33k | { |
827 | 7.33k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
828 | 7.33k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
829 | 7.33k | } |
830 | 7.38k | if (hDecoder->lt_pred_stat[paired_channel] == NULL) |
831 | 7.33k | { |
832 | 7.33k | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
833 | 7.33k | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
834 | 7.33k | } |
835 | 7.38k | } |
836 | | #endif |
837 | | |
838 | 41.4k | { |
839 | 41.4k | mul = 1; |
840 | 41.4k | #ifdef SBR_DEC |
841 | 41.4k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; |
842 | 41.4k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
843 | 34.7k | { |
844 | | /* SBR requires 2 times as much output data */ |
845 | 34.7k | mul = 2; |
846 | 34.7k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; |
847 | 34.7k | } |
848 | 41.4k | #endif |
849 | 41.4k | } |
850 | 41.4k | if (hDecoder->time_out[channel] == NULL) |
851 | 41.3k | { |
852 | 41.3k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
853 | 41.3k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
854 | 41.3k | } |
855 | 41.4k | if (hDecoder->time_out[paired_channel] == NULL) |
856 | 41.3k | { |
857 | 41.3k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
858 | 41.3k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
859 | 41.3k | } |
860 | | |
861 | 41.4k | if (hDecoder->fb_intermed[channel] == NULL) |
862 | 41.3k | { |
863 | 41.3k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
864 | 41.3k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
865 | 41.3k | } |
866 | 41.4k | if (hDecoder->fb_intermed[paired_channel] == NULL) |
867 | 41.3k | { |
868 | 41.3k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
869 | 41.3k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); |
870 | 41.3k | } |
871 | | |
872 | | #ifdef SSR_DEC |
873 | | if (hDecoder->object_type == SSR) |
874 | | { |
875 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) |
876 | | { |
877 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
878 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
879 | | } |
880 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) |
881 | | { |
882 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
883 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
884 | | } |
885 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) |
886 | | { |
887 | | uint16_t k; |
888 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
889 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
890 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); |
891 | | } |
892 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) |
893 | | { |
894 | | uint16_t k; |
895 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
896 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
897 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); |
898 | | } |
899 | | } |
900 | | #endif |
901 | | |
902 | 41.4k | return 0; |
903 | 41.4k | } specrec.c:allocate_channel_pair Line | Count | Source | 800 | 22.3k | { | 801 | 22.3k | int mul = 1; | 802 | | | 803 | | #ifdef MAIN_DEC | 804 | | /* MAIN object type prediction */ | 805 | | if (hDecoder->object_type == MAIN) | 806 | | { | 807 | | /* allocate the state only when needed */ | 808 | | if (hDecoder->pred_stat[channel] == NULL) | 809 | | { | 810 | | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 811 | | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 812 | | } | 813 | | if (hDecoder->pred_stat[paired_channel] == NULL) | 814 | | { | 815 | | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 816 | | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | 817 | | } | 818 | | } | 819 | | #endif | 820 | | | 821 | | #ifdef LTP_DEC | 822 | | if (is_ltp_ot(hDecoder->object_type)) | 823 | | { | 824 | | /* allocate the state only when needed */ | 825 | | if (hDecoder->lt_pred_stat[channel] == NULL) | 826 | | { | 827 | | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 828 | | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 829 | | } | 830 | | if (hDecoder->lt_pred_stat[paired_channel] == NULL) | 831 | | { | 832 | | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 833 | | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 834 | | } | 835 | | } | 836 | | #endif | 837 | | | 838 | 22.3k | { | 839 | 22.3k | mul = 1; | 840 | 22.3k | #ifdef SBR_DEC | 841 | 22.3k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 842 | 22.3k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 843 | 19.8k | { | 844 | | /* SBR requires 2 times as much output data */ | 845 | 19.8k | mul = 2; | 846 | 19.8k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 847 | 19.8k | } | 848 | 22.3k | #endif | 849 | 22.3k | } | 850 | 22.3k | if (hDecoder->time_out[channel] == NULL) | 851 | 22.3k | { | 852 | 22.3k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 853 | 22.3k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 854 | 22.3k | } | 855 | 22.3k | if (hDecoder->time_out[paired_channel] == NULL) | 856 | 22.3k | { | 857 | 22.3k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 858 | 22.3k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 859 | 22.3k | } | 860 | | | 861 | 22.3k | if (hDecoder->fb_intermed[channel] == NULL) | 862 | 22.3k | { | 863 | 22.3k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 864 | 22.3k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 865 | 22.3k | } | 866 | 22.3k | if (hDecoder->fb_intermed[paired_channel] == NULL) | 867 | 22.3k | { | 868 | 22.3k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 869 | 22.3k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | 870 | 22.3k | } | 871 | | | 872 | | #ifdef SSR_DEC | 873 | | if (hDecoder->object_type == SSR) | 874 | | { | 875 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) | 876 | | { | 877 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 878 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 879 | | } | 880 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | 881 | | { | 882 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 883 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 884 | | } | 885 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) | 886 | | { | 887 | | uint16_t k; | 888 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 889 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 890 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | 891 | | } | 892 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | 893 | | { | 894 | | uint16_t k; | 895 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 896 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 897 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | 898 | | } | 899 | | } | 900 | | #endif | 901 | | | 902 | 22.3k | return 0; | 903 | 22.3k | } |
specrec.c:allocate_channel_pair Line | Count | Source | 800 | 19.1k | { | 801 | 19.1k | int mul = 1; | 802 | | | 803 | 19.1k | #ifdef MAIN_DEC | 804 | | /* MAIN object type prediction */ | 805 | 19.1k | if (hDecoder->object_type == MAIN) | 806 | 9.03k | { | 807 | | /* allocate the state only when needed */ | 808 | 9.03k | if (hDecoder->pred_stat[channel] == NULL) | 809 | 9.01k | { | 810 | 9.01k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 811 | 9.01k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 812 | 9.01k | } | 813 | 9.03k | if (hDecoder->pred_stat[paired_channel] == NULL) | 814 | 9.01k | { | 815 | 9.01k | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 816 | 9.01k | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | 817 | 9.01k | } | 818 | 9.03k | } | 819 | 19.1k | #endif | 820 | | | 821 | 19.1k | #ifdef LTP_DEC | 822 | 19.1k | if (is_ltp_ot(hDecoder->object_type)) | 823 | 7.38k | { | 824 | | /* allocate the state only when needed */ | 825 | 7.38k | if (hDecoder->lt_pred_stat[channel] == NULL) | 826 | 7.33k | { | 827 | 7.33k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 828 | 7.33k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 829 | 7.33k | } | 830 | 7.38k | if (hDecoder->lt_pred_stat[paired_channel] == NULL) | 831 | 7.33k | { | 832 | 7.33k | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 833 | 7.33k | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 834 | 7.33k | } | 835 | 7.38k | } | 836 | 19.1k | #endif | 837 | | | 838 | 19.1k | { | 839 | 19.1k | mul = 1; | 840 | 19.1k | #ifdef SBR_DEC | 841 | 19.1k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 842 | 19.1k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 843 | 14.9k | { | 844 | | /* SBR requires 2 times as much output data */ | 845 | 14.9k | mul = 2; | 846 | 14.9k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 847 | 14.9k | } | 848 | 19.1k | #endif | 849 | 19.1k | } | 850 | 19.1k | if (hDecoder->time_out[channel] == NULL) | 851 | 19.0k | { | 852 | 19.0k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 853 | 19.0k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 854 | 19.0k | } | 855 | 19.1k | if (hDecoder->time_out[paired_channel] == NULL) | 856 | 19.0k | { | 857 | 19.0k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 858 | 19.0k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 859 | 19.0k | } | 860 | | | 861 | 19.1k | if (hDecoder->fb_intermed[channel] == NULL) | 862 | 19.0k | { | 863 | 19.0k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 864 | 19.0k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 865 | 19.0k | } | 866 | 19.1k | if (hDecoder->fb_intermed[paired_channel] == NULL) | 867 | 19.0k | { | 868 | 19.0k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 869 | 19.0k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | 870 | 19.0k | } | 871 | | | 872 | | #ifdef SSR_DEC | 873 | | if (hDecoder->object_type == SSR) | 874 | | { | 875 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) | 876 | | { | 877 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 878 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 879 | | } | 880 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | 881 | | { | 882 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 883 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 884 | | } | 885 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) | 886 | | { | 887 | | uint16_t k; | 888 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 889 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 890 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | 891 | | } | 892 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | 893 | | { | 894 | | uint16_t k; | 895 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 896 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 897 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | 898 | | } | 899 | | } | 900 | | #endif | 901 | | | 902 | 19.1k | return 0; | 903 | 19.1k | } |
|
904 | | |
905 | | uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, |
906 | | element *sce, int16_t *spec_data) |
907 | 497k | { |
908 | 497k | uint8_t retval; |
909 | 497k | uint8_t output_channels; |
910 | 497k | ALIGN real_t spec_coef[1024]; |
911 | | |
912 | | #ifdef PROFILE |
913 | | int64_t count = faad_get_ts(); |
914 | | #endif |
915 | | |
916 | | |
917 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ |
918 | | #if ( (defined(DRM) && defined(DRM_PS)) ) |
919 | | output_channels = 2; |
920 | | #elif defined(PS_DEC) |
921 | 375k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) |
922 | 9.21k | output_channels = 2; |
923 | 365k | else |
924 | 365k | output_channels = 1; |
925 | | #else |
926 | | output_channels = 1; |
927 | | #endif |
928 | | |
929 | 497k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
930 | 433k | { |
931 | | /* element_output_channels not set yet */ |
932 | 433k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
933 | 433k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { |
934 | | /* element inconsistency */ |
935 | | |
936 | | /* this only happens if PS is actually found but not in the first frame |
937 | | * this means that there is only 1 bitstream element! |
938 | | */ |
939 | | |
940 | | /* The simplest way to fix the accounting, |
941 | | * is to reallocate this and all the following channels. |
942 | | */ |
943 | 992 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, |
944 | 992 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); |
945 | | |
946 | 992 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
947 | | |
948 | | //return 21; |
949 | 992 | } |
950 | | |
951 | 497k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) |
952 | 440k | { |
953 | 440k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); |
954 | 440k | if (retval > 0) |
955 | 0 | return retval; |
956 | | |
957 | 440k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; |
958 | 440k | } |
959 | | |
960 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ |
961 | 497k | if(!hDecoder->time_out[sce->channel]) |
962 | 0 | return 15; |
963 | 497k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) |
964 | 0 | return 15; |
965 | 497k | if(!hDecoder->fb_intermed[sce->channel]) |
966 | 0 | return 15; |
967 | | |
968 | | /* dequantisation and scaling */ |
969 | 497k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); |
970 | 497k | if (retval > 0) |
971 | 215 | return retval; |
972 | | |
973 | | #ifdef PROFILE |
974 | | count = faad_get_ts() - count; |
975 | | hDecoder->requant_cycles += count; |
976 | | #endif |
977 | | |
978 | | |
979 | | /* pns decoding */ |
980 | 497k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, |
981 | 497k | &(hDecoder->__r1), &(hDecoder->__r2)); |
982 | | |
983 | | #ifdef MAIN_DEC |
984 | | /* MAIN object type prediction */ |
985 | 211k | if (hDecoder->object_type == MAIN) |
986 | 82.0k | { |
987 | 82.0k | if (!hDecoder->pred_stat[sce->channel]) |
988 | 0 | return 33; |
989 | | |
990 | | /* intra channel prediction */ |
991 | 82.0k | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, |
992 | 82.0k | hDecoder->sf_index); |
993 | | |
994 | | /* In addition, for scalefactor bands coded by perceptual |
995 | | noise substitution the predictors belonging to the |
996 | | corresponding spectral coefficients are reset. |
997 | | */ |
998 | 82.0k | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); |
999 | 82.0k | } |
1000 | 211k | #endif |
1001 | | |
1002 | | #ifdef LTP_DEC |
1003 | 374k | if (is_ltp_ot(hDecoder->object_type)) |
1004 | 148k | { |
1005 | 148k | #ifdef LD_DEC |
1006 | 148k | if (hDecoder->object_type == LD) |
1007 | 999 | { |
1008 | 999 | if (ics->ltp.data_present) |
1009 | 98 | { |
1010 | 98 | if (ics->ltp.lag_update) |
1011 | 22 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; |
1012 | 98 | } |
1013 | 999 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; |
1014 | 999 | } |
1015 | 148k | #endif |
1016 | | |
1017 | | /* long term prediction */ |
1018 | 148k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, |
1019 | 148k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], |
1020 | 148k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1021 | 148k | } |
1022 | 211k | #endif |
1023 | | |
1024 | | /* tns decoding */ |
1025 | 211k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, |
1026 | 211k | spec_coef, hDecoder->frameLength); |
1027 | | |
1028 | | /* drc decoding */ |
1029 | 211k | #ifdef APPLY_DRC |
1030 | 497k | if (hDecoder->drc->present) |
1031 | 25.1k | { |
1032 | 25.1k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) |
1033 | 22.6k | drc_decode(hDecoder->drc, spec_coef); |
1034 | 25.1k | } |
1035 | 211k | #endif |
1036 | | /* filter bank */ |
1037 | | #ifdef SSR_DEC |
1038 | | if (hDecoder->object_type != SSR) |
1039 | | { |
1040 | | #endif |
1041 | 211k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, |
1042 | 211k | hDecoder->window_shape_prev[sce->channel], spec_coef, |
1043 | 211k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], |
1044 | 211k | hDecoder->object_type, hDecoder->frameLength); |
1045 | | #ifdef SSR_DEC |
1046 | | } else { |
1047 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, |
1048 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], |
1049 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], |
1050 | | hDecoder->frameLength); |
1051 | | } |
1052 | | #endif |
1053 | | |
1054 | | /* save window shape for next frame */ |
1055 | 211k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; |
1056 | | |
1057 | | #ifdef LTP_DEC |
1058 | 374k | if (is_ltp_ot(hDecoder->object_type)) |
1059 | 148k | { |
1060 | 148k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], |
1061 | 148k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); |
1062 | 148k | } |
1063 | | #endif |
1064 | | |
1065 | 211k | #ifdef SBR_DEC |
1066 | 497k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1067 | 497k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1068 | 386k | { |
1069 | 386k | int ele = hDecoder->fr_ch_ele; |
1070 | 386k | int ch = sce->channel; |
1071 | | |
1072 | | /* following case can happen when forceUpSampling == 1 */ |
1073 | 386k | if (hDecoder->sbr[ele] == NULL) |
1074 | 295k | { |
1075 | 295k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, |
1076 | 295k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
1077 | 295k | hDecoder->downSampledSBR |
1078 | | #ifdef DRM |
1079 | | , 0 |
1080 | | #endif |
1081 | 295k | ); |
1082 | 295k | } |
1083 | 386k | if (!hDecoder->sbr[ele]) |
1084 | 103 | return 19; |
1085 | | |
1086 | 386k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
1087 | 43.7k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); |
1088 | 342k | else |
1089 | 342k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); |
1090 | | |
1091 | | /* check if any of the PS tools is used */ |
1092 | 386k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1093 | 386k | if (hDecoder->ps_used[ele] == 0) |
1094 | 369k | { |
1095 | 369k | #endif |
1096 | 369k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], |
1097 | 369k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
1098 | 369k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1099 | 369k | } else { |
1100 | 17.1k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], |
1101 | 17.1k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, |
1102 | 17.1k | hDecoder->downSampledSBR); |
1103 | 17.1k | } |
1104 | 386k | #endif |
1105 | 386k | if (retval > 0) |
1106 | 63 | return retval; |
1107 | 386k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1108 | 111k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1109 | 14 | { |
1110 | 14 | return 23; |
1111 | 14 | } |
1112 | 497k | #endif |
1113 | | |
1114 | | /* copy L to R when no PS is used */ |
1115 | 497k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1116 | 497k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && |
1117 | 497k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) |
1118 | 114k | { |
1119 | 114k | int ele = hDecoder->fr_ch_ele; |
1120 | 114k | int ch = sce->channel; |
1121 | 114k | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; |
1122 | 114k | frame_size *= hDecoder->frameLength*sizeof(real_t); |
1123 | | |
1124 | 114k | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); |
1125 | 114k | } |
1126 | 497k | #endif |
1127 | | |
1128 | 497k | return 0; |
1129 | 211k | } reconstruct_single_channel Line | Count | Source | 907 | 122k | { | 908 | 122k | uint8_t retval; | 909 | 122k | uint8_t output_channels; | 910 | 122k | ALIGN real_t spec_coef[1024]; | 911 | | | 912 | | #ifdef PROFILE | 913 | | int64_t count = faad_get_ts(); | 914 | | #endif | 915 | | | 916 | | | 917 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 918 | 122k | #if ( (defined(DRM) && defined(DRM_PS)) ) | 919 | 122k | output_channels = 2; | 920 | | #elif defined(PS_DEC) | 921 | | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 922 | | output_channels = 2; | 923 | | else | 924 | | output_channels = 1; | 925 | | #else | 926 | | output_channels = 1; | 927 | | #endif | 928 | | | 929 | 122k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 930 | 105k | { | 931 | | /* element_output_channels not set yet */ | 932 | 105k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 933 | 105k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 934 | | /* element inconsistency */ | 935 | | | 936 | | /* this only happens if PS is actually found but not in the first frame | 937 | | * this means that there is only 1 bitstream element! | 938 | | */ | 939 | | | 940 | | /* The simplest way to fix the accounting, | 941 | | * is to reallocate this and all the following channels. | 942 | | */ | 943 | 0 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 944 | 0 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 945 | |
| 946 | 0 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 947 | | | 948 | | //return 21; | 949 | 0 | } | 950 | | | 951 | 122k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 952 | 105k | { | 953 | 105k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 954 | 105k | if (retval > 0) | 955 | 0 | return retval; | 956 | | | 957 | 105k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 958 | 105k | } | 959 | | | 960 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 961 | 122k | if(!hDecoder->time_out[sce->channel]) | 962 | 0 | return 15; | 963 | 122k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 964 | 0 | return 15; | 965 | 122k | if(!hDecoder->fb_intermed[sce->channel]) | 966 | 0 | return 15; | 967 | | | 968 | | /* dequantisation and scaling */ | 969 | 122k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 970 | 122k | if (retval > 0) | 971 | 103 | return retval; | 972 | | | 973 | | #ifdef PROFILE | 974 | | count = faad_get_ts() - count; | 975 | | hDecoder->requant_cycles += count; | 976 | | #endif | 977 | | | 978 | | | 979 | | /* pns decoding */ | 980 | 122k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 981 | 122k | &(hDecoder->__r1), &(hDecoder->__r2)); | 982 | | | 983 | | #ifdef MAIN_DEC | 984 | | /* MAIN object type prediction */ | 985 | | if (hDecoder->object_type == MAIN) | 986 | | { | 987 | | if (!hDecoder->pred_stat[sce->channel]) | 988 | | return 33; | 989 | | | 990 | | /* intra channel prediction */ | 991 | | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 992 | | hDecoder->sf_index); | 993 | | | 994 | | /* In addition, for scalefactor bands coded by perceptual | 995 | | noise substitution the predictors belonging to the | 996 | | corresponding spectral coefficients are reset. | 997 | | */ | 998 | | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 999 | | } | 1000 | | #endif | 1001 | | | 1002 | | #ifdef LTP_DEC | 1003 | | if (is_ltp_ot(hDecoder->object_type)) | 1004 | | { | 1005 | | #ifdef LD_DEC | 1006 | | if (hDecoder->object_type == LD) | 1007 | | { | 1008 | | if (ics->ltp.data_present) | 1009 | | { | 1010 | | if (ics->ltp.lag_update) | 1011 | | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1012 | | } | 1013 | | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1014 | | } | 1015 | | #endif | 1016 | | | 1017 | | /* long term prediction */ | 1018 | | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1019 | | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1020 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1021 | | } | 1022 | | #endif | 1023 | | | 1024 | | /* tns decoding */ | 1025 | 122k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1026 | 122k | spec_coef, hDecoder->frameLength); | 1027 | | | 1028 | | /* drc decoding */ | 1029 | 122k | #ifdef APPLY_DRC | 1030 | 122k | if (hDecoder->drc->present) | 1031 | 0 | { | 1032 | 0 | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1033 | 0 | drc_decode(hDecoder->drc, spec_coef); | 1034 | 0 | } | 1035 | 122k | #endif | 1036 | | /* filter bank */ | 1037 | | #ifdef SSR_DEC | 1038 | | if (hDecoder->object_type != SSR) | 1039 | | { | 1040 | | #endif | 1041 | 122k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1042 | 122k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1043 | 122k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1044 | 122k | hDecoder->object_type, hDecoder->frameLength); | 1045 | | #ifdef SSR_DEC | 1046 | | } else { | 1047 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1048 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1049 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1050 | | hDecoder->frameLength); | 1051 | | } | 1052 | | #endif | 1053 | | | 1054 | | /* save window shape for next frame */ | 1055 | 122k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1056 | | | 1057 | | #ifdef LTP_DEC | 1058 | | if (is_ltp_ot(hDecoder->object_type)) | 1059 | | { | 1060 | | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1061 | | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1062 | | } | 1063 | | #endif | 1064 | | | 1065 | 122k | #ifdef SBR_DEC | 1066 | 122k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1067 | 122k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1068 | 105k | { | 1069 | 105k | int ele = hDecoder->fr_ch_ele; | 1070 | 105k | int ch = sce->channel; | 1071 | | | 1072 | | /* following case can happen when forceUpSampling == 1 */ | 1073 | 105k | if (hDecoder->sbr[ele] == NULL) | 1074 | 74.5k | { | 1075 | 74.5k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1076 | 74.5k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1077 | 74.5k | hDecoder->downSampledSBR | 1078 | 74.5k | #ifdef DRM | 1079 | 74.5k | , 0 | 1080 | 74.5k | #endif | 1081 | 74.5k | ); | 1082 | 74.5k | } | 1083 | 105k | if (!hDecoder->sbr[ele]) | 1084 | 0 | return 19; | 1085 | | | 1086 | 105k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1087 | 16.0k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1088 | 89.9k | else | 1089 | 89.9k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1090 | | | 1091 | | /* check if any of the PS tools is used */ | 1092 | 105k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1093 | 105k | if (hDecoder->ps_used[ele] == 0) | 1094 | 98.0k | { | 1095 | 98.0k | #endif | 1096 | 98.0k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1097 | 98.0k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1098 | 98.0k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1099 | 98.0k | } else { | 1100 | 7.92k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1101 | 7.92k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1102 | 7.92k | hDecoder->downSampledSBR); | 1103 | 7.92k | } | 1104 | 105k | #endif | 1105 | 105k | if (retval > 0) | 1106 | 11 | return retval; | 1107 | 105k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1108 | 16.6k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1109 | 1 | { | 1110 | 1 | return 23; | 1111 | 1 | } | 1112 | 122k | #endif | 1113 | | | 1114 | | /* copy L to R when no PS is used */ | 1115 | 122k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1116 | 122k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1117 | 122k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1118 | 114k | { | 1119 | 114k | int ele = hDecoder->fr_ch_ele; | 1120 | 114k | int ch = sce->channel; | 1121 | 114k | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1122 | 114k | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1123 | | | 1124 | 114k | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1125 | 114k | } | 1126 | 122k | #endif | 1127 | | | 1128 | 122k | return 0; | 1129 | 122k | } |
reconstruct_single_channel Line | Count | Source | 907 | 212k | { | 908 | 212k | uint8_t retval; | 909 | 212k | uint8_t output_channels; | 910 | 212k | ALIGN real_t spec_coef[1024]; | 911 | | | 912 | | #ifdef PROFILE | 913 | | int64_t count = faad_get_ts(); | 914 | | #endif | 915 | | | 916 | | | 917 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 918 | | #if ( (defined(DRM) && defined(DRM_PS)) ) | 919 | | output_channels = 2; | 920 | | #elif defined(PS_DEC) | 921 | 212k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 922 | 5.65k | output_channels = 2; | 923 | 206k | else | 924 | 206k | output_channels = 1; | 925 | | #else | 926 | | output_channels = 1; | 927 | | #endif | 928 | | | 929 | 212k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 930 | 182k | { | 931 | | /* element_output_channels not set yet */ | 932 | 182k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 933 | 182k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 934 | | /* element inconsistency */ | 935 | | | 936 | | /* this only happens if PS is actually found but not in the first frame | 937 | | * this means that there is only 1 bitstream element! | 938 | | */ | 939 | | | 940 | | /* The simplest way to fix the accounting, | 941 | | * is to reallocate this and all the following channels. | 942 | | */ | 943 | 573 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 944 | 573 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 945 | | | 946 | 573 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 947 | | | 948 | | //return 21; | 949 | 573 | } | 950 | | | 951 | 212k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 952 | 187k | { | 953 | 187k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 954 | 187k | if (retval > 0) | 955 | 0 | return retval; | 956 | | | 957 | 187k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 958 | 187k | } | 959 | | | 960 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 961 | 212k | if(!hDecoder->time_out[sce->channel]) | 962 | 0 | return 15; | 963 | 212k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 964 | 0 | return 15; | 965 | 212k | if(!hDecoder->fb_intermed[sce->channel]) | 966 | 0 | return 15; | 967 | | | 968 | | /* dequantisation and scaling */ | 969 | 212k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 970 | 212k | if (retval > 0) | 971 | 68 | return retval; | 972 | | | 973 | | #ifdef PROFILE | 974 | | count = faad_get_ts() - count; | 975 | | hDecoder->requant_cycles += count; | 976 | | #endif | 977 | | | 978 | | | 979 | | /* pns decoding */ | 980 | 211k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 981 | 211k | &(hDecoder->__r1), &(hDecoder->__r2)); | 982 | | | 983 | 211k | #ifdef MAIN_DEC | 984 | | /* MAIN object type prediction */ | 985 | 211k | if (hDecoder->object_type == MAIN) | 986 | 82.0k | { | 987 | 82.0k | if (!hDecoder->pred_stat[sce->channel]) | 988 | 0 | return 33; | 989 | | | 990 | | /* intra channel prediction */ | 991 | 82.0k | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 992 | 82.0k | hDecoder->sf_index); | 993 | | | 994 | | /* In addition, for scalefactor bands coded by perceptual | 995 | | noise substitution the predictors belonging to the | 996 | | corresponding spectral coefficients are reset. | 997 | | */ | 998 | 82.0k | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 999 | 82.0k | } | 1000 | 211k | #endif | 1001 | | | 1002 | 211k | #ifdef LTP_DEC | 1003 | 211k | if (is_ltp_ot(hDecoder->object_type)) | 1004 | 59.1k | { | 1005 | 59.1k | #ifdef LD_DEC | 1006 | 59.1k | if (hDecoder->object_type == LD) | 1007 | 574 | { | 1008 | 574 | if (ics->ltp.data_present) | 1009 | 79 | { | 1010 | 79 | if (ics->ltp.lag_update) | 1011 | 17 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1012 | 79 | } | 1013 | 574 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1014 | 574 | } | 1015 | 59.1k | #endif | 1016 | | | 1017 | | /* long term prediction */ | 1018 | 59.1k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1019 | 59.1k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1020 | 59.1k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1021 | 59.1k | } | 1022 | 211k | #endif | 1023 | | | 1024 | | /* tns decoding */ | 1025 | 211k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1026 | 211k | spec_coef, hDecoder->frameLength); | 1027 | | | 1028 | | /* drc decoding */ | 1029 | 211k | #ifdef APPLY_DRC | 1030 | 211k | if (hDecoder->drc->present) | 1031 | 13.6k | { | 1032 | 13.6k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1033 | 12.5k | drc_decode(hDecoder->drc, spec_coef); | 1034 | 13.6k | } | 1035 | 211k | #endif | 1036 | | /* filter bank */ | 1037 | | #ifdef SSR_DEC | 1038 | | if (hDecoder->object_type != SSR) | 1039 | | { | 1040 | | #endif | 1041 | 211k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1042 | 211k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1043 | 211k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1044 | 211k | hDecoder->object_type, hDecoder->frameLength); | 1045 | | #ifdef SSR_DEC | 1046 | | } else { | 1047 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1048 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1049 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1050 | | hDecoder->frameLength); | 1051 | | } | 1052 | | #endif | 1053 | | | 1054 | | /* save window shape for next frame */ | 1055 | 211k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1056 | | | 1057 | 211k | #ifdef LTP_DEC | 1058 | 211k | if (is_ltp_ot(hDecoder->object_type)) | 1059 | 59.1k | { | 1060 | 59.1k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1061 | 59.1k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1062 | 59.1k | } | 1063 | 211k | #endif | 1064 | | | 1065 | 211k | #ifdef SBR_DEC | 1066 | 211k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1067 | 211k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1068 | 157k | { | 1069 | 157k | int ele = hDecoder->fr_ch_ele; | 1070 | 157k | int ch = sce->channel; | 1071 | | | 1072 | | /* following case can happen when forceUpSampling == 1 */ | 1073 | 157k | if (hDecoder->sbr[ele] == NULL) | 1074 | 120k | { | 1075 | 120k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1076 | 120k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1077 | 120k | hDecoder->downSampledSBR | 1078 | | #ifdef DRM | 1079 | | , 0 | 1080 | | #endif | 1081 | 120k | ); | 1082 | 120k | } | 1083 | 157k | if (!hDecoder->sbr[ele]) | 1084 | 34 | return 19; | 1085 | | | 1086 | 157k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1087 | 19.0k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1088 | 138k | else | 1089 | 138k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1090 | | | 1091 | | /* check if any of the PS tools is used */ | 1092 | 157k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1093 | 157k | if (hDecoder->ps_used[ele] == 0) | 1094 | 151k | { | 1095 | 151k | #endif | 1096 | 151k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1097 | 151k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1098 | 151k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1099 | 151k | } else { | 1100 | 5.65k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1101 | 5.65k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1102 | 5.65k | hDecoder->downSampledSBR); | 1103 | 5.65k | } | 1104 | 157k | #endif | 1105 | 157k | if (retval > 0) | 1106 | 31 | return retval; | 1107 | 157k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1108 | 54.2k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1109 | 5 | { | 1110 | 5 | return 23; | 1111 | 5 | } | 1112 | 211k | #endif | 1113 | | | 1114 | | /* copy L to R when no PS is used */ | 1115 | 211k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1116 | 211k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1117 | 211k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1118 | 0 | { | 1119 | 0 | int ele = hDecoder->fr_ch_ele; | 1120 | 0 | int ch = sce->channel; | 1121 | 0 | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1122 | 0 | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1123 | |
| 1124 | 0 | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1125 | 0 | } | 1126 | 211k | #endif | 1127 | | | 1128 | 211k | return 0; | 1129 | 211k | } |
reconstruct_single_channel Line | Count | Source | 907 | 163k | { | 908 | 163k | uint8_t retval; | 909 | 163k | uint8_t output_channels; | 910 | 163k | ALIGN real_t spec_coef[1024]; | 911 | | | 912 | | #ifdef PROFILE | 913 | | int64_t count = faad_get_ts(); | 914 | | #endif | 915 | | | 916 | | | 917 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 918 | | #if ( (defined(DRM) && defined(DRM_PS)) ) | 919 | | output_channels = 2; | 920 | | #elif defined(PS_DEC) | 921 | 163k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 922 | 3.55k | output_channels = 2; | 923 | 159k | else | 924 | 159k | output_channels = 1; | 925 | | #else | 926 | | output_channels = 1; | 927 | | #endif | 928 | | | 929 | 163k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 930 | 145k | { | 931 | | /* element_output_channels not set yet */ | 932 | 145k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 933 | 145k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 934 | | /* element inconsistency */ | 935 | | | 936 | | /* this only happens if PS is actually found but not in the first frame | 937 | | * this means that there is only 1 bitstream element! | 938 | | */ | 939 | | | 940 | | /* The simplest way to fix the accounting, | 941 | | * is to reallocate this and all the following channels. | 942 | | */ | 943 | 419 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 944 | 419 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 945 | | | 946 | 419 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 947 | | | 948 | | //return 21; | 949 | 419 | } | 950 | | | 951 | 163k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 952 | 147k | { | 953 | 147k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 954 | 147k | if (retval > 0) | 955 | 0 | return retval; | 956 | | | 957 | 147k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 958 | 147k | } | 959 | | | 960 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 961 | 163k | if(!hDecoder->time_out[sce->channel]) | 962 | 0 | return 15; | 963 | 163k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 964 | 0 | return 15; | 965 | 163k | if(!hDecoder->fb_intermed[sce->channel]) | 966 | 0 | return 15; | 967 | | | 968 | | /* dequantisation and scaling */ | 969 | 163k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 970 | 163k | if (retval > 0) | 971 | 44 | return retval; | 972 | | | 973 | | #ifdef PROFILE | 974 | | count = faad_get_ts() - count; | 975 | | hDecoder->requant_cycles += count; | 976 | | #endif | 977 | | | 978 | | | 979 | | /* pns decoding */ | 980 | 162k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 981 | 162k | &(hDecoder->__r1), &(hDecoder->__r2)); | 982 | | | 983 | | #ifdef MAIN_DEC | 984 | | /* MAIN object type prediction */ | 985 | | if (hDecoder->object_type == MAIN) | 986 | | { | 987 | | if (!hDecoder->pred_stat[sce->channel]) | 988 | | return 33; | 989 | | | 990 | | /* intra channel prediction */ | 991 | | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 992 | | hDecoder->sf_index); | 993 | | | 994 | | /* In addition, for scalefactor bands coded by perceptual | 995 | | noise substitution the predictors belonging to the | 996 | | corresponding spectral coefficients are reset. | 997 | | */ | 998 | | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 999 | | } | 1000 | | #endif | 1001 | | | 1002 | 162k | #ifdef LTP_DEC | 1003 | 162k | if (is_ltp_ot(hDecoder->object_type)) | 1004 | 89.1k | { | 1005 | 89.1k | #ifdef LD_DEC | 1006 | 89.1k | if (hDecoder->object_type == LD) | 1007 | 425 | { | 1008 | 425 | if (ics->ltp.data_present) | 1009 | 19 | { | 1010 | 19 | if (ics->ltp.lag_update) | 1011 | 5 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1012 | 19 | } | 1013 | 425 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1014 | 425 | } | 1015 | 89.1k | #endif | 1016 | | | 1017 | | /* long term prediction */ | 1018 | 89.1k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1019 | 89.1k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1020 | 89.1k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1021 | 89.1k | } | 1022 | 162k | #endif | 1023 | | | 1024 | | /* tns decoding */ | 1025 | 162k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1026 | 162k | spec_coef, hDecoder->frameLength); | 1027 | | | 1028 | | /* drc decoding */ | 1029 | 162k | #ifdef APPLY_DRC | 1030 | 162k | if (hDecoder->drc->present) | 1031 | 11.4k | { | 1032 | 11.4k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1033 | 10.0k | drc_decode(hDecoder->drc, spec_coef); | 1034 | 11.4k | } | 1035 | 162k | #endif | 1036 | | /* filter bank */ | 1037 | | #ifdef SSR_DEC | 1038 | | if (hDecoder->object_type != SSR) | 1039 | | { | 1040 | | #endif | 1041 | 162k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1042 | 162k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1043 | 162k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1044 | 162k | hDecoder->object_type, hDecoder->frameLength); | 1045 | | #ifdef SSR_DEC | 1046 | | } else { | 1047 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1048 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1049 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1050 | | hDecoder->frameLength); | 1051 | | } | 1052 | | #endif | 1053 | | | 1054 | | /* save window shape for next frame */ | 1055 | 162k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1056 | | | 1057 | 162k | #ifdef LTP_DEC | 1058 | 162k | if (is_ltp_ot(hDecoder->object_type)) | 1059 | 89.1k | { | 1060 | 89.1k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1061 | 89.1k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1062 | 89.1k | } | 1063 | 162k | #endif | 1064 | | | 1065 | 162k | #ifdef SBR_DEC | 1066 | 162k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1067 | 162k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1068 | 122k | { | 1069 | 122k | int ele = hDecoder->fr_ch_ele; | 1070 | 122k | int ch = sce->channel; | 1071 | | | 1072 | | /* following case can happen when forceUpSampling == 1 */ | 1073 | 122k | if (hDecoder->sbr[ele] == NULL) | 1074 | 100k | { | 1075 | 100k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1076 | 100k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1077 | 100k | hDecoder->downSampledSBR | 1078 | | #ifdef DRM | 1079 | | , 0 | 1080 | | #endif | 1081 | 100k | ); | 1082 | 100k | } | 1083 | 122k | if (!hDecoder->sbr[ele]) | 1084 | 69 | return 19; | 1085 | | | 1086 | 122k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1087 | 8.61k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1088 | 114k | else | 1089 | 114k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1090 | | | 1091 | | /* check if any of the PS tools is used */ | 1092 | 122k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1093 | 122k | if (hDecoder->ps_used[ele] == 0) | 1094 | 119k | { | 1095 | 119k | #endif | 1096 | 119k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1097 | 119k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1098 | 119k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1099 | 119k | } else { | 1100 | 3.55k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1101 | 3.55k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1102 | 3.55k | hDecoder->downSampledSBR); | 1103 | 3.55k | } | 1104 | 122k | #endif | 1105 | 122k | if (retval > 0) | 1106 | 21 | return retval; | 1107 | 122k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1108 | 40.1k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1109 | 8 | { | 1110 | 8 | return 23; | 1111 | 8 | } | 1112 | 162k | #endif | 1113 | | | 1114 | | /* copy L to R when no PS is used */ | 1115 | 162k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1116 | 162k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1117 | 162k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1118 | 0 | { | 1119 | 0 | int ele = hDecoder->fr_ch_ele; | 1120 | 0 | int ch = sce->channel; | 1121 | 0 | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1122 | 0 | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1123 | |
| 1124 | 0 | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1125 | 0 | } | 1126 | 162k | #endif | 1127 | | | 1128 | 162k | return 0; | 1129 | 162k | } |
|
1130 | | |
1131 | | uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, |
1132 | | element *cpe, int16_t *spec_data1, int16_t *spec_data2) |
1133 | 64.0k | { |
1134 | 64.0k | uint8_t retval; |
1135 | 64.0k | ALIGN real_t spec_coef1[1024]; |
1136 | 64.0k | ALIGN real_t spec_coef2[1024]; |
1137 | | |
1138 | | #ifdef PROFILE |
1139 | | int64_t count = faad_get_ts(); |
1140 | | #endif |
1141 | 64.0k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) |
1142 | 54.2k | { |
1143 | 54.2k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); |
1144 | 54.2k | if (retval > 0) |
1145 | 0 | return retval; |
1146 | | |
1147 | 54.2k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; |
1148 | 54.2k | } |
1149 | | |
1150 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ |
1151 | 64.0k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) |
1152 | 0 | return 15; |
1153 | 64.0k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) |
1154 | 0 | return 15; |
1155 | | |
1156 | | /* dequantisation and scaling */ |
1157 | 64.0k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); |
1158 | 64.0k | if (retval > 0) |
1159 | 112 | return retval; |
1160 | 63.9k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); |
1161 | 63.9k | if (retval > 0) |
1162 | 11 | return retval; |
1163 | | |
1164 | | #ifdef PROFILE |
1165 | | count = faad_get_ts() - count; |
1166 | | hDecoder->requant_cycles += count; |
1167 | | #endif |
1168 | | |
1169 | | /* pns decoding */ |
1170 | 63.9k | if (ics1->ms_mask_present) |
1171 | 15.6k | { |
1172 | 15.6k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, |
1173 | 15.6k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1174 | 48.2k | } else { |
1175 | 48.2k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, |
1176 | 48.2k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1177 | 48.2k | } |
1178 | | |
1179 | | /* mid/side decoding */ |
1180 | 63.9k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); |
1181 | | |
1182 | | #if 0 |
1183 | | { |
1184 | | int i; |
1185 | | for (i = 0; i < 1024; i++) |
1186 | | { |
1187 | | //printf("%d\n", spec_coef1[i]); |
1188 | | printf("0x%.8X\n", spec_coef1[i]); |
1189 | | } |
1190 | | for (i = 0; i < 1024; i++) |
1191 | | { |
1192 | | //printf("%d\n", spec_coef2[i]); |
1193 | | printf("0x%.8X\n", spec_coef2[i]); |
1194 | | } |
1195 | | } |
1196 | | #endif |
1197 | | |
1198 | | /* intensity stereo decoding */ |
1199 | 63.9k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); |
1200 | | |
1201 | | #if 0 |
1202 | | { |
1203 | | int i; |
1204 | | for (i = 0; i < 1024; i++) |
1205 | | { |
1206 | | printf("%d\n", spec_coef1[i]); |
1207 | | //printf("0x%.8X\n", spec_coef1[i]); |
1208 | | } |
1209 | | for (i = 0; i < 1024; i++) |
1210 | | { |
1211 | | printf("%d\n", spec_coef2[i]); |
1212 | | //printf("0x%.8X\n", spec_coef2[i]); |
1213 | | } |
1214 | | } |
1215 | | #endif |
1216 | | |
1217 | | #ifdef MAIN_DEC |
1218 | | /* MAIN object type prediction */ |
1219 | 22.4k | if (hDecoder->object_type == MAIN) |
1220 | 10.2k | { |
1221 | | /* intra channel prediction */ |
1222 | 10.2k | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, |
1223 | 10.2k | hDecoder->sf_index); |
1224 | 10.2k | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, |
1225 | 10.2k | hDecoder->sf_index); |
1226 | | |
1227 | | /* In addition, for scalefactor bands coded by perceptual |
1228 | | noise substitution the predictors belonging to the |
1229 | | corresponding spectral coefficients are reset. |
1230 | | */ |
1231 | 10.2k | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); |
1232 | 10.2k | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); |
1233 | 10.2k | } |
1234 | | #endif |
1235 | | |
1236 | | #ifdef LTP_DEC |
1237 | 37.6k | if (is_ltp_ot(hDecoder->object_type)) |
1238 | 14.6k | { |
1239 | 14.6k | ltp_info *ltp1 = &(ics1->ltp); |
1240 | 14.6k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); |
1241 | 14.6k | #ifdef LD_DEC |
1242 | 14.6k | if (hDecoder->object_type == LD) |
1243 | 1.52k | { |
1244 | 1.52k | if (ltp1->data_present) |
1245 | 202 | { |
1246 | 202 | if (ltp1->lag_update) |
1247 | 104 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; |
1248 | 202 | } |
1249 | 1.52k | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; |
1250 | 1.52k | if (ltp2->data_present) |
1251 | 77 | { |
1252 | 77 | if (ltp2->lag_update) |
1253 | 34 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; |
1254 | 77 | } |
1255 | 1.52k | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; |
1256 | 1.52k | } |
1257 | 14.6k | #endif |
1258 | | |
1259 | | /* long term prediction */ |
1260 | 14.6k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, |
1261 | 14.6k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], |
1262 | 14.6k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1263 | 14.6k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, |
1264 | 14.6k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], |
1265 | 14.6k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1266 | 14.6k | } |
1267 | | #endif |
1268 | | |
1269 | | /* tns decoding */ |
1270 | 63.9k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, |
1271 | 63.9k | spec_coef1, hDecoder->frameLength); |
1272 | 63.9k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, |
1273 | 63.9k | spec_coef2, hDecoder->frameLength); |
1274 | | |
1275 | | /* drc decoding */ |
1276 | 63.9k | #if APPLY_DRC |
1277 | 63.9k | if (hDecoder->drc->present) |
1278 | 1.06k | { |
1279 | 1.06k | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) |
1280 | 935 | drc_decode(hDecoder->drc, spec_coef1); |
1281 | 1.06k | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) |
1282 | 943 | drc_decode(hDecoder->drc, spec_coef2); |
1283 | 1.06k | } |
1284 | 63.9k | #endif |
1285 | | /* filter bank */ |
1286 | | #ifdef SSR_DEC |
1287 | | if (hDecoder->object_type != SSR) |
1288 | | { |
1289 | | #endif |
1290 | 63.9k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, |
1291 | 63.9k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, |
1292 | 63.9k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], |
1293 | 63.9k | hDecoder->object_type, hDecoder->frameLength); |
1294 | 63.9k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, |
1295 | 63.9k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, |
1296 | 63.9k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], |
1297 | 63.9k | hDecoder->object_type, hDecoder->frameLength); |
1298 | | #ifdef SSR_DEC |
1299 | | } else { |
1300 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, |
1301 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], |
1302 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], |
1303 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); |
1304 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, |
1305 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], |
1306 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], |
1307 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); |
1308 | | } |
1309 | | #endif |
1310 | | |
1311 | | /* save window shape for next frame */ |
1312 | 63.9k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; |
1313 | 63.9k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; |
1314 | | |
1315 | | #ifdef LTP_DEC |
1316 | 37.6k | if (is_ltp_ot(hDecoder->object_type)) |
1317 | 14.6k | { |
1318 | 14.6k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], |
1319 | 14.6k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); |
1320 | 14.6k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], |
1321 | 14.6k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); |
1322 | 14.6k | } |
1323 | | #endif |
1324 | | |
1325 | 63.9k | #ifdef SBR_DEC |
1326 | 63.9k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1327 | 63.9k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1328 | 53.9k | { |
1329 | 53.9k | int ele = hDecoder->fr_ch_ele; |
1330 | 53.9k | int ch0 = cpe->channel; |
1331 | 53.9k | int ch1 = cpe->paired_channel; |
1332 | | |
1333 | | /* following case can happen when forceUpSampling == 1 */ |
1334 | 53.9k | if (hDecoder->sbr[ele] == NULL) |
1335 | 17.6k | { |
1336 | 17.6k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, |
1337 | 17.6k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
1338 | 17.6k | hDecoder->downSampledSBR |
1339 | | #ifdef DRM |
1340 | | , 0 |
1341 | | #endif |
1342 | 17.6k | ); |
1343 | 17.6k | } |
1344 | 53.9k | if (!hDecoder->sbr[ele]) |
1345 | 80 | return 19; |
1346 | | |
1347 | 53.9k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
1348 | 2.46k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); |
1349 | 51.4k | else |
1350 | 51.4k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); |
1351 | | |
1352 | 53.9k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], |
1353 | 53.9k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], |
1354 | 53.9k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
1355 | 53.9k | if (retval > 0) |
1356 | 7 | return retval; |
1357 | 53.9k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1358 | 9.93k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1359 | 5 | { |
1360 | 5 | return 23; |
1361 | 5 | } |
1362 | 63.8k | #endif |
1363 | | |
1364 | 63.8k | return 0; |
1365 | 63.9k | } Line | Count | Source | 1133 | 26.2k | { | 1134 | 26.2k | uint8_t retval; | 1135 | 26.2k | ALIGN real_t spec_coef1[1024]; | 1136 | 26.2k | ALIGN real_t spec_coef2[1024]; | 1137 | | | 1138 | | #ifdef PROFILE | 1139 | | int64_t count = faad_get_ts(); | 1140 | | #endif | 1141 | 26.2k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1142 | 22.3k | { | 1143 | 22.3k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1144 | 22.3k | if (retval > 0) | 1145 | 0 | return retval; | 1146 | | | 1147 | 22.3k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1148 | 22.3k | } | 1149 | | | 1150 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1151 | 26.2k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1152 | 0 | return 15; | 1153 | 26.2k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1154 | 0 | return 15; | 1155 | | | 1156 | | /* dequantisation and scaling */ | 1157 | 26.2k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1158 | 26.2k | if (retval > 0) | 1159 | 36 | return retval; | 1160 | 26.2k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1161 | 26.2k | if (retval > 0) | 1162 | 3 | return retval; | 1163 | | | 1164 | | #ifdef PROFILE | 1165 | | count = faad_get_ts() - count; | 1166 | | hDecoder->requant_cycles += count; | 1167 | | #endif | 1168 | | | 1169 | | /* pns decoding */ | 1170 | 26.2k | if (ics1->ms_mask_present) | 1171 | 7.19k | { | 1172 | 7.19k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1173 | 7.19k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1174 | 19.0k | } else { | 1175 | 19.0k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1176 | 19.0k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1177 | 19.0k | } | 1178 | | | 1179 | | /* mid/side decoding */ | 1180 | 26.2k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1181 | | | 1182 | | #if 0 | 1183 | | { | 1184 | | int i; | 1185 | | for (i = 0; i < 1024; i++) | 1186 | | { | 1187 | | //printf("%d\n", spec_coef1[i]); | 1188 | | printf("0x%.8X\n", spec_coef1[i]); | 1189 | | } | 1190 | | for (i = 0; i < 1024; i++) | 1191 | | { | 1192 | | //printf("%d\n", spec_coef2[i]); | 1193 | | printf("0x%.8X\n", spec_coef2[i]); | 1194 | | } | 1195 | | } | 1196 | | #endif | 1197 | | | 1198 | | /* intensity stereo decoding */ | 1199 | 26.2k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1200 | | | 1201 | | #if 0 | 1202 | | { | 1203 | | int i; | 1204 | | for (i = 0; i < 1024; i++) | 1205 | | { | 1206 | | printf("%d\n", spec_coef1[i]); | 1207 | | //printf("0x%.8X\n", spec_coef1[i]); | 1208 | | } | 1209 | | for (i = 0; i < 1024; i++) | 1210 | | { | 1211 | | printf("%d\n", spec_coef2[i]); | 1212 | | //printf("0x%.8X\n", spec_coef2[i]); | 1213 | | } | 1214 | | } | 1215 | | #endif | 1216 | | | 1217 | | #ifdef MAIN_DEC | 1218 | | /* MAIN object type prediction */ | 1219 | | if (hDecoder->object_type == MAIN) | 1220 | | { | 1221 | | /* intra channel prediction */ | 1222 | | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1223 | | hDecoder->sf_index); | 1224 | | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1225 | | hDecoder->sf_index); | 1226 | | | 1227 | | /* In addition, for scalefactor bands coded by perceptual | 1228 | | noise substitution the predictors belonging to the | 1229 | | corresponding spectral coefficients are reset. | 1230 | | */ | 1231 | | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1232 | | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1233 | | } | 1234 | | #endif | 1235 | | | 1236 | | #ifdef LTP_DEC | 1237 | | if (is_ltp_ot(hDecoder->object_type)) | 1238 | | { | 1239 | | ltp_info *ltp1 = &(ics1->ltp); | 1240 | | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1241 | | #ifdef LD_DEC | 1242 | | if (hDecoder->object_type == LD) | 1243 | | { | 1244 | | if (ltp1->data_present) | 1245 | | { | 1246 | | if (ltp1->lag_update) | 1247 | | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1248 | | } | 1249 | | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1250 | | if (ltp2->data_present) | 1251 | | { | 1252 | | if (ltp2->lag_update) | 1253 | | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1254 | | } | 1255 | | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1256 | | } | 1257 | | #endif | 1258 | | | 1259 | | /* long term prediction */ | 1260 | | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1261 | | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1262 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1263 | | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1264 | | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1265 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1266 | | } | 1267 | | #endif | 1268 | | | 1269 | | /* tns decoding */ | 1270 | 26.2k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1271 | 26.2k | spec_coef1, hDecoder->frameLength); | 1272 | 26.2k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1273 | 26.2k | spec_coef2, hDecoder->frameLength); | 1274 | | | 1275 | | /* drc decoding */ | 1276 | 26.2k | #if APPLY_DRC | 1277 | 26.2k | if (hDecoder->drc->present) | 1278 | 0 | { | 1279 | 0 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1280 | 0 | drc_decode(hDecoder->drc, spec_coef1); | 1281 | 0 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1282 | 0 | drc_decode(hDecoder->drc, spec_coef2); | 1283 | 0 | } | 1284 | 26.2k | #endif | 1285 | | /* filter bank */ | 1286 | | #ifdef SSR_DEC | 1287 | | if (hDecoder->object_type != SSR) | 1288 | | { | 1289 | | #endif | 1290 | 26.2k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1291 | 26.2k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1292 | 26.2k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1293 | 26.2k | hDecoder->object_type, hDecoder->frameLength); | 1294 | 26.2k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1295 | 26.2k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1296 | 26.2k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1297 | 26.2k | hDecoder->object_type, hDecoder->frameLength); | 1298 | | #ifdef SSR_DEC | 1299 | | } else { | 1300 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1301 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1302 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1303 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1304 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1305 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1306 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1307 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1308 | | } | 1309 | | #endif | 1310 | | | 1311 | | /* save window shape for next frame */ | 1312 | 26.2k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1313 | 26.2k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1314 | | | 1315 | | #ifdef LTP_DEC | 1316 | | if (is_ltp_ot(hDecoder->object_type)) | 1317 | | { | 1318 | | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1319 | | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1320 | | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1321 | | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1322 | | } | 1323 | | #endif | 1324 | | | 1325 | 26.2k | #ifdef SBR_DEC | 1326 | 26.2k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1327 | 26.2k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1328 | 23.6k | { | 1329 | 23.6k | int ele = hDecoder->fr_ch_ele; | 1330 | 23.6k | int ch0 = cpe->channel; | 1331 | 23.6k | int ch1 = cpe->paired_channel; | 1332 | | | 1333 | | /* following case can happen when forceUpSampling == 1 */ | 1334 | 23.6k | if (hDecoder->sbr[ele] == NULL) | 1335 | 6.38k | { | 1336 | 6.38k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1337 | 6.38k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1338 | 6.38k | hDecoder->downSampledSBR | 1339 | 6.38k | #ifdef DRM | 1340 | 6.38k | , 0 | 1341 | 6.38k | #endif | 1342 | 6.38k | ); | 1343 | 6.38k | } | 1344 | 23.6k | if (!hDecoder->sbr[ele]) | 1345 | 0 | return 19; | 1346 | | | 1347 | 23.6k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1348 | 1.09k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1349 | 22.5k | else | 1350 | 22.5k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1351 | | | 1352 | 23.6k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1353 | 23.6k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1354 | 23.6k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1355 | 23.6k | if (retval > 0) | 1356 | 7 | return retval; | 1357 | 23.6k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1358 | 2.63k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1359 | 1 | { | 1360 | 1 | return 23; | 1361 | 1 | } | 1362 | 26.2k | #endif | 1363 | | | 1364 | 26.2k | return 0; | 1365 | 26.2k | } |
Line | Count | Source | 1133 | 22.5k | { | 1134 | 22.5k | uint8_t retval; | 1135 | 22.5k | ALIGN real_t spec_coef1[1024]; | 1136 | 22.5k | ALIGN real_t spec_coef2[1024]; | 1137 | | | 1138 | | #ifdef PROFILE | 1139 | | int64_t count = faad_get_ts(); | 1140 | | #endif | 1141 | 22.5k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1142 | 19.1k | { | 1143 | 19.1k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1144 | 19.1k | if (retval > 0) | 1145 | 0 | return retval; | 1146 | | | 1147 | 19.1k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1148 | 19.1k | } | 1149 | | | 1150 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1151 | 22.5k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1152 | 0 | return 15; | 1153 | 22.5k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1154 | 0 | return 15; | 1155 | | | 1156 | | /* dequantisation and scaling */ | 1157 | 22.5k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1158 | 22.5k | if (retval > 0) | 1159 | 63 | return retval; | 1160 | 22.4k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1161 | 22.4k | if (retval > 0) | 1162 | 3 | return retval; | 1163 | | | 1164 | | #ifdef PROFILE | 1165 | | count = faad_get_ts() - count; | 1166 | | hDecoder->requant_cycles += count; | 1167 | | #endif | 1168 | | | 1169 | | /* pns decoding */ | 1170 | 22.4k | if (ics1->ms_mask_present) | 1171 | 5.75k | { | 1172 | 5.75k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1173 | 5.75k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1174 | 16.7k | } else { | 1175 | 16.7k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1176 | 16.7k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1177 | 16.7k | } | 1178 | | | 1179 | | /* mid/side decoding */ | 1180 | 22.4k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1181 | | | 1182 | | #if 0 | 1183 | | { | 1184 | | int i; | 1185 | | for (i = 0; i < 1024; i++) | 1186 | | { | 1187 | | //printf("%d\n", spec_coef1[i]); | 1188 | | printf("0x%.8X\n", spec_coef1[i]); | 1189 | | } | 1190 | | for (i = 0; i < 1024; i++) | 1191 | | { | 1192 | | //printf("%d\n", spec_coef2[i]); | 1193 | | printf("0x%.8X\n", spec_coef2[i]); | 1194 | | } | 1195 | | } | 1196 | | #endif | 1197 | | | 1198 | | /* intensity stereo decoding */ | 1199 | 22.4k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1200 | | | 1201 | | #if 0 | 1202 | | { | 1203 | | int i; | 1204 | | for (i = 0; i < 1024; i++) | 1205 | | { | 1206 | | printf("%d\n", spec_coef1[i]); | 1207 | | //printf("0x%.8X\n", spec_coef1[i]); | 1208 | | } | 1209 | | for (i = 0; i < 1024; i++) | 1210 | | { | 1211 | | printf("%d\n", spec_coef2[i]); | 1212 | | //printf("0x%.8X\n", spec_coef2[i]); | 1213 | | } | 1214 | | } | 1215 | | #endif | 1216 | | | 1217 | 22.4k | #ifdef MAIN_DEC | 1218 | | /* MAIN object type prediction */ | 1219 | 22.4k | if (hDecoder->object_type == MAIN) | 1220 | 10.2k | { | 1221 | | /* intra channel prediction */ | 1222 | 10.2k | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1223 | 10.2k | hDecoder->sf_index); | 1224 | 10.2k | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1225 | 10.2k | hDecoder->sf_index); | 1226 | | | 1227 | | /* In addition, for scalefactor bands coded by perceptual | 1228 | | noise substitution the predictors belonging to the | 1229 | | corresponding spectral coefficients are reset. | 1230 | | */ | 1231 | 10.2k | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1232 | 10.2k | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1233 | 10.2k | } | 1234 | 22.4k | #endif | 1235 | | | 1236 | 22.4k | #ifdef LTP_DEC | 1237 | 22.4k | if (is_ltp_ot(hDecoder->object_type)) | 1238 | 8.79k | { | 1239 | 8.79k | ltp_info *ltp1 = &(ics1->ltp); | 1240 | 8.79k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1241 | 8.79k | #ifdef LD_DEC | 1242 | 8.79k | if (hDecoder->object_type == LD) | 1243 | 890 | { | 1244 | 890 | if (ltp1->data_present) | 1245 | 122 | { | 1246 | 122 | if (ltp1->lag_update) | 1247 | 50 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1248 | 122 | } | 1249 | 890 | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1250 | 890 | if (ltp2->data_present) | 1251 | 59 | { | 1252 | 59 | if (ltp2->lag_update) | 1253 | 22 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1254 | 59 | } | 1255 | 890 | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1256 | 890 | } | 1257 | 8.79k | #endif | 1258 | | | 1259 | | /* long term prediction */ | 1260 | 8.79k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1261 | 8.79k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1262 | 8.79k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1263 | 8.79k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1264 | 8.79k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1265 | 8.79k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1266 | 8.79k | } | 1267 | 22.4k | #endif | 1268 | | | 1269 | | /* tns decoding */ | 1270 | 22.4k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1271 | 22.4k | spec_coef1, hDecoder->frameLength); | 1272 | 22.4k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1273 | 22.4k | spec_coef2, hDecoder->frameLength); | 1274 | | | 1275 | | /* drc decoding */ | 1276 | 22.4k | #if APPLY_DRC | 1277 | 22.4k | if (hDecoder->drc->present) | 1278 | 531 | { | 1279 | 531 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1280 | 456 | drc_decode(hDecoder->drc, spec_coef1); | 1281 | 531 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1282 | 455 | drc_decode(hDecoder->drc, spec_coef2); | 1283 | 531 | } | 1284 | 22.4k | #endif | 1285 | | /* filter bank */ | 1286 | | #ifdef SSR_DEC | 1287 | | if (hDecoder->object_type != SSR) | 1288 | | { | 1289 | | #endif | 1290 | 22.4k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1291 | 22.4k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1292 | 22.4k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1293 | 22.4k | hDecoder->object_type, hDecoder->frameLength); | 1294 | 22.4k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1295 | 22.4k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1296 | 22.4k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1297 | 22.4k | hDecoder->object_type, hDecoder->frameLength); | 1298 | | #ifdef SSR_DEC | 1299 | | } else { | 1300 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1301 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1302 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1303 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1304 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1305 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1306 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1307 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1308 | | } | 1309 | | #endif | 1310 | | | 1311 | | /* save window shape for next frame */ | 1312 | 22.4k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1313 | 22.4k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1314 | | | 1315 | 22.4k | #ifdef LTP_DEC | 1316 | 22.4k | if (is_ltp_ot(hDecoder->object_type)) | 1317 | 8.79k | { | 1318 | 8.79k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1319 | 8.79k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1320 | 8.79k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1321 | 8.79k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1322 | 8.79k | } | 1323 | 22.4k | #endif | 1324 | | | 1325 | 22.4k | #ifdef SBR_DEC | 1326 | 22.4k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1327 | 22.4k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1328 | 17.7k | { | 1329 | 17.7k | int ele = hDecoder->fr_ch_ele; | 1330 | 17.7k | int ch0 = cpe->channel; | 1331 | 17.7k | int ch1 = cpe->paired_channel; | 1332 | | | 1333 | | /* following case can happen when forceUpSampling == 1 */ | 1334 | 17.7k | if (hDecoder->sbr[ele] == NULL) | 1335 | 6.73k | { | 1336 | 6.73k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1337 | 6.73k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1338 | 6.73k | hDecoder->downSampledSBR | 1339 | | #ifdef DRM | 1340 | | , 0 | 1341 | | #endif | 1342 | 6.73k | ); | 1343 | 6.73k | } | 1344 | 17.7k | if (!hDecoder->sbr[ele]) | 1345 | 38 | return 19; | 1346 | | | 1347 | 17.6k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1348 | 855 | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1349 | 16.8k | else | 1350 | 16.8k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1351 | | | 1352 | 17.6k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1353 | 17.6k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1354 | 17.6k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1355 | 17.6k | if (retval > 0) | 1356 | 0 | return retval; | 1357 | 17.6k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1358 | 4.77k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1359 | 1 | { | 1360 | 1 | return 23; | 1361 | 1 | } | 1362 | 22.4k | #endif | 1363 | | | 1364 | 22.4k | return 0; | 1365 | 22.4k | } |
Line | Count | Source | 1133 | 15.1k | { | 1134 | 15.1k | uint8_t retval; | 1135 | 15.1k | ALIGN real_t spec_coef1[1024]; | 1136 | 15.1k | ALIGN real_t spec_coef2[1024]; | 1137 | | | 1138 | | #ifdef PROFILE | 1139 | | int64_t count = faad_get_ts(); | 1140 | | #endif | 1141 | 15.1k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1142 | 12.7k | { | 1143 | 12.7k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1144 | 12.7k | if (retval > 0) | 1145 | 0 | return retval; | 1146 | | | 1147 | 12.7k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1148 | 12.7k | } | 1149 | | | 1150 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1151 | 15.1k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1152 | 0 | return 15; | 1153 | 15.1k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1154 | 0 | return 15; | 1155 | | | 1156 | | /* dequantisation and scaling */ | 1157 | 15.1k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1158 | 15.1k | if (retval > 0) | 1159 | 13 | return retval; | 1160 | 15.1k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1161 | 15.1k | if (retval > 0) | 1162 | 5 | return retval; | 1163 | | | 1164 | | #ifdef PROFILE | 1165 | | count = faad_get_ts() - count; | 1166 | | hDecoder->requant_cycles += count; | 1167 | | #endif | 1168 | | | 1169 | | /* pns decoding */ | 1170 | 15.1k | if (ics1->ms_mask_present) | 1171 | 2.67k | { | 1172 | 2.67k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1173 | 2.67k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1174 | 12.5k | } else { | 1175 | 12.5k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1176 | 12.5k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1177 | 12.5k | } | 1178 | | | 1179 | | /* mid/side decoding */ | 1180 | 15.1k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1181 | | | 1182 | | #if 0 | 1183 | | { | 1184 | | int i; | 1185 | | for (i = 0; i < 1024; i++) | 1186 | | { | 1187 | | //printf("%d\n", spec_coef1[i]); | 1188 | | printf("0x%.8X\n", spec_coef1[i]); | 1189 | | } | 1190 | | for (i = 0; i < 1024; i++) | 1191 | | { | 1192 | | //printf("%d\n", spec_coef2[i]); | 1193 | | printf("0x%.8X\n", spec_coef2[i]); | 1194 | | } | 1195 | | } | 1196 | | #endif | 1197 | | | 1198 | | /* intensity stereo decoding */ | 1199 | 15.1k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1200 | | | 1201 | | #if 0 | 1202 | | { | 1203 | | int i; | 1204 | | for (i = 0; i < 1024; i++) | 1205 | | { | 1206 | | printf("%d\n", spec_coef1[i]); | 1207 | | //printf("0x%.8X\n", spec_coef1[i]); | 1208 | | } | 1209 | | for (i = 0; i < 1024; i++) | 1210 | | { | 1211 | | printf("%d\n", spec_coef2[i]); | 1212 | | //printf("0x%.8X\n", spec_coef2[i]); | 1213 | | } | 1214 | | } | 1215 | | #endif | 1216 | | | 1217 | | #ifdef MAIN_DEC | 1218 | | /* MAIN object type prediction */ | 1219 | | if (hDecoder->object_type == MAIN) | 1220 | | { | 1221 | | /* intra channel prediction */ | 1222 | | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1223 | | hDecoder->sf_index); | 1224 | | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1225 | | hDecoder->sf_index); | 1226 | | | 1227 | | /* In addition, for scalefactor bands coded by perceptual | 1228 | | noise substitution the predictors belonging to the | 1229 | | corresponding spectral coefficients are reset. | 1230 | | */ | 1231 | | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1232 | | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1233 | | } | 1234 | | #endif | 1235 | | | 1236 | 15.1k | #ifdef LTP_DEC | 1237 | 15.1k | if (is_ltp_ot(hDecoder->object_type)) | 1238 | 5.82k | { | 1239 | 5.82k | ltp_info *ltp1 = &(ics1->ltp); | 1240 | 5.82k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1241 | 5.82k | #ifdef LD_DEC | 1242 | 5.82k | if (hDecoder->object_type == LD) | 1243 | 639 | { | 1244 | 639 | if (ltp1->data_present) | 1245 | 80 | { | 1246 | 80 | if (ltp1->lag_update) | 1247 | 54 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1248 | 80 | } | 1249 | 639 | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1250 | 639 | if (ltp2->data_present) | 1251 | 18 | { | 1252 | 18 | if (ltp2->lag_update) | 1253 | 12 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1254 | 18 | } | 1255 | 639 | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1256 | 639 | } | 1257 | 5.82k | #endif | 1258 | | | 1259 | | /* long term prediction */ | 1260 | 5.82k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1261 | 5.82k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1262 | 5.82k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1263 | 5.82k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1264 | 5.82k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1265 | 5.82k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1266 | 5.82k | } | 1267 | 15.1k | #endif | 1268 | | | 1269 | | /* tns decoding */ | 1270 | 15.1k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1271 | 15.1k | spec_coef1, hDecoder->frameLength); | 1272 | 15.1k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1273 | 15.1k | spec_coef2, hDecoder->frameLength); | 1274 | | | 1275 | | /* drc decoding */ | 1276 | 15.1k | #if APPLY_DRC | 1277 | 15.1k | if (hDecoder->drc->present) | 1278 | 534 | { | 1279 | 534 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1280 | 479 | drc_decode(hDecoder->drc, spec_coef1); | 1281 | 534 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1282 | 488 | drc_decode(hDecoder->drc, spec_coef2); | 1283 | 534 | } | 1284 | 15.1k | #endif | 1285 | | /* filter bank */ | 1286 | | #ifdef SSR_DEC | 1287 | | if (hDecoder->object_type != SSR) | 1288 | | { | 1289 | | #endif | 1290 | 15.1k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1291 | 15.1k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1292 | 15.1k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1293 | 15.1k | hDecoder->object_type, hDecoder->frameLength); | 1294 | 15.1k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1295 | 15.1k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1296 | 15.1k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1297 | 15.1k | hDecoder->object_type, hDecoder->frameLength); | 1298 | | #ifdef SSR_DEC | 1299 | | } else { | 1300 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1301 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1302 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1303 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1304 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1305 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1306 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1307 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1308 | | } | 1309 | | #endif | 1310 | | | 1311 | | /* save window shape for next frame */ | 1312 | 15.1k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1313 | 15.1k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1314 | | | 1315 | 15.1k | #ifdef LTP_DEC | 1316 | 15.1k | if (is_ltp_ot(hDecoder->object_type)) | 1317 | 5.82k | { | 1318 | 5.82k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1319 | 5.82k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1320 | 5.82k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1321 | 5.82k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1322 | 5.82k | } | 1323 | 15.1k | #endif | 1324 | | | 1325 | 15.1k | #ifdef SBR_DEC | 1326 | 15.1k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1327 | 15.1k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1328 | 12.6k | { | 1329 | 12.6k | int ele = hDecoder->fr_ch_ele; | 1330 | 12.6k | int ch0 = cpe->channel; | 1331 | 12.6k | int ch1 = cpe->paired_channel; | 1332 | | | 1333 | | /* following case can happen when forceUpSampling == 1 */ | 1334 | 12.6k | if (hDecoder->sbr[ele] == NULL) | 1335 | 4.55k | { | 1336 | 4.55k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1337 | 4.55k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1338 | 4.55k | hDecoder->downSampledSBR | 1339 | | #ifdef DRM | 1340 | | , 0 | 1341 | | #endif | 1342 | 4.55k | ); | 1343 | 4.55k | } | 1344 | 12.6k | if (!hDecoder->sbr[ele]) | 1345 | 42 | return 19; | 1346 | | | 1347 | 12.6k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1348 | 512 | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1349 | 12.1k | else | 1350 | 12.1k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1351 | | | 1352 | 12.6k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1353 | 12.6k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1354 | 12.6k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1355 | 12.6k | if (retval > 0) | 1356 | 0 | return retval; | 1357 | 12.6k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1358 | 2.52k | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1359 | 3 | { | 1360 | 3 | return 23; | 1361 | 3 | } | 1362 | 15.1k | #endif | 1363 | | | 1364 | 15.1k | return 0; | 1365 | 15.1k | } |
|