/proc/self/cwd/libfaad/specrec.c
Line | Count | Source |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | | ** |
5 | | ** This program is free software; you can redistribute it and/or modify |
6 | | ** it under the terms of the GNU General Public License as published by |
7 | | ** the Free Software Foundation; either version 2 of the License, or |
8 | | ** (at your option) any later version. |
9 | | ** |
10 | | ** This program is distributed in the hope that it will be useful, |
11 | | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | ** GNU General Public License for more details. |
14 | | ** |
15 | | ** You should have received a copy of the GNU General Public License |
16 | | ** along with this program; if not, write to the Free Software |
17 | | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | | ** |
19 | | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | | ** forbidden. |
21 | | ** |
22 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: 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 | 453k | #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 | 627k | { |
304 | 627k | uint8_t i, g; |
305 | | |
306 | 627k | uint8_t sf_index = hDecoder->sf_index; |
307 | | |
308 | 627k | if (sf_index >= 12) |
309 | 10 | return 32; |
310 | | |
311 | 627k | switch (ics->window_sequence) { |
312 | 518k | case ONLY_LONG_SEQUENCE: |
313 | 549k | case LONG_START_SEQUENCE: |
314 | 562k | case LONG_STOP_SEQUENCE: |
315 | 562k | ics->num_windows = 1; |
316 | 562k | ics->num_window_groups = 1; |
317 | 562k | ics->window_group_length[ics->num_window_groups-1] = 1; |
318 | | #ifdef LD_DEC |
319 | 420k | if (hDecoder->object_type == LD) |
320 | 4.84k | { |
321 | 4.84k | if (hDecoder->frameLength == 512) |
322 | 2.06k | ics->num_swb = num_swb_512_window[sf_index]; |
323 | 2.78k | else /* if (hDecoder->frameLength == 480) */ |
324 | 2.78k | ics->num_swb = num_swb_480_window[sf_index]; |
325 | 416k | } else { |
326 | 416k | #endif |
327 | 557k | if (hDecoder->frameLength == 1024) |
328 | 466k | ics->num_swb = num_swb_1024_window[sf_index]; |
329 | 90.9k | else /* if (hDecoder->frameLength == 960) */ |
330 | 90.9k | ics->num_swb = num_swb_960_window[sf_index]; |
331 | | #ifdef LD_DEC |
332 | | } |
333 | | #endif |
334 | | |
335 | 562k | if (ics->max_sfb > ics->num_swb) |
336 | 265 | { |
337 | 265 | return 32; |
338 | 265 | } |
339 | | |
340 | | /* preparation of sect_sfb_offset for long blocks */ |
341 | | /* also copy the last value! */ |
342 | | #ifdef LD_DEC |
343 | 420k | if (hDecoder->object_type == LD) |
344 | 4.83k | { |
345 | 4.83k | if (hDecoder->frameLength == 512) |
346 | 2.05k | { |
347 | 50.3k | for (i = 0; i < ics->num_swb; i++) |
348 | 48.3k | { |
349 | 48.3k | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; |
350 | 48.3k | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; |
351 | 48.3k | } |
352 | 2.78k | } else /* if (hDecoder->frameLength == 480) */ { |
353 | 82.3k | for (i = 0; i < ics->num_swb; i++) |
354 | 79.5k | { |
355 | 79.5k | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; |
356 | 79.5k | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; |
357 | 79.5k | } |
358 | 2.78k | } |
359 | 4.83k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; |
360 | 4.83k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; |
361 | 4.83k | ics->swb_offset_max = hDecoder->frameLength; |
362 | 415k | } else { |
363 | 415k | #endif |
364 | 24.1M | for (i = 0; i < ics->num_swb; i++) |
365 | 23.6M | { |
366 | 23.6M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; |
367 | 23.6M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; |
368 | 23.6M | } |
369 | 141k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; |
370 | 141k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; |
371 | 141k | ics->swb_offset_max = hDecoder->frameLength; |
372 | | #ifdef LD_DEC |
373 | | } |
374 | | #endif |
375 | 141k | return 0; |
376 | 64.8k | case EIGHT_SHORT_SEQUENCE: |
377 | 64.8k | ics->num_windows = 8; |
378 | 64.8k | ics->num_window_groups = 1; |
379 | 64.8k | ics->window_group_length[ics->num_window_groups-1] = 1; |
380 | 64.8k | ics->num_swb = num_swb_128_window[sf_index]; |
381 | | |
382 | 64.8k | if (ics->max_sfb > ics->num_swb) |
383 | 17 | { |
384 | 17 | return 32; |
385 | 17 | } |
386 | | |
387 | 957k | for (i = 0; i < ics->num_swb; i++) |
388 | 892k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; |
389 | 64.8k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; |
390 | 64.8k | ics->swb_offset_max = hDecoder->frameLength/8; |
391 | | |
392 | 518k | for (i = 0; i < ics->num_windows-1; i++) { |
393 | 453k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) |
394 | 367k | { |
395 | 367k | ics->num_window_groups += 1; |
396 | 367k | ics->window_group_length[ics->num_window_groups-1] = 1; |
397 | 367k | } else { |
398 | 85.8k | ics->window_group_length[ics->num_window_groups-1] += 1; |
399 | 85.8k | } |
400 | 453k | } |
401 | | |
402 | | /* preparation of sect_sfb_offset for short blocks */ |
403 | 497k | for (g = 0; g < ics->num_window_groups; g++) |
404 | 432k | { |
405 | 432k | uint16_t width; |
406 | 432k | uint8_t sect_sfb = 0; |
407 | 432k | uint16_t offset = 0; |
408 | | |
409 | 6.38M | for (i = 0; i < ics->num_swb; i++) |
410 | 5.94M | { |
411 | 5.94M | if (i+1 == ics->num_swb) |
412 | 432k | { |
413 | 432k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; |
414 | 5.51M | } else { |
415 | 5.51M | width = swb_offset_128_window[sf_index][i+1] - |
416 | 5.51M | swb_offset_128_window[sf_index][i]; |
417 | 5.51M | } |
418 | 5.94M | width *= ics->window_group_length[g]; |
419 | 5.94M | ics->sect_sfb_offset[g][sect_sfb++] = offset; |
420 | 5.94M | offset += width; |
421 | 5.94M | } |
422 | 432k | ics->sect_sfb_offset[g][sect_sfb] = offset; |
423 | 432k | } |
424 | 64.8k | return 0; |
425 | 0 | default: |
426 | 0 | return 32; |
427 | 627k | } |
428 | 627k | } Line | Count | Source | 303 | 166k | { | 304 | 166k | uint8_t i, g; | 305 | | | 306 | 166k | uint8_t sf_index = hDecoder->sf_index; | 307 | | | 308 | 166k | if (sf_index >= 12) | 309 | 4 | return 32; | 310 | | | 311 | 166k | switch (ics->window_sequence) { | 312 | 127k | case ONLY_LONG_SEQUENCE: | 313 | 135k | case LONG_START_SEQUENCE: | 314 | 141k | case LONG_STOP_SEQUENCE: | 315 | 141k | ics->num_windows = 1; | 316 | 141k | ics->num_window_groups = 1; | 317 | 141k | 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 | 141k | if (hDecoder->frameLength == 1024) | 328 | 108k | ics->num_swb = num_swb_1024_window[sf_index]; | 329 | 32.6k | else /* if (hDecoder->frameLength == 960) */ | 330 | 32.6k | ics->num_swb = num_swb_960_window[sf_index]; | 331 | | #ifdef LD_DEC | 332 | | } | 333 | | #endif | 334 | | | 335 | 141k | if (ics->max_sfb > ics->num_swb) | 336 | 84 | { | 337 | 84 | return 32; | 338 | 84 | } | 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.21M | for (i = 0; i < ics->num_swb; i++) | 365 | 6.07M | { | 366 | 6.07M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | 367 | 6.07M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | 368 | 6.07M | } | 369 | 141k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 370 | 141k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 371 | 141k | ics->swb_offset_max = hDecoder->frameLength; | 372 | | #ifdef LD_DEC | 373 | | } | 374 | | #endif | 375 | 141k | return 0; | 376 | 24.6k | case EIGHT_SHORT_SEQUENCE: | 377 | 24.6k | ics->num_windows = 8; | 378 | 24.6k | ics->num_window_groups = 1; | 379 | 24.6k | ics->window_group_length[ics->num_window_groups-1] = 1; | 380 | 24.6k | ics->num_swb = num_swb_128_window[sf_index]; | 381 | | | 382 | 24.6k | if (ics->max_sfb > ics->num_swb) | 383 | 6 | { | 384 | 6 | return 32; | 385 | 6 | } | 386 | | | 387 | 370k | for (i = 0; i < ics->num_swb; i++) | 388 | 345k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | 389 | 24.6k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | 390 | 24.6k | ics->swb_offset_max = hDecoder->frameLength/8; | 391 | | | 392 | 197k | for (i = 0; i < ics->num_windows-1; i++) { | 393 | 172k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | 394 | 139k | { | 395 | 139k | ics->num_window_groups += 1; | 396 | 139k | ics->window_group_length[ics->num_window_groups-1] = 1; | 397 | 139k | } else { | 398 | 33.3k | ics->window_group_length[ics->num_window_groups-1] += 1; | 399 | 33.3k | } | 400 | 172k | } | 401 | | | 402 | | /* preparation of sect_sfb_offset for short blocks */ | 403 | 188k | for (g = 0; g < ics->num_window_groups; g++) | 404 | 164k | { | 405 | 164k | uint16_t width; | 406 | 164k | uint8_t sect_sfb = 0; | 407 | 164k | uint16_t offset = 0; | 408 | | | 409 | 2.46M | for (i = 0; i < ics->num_swb; i++) | 410 | 2.29M | { | 411 | 2.29M | if (i+1 == ics->num_swb) | 412 | 164k | { | 413 | 164k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | 414 | 2.13M | } else { | 415 | 2.13M | width = swb_offset_128_window[sf_index][i+1] - | 416 | 2.13M | swb_offset_128_window[sf_index][i]; | 417 | 2.13M | } | 418 | 2.29M | width *= ics->window_group_length[g]; | 419 | 2.29M | ics->sect_sfb_offset[g][sect_sfb++] = offset; | 420 | 2.29M | offset += width; | 421 | 2.29M | } | 422 | 164k | ics->sect_sfb_offset[g][sect_sfb] = offset; | 423 | 164k | } | 424 | 24.6k | return 0; | 425 | 0 | default: | 426 | 0 | return 32; | 427 | 166k | } | 428 | 166k | } |
Line | Count | Source | 303 | 461k | { | 304 | 461k | uint8_t i, g; | 305 | | | 306 | 461k | uint8_t sf_index = hDecoder->sf_index; | 307 | | | 308 | 461k | if (sf_index >= 12) | 309 | 6 | return 32; | 310 | | | 311 | 461k | switch (ics->window_sequence) { | 312 | 390k | case ONLY_LONG_SEQUENCE: | 313 | 413k | case LONG_START_SEQUENCE: | 314 | 420k | case LONG_STOP_SEQUENCE: | 315 | 420k | ics->num_windows = 1; | 316 | 420k | ics->num_window_groups = 1; | 317 | 420k | ics->window_group_length[ics->num_window_groups-1] = 1; | 318 | 420k | #ifdef LD_DEC | 319 | 420k | if (hDecoder->object_type == LD) | 320 | 4.84k | { | 321 | 4.84k | if (hDecoder->frameLength == 512) | 322 | 2.06k | ics->num_swb = num_swb_512_window[sf_index]; | 323 | 2.78k | else /* if (hDecoder->frameLength == 480) */ | 324 | 2.78k | ics->num_swb = num_swb_480_window[sf_index]; | 325 | 416k | } else { | 326 | 416k | #endif | 327 | 416k | if (hDecoder->frameLength == 1024) | 328 | 357k | ics->num_swb = num_swb_1024_window[sf_index]; | 329 | 58.3k | else /* if (hDecoder->frameLength == 960) */ | 330 | 58.3k | ics->num_swb = num_swb_960_window[sf_index]; | 331 | 416k | #ifdef LD_DEC | 332 | 416k | } | 333 | 420k | #endif | 334 | | | 335 | 420k | if (ics->max_sfb > ics->num_swb) | 336 | 181 | { | 337 | 181 | return 32; | 338 | 181 | } | 339 | | | 340 | | /* preparation of sect_sfb_offset for long blocks */ | 341 | | /* also copy the last value! */ | 342 | 420k | #ifdef LD_DEC | 343 | 420k | if (hDecoder->object_type == LD) | 344 | 4.83k | { | 345 | 4.83k | if (hDecoder->frameLength == 512) | 346 | 2.05k | { | 347 | 50.3k | for (i = 0; i < ics->num_swb; i++) | 348 | 48.3k | { | 349 | 48.3k | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; | 350 | 48.3k | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; | 351 | 48.3k | } | 352 | 2.78k | } else /* if (hDecoder->frameLength == 480) */ { | 353 | 82.3k | for (i = 0; i < ics->num_swb; i++) | 354 | 79.5k | { | 355 | 79.5k | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; | 356 | 79.5k | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; | 357 | 79.5k | } | 358 | 2.78k | } | 359 | 4.83k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 360 | 4.83k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 361 | 4.83k | ics->swb_offset_max = hDecoder->frameLength; | 362 | 415k | } else { | 363 | 415k | #endif | 364 | 17.9M | for (i = 0; i < ics->num_swb; i++) | 365 | 17.5M | { | 366 | 17.5M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | 367 | 17.5M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | 368 | 17.5M | } | 369 | 415k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 370 | 415k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 371 | 415k | ics->swb_offset_max = hDecoder->frameLength; | 372 | 415k | #ifdef LD_DEC | 373 | 415k | } | 374 | 420k | #endif | 375 | 420k | return 0; | 376 | 40.1k | case EIGHT_SHORT_SEQUENCE: | 377 | 40.1k | ics->num_windows = 8; | 378 | 40.1k | ics->num_window_groups = 1; | 379 | 40.1k | ics->window_group_length[ics->num_window_groups-1] = 1; | 380 | 40.1k | ics->num_swb = num_swb_128_window[sf_index]; | 381 | | | 382 | 40.1k | if (ics->max_sfb > ics->num_swb) | 383 | 11 | { | 384 | 11 | return 32; | 385 | 11 | } | 386 | | | 387 | 587k | for (i = 0; i < ics->num_swb; i++) | 388 | 547k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | 389 | 40.1k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | 390 | 40.1k | ics->swb_offset_max = hDecoder->frameLength/8; | 391 | | | 392 | 321k | for (i = 0; i < ics->num_windows-1; i++) { | 393 | 281k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | 394 | 228k | { | 395 | 228k | ics->num_window_groups += 1; | 396 | 228k | ics->window_group_length[ics->num_window_groups-1] = 1; | 397 | 228k | } else { | 398 | 52.5k | ics->window_group_length[ics->num_window_groups-1] += 1; | 399 | 52.5k | } | 400 | 281k | } | 401 | | | 402 | | /* preparation of sect_sfb_offset for short blocks */ | 403 | 308k | for (g = 0; g < ics->num_window_groups; g++) | 404 | 268k | { | 405 | 268k | uint16_t width; | 406 | 268k | uint8_t sect_sfb = 0; | 407 | 268k | uint16_t offset = 0; | 408 | | | 409 | 3.92M | for (i = 0; i < ics->num_swb; i++) | 410 | 3.65M | { | 411 | 3.65M | if (i+1 == ics->num_swb) | 412 | 268k | { | 413 | 268k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | 414 | 3.38M | } else { | 415 | 3.38M | width = swb_offset_128_window[sf_index][i+1] - | 416 | 3.38M | swb_offset_128_window[sf_index][i]; | 417 | 3.38M | } | 418 | 3.65M | width *= ics->window_group_length[g]; | 419 | 3.65M | ics->sect_sfb_offset[g][sect_sfb++] = offset; | 420 | 3.65M | offset += width; | 421 | 3.65M | } | 422 | 268k | ics->sect_sfb_offset[g][sect_sfb] = offset; | 423 | 268k | } | 424 | 40.1k | return 0; | 425 | 0 | default: | 426 | 0 | return 32; | 427 | 461k | } | 428 | 461k | } |
|
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 | 667M | { |
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 | 286M | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), |
441 | 286M | 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 | 286M | REAL_CONST(0) |
443 | | }; |
444 | | real_t x1, x2; |
445 | | #endif |
446 | | int16_t sgn = 1; |
447 | | /* compute the magnitude in int: -q is evaluated as int and so does not |
448 | | wrap for q == -32768 the way an int16_t negation would, which keeps the |
449 | | comparison against IQ_TABLE_SIZE in range like the floating-point path */ |
450 | | int aq = q; |
451 | | |
452 | 286M | if (aq < 0) |
453 | 130k | { |
454 | 130k | aq = -aq; |
455 | 130k | sgn = -1; |
456 | 130k | } |
457 | | |
458 | 286M | if (aq < IQ_TABLE_SIZE) |
459 | 286M | { |
460 | | //#define IQUANT_PRINT |
461 | | #ifdef IQUANT_PRINT |
462 | | //printf("0x%.8X\n", sgn * tab[aq]); |
463 | | printf("%d\n", sgn * tab[aq]); |
464 | | #endif |
465 | 286M | return sgn * tab[aq]; |
466 | 286M | } |
467 | | |
468 | 3.02k | #ifndef BIG_IQ_TABLE |
469 | 3.02k | if (aq >= 8192) |
470 | 534 | { |
471 | 534 | *error = 17; |
472 | 534 | return 0; |
473 | 534 | } |
474 | | |
475 | | /* linear interpolation */ |
476 | 2.48k | x1 = tab[aq>>3]; |
477 | 2.48k | x2 = tab[(aq>>3) + 1]; |
478 | 2.48k | return sgn * 16 * (MUL_R(errcorr[aq&7],(x2-x1)) + x1); |
479 | | #else |
480 | | *error = 17; |
481 | | return 0; |
482 | | #endif |
483 | | |
484 | | #else |
485 | 381M | if (q < 0) |
486 | 139k | { |
487 | | /* tab contains a value for all possible q [0,8192] */ |
488 | 139k | if (-q < IQ_TABLE_SIZE) |
489 | 137k | return -tab[-q]; |
490 | | |
491 | 1.80k | *error = 17; |
492 | 1.80k | return 0; |
493 | 381M | } else { |
494 | | /* tab contains a value for all possible q [0,8192] */ |
495 | 381M | if (q < IQ_TABLE_SIZE) |
496 | 381M | return tab[q]; |
497 | | |
498 | 1.40k | *error = 17; |
499 | 1.40k | return 0; |
500 | 381M | } |
501 | | #endif |
502 | 3.02k | } Line | Count | Source | 432 | 286M | { | 433 | 286M | #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 | 286M | #ifndef BIG_IQ_TABLE | 439 | 286M | static const real_t errcorr[] = { | 440 | 286M | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), | 441 | 286M | 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 | 286M | REAL_CONST(0) | 443 | 286M | }; | 444 | 286M | real_t x1, x2; | 445 | 286M | #endif | 446 | 286M | int16_t sgn = 1; | 447 | | /* compute the magnitude in int: -q is evaluated as int and so does not | 448 | | wrap for q == -32768 the way an int16_t negation would, which keeps the | 449 | | comparison against IQ_TABLE_SIZE in range like the floating-point path */ | 450 | 286M | int aq = q; | 451 | | | 452 | 286M | if (aq < 0) | 453 | 130k | { | 454 | 130k | aq = -aq; | 455 | 130k | sgn = -1; | 456 | 130k | } | 457 | | | 458 | 286M | if (aq < IQ_TABLE_SIZE) | 459 | 286M | { | 460 | | //#define IQUANT_PRINT | 461 | | #ifdef IQUANT_PRINT | 462 | | //printf("0x%.8X\n", sgn * tab[aq]); | 463 | | printf("%d\n", sgn * tab[aq]); | 464 | | #endif | 465 | 286M | return sgn * tab[aq]; | 466 | 286M | } | 467 | | | 468 | 3.02k | #ifndef BIG_IQ_TABLE | 469 | 3.02k | if (aq >= 8192) | 470 | 534 | { | 471 | 534 | *error = 17; | 472 | 534 | return 0; | 473 | 534 | } | 474 | | | 475 | | /* linear interpolation */ | 476 | 2.48k | x1 = tab[aq>>3]; | 477 | 2.48k | x2 = tab[(aq>>3) + 1]; | 478 | 2.48k | return sgn * 16 * (MUL_R(errcorr[aq&7],(x2-x1)) + x1); | 479 | | #else | 480 | | *error = 17; | 481 | | return 0; | 482 | | #endif | 483 | | | 484 | | #else | 485 | | if (q < 0) | 486 | | { | 487 | | /* tab contains a value for all possible q [0,8192] */ | 488 | | if (-q < IQ_TABLE_SIZE) | 489 | | return -tab[-q]; | 490 | | | 491 | | *error = 17; | 492 | | return 0; | 493 | | } else { | 494 | | /* tab contains a value for all possible q [0,8192] */ | 495 | | if (q < IQ_TABLE_SIZE) | 496 | | return tab[q]; | 497 | | | 498 | | *error = 17; | 499 | | return 0; | 500 | | } | 501 | | #endif | 502 | 3.02k | } |
Line | Count | Source | 432 | 381M | { | 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 | | /* compute the magnitude in int: -q is evaluated as int and so does not | 448 | | wrap for q == -32768 the way an int16_t negation would, which keeps the | 449 | | comparison against IQ_TABLE_SIZE in range like the floating-point path */ | 450 | | int aq = q; | 451 | | | 452 | | if (aq < 0) | 453 | | { | 454 | | aq = -aq; | 455 | | sgn = -1; | 456 | | } | 457 | | | 458 | | if (aq < IQ_TABLE_SIZE) | 459 | | { | 460 | | //#define IQUANT_PRINT | 461 | | #ifdef IQUANT_PRINT | 462 | | //printf("0x%.8X\n", sgn * tab[aq]); | 463 | | printf("%d\n", sgn * tab[aq]); | 464 | | #endif | 465 | | return sgn * tab[aq]; | 466 | | } | 467 | | | 468 | | #ifndef BIG_IQ_TABLE | 469 | | if (aq >= 8192) | 470 | | { | 471 | | *error = 17; | 472 | | return 0; | 473 | | } | 474 | | | 475 | | /* linear interpolation */ | 476 | | x1 = tab[aq>>3]; | 477 | | x2 = tab[(aq>>3) + 1]; | 478 | | return sgn * 16 * (MUL_R(errcorr[aq&7],(x2-x1)) + x1); | 479 | | #else | 480 | | *error = 17; | 481 | | return 0; | 482 | | #endif | 483 | | | 484 | | #else | 485 | 381M | if (q < 0) | 486 | 139k | { | 487 | | /* tab contains a value for all possible q [0,8192] */ | 488 | 139k | if (-q < IQ_TABLE_SIZE) | 489 | 137k | return -tab[-q]; | 490 | | | 491 | 1.80k | *error = 17; | 492 | 1.80k | return 0; | 493 | 381M | } else { | 494 | | /* tab contains a value for all possible q [0,8192] */ | 495 | 381M | if (q < IQ_TABLE_SIZE) | 496 | 381M | return tab[q]; | 497 | | | 498 | 1.40k | *error = 17; | 499 | 1.40k | return 0; | 500 | 381M | } | 501 | 381M | #endif | 502 | 381M | } |
|
503 | | |
504 | | #ifndef FIXED_POINT |
505 | | ALIGN static const real_t pow2sf_tab[] = { |
506 | | 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, |
507 | | 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, |
508 | | 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, |
509 | | 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, |
510 | | 0.0001220703125, 0.000244140625, 0.00048828125, |
511 | | 0.0009765625, 0.001953125, 0.00390625, |
512 | | 0.0078125, 0.015625, 0.03125, |
513 | | 0.0625, 0.125, 0.25, |
514 | | 0.5, 1.0, 2.0, |
515 | | 4.0, 8.0, 16.0, 32.0, |
516 | | 64.0, 128.0, 256.0, |
517 | | 512.0, 1024.0, 2048.0, |
518 | | 4096.0, 8192.0, 16384.0, |
519 | | 32768.0, 65536.0, 131072.0, |
520 | | 262144.0, 524288.0, 1048576.0, |
521 | | 2097152.0, 4194304.0, 8388608.0, |
522 | | 16777216.0, 33554432.0, 67108864.0, |
523 | | 134217728.0, 268435456.0, 536870912.0, |
524 | | 1073741824.0, 2147483648.0, 4294967296.0, |
525 | | 8589934592.0, 17179869184.0, 34359738368.0, |
526 | | 68719476736.0, 137438953472.0, 274877906944.0 |
527 | | }; |
528 | | #endif |
529 | | |
530 | | /* quant_to_spec: perform dequantisation and scaling |
531 | | * and in case of short block it also does the deinterleaving |
532 | | */ |
533 | | /* |
534 | | For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, |
535 | | window_group_length[0] = 1) the spectral data is in ascending spectral |
536 | | order. |
537 | | For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the |
538 | | grouping in the following manner: |
539 | | - Groups are ordered sequentially |
540 | | - Within a group, a scalefactor band consists of the spectral data of all |
541 | | grouped SHORT_WINDOWs for the associated scalefactor window band. To |
542 | | clarify via example, the length of a group is in the range of one to eight |
543 | | SHORT_WINDOWs. |
544 | | - If there are eight groups each with length one (num_window_groups = 8, |
545 | | window_group_length[0..7] = 1), the result is a sequence of eight spectra, |
546 | | each in ascending spectral order. |
547 | | - If there is only one group with length eight (num_window_groups = 1, |
548 | | window_group_length[0] = 8), the result is that spectral data of all eight |
549 | | SHORT_WINDOWs is interleaved by scalefactor window bands. |
550 | | - Within a scalefactor window band, the coefficients are in ascending |
551 | | spectral order. |
552 | | */ |
553 | | static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, |
554 | | ic_stream *ics, int16_t *quant_data, |
555 | | real_t *spec_data, uint16_t frame_len) |
556 | 661k | { |
557 | 661k | ALIGN static const real_t pow2_table[] = |
558 | 661k | { |
559 | 661k | COEF_CONST(1.0), |
560 | 661k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ |
561 | 661k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ |
562 | 661k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ |
563 | 661k | }; |
564 | 661k | const real_t *tab = iq_table; |
565 | | |
566 | 661k | uint8_t g, sfb, win; |
567 | 661k | uint16_t width, bin, k, gindex; |
568 | 661k | uint8_t error = 0; /* Init error flag */ |
569 | | #ifndef FIXED_POINT |
570 | | real_t scf; |
571 | | #else |
572 | | int32_t sat_shift_mask = 0; |
573 | | #endif |
574 | | |
575 | 661k | k = 0; |
576 | 661k | gindex = 0; |
577 | | |
578 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. |
579 | | * Without peeking into AAC specification, there is no strong evidence if |
580 | | * such streams are invalid -> just calm down MSAN. */ |
581 | 661k | if (ics->num_swb == 0) |
582 | 1.26k | memset(spec_data, 0, frame_len * sizeof(real_t)); |
583 | | |
584 | 1.70M | for (g = 0; g < ics->num_window_groups; g++) |
585 | 1.04M | { |
586 | 1.04M | uint16_t j = 0; |
587 | 1.04M | uint16_t gincrease = 0; |
588 | 1.04M | uint16_t win_inc = ics->swb_offset[ics->num_swb]; |
589 | | |
590 | 32.2M | for (sfb = 0; sfb < ics->num_swb; sfb++) |
591 | 31.2M | { |
592 | 31.2M | int32_t exp, frac; |
593 | 31.2M | uint16_t wa = gindex + j; |
594 | 31.2M | int16_t scale_factor = ics->scale_factors[g][sfb]; |
595 | | |
596 | 31.2M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; |
597 | | |
598 | | #ifdef FIXED_POINT |
599 | | scale_factor -= 100; |
600 | | /* IMDCT pre-scaling */ |
601 | 13.2M | if (hDecoder->object_type == LD) |
602 | 59.7k | { |
603 | 59.7k | scale_factor -= 24 /*9*/; |
604 | 13.2M | } else { |
605 | 13.2M | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
606 | 2.54M | scale_factor -= 16 /*7*/; |
607 | 10.6M | else |
608 | 10.6M | scale_factor -= 28 /*10*/; |
609 | 13.2M | } |
610 | 13.2M | if (scale_factor > 120) |
611 | 882 | scale_factor = 120; /* => exp <= 30 */ |
612 | | #else |
613 | | (void)hDecoder; |
614 | | #endif |
615 | | |
616 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ |
617 | 31.2M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) |
618 | 75.1k | { |
619 | 75.1k | scale_factor = 0; |
620 | 75.1k | } |
621 | | |
622 | | /* scale_factor must be between 0 and 255 */ |
623 | 31.2M | exp = (scale_factor /* - 100 */) >> 2; |
624 | | /* frac must always be > 0 */ |
625 | 31.2M | frac = (scale_factor /* - 100 */) & 3; |
626 | | |
627 | | #ifndef FIXED_POINT |
628 | | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; |
629 | | #else |
630 | 13.2M | if (exp > 0) |
631 | 24.0k | sat_shift_mask = SAT_SHIFT_MASK(exp); |
632 | | #endif |
633 | | |
634 | 63.8M | for (win = 0; win < ics->window_group_length[g]; win++) |
635 | 32.5M | { |
636 | 199M | for (bin = 0; bin < width; bin += 4) |
637 | 166M | { |
638 | 166M | uint16_t wb = wa + bin; |
639 | | #ifndef FIXED_POINT |
640 | | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; |
641 | | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; |
642 | | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; |
643 | | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; |
644 | | #else |
645 | | real_t iq0 = iquant(quant_data[k+0], tab, &error); |
646 | | real_t iq1 = iquant(quant_data[k+1], tab, &error); |
647 | | real_t iq2 = iquant(quant_data[k+2], tab, &error); |
648 | | real_t iq3 = iquant(quant_data[k+3], tab, &error); |
649 | | |
650 | 71.5M | if (exp == -32) |
651 | 63.9M | { |
652 | 63.9M | spec_data[wb+0] = 0; |
653 | 63.9M | spec_data[wb+1] = 0; |
654 | 63.9M | spec_data[wb+2] = 0; |
655 | 63.9M | spec_data[wb+3] = 0; |
656 | 63.9M | } else if (exp <= 0) { |
657 | 7.44M | spec_data[wb+0] = iq0 >> -exp; |
658 | 7.44M | spec_data[wb+1] = iq1 >> -exp; |
659 | 7.44M | spec_data[wb+2] = iq2 >> -exp; |
660 | 7.44M | spec_data[wb+3] = iq3 >> -exp; |
661 | 7.44M | } else { /* exp > 0 */ |
662 | 131k | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); |
663 | 131k | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); |
664 | 131k | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); |
665 | 131k | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); |
666 | 131k | } |
667 | 71.5M | if (frac != 0) |
668 | 220k | { |
669 | 220k | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); |
670 | 220k | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); |
671 | 220k | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); |
672 | 220k | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); |
673 | 220k | } |
674 | | |
675 | | //#define SCFS_PRINT |
676 | | #ifdef SCFS_PRINT |
677 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
678 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); |
679 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); |
680 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); |
681 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
682 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); |
683 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); |
684 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); |
685 | | #endif |
686 | | #endif |
687 | | |
688 | 166M | gincrease += 4; |
689 | 166M | k += 4; |
690 | 166M | } |
691 | 32.5M | wa += win_inc; |
692 | 32.5M | } |
693 | 31.2M | j += width; |
694 | 31.2M | } |
695 | 1.04M | gindex += gincrease; |
696 | 1.04M | } |
697 | | |
698 | 661k | return error; |
699 | 661k | } Line | Count | Source | 556 | 283k | { | 557 | 283k | ALIGN static const real_t pow2_table[] = | 558 | 283k | { | 559 | 283k | COEF_CONST(1.0), | 560 | 283k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ | 561 | 283k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ | 562 | 283k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ | 563 | 283k | }; | 564 | 283k | const real_t *tab = iq_table; | 565 | | | 566 | 283k | uint8_t g, sfb, win; | 567 | 283k | uint16_t width, bin, k, gindex; | 568 | 283k | uint8_t error = 0; /* Init error flag */ | 569 | | #ifndef FIXED_POINT | 570 | | real_t scf; | 571 | | #else | 572 | 283k | int32_t sat_shift_mask = 0; | 573 | 283k | #endif | 574 | | | 575 | 283k | k = 0; | 576 | 283k | gindex = 0; | 577 | | | 578 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. | 579 | | * Without peeking into AAC specification, there is no strong evidence if | 580 | | * such streams are invalid -> just calm down MSAN. */ | 581 | 283k | if (ics->num_swb == 0) | 582 | 467 | memset(spec_data, 0, frame_len * sizeof(real_t)); | 583 | | | 584 | 726k | for (g = 0; g < ics->num_window_groups; g++) | 585 | 442k | { | 586 | 442k | uint16_t j = 0; | 587 | 442k | uint16_t gincrease = 0; | 588 | 442k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; | 589 | | | 590 | 13.7M | for (sfb = 0; sfb < ics->num_swb; sfb++) | 591 | 13.2M | { | 592 | 13.2M | int32_t exp, frac; | 593 | 13.2M | uint16_t wa = gindex + j; | 594 | 13.2M | int16_t scale_factor = ics->scale_factors[g][sfb]; | 595 | | | 596 | 13.2M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; | 597 | | | 598 | 13.2M | #ifdef FIXED_POINT | 599 | 13.2M | scale_factor -= 100; | 600 | | /* IMDCT pre-scaling */ | 601 | 13.2M | if (hDecoder->object_type == LD) | 602 | 59.7k | { | 603 | 59.7k | scale_factor -= 24 /*9*/; | 604 | 13.2M | } else { | 605 | 13.2M | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 606 | 2.54M | scale_factor -= 16 /*7*/; | 607 | 10.6M | else | 608 | 10.6M | scale_factor -= 28 /*10*/; | 609 | 13.2M | } | 610 | 13.2M | if (scale_factor > 120) | 611 | 882 | scale_factor = 120; /* => exp <= 30 */ | 612 | | #else | 613 | | (void)hDecoder; | 614 | | #endif | 615 | | | 616 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ | 617 | 13.2M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) | 618 | 46.4k | { | 619 | 46.4k | scale_factor = 0; | 620 | 46.4k | } | 621 | | | 622 | | /* scale_factor must be between 0 and 255 */ | 623 | 13.2M | exp = (scale_factor /* - 100 */) >> 2; | 624 | | /* frac must always be > 0 */ | 625 | 13.2M | frac = (scale_factor /* - 100 */) & 3; | 626 | | | 627 | | #ifndef FIXED_POINT | 628 | | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | 629 | | #else | 630 | 13.2M | if (exp > 0) | 631 | 24.0k | sat_shift_mask = SAT_SHIFT_MASK(exp); | 632 | 13.2M | #endif | 633 | | | 634 | 27.0M | for (win = 0; win < ics->window_group_length[g]; win++) | 635 | 13.7M | { | 636 | 85.3M | for (bin = 0; bin < width; bin += 4) | 637 | 71.5M | { | 638 | 71.5M | uint16_t wb = wa + bin; | 639 | | #ifndef FIXED_POINT | 640 | | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | 641 | | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | 642 | | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | 643 | | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | 644 | | #else | 645 | 71.5M | real_t iq0 = iquant(quant_data[k+0], tab, &error); | 646 | 71.5M | real_t iq1 = iquant(quant_data[k+1], tab, &error); | 647 | 71.5M | real_t iq2 = iquant(quant_data[k+2], tab, &error); | 648 | 71.5M | real_t iq3 = iquant(quant_data[k+3], tab, &error); | 649 | | | 650 | 71.5M | if (exp == -32) | 651 | 63.9M | { | 652 | 63.9M | spec_data[wb+0] = 0; | 653 | 63.9M | spec_data[wb+1] = 0; | 654 | 63.9M | spec_data[wb+2] = 0; | 655 | 63.9M | spec_data[wb+3] = 0; | 656 | 63.9M | } else if (exp <= 0) { | 657 | 7.44M | spec_data[wb+0] = iq0 >> -exp; | 658 | 7.44M | spec_data[wb+1] = iq1 >> -exp; | 659 | 7.44M | spec_data[wb+2] = iq2 >> -exp; | 660 | 7.44M | spec_data[wb+3] = iq3 >> -exp; | 661 | 7.44M | } else { /* exp > 0 */ | 662 | 131k | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); | 663 | 131k | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); | 664 | 131k | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); | 665 | 131k | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); | 666 | 131k | } | 667 | 71.5M | if (frac != 0) | 668 | 220k | { | 669 | 220k | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | 670 | 220k | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | 671 | 220k | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | 672 | 220k | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | 673 | 220k | } | 674 | | | 675 | | //#define SCFS_PRINT | 676 | | #ifdef SCFS_PRINT | 677 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 678 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 679 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 680 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 681 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 682 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 683 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 684 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 685 | | #endif | 686 | 71.5M | #endif | 687 | | | 688 | 71.5M | gincrease += 4; | 689 | 71.5M | k += 4; | 690 | 71.5M | } | 691 | 13.7M | wa += win_inc; | 692 | 13.7M | } | 693 | 13.2M | j += width; | 694 | 13.2M | } | 695 | 442k | gindex += gincrease; | 696 | 442k | } | 697 | | | 698 | 283k | return error; | 699 | 283k | } |
Line | Count | Source | 556 | 378k | { | 557 | 378k | ALIGN static const real_t pow2_table[] = | 558 | 378k | { | 559 | 378k | COEF_CONST(1.0), | 560 | 378k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ | 561 | 378k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ | 562 | 378k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ | 563 | 378k | }; | 564 | 378k | const real_t *tab = iq_table; | 565 | | | 566 | 378k | uint8_t g, sfb, win; | 567 | 378k | uint16_t width, bin, k, gindex; | 568 | 378k | uint8_t error = 0; /* Init error flag */ | 569 | 378k | #ifndef FIXED_POINT | 570 | 378k | real_t scf; | 571 | | #else | 572 | | int32_t sat_shift_mask = 0; | 573 | | #endif | 574 | | | 575 | 378k | k = 0; | 576 | 378k | gindex = 0; | 577 | | | 578 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. | 579 | | * Without peeking into AAC specification, there is no strong evidence if | 580 | | * such streams are invalid -> just calm down MSAN. */ | 581 | 378k | if (ics->num_swb == 0) | 582 | 798 | memset(spec_data, 0, frame_len * sizeof(real_t)); | 583 | | | 584 | 979k | for (g = 0; g < ics->num_window_groups; g++) | 585 | 601k | { | 586 | 601k | uint16_t j = 0; | 587 | 601k | uint16_t gincrease = 0; | 588 | 601k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; | 589 | | | 590 | 18.5M | for (sfb = 0; sfb < ics->num_swb; sfb++) | 591 | 17.9M | { | 592 | 17.9M | int32_t exp, frac; | 593 | 17.9M | uint16_t wa = gindex + j; | 594 | 17.9M | int16_t scale_factor = ics->scale_factors[g][sfb]; | 595 | | | 596 | 17.9M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; | 597 | | | 598 | | #ifdef FIXED_POINT | 599 | | scale_factor -= 100; | 600 | | /* IMDCT pre-scaling */ | 601 | | if (hDecoder->object_type == LD) | 602 | | { | 603 | | scale_factor -= 24 /*9*/; | 604 | | } else { | 605 | | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 606 | | scale_factor -= 16 /*7*/; | 607 | | else | 608 | | scale_factor -= 28 /*10*/; | 609 | | } | 610 | | if (scale_factor > 120) | 611 | | scale_factor = 120; /* => exp <= 30 */ | 612 | | #else | 613 | 17.9M | (void)hDecoder; | 614 | 17.9M | #endif | 615 | | | 616 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ | 617 | 17.9M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) | 618 | 28.6k | { | 619 | 28.6k | scale_factor = 0; | 620 | 28.6k | } | 621 | | | 622 | | /* scale_factor must be between 0 and 255 */ | 623 | 17.9M | exp = (scale_factor /* - 100 */) >> 2; | 624 | | /* frac must always be > 0 */ | 625 | 17.9M | frac = (scale_factor /* - 100 */) & 3; | 626 | | | 627 | 17.9M | #ifndef FIXED_POINT | 628 | 17.9M | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | 629 | | #else | 630 | | if (exp > 0) | 631 | | sat_shift_mask = SAT_SHIFT_MASK(exp); | 632 | | #endif | 633 | | | 634 | 36.7M | for (win = 0; win < ics->window_group_length[g]; win++) | 635 | 18.8M | { | 636 | 114M | for (bin = 0; bin < width; bin += 4) | 637 | 95.3M | { | 638 | 95.3M | uint16_t wb = wa + bin; | 639 | 95.3M | #ifndef FIXED_POINT | 640 | 95.3M | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | 641 | 95.3M | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | 642 | 95.3M | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | 643 | 95.3M | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | 644 | | #else | 645 | | real_t iq0 = iquant(quant_data[k+0], tab, &error); | 646 | | real_t iq1 = iquant(quant_data[k+1], tab, &error); | 647 | | real_t iq2 = iquant(quant_data[k+2], tab, &error); | 648 | | real_t iq3 = iquant(quant_data[k+3], tab, &error); | 649 | | | 650 | | if (exp == -32) | 651 | | { | 652 | | spec_data[wb+0] = 0; | 653 | | spec_data[wb+1] = 0; | 654 | | spec_data[wb+2] = 0; | 655 | | spec_data[wb+3] = 0; | 656 | | } else if (exp <= 0) { | 657 | | spec_data[wb+0] = iq0 >> -exp; | 658 | | spec_data[wb+1] = iq1 >> -exp; | 659 | | spec_data[wb+2] = iq2 >> -exp; | 660 | | spec_data[wb+3] = iq3 >> -exp; | 661 | | } else { /* exp > 0 */ | 662 | | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); | 663 | | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); | 664 | | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); | 665 | | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); | 666 | | } | 667 | | if (frac != 0) | 668 | | { | 669 | | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | 670 | | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | 671 | | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | 672 | | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | 673 | | } | 674 | | | 675 | | //#define SCFS_PRINT | 676 | | #ifdef SCFS_PRINT | 677 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 678 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 679 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 680 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 681 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 682 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 683 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 684 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 685 | | #endif | 686 | | #endif | 687 | | | 688 | 95.3M | gincrease += 4; | 689 | 95.3M | k += 4; | 690 | 95.3M | } | 691 | 18.8M | wa += win_inc; | 692 | 18.8M | } | 693 | 17.9M | j += width; | 694 | 17.9M | } | 695 | 601k | gindex += gincrease; | 696 | 601k | } | 697 | | | 698 | 378k | return error; | 699 | 378k | } |
|
700 | | |
701 | | static uint8_t allocate_single_channel(NeAACDecStruct *hDecoder, uint8_t channel, |
702 | | uint8_t output_channels) |
703 | 275k | { |
704 | 275k | int mul = 1; |
705 | | |
706 | | #ifdef MAIN_DEC |
707 | | /* MAIN object type prediction */ |
708 | 170k | if (hDecoder->object_type == MAIN) |
709 | 73.3k | { |
710 | | /* allocate the state only when needed */ |
711 | 73.3k | if (hDecoder->pred_stat[channel] != NULL) |
712 | 1.66k | { |
713 | 1.66k | faad_free(hDecoder->pred_stat[channel]); |
714 | 1.66k | hDecoder->pred_stat[channel] = NULL; |
715 | 1.66k | } |
716 | | |
717 | 73.3k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
718 | 73.3k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
719 | 73.3k | } |
720 | | #endif |
721 | | |
722 | | #ifdef LTP_DEC |
723 | 170k | if (is_ltp_ot(hDecoder->object_type)) |
724 | 48.0k | { |
725 | | /* allocate the state only when needed */ |
726 | 48.0k | if (hDecoder->lt_pred_stat[channel] != NULL) |
727 | 787 | { |
728 | 787 | faad_free(hDecoder->lt_pred_stat[channel]); |
729 | 787 | hDecoder->lt_pred_stat[channel] = NULL; |
730 | 787 | } |
731 | | |
732 | 48.0k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
733 | 48.0k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
734 | 48.0k | } |
735 | | #endif |
736 | | |
737 | 275k | if (hDecoder->time_out[channel] != NULL) |
738 | 3.73k | { |
739 | 3.73k | faad_free(hDecoder->time_out[channel]); |
740 | 3.73k | hDecoder->time_out[channel] = NULL; |
741 | 3.73k | } |
742 | | |
743 | 275k | { |
744 | 275k | mul = 1; |
745 | 275k | #ifdef SBR_DEC |
746 | 275k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; |
747 | 275k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
748 | 219k | { |
749 | | /* SBR requires 2 times as much output data */ |
750 | 219k | mul = 2; |
751 | 219k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; |
752 | 219k | } |
753 | 275k | #endif |
754 | 275k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
755 | 275k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
756 | 275k | } |
757 | | |
758 | 275k | #if (defined(PS_DEC) || defined(DRM_PS)) |
759 | 275k | if (output_channels == 2) |
760 | 108k | { |
761 | 108k | if (hDecoder->time_out[channel+1] != NULL) |
762 | 1.01k | { |
763 | 1.01k | faad_free(hDecoder->time_out[channel+1]); |
764 | 1.01k | hDecoder->time_out[channel+1] = NULL; |
765 | 1.01k | } |
766 | | |
767 | 108k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
768 | 108k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
769 | 108k | } |
770 | 275k | #endif |
771 | | |
772 | 275k | if (hDecoder->fb_intermed[channel] != NULL) |
773 | 3.23k | { |
774 | 3.23k | faad_free(hDecoder->fb_intermed[channel]); |
775 | 3.23k | hDecoder->fb_intermed[channel] = NULL; |
776 | 3.23k | } |
777 | | |
778 | 275k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
779 | 275k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
780 | | |
781 | | #ifdef SSR_DEC |
782 | | if (hDecoder->object_type == SSR) |
783 | | { |
784 | | if (hDecoder->ssr_overlap[channel] == NULL) |
785 | | { |
786 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
787 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
788 | | } |
789 | | if (hDecoder->prev_fmd[channel] == NULL) |
790 | | { |
791 | | uint16_t k; |
792 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
793 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
794 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); |
795 | | } |
796 | | } |
797 | | #endif |
798 | | |
799 | 275k | return 0; |
800 | 275k | } specrec.c:allocate_single_channel Line | Count | Source | 703 | 104k | { | 704 | 104k | int mul = 1; | 705 | | | 706 | | #ifdef MAIN_DEC | 707 | | /* MAIN object type prediction */ | 708 | | if (hDecoder->object_type == MAIN) | 709 | | { | 710 | | /* allocate the state only when needed */ | 711 | | if (hDecoder->pred_stat[channel] != NULL) | 712 | | { | 713 | | faad_free(hDecoder->pred_stat[channel]); | 714 | | hDecoder->pred_stat[channel] = NULL; | 715 | | } | 716 | | | 717 | | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 718 | | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 719 | | } | 720 | | #endif | 721 | | | 722 | | #ifdef LTP_DEC | 723 | | if (is_ltp_ot(hDecoder->object_type)) | 724 | | { | 725 | | /* allocate the state only when needed */ | 726 | | if (hDecoder->lt_pred_stat[channel] != NULL) | 727 | | { | 728 | | faad_free(hDecoder->lt_pred_stat[channel]); | 729 | | hDecoder->lt_pred_stat[channel] = NULL; | 730 | | } | 731 | | | 732 | | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 733 | | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 734 | | } | 735 | | #endif | 736 | | | 737 | 104k | if (hDecoder->time_out[channel] != NULL) | 738 | 0 | { | 739 | 0 | faad_free(hDecoder->time_out[channel]); | 740 | 0 | hDecoder->time_out[channel] = NULL; | 741 | 0 | } | 742 | | | 743 | 104k | { | 744 | 104k | mul = 1; | 745 | 104k | #ifdef SBR_DEC | 746 | 104k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 747 | 104k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 748 | 90.9k | { | 749 | | /* SBR requires 2 times as much output data */ | 750 | 90.9k | mul = 2; | 751 | 90.9k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 752 | 90.9k | } | 753 | 104k | #endif | 754 | 104k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 755 | 104k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 756 | 104k | } | 757 | | | 758 | 104k | #if (defined(PS_DEC) || defined(DRM_PS)) | 759 | 104k | if (output_channels == 2) | 760 | 104k | { | 761 | 104k | if (hDecoder->time_out[channel+1] != NULL) | 762 | 0 | { | 763 | 0 | faad_free(hDecoder->time_out[channel+1]); | 764 | 0 | hDecoder->time_out[channel+1] = NULL; | 765 | 0 | } | 766 | | | 767 | 104k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 768 | 104k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 769 | 104k | } | 770 | 104k | #endif | 771 | | | 772 | 104k | if (hDecoder->fb_intermed[channel] != NULL) | 773 | 0 | { | 774 | 0 | faad_free(hDecoder->fb_intermed[channel]); | 775 | 0 | hDecoder->fb_intermed[channel] = NULL; | 776 | 0 | } | 777 | | | 778 | 104k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 779 | 104k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 780 | | | 781 | | #ifdef SSR_DEC | 782 | | if (hDecoder->object_type == SSR) | 783 | | { | 784 | | if (hDecoder->ssr_overlap[channel] == NULL) | 785 | | { | 786 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 787 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 788 | | } | 789 | | if (hDecoder->prev_fmd[channel] == NULL) | 790 | | { | 791 | | uint16_t k; | 792 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 793 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 794 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | 795 | | } | 796 | | } | 797 | | #endif | 798 | | | 799 | 104k | return 0; | 800 | 104k | } |
specrec.c:allocate_single_channel Line | Count | Source | 703 | 170k | { | 704 | 170k | int mul = 1; | 705 | | | 706 | 170k | #ifdef MAIN_DEC | 707 | | /* MAIN object type prediction */ | 708 | 170k | if (hDecoder->object_type == MAIN) | 709 | 73.3k | { | 710 | | /* allocate the state only when needed */ | 711 | 73.3k | if (hDecoder->pred_stat[channel] != NULL) | 712 | 1.66k | { | 713 | 1.66k | faad_free(hDecoder->pred_stat[channel]); | 714 | 1.66k | hDecoder->pred_stat[channel] = NULL; | 715 | 1.66k | } | 716 | | | 717 | 73.3k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 718 | 73.3k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 719 | 73.3k | } | 720 | 170k | #endif | 721 | | | 722 | 170k | #ifdef LTP_DEC | 723 | 170k | if (is_ltp_ot(hDecoder->object_type)) | 724 | 48.0k | { | 725 | | /* allocate the state only when needed */ | 726 | 48.0k | if (hDecoder->lt_pred_stat[channel] != NULL) | 727 | 787 | { | 728 | 787 | faad_free(hDecoder->lt_pred_stat[channel]); | 729 | 787 | hDecoder->lt_pred_stat[channel] = NULL; | 730 | 787 | } | 731 | | | 732 | 48.0k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 733 | 48.0k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 734 | 48.0k | } | 735 | 170k | #endif | 736 | | | 737 | 170k | if (hDecoder->time_out[channel] != NULL) | 738 | 3.73k | { | 739 | 3.73k | faad_free(hDecoder->time_out[channel]); | 740 | 3.73k | hDecoder->time_out[channel] = NULL; | 741 | 3.73k | } | 742 | | | 743 | 170k | { | 744 | 170k | mul = 1; | 745 | 170k | #ifdef SBR_DEC | 746 | 170k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 747 | 170k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 748 | 128k | { | 749 | | /* SBR requires 2 times as much output data */ | 750 | 128k | mul = 2; | 751 | 128k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 752 | 128k | } | 753 | 170k | #endif | 754 | 170k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 755 | 170k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 756 | 170k | } | 757 | | | 758 | 170k | #if (defined(PS_DEC) || defined(DRM_PS)) | 759 | 170k | if (output_channels == 2) | 760 | 3.93k | { | 761 | 3.93k | if (hDecoder->time_out[channel+1] != NULL) | 762 | 1.01k | { | 763 | 1.01k | faad_free(hDecoder->time_out[channel+1]); | 764 | 1.01k | hDecoder->time_out[channel+1] = NULL; | 765 | 1.01k | } | 766 | | | 767 | 3.93k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 768 | 3.93k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 769 | 3.93k | } | 770 | 170k | #endif | 771 | | | 772 | 170k | if (hDecoder->fb_intermed[channel] != NULL) | 773 | 3.23k | { | 774 | 3.23k | faad_free(hDecoder->fb_intermed[channel]); | 775 | 3.23k | hDecoder->fb_intermed[channel] = NULL; | 776 | 3.23k | } | 777 | | | 778 | 170k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 779 | 170k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 780 | | | 781 | | #ifdef SSR_DEC | 782 | | if (hDecoder->object_type == SSR) | 783 | | { | 784 | | if (hDecoder->ssr_overlap[channel] == NULL) | 785 | | { | 786 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 787 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 788 | | } | 789 | | if (hDecoder->prev_fmd[channel] == NULL) | 790 | | { | 791 | | uint16_t k; | 792 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 793 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 794 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | 795 | | } | 796 | | } | 797 | | #endif | 798 | | | 799 | 170k | return 0; | 800 | 170k | } |
|
801 | | |
802 | | static uint8_t allocate_channel_pair(NeAACDecStruct *hDecoder, |
803 | | uint8_t channel, uint8_t paired_channel) |
804 | 43.2k | { |
805 | 43.2k | int mul = 1; |
806 | | |
807 | | #ifdef MAIN_DEC |
808 | | /* MAIN object type prediction */ |
809 | 19.5k | if (hDecoder->object_type == MAIN) |
810 | 9.82k | { |
811 | | /* allocate the state only when needed */ |
812 | 9.82k | if (hDecoder->pred_stat[channel] == NULL) |
813 | 9.79k | { |
814 | 9.79k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
815 | 9.79k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
816 | 9.79k | } |
817 | 9.82k | if (hDecoder->pred_stat[paired_channel] == NULL) |
818 | 9.79k | { |
819 | 9.79k | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
820 | 9.79k | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); |
821 | 9.79k | } |
822 | 9.82k | } |
823 | | #endif |
824 | | |
825 | | #ifdef LTP_DEC |
826 | 19.5k | if (is_ltp_ot(hDecoder->object_type)) |
827 | 7.61k | { |
828 | | /* allocate the state only when needed */ |
829 | 7.61k | if (hDecoder->lt_pred_stat[channel] == NULL) |
830 | 7.55k | { |
831 | 7.55k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
832 | 7.55k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
833 | 7.55k | } |
834 | 7.61k | if (hDecoder->lt_pred_stat[paired_channel] == NULL) |
835 | 7.55k | { |
836 | 7.55k | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
837 | 7.55k | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
838 | 7.55k | } |
839 | 7.61k | } |
840 | | #endif |
841 | | |
842 | 43.2k | { |
843 | 43.2k | mul = 1; |
844 | 43.2k | #ifdef SBR_DEC |
845 | 43.2k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; |
846 | 43.2k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
847 | 35.7k | { |
848 | | /* SBR requires 2 times as much output data */ |
849 | 35.7k | mul = 2; |
850 | 35.7k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; |
851 | 35.7k | } |
852 | 43.2k | #endif |
853 | 43.2k | } |
854 | 43.2k | if (hDecoder->time_out[channel] != NULL) |
855 | 109 | { |
856 | 109 | faad_free(hDecoder->time_out[channel]); |
857 | 109 | hDecoder->time_out[channel] = NULL; |
858 | 109 | } |
859 | 43.2k | if (hDecoder->time_out[paired_channel] != NULL) |
860 | 105 | { |
861 | 105 | faad_free(hDecoder->time_out[paired_channel]); |
862 | 105 | hDecoder->time_out[paired_channel] = NULL; |
863 | 105 | } |
864 | 43.2k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
865 | 43.2k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
866 | 43.2k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
867 | 43.2k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
868 | | |
869 | 43.2k | if (hDecoder->fb_intermed[channel] != NULL) |
870 | 109 | { |
871 | 109 | faad_free(hDecoder->fb_intermed[channel]); |
872 | 109 | hDecoder->fb_intermed[channel] = NULL; |
873 | 109 | } |
874 | 43.2k | if (hDecoder->fb_intermed[paired_channel] != NULL) |
875 | 100 | { |
876 | 100 | faad_free(hDecoder->fb_intermed[paired_channel]); |
877 | 100 | hDecoder->fb_intermed[paired_channel] = NULL; |
878 | 100 | } |
879 | 43.2k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
880 | 43.2k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
881 | 43.2k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
882 | 43.2k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); |
883 | | |
884 | | #ifdef SSR_DEC |
885 | | if (hDecoder->object_type == SSR) |
886 | | { |
887 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) |
888 | | { |
889 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
890 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
891 | | } |
892 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) |
893 | | { |
894 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
895 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
896 | | } |
897 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) |
898 | | { |
899 | | uint16_t k; |
900 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
901 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
902 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); |
903 | | } |
904 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) |
905 | | { |
906 | | uint16_t k; |
907 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
908 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
909 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); |
910 | | } |
911 | | } |
912 | | #endif |
913 | | |
914 | 43.2k | return 0; |
915 | 43.2k | } specrec.c:allocate_channel_pair Line | Count | Source | 804 | 23.7k | { | 805 | 23.7k | int mul = 1; | 806 | | | 807 | | #ifdef MAIN_DEC | 808 | | /* MAIN object type prediction */ | 809 | | if (hDecoder->object_type == MAIN) | 810 | | { | 811 | | /* allocate the state only when needed */ | 812 | | if (hDecoder->pred_stat[channel] == NULL) | 813 | | { | 814 | | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 815 | | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 816 | | } | 817 | | if (hDecoder->pred_stat[paired_channel] == NULL) | 818 | | { | 819 | | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 820 | | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | 821 | | } | 822 | | } | 823 | | #endif | 824 | | | 825 | | #ifdef LTP_DEC | 826 | | if (is_ltp_ot(hDecoder->object_type)) | 827 | | { | 828 | | /* allocate the state only when needed */ | 829 | | if (hDecoder->lt_pred_stat[channel] == NULL) | 830 | | { | 831 | | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 832 | | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 833 | | } | 834 | | if (hDecoder->lt_pred_stat[paired_channel] == NULL) | 835 | | { | 836 | | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 837 | | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 838 | | } | 839 | | } | 840 | | #endif | 841 | | | 842 | 23.7k | { | 843 | 23.7k | mul = 1; | 844 | 23.7k | #ifdef SBR_DEC | 845 | 23.7k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 846 | 23.7k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 847 | 21.0k | { | 848 | | /* SBR requires 2 times as much output data */ | 849 | 21.0k | mul = 2; | 850 | 21.0k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 851 | 21.0k | } | 852 | 23.7k | #endif | 853 | 23.7k | } | 854 | 23.7k | if (hDecoder->time_out[channel] != NULL) | 855 | 5 | { | 856 | 5 | faad_free(hDecoder->time_out[channel]); | 857 | 5 | hDecoder->time_out[channel] = NULL; | 858 | 5 | } | 859 | 23.7k | if (hDecoder->time_out[paired_channel] != NULL) | 860 | 5 | { | 861 | 5 | faad_free(hDecoder->time_out[paired_channel]); | 862 | 5 | hDecoder->time_out[paired_channel] = NULL; | 863 | 5 | } | 864 | 23.7k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 865 | 23.7k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 866 | 23.7k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 867 | 23.7k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 868 | | | 869 | 23.7k | if (hDecoder->fb_intermed[channel] != NULL) | 870 | 5 | { | 871 | 5 | faad_free(hDecoder->fb_intermed[channel]); | 872 | 5 | hDecoder->fb_intermed[channel] = NULL; | 873 | 5 | } | 874 | 23.7k | if (hDecoder->fb_intermed[paired_channel] != NULL) | 875 | 0 | { | 876 | 0 | faad_free(hDecoder->fb_intermed[paired_channel]); | 877 | 0 | hDecoder->fb_intermed[paired_channel] = NULL; | 878 | 0 | } | 879 | 23.7k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 880 | 23.7k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 881 | 23.7k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 882 | 23.7k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | 883 | | | 884 | | #ifdef SSR_DEC | 885 | | if (hDecoder->object_type == SSR) | 886 | | { | 887 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) | 888 | | { | 889 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 890 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 891 | | } | 892 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | 893 | | { | 894 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 895 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 896 | | } | 897 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) | 898 | | { | 899 | | uint16_t k; | 900 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 901 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 902 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | 903 | | } | 904 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | 905 | | { | 906 | | uint16_t k; | 907 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 908 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 909 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | 910 | | } | 911 | | } | 912 | | #endif | 913 | | | 914 | 23.7k | return 0; | 915 | 23.7k | } |
specrec.c:allocate_channel_pair Line | Count | Source | 804 | 19.5k | { | 805 | 19.5k | int mul = 1; | 806 | | | 807 | 19.5k | #ifdef MAIN_DEC | 808 | | /* MAIN object type prediction */ | 809 | 19.5k | if (hDecoder->object_type == MAIN) | 810 | 9.82k | { | 811 | | /* allocate the state only when needed */ | 812 | 9.82k | if (hDecoder->pred_stat[channel] == NULL) | 813 | 9.79k | { | 814 | 9.79k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 815 | 9.79k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 816 | 9.79k | } | 817 | 9.82k | if (hDecoder->pred_stat[paired_channel] == NULL) | 818 | 9.79k | { | 819 | 9.79k | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 820 | 9.79k | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | 821 | 9.79k | } | 822 | 9.82k | } | 823 | 19.5k | #endif | 824 | | | 825 | 19.5k | #ifdef LTP_DEC | 826 | 19.5k | if (is_ltp_ot(hDecoder->object_type)) | 827 | 7.61k | { | 828 | | /* allocate the state only when needed */ | 829 | 7.61k | if (hDecoder->lt_pred_stat[channel] == NULL) | 830 | 7.55k | { | 831 | 7.55k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 832 | 7.55k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 833 | 7.55k | } | 834 | 7.61k | if (hDecoder->lt_pred_stat[paired_channel] == NULL) | 835 | 7.55k | { | 836 | 7.55k | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 837 | 7.55k | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 838 | 7.55k | } | 839 | 7.61k | } | 840 | 19.5k | #endif | 841 | | | 842 | 19.5k | { | 843 | 19.5k | mul = 1; | 844 | 19.5k | #ifdef SBR_DEC | 845 | 19.5k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 846 | 19.5k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 847 | 14.6k | { | 848 | | /* SBR requires 2 times as much output data */ | 849 | 14.6k | mul = 2; | 850 | 14.6k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 851 | 14.6k | } | 852 | 19.5k | #endif | 853 | 19.5k | } | 854 | 19.5k | if (hDecoder->time_out[channel] != NULL) | 855 | 104 | { | 856 | 104 | faad_free(hDecoder->time_out[channel]); | 857 | 104 | hDecoder->time_out[channel] = NULL; | 858 | 104 | } | 859 | 19.5k | if (hDecoder->time_out[paired_channel] != NULL) | 860 | 100 | { | 861 | 100 | faad_free(hDecoder->time_out[paired_channel]); | 862 | 100 | hDecoder->time_out[paired_channel] = NULL; | 863 | 100 | } | 864 | 19.5k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 865 | 19.5k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 866 | 19.5k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 867 | 19.5k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 868 | | | 869 | 19.5k | if (hDecoder->fb_intermed[channel] != NULL) | 870 | 104 | { | 871 | 104 | faad_free(hDecoder->fb_intermed[channel]); | 872 | 104 | hDecoder->fb_intermed[channel] = NULL; | 873 | 104 | } | 874 | 19.5k | if (hDecoder->fb_intermed[paired_channel] != NULL) | 875 | 100 | { | 876 | 100 | faad_free(hDecoder->fb_intermed[paired_channel]); | 877 | 100 | hDecoder->fb_intermed[paired_channel] = NULL; | 878 | 100 | } | 879 | 19.5k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 880 | 19.5k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 881 | 19.5k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 882 | 19.5k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | 883 | | | 884 | | #ifdef SSR_DEC | 885 | | if (hDecoder->object_type == SSR) | 886 | | { | 887 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) | 888 | | { | 889 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 890 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 891 | | } | 892 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | 893 | | { | 894 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 895 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 896 | | } | 897 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) | 898 | | { | 899 | | uint16_t k; | 900 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 901 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 902 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | 903 | | } | 904 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | 905 | | { | 906 | | uint16_t k; | 907 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 908 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 909 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | 910 | | } | 911 | | } | 912 | | #endif | 913 | | | 914 | 19.5k | return 0; | 915 | 19.5k | } |
|
916 | | |
917 | | uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, |
918 | | element *sce, int16_t *spec_data) |
919 | 519k | { |
920 | 519k | uint8_t retval; |
921 | 519k | uint8_t output_channels; |
922 | 519k | ALIGN real_t spec_coef[1024]; |
923 | | |
924 | | #ifdef PROFILE |
925 | | int64_t count = faad_get_ts(); |
926 | | #endif |
927 | | |
928 | | |
929 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ |
930 | | #if ( (defined(DRM) && defined(DRM_PS)) ) |
931 | | output_channels = 2; |
932 | | #elif defined(PS_DEC) |
933 | 395k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) |
934 | 11.1k | output_channels = 2; |
935 | 384k | else |
936 | 384k | output_channels = 1; |
937 | | #else |
938 | | output_channels = 1; |
939 | | #endif |
940 | | |
941 | 519k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
942 | 453k | { |
943 | | /* element_output_channels not set yet */ |
944 | 453k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
945 | 453k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { |
946 | | /* element inconsistency */ |
947 | | |
948 | | /* this only happens if PS is actually found but not in the first frame |
949 | | * this means that there is only 1 bitstream element! |
950 | | */ |
951 | | |
952 | | /* The simplest way to fix the accounting, |
953 | | * is to reallocate this and all the following channels. |
954 | | */ |
955 | 1.14k | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, |
956 | 1.14k | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); |
957 | | |
958 | 1.14k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
959 | | |
960 | | //return 21; |
961 | 1.14k | } |
962 | | |
963 | 519k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) |
964 | 461k | { |
965 | 461k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); |
966 | 461k | if (retval > 0) |
967 | 0 | return retval; |
968 | | |
969 | 461k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; |
970 | 461k | } |
971 | | |
972 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ |
973 | 519k | if(!hDecoder->time_out[sce->channel]) |
974 | 0 | return 15; |
975 | 519k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) |
976 | 0 | return 15; |
977 | 519k | if(!hDecoder->fb_intermed[sce->channel]) |
978 | 0 | return 15; |
979 | | |
980 | | /* dequantisation and scaling */ |
981 | 519k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); |
982 | 519k | if (retval > 0) |
983 | 177 | return retval; |
984 | | |
985 | | #ifdef PROFILE |
986 | | count = faad_get_ts() - count; |
987 | | hDecoder->requant_cycles += count; |
988 | | #endif |
989 | | |
990 | | |
991 | | /* pns decoding */ |
992 | 518k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, |
993 | 518k | &(hDecoder->__r1), &(hDecoder->__r2)); |
994 | | |
995 | | #ifdef MAIN_DEC |
996 | | /* MAIN object type prediction */ |
997 | 192k | if (hDecoder->object_type == MAIN) |
998 | 83.0k | { |
999 | 83.0k | if (!hDecoder->pred_stat[sce->channel]) |
1000 | 0 | return 33; |
1001 | | |
1002 | | /* intra channel prediction */ |
1003 | 83.0k | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, |
1004 | 83.0k | hDecoder->sf_index); |
1005 | | |
1006 | | /* In addition, for scalefactor bands coded by perceptual |
1007 | | noise substitution the predictors belonging to the |
1008 | | corresponding spectral coefficients are reset. |
1009 | | */ |
1010 | 83.0k | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); |
1011 | 83.0k | } |
1012 | 192k | #endif |
1013 | | |
1014 | | #ifdef LTP_DEC |
1015 | 395k | if (is_ltp_ot(hDecoder->object_type)) |
1016 | 177k | { |
1017 | 177k | #ifdef LD_DEC |
1018 | 177k | if (hDecoder->object_type == LD) |
1019 | 1.15k | { |
1020 | 1.15k | if (ics->ltp.data_present) |
1021 | 138 | { |
1022 | 138 | if (ics->ltp.lag_update) |
1023 | 39 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; |
1024 | 138 | } |
1025 | 1.15k | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; |
1026 | 1.15k | } |
1027 | 177k | #endif |
1028 | | |
1029 | | /* long term prediction */ |
1030 | 177k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, |
1031 | 177k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], |
1032 | 177k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1033 | 177k | } |
1034 | 192k | #endif |
1035 | | |
1036 | | /* tns decoding */ |
1037 | 192k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, |
1038 | 192k | spec_coef, hDecoder->frameLength); |
1039 | | |
1040 | | /* drc decoding */ |
1041 | 192k | #ifdef APPLY_DRC |
1042 | 518k | if (hDecoder->drc->present) |
1043 | 25.8k | { |
1044 | 25.8k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) |
1045 | 23.1k | drc_decode(hDecoder->drc, spec_coef); |
1046 | 25.8k | } |
1047 | 192k | #endif |
1048 | | /* filter bank */ |
1049 | | #ifdef SSR_DEC |
1050 | | if (hDecoder->object_type != SSR) |
1051 | | { |
1052 | | #endif |
1053 | 192k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, |
1054 | 192k | hDecoder->window_shape_prev[sce->channel], spec_coef, |
1055 | 192k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], |
1056 | 192k | hDecoder->object_type, hDecoder->frameLength); |
1057 | | #ifdef SSR_DEC |
1058 | | } else { |
1059 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, |
1060 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], |
1061 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], |
1062 | | hDecoder->frameLength); |
1063 | | } |
1064 | | #endif |
1065 | | |
1066 | | /* save window shape for next frame */ |
1067 | 192k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; |
1068 | | |
1069 | | #ifdef LTP_DEC |
1070 | 395k | if (is_ltp_ot(hDecoder->object_type)) |
1071 | 177k | { |
1072 | 177k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], |
1073 | 177k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); |
1074 | 177k | } |
1075 | | #endif |
1076 | | |
1077 | 192k | #ifdef SBR_DEC |
1078 | 518k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1079 | 409k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1080 | 409k | { |
1081 | 409k | int ele = hDecoder->fr_ch_ele; |
1082 | 409k | int ch = sce->channel; |
1083 | | |
1084 | | /* following case can happen when forceUpSampling == 1 */ |
1085 | 409k | if (hDecoder->sbr[ele] == NULL) |
1086 | 310k | { |
1087 | 310k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, |
1088 | 310k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
1089 | 310k | hDecoder->downSampledSBR |
1090 | | #ifdef DRM |
1091 | | , 0 |
1092 | | #endif |
1093 | 310k | ); |
1094 | 310k | } |
1095 | 409k | if (!hDecoder->sbr[ele]) |
1096 | 91 | return 19; |
1097 | | |
1098 | 409k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
1099 | 48.4k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); |
1100 | 361k | else |
1101 | 361k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); |
1102 | | |
1103 | | /* check if any of the PS tools is used */ |
1104 | 409k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1105 | 409k | if (hDecoder->ps_used[ele] == 0) |
1106 | 389k | { |
1107 | 389k | #endif |
1108 | 389k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], |
1109 | 389k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
1110 | 389k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1111 | 389k | } else { |
1112 | 19.8k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], |
1113 | 19.8k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, |
1114 | 19.8k | hDecoder->downSampledSBR); |
1115 | 19.8k | } |
1116 | 409k | #endif |
1117 | 409k | if (retval > 0) |
1118 | 93 | return retval; |
1119 | 409k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1120 | 9 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1121 | 9 | { |
1122 | 9 | return 23; |
1123 | 9 | } |
1124 | 518k | #endif |
1125 | | |
1126 | | /* copy L to R when no PS is used */ |
1127 | 518k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1128 | 518k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && |
1129 | 498k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) |
1130 | 114k | { |
1131 | 114k | int ele = hDecoder->fr_ch_ele; |
1132 | 114k | int ch = sce->channel; |
1133 | 114k | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; |
1134 | 114k | frame_size *= hDecoder->frameLength*sizeof(real_t); |
1135 | | |
1136 | 114k | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); |
1137 | 114k | } |
1138 | 518k | #endif |
1139 | | |
1140 | 518k | return 0; |
1141 | 192k | } reconstruct_single_channel Line | Count | Source | 919 | 123k | { | 920 | 123k | uint8_t retval; | 921 | 123k | uint8_t output_channels; | 922 | 123k | ALIGN real_t spec_coef[1024]; | 923 | | | 924 | | #ifdef PROFILE | 925 | | int64_t count = faad_get_ts(); | 926 | | #endif | 927 | | | 928 | | | 929 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 930 | 123k | #if ( (defined(DRM) && defined(DRM_PS)) ) | 931 | 123k | output_channels = 2; | 932 | | #elif defined(PS_DEC) | 933 | | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 934 | | output_channels = 2; | 935 | | else | 936 | | output_channels = 1; | 937 | | #else | 938 | | output_channels = 1; | 939 | | #endif | 940 | | | 941 | 123k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 942 | 104k | { | 943 | | /* element_output_channels not set yet */ | 944 | 104k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 945 | 104k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 946 | | /* element inconsistency */ | 947 | | | 948 | | /* this only happens if PS is actually found but not in the first frame | 949 | | * this means that there is only 1 bitstream element! | 950 | | */ | 951 | | | 952 | | /* The simplest way to fix the accounting, | 953 | | * is to reallocate this and all the following channels. | 954 | | */ | 955 | 0 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 956 | 0 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 957 | |
| 958 | 0 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 959 | | | 960 | | //return 21; | 961 | 0 | } | 962 | | | 963 | 123k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 964 | 104k | { | 965 | 104k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 966 | 104k | if (retval > 0) | 967 | 0 | return retval; | 968 | | | 969 | 104k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 970 | 104k | } | 971 | | | 972 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 973 | 123k | if(!hDecoder->time_out[sce->channel]) | 974 | 0 | return 15; | 975 | 123k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 976 | 0 | return 15; | 977 | 123k | if(!hDecoder->fb_intermed[sce->channel]) | 978 | 0 | return 15; | 979 | | | 980 | | /* dequantisation and scaling */ | 981 | 123k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 982 | 123k | if (retval > 0) | 983 | 66 | return retval; | 984 | | | 985 | | #ifdef PROFILE | 986 | | count = faad_get_ts() - count; | 987 | | hDecoder->requant_cycles += count; | 988 | | #endif | 989 | | | 990 | | | 991 | | /* pns decoding */ | 992 | 123k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 993 | 123k | &(hDecoder->__r1), &(hDecoder->__r2)); | 994 | | | 995 | | #ifdef MAIN_DEC | 996 | | /* MAIN object type prediction */ | 997 | | if (hDecoder->object_type == MAIN) | 998 | | { | 999 | | if (!hDecoder->pred_stat[sce->channel]) | 1000 | | return 33; | 1001 | | | 1002 | | /* intra channel prediction */ | 1003 | | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 1004 | | hDecoder->sf_index); | 1005 | | | 1006 | | /* In addition, for scalefactor bands coded by perceptual | 1007 | | noise substitution the predictors belonging to the | 1008 | | corresponding spectral coefficients are reset. | 1009 | | */ | 1010 | | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 1011 | | } | 1012 | | #endif | 1013 | | | 1014 | | #ifdef LTP_DEC | 1015 | | if (is_ltp_ot(hDecoder->object_type)) | 1016 | | { | 1017 | | #ifdef LD_DEC | 1018 | | if (hDecoder->object_type == LD) | 1019 | | { | 1020 | | if (ics->ltp.data_present) | 1021 | | { | 1022 | | if (ics->ltp.lag_update) | 1023 | | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1024 | | } | 1025 | | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1026 | | } | 1027 | | #endif | 1028 | | | 1029 | | /* long term prediction */ | 1030 | | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1031 | | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1032 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1033 | | } | 1034 | | #endif | 1035 | | | 1036 | | /* tns decoding */ | 1037 | 123k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1038 | 123k | spec_coef, hDecoder->frameLength); | 1039 | | | 1040 | | /* drc decoding */ | 1041 | 123k | #ifdef APPLY_DRC | 1042 | 123k | if (hDecoder->drc->present) | 1043 | 0 | { | 1044 | 0 | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1045 | 0 | drc_decode(hDecoder->drc, spec_coef); | 1046 | 0 | } | 1047 | 123k | #endif | 1048 | | /* filter bank */ | 1049 | | #ifdef SSR_DEC | 1050 | | if (hDecoder->object_type != SSR) | 1051 | | { | 1052 | | #endif | 1053 | 123k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1054 | 123k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1055 | 123k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1056 | 123k | hDecoder->object_type, hDecoder->frameLength); | 1057 | | #ifdef SSR_DEC | 1058 | | } else { | 1059 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1060 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1061 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1062 | | hDecoder->frameLength); | 1063 | | } | 1064 | | #endif | 1065 | | | 1066 | | /* save window shape for next frame */ | 1067 | 123k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1068 | | | 1069 | | #ifdef LTP_DEC | 1070 | | if (is_ltp_ot(hDecoder->object_type)) | 1071 | | { | 1072 | | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1073 | | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1074 | | } | 1075 | | #endif | 1076 | | | 1077 | 123k | #ifdef SBR_DEC | 1078 | 123k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1079 | 107k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1080 | 107k | { | 1081 | 107k | int ele = hDecoder->fr_ch_ele; | 1082 | 107k | int ch = sce->channel; | 1083 | | | 1084 | | /* following case can happen when forceUpSampling == 1 */ | 1085 | 107k | if (hDecoder->sbr[ele] == NULL) | 1086 | 73.9k | { | 1087 | 73.9k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1088 | 73.9k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1089 | 73.9k | hDecoder->downSampledSBR | 1090 | 73.9k | #ifdef DRM | 1091 | 73.9k | , 0 | 1092 | 73.9k | #endif | 1093 | 73.9k | ); | 1094 | 73.9k | } | 1095 | 107k | if (!hDecoder->sbr[ele]) | 1096 | 0 | return 19; | 1097 | | | 1098 | 107k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1099 | 17.0k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1100 | 90.6k | else | 1101 | 90.6k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1102 | | | 1103 | | /* check if any of the PS tools is used */ | 1104 | 107k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1105 | 107k | if (hDecoder->ps_used[ele] == 0) | 1106 | 98.9k | { | 1107 | 98.9k | #endif | 1108 | 98.9k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1109 | 98.9k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1110 | 98.9k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1111 | 98.9k | } else { | 1112 | 8.75k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1113 | 8.75k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1114 | 8.75k | hDecoder->downSampledSBR); | 1115 | 8.75k | } | 1116 | 107k | #endif | 1117 | 107k | if (retval > 0) | 1118 | 13 | return retval; | 1119 | 107k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1120 | 1 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1121 | 1 | { | 1122 | 1 | return 23; | 1123 | 1 | } | 1124 | 123k | #endif | 1125 | | | 1126 | | /* copy L to R when no PS is used */ | 1127 | 123k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1128 | 123k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1129 | 114k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1130 | 114k | { | 1131 | 114k | int ele = hDecoder->fr_ch_ele; | 1132 | 114k | int ch = sce->channel; | 1133 | 114k | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1134 | 114k | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1135 | | | 1136 | 114k | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1137 | 114k | } | 1138 | 123k | #endif | 1139 | | | 1140 | 123k | return 0; | 1141 | 123k | } |
reconstruct_single_channel Line | Count | Source | 919 | 192k | { | 920 | 192k | uint8_t retval; | 921 | 192k | uint8_t output_channels; | 922 | 192k | ALIGN real_t spec_coef[1024]; | 923 | | | 924 | | #ifdef PROFILE | 925 | | int64_t count = faad_get_ts(); | 926 | | #endif | 927 | | | 928 | | | 929 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 930 | | #if ( (defined(DRM) && defined(DRM_PS)) ) | 931 | | output_channels = 2; | 932 | | #elif defined(PS_DEC) | 933 | 192k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 934 | 5.56k | output_channels = 2; | 935 | 187k | else | 936 | 187k | output_channels = 1; | 937 | | #else | 938 | | output_channels = 1; | 939 | | #endif | 940 | | | 941 | 192k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 942 | 166k | { | 943 | | /* element_output_channels not set yet */ | 944 | 166k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 945 | 166k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 946 | | /* element inconsistency */ | 947 | | | 948 | | /* this only happens if PS is actually found but not in the first frame | 949 | | * this means that there is only 1 bitstream element! | 950 | | */ | 951 | | | 952 | | /* The simplest way to fix the accounting, | 953 | | * is to reallocate this and all the following channels. | 954 | | */ | 955 | 484 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 956 | 484 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 957 | | | 958 | 484 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 959 | | | 960 | | //return 21; | 961 | 484 | } | 962 | | | 963 | 192k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 964 | 170k | { | 965 | 170k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 966 | 170k | if (retval > 0) | 967 | 0 | return retval; | 968 | | | 969 | 170k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 970 | 170k | } | 971 | | | 972 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 973 | 192k | if(!hDecoder->time_out[sce->channel]) | 974 | 0 | return 15; | 975 | 192k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 976 | 0 | return 15; | 977 | 192k | if(!hDecoder->fb_intermed[sce->channel]) | 978 | 0 | return 15; | 979 | | | 980 | | /* dequantisation and scaling */ | 981 | 192k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 982 | 192k | if (retval > 0) | 983 | 68 | return retval; | 984 | | | 985 | | #ifdef PROFILE | 986 | | count = faad_get_ts() - count; | 987 | | hDecoder->requant_cycles += count; | 988 | | #endif | 989 | | | 990 | | | 991 | | /* pns decoding */ | 992 | 192k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 993 | 192k | &(hDecoder->__r1), &(hDecoder->__r2)); | 994 | | | 995 | 192k | #ifdef MAIN_DEC | 996 | | /* MAIN object type prediction */ | 997 | 192k | if (hDecoder->object_type == MAIN) | 998 | 83.0k | { | 999 | 83.0k | if (!hDecoder->pred_stat[sce->channel]) | 1000 | 0 | return 33; | 1001 | | | 1002 | | /* intra channel prediction */ | 1003 | 83.0k | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 1004 | 83.0k | hDecoder->sf_index); | 1005 | | | 1006 | | /* In addition, for scalefactor bands coded by perceptual | 1007 | | noise substitution the predictors belonging to the | 1008 | | corresponding spectral coefficients are reset. | 1009 | | */ | 1010 | 83.0k | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 1011 | 83.0k | } | 1012 | 192k | #endif | 1013 | | | 1014 | 192k | #ifdef LTP_DEC | 1015 | 192k | if (is_ltp_ot(hDecoder->object_type)) | 1016 | 51.3k | { | 1017 | 51.3k | #ifdef LD_DEC | 1018 | 51.3k | if (hDecoder->object_type == LD) | 1019 | 660 | { | 1020 | 660 | if (ics->ltp.data_present) | 1021 | 81 | { | 1022 | 81 | if (ics->ltp.lag_update) | 1023 | 18 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1024 | 81 | } | 1025 | 660 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1026 | 660 | } | 1027 | 51.3k | #endif | 1028 | | | 1029 | | /* long term prediction */ | 1030 | 51.3k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1031 | 51.3k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1032 | 51.3k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1033 | 51.3k | } | 1034 | 192k | #endif | 1035 | | | 1036 | | /* tns decoding */ | 1037 | 192k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1038 | 192k | spec_coef, hDecoder->frameLength); | 1039 | | | 1040 | | /* drc decoding */ | 1041 | 192k | #ifdef APPLY_DRC | 1042 | 192k | if (hDecoder->drc->present) | 1043 | 12.3k | { | 1044 | 12.3k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1045 | 11.3k | drc_decode(hDecoder->drc, spec_coef); | 1046 | 12.3k | } | 1047 | 192k | #endif | 1048 | | /* filter bank */ | 1049 | | #ifdef SSR_DEC | 1050 | | if (hDecoder->object_type != SSR) | 1051 | | { | 1052 | | #endif | 1053 | 192k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1054 | 192k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1055 | 192k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1056 | 192k | hDecoder->object_type, hDecoder->frameLength); | 1057 | | #ifdef SSR_DEC | 1058 | | } else { | 1059 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1060 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1061 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1062 | | hDecoder->frameLength); | 1063 | | } | 1064 | | #endif | 1065 | | | 1066 | | /* save window shape for next frame */ | 1067 | 192k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1068 | | | 1069 | 192k | #ifdef LTP_DEC | 1070 | 192k | if (is_ltp_ot(hDecoder->object_type)) | 1071 | 51.3k | { | 1072 | 51.3k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1073 | 51.3k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1074 | 51.3k | } | 1075 | 192k | #endif | 1076 | | | 1077 | 192k | #ifdef SBR_DEC | 1078 | 192k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1079 | 146k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1080 | 146k | { | 1081 | 146k | int ele = hDecoder->fr_ch_ele; | 1082 | 146k | int ch = sce->channel; | 1083 | | | 1084 | | /* following case can happen when forceUpSampling == 1 */ | 1085 | 146k | if (hDecoder->sbr[ele] == NULL) | 1086 | 110k | { | 1087 | 110k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1088 | 110k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1089 | 110k | hDecoder->downSampledSBR | 1090 | | #ifdef DRM | 1091 | | , 0 | 1092 | | #endif | 1093 | 110k | ); | 1094 | 110k | } | 1095 | 146k | if (!hDecoder->sbr[ele]) | 1096 | 35 | return 19; | 1097 | | | 1098 | 146k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1099 | 18.0k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1100 | 128k | else | 1101 | 128k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1102 | | | 1103 | | /* check if any of the PS tools is used */ | 1104 | 146k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1105 | 146k | if (hDecoder->ps_used[ele] == 0) | 1106 | 140k | { | 1107 | 140k | #endif | 1108 | 140k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1109 | 140k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1110 | 140k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1111 | 140k | } else { | 1112 | 5.56k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1113 | 5.56k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1114 | 5.56k | hDecoder->downSampledSBR); | 1115 | 5.56k | } | 1116 | 146k | #endif | 1117 | 146k | if (retval > 0) | 1118 | 51 | return retval; | 1119 | 146k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1120 | 3 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1121 | 3 | { | 1122 | 3 | return 23; | 1123 | 3 | } | 1124 | 192k | #endif | 1125 | | | 1126 | | /* copy L to R when no PS is used */ | 1127 | 192k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1128 | 192k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1129 | 186k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1130 | 0 | { | 1131 | 0 | int ele = hDecoder->fr_ch_ele; | 1132 | 0 | int ch = sce->channel; | 1133 | 0 | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1134 | 0 | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1135 | |
| 1136 | 0 | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1137 | 0 | } | 1138 | 192k | #endif | 1139 | | | 1140 | 192k | return 0; | 1141 | 192k | } |
reconstruct_single_channel Line | Count | Source | 919 | 203k | { | 920 | 203k | uint8_t retval; | 921 | 203k | uint8_t output_channels; | 922 | 203k | ALIGN real_t spec_coef[1024]; | 923 | | | 924 | | #ifdef PROFILE | 925 | | int64_t count = faad_get_ts(); | 926 | | #endif | 927 | | | 928 | | | 929 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 930 | | #if ( (defined(DRM) && defined(DRM_PS)) ) | 931 | | output_channels = 2; | 932 | | #elif defined(PS_DEC) | 933 | 203k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 934 | 5.56k | output_channels = 2; | 935 | 197k | else | 936 | 197k | output_channels = 1; | 937 | | #else | 938 | | output_channels = 1; | 939 | | #endif | 940 | | | 941 | 203k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 942 | 182k | { | 943 | | /* element_output_channels not set yet */ | 944 | 182k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 945 | 182k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 946 | | /* element inconsistency */ | 947 | | | 948 | | /* this only happens if PS is actually found but not in the first frame | 949 | | * this means that there is only 1 bitstream element! | 950 | | */ | 951 | | | 952 | | /* The simplest way to fix the accounting, | 953 | | * is to reallocate this and all the following channels. | 954 | | */ | 955 | 659 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 956 | 659 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 957 | | | 958 | 659 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 959 | | | 960 | | //return 21; | 961 | 659 | } | 962 | | | 963 | 203k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 964 | 186k | { | 965 | 186k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 966 | 186k | if (retval > 0) | 967 | 0 | return retval; | 968 | | | 969 | 186k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 970 | 186k | } | 971 | | | 972 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 973 | 203k | if(!hDecoder->time_out[sce->channel]) | 974 | 0 | return 15; | 975 | 203k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 976 | 0 | return 15; | 977 | 203k | if(!hDecoder->fb_intermed[sce->channel]) | 978 | 0 | return 15; | 979 | | | 980 | | /* dequantisation and scaling */ | 981 | 203k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 982 | 203k | if (retval > 0) | 983 | 43 | return retval; | 984 | | | 985 | | #ifdef PROFILE | 986 | | count = faad_get_ts() - count; | 987 | | hDecoder->requant_cycles += count; | 988 | | #endif | 989 | | | 990 | | | 991 | | /* pns decoding */ | 992 | 203k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 993 | 203k | &(hDecoder->__r1), &(hDecoder->__r2)); | 994 | | | 995 | | #ifdef MAIN_DEC | 996 | | /* MAIN object type prediction */ | 997 | | if (hDecoder->object_type == MAIN) | 998 | | { | 999 | | if (!hDecoder->pred_stat[sce->channel]) | 1000 | | return 33; | 1001 | | | 1002 | | /* intra channel prediction */ | 1003 | | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 1004 | | hDecoder->sf_index); | 1005 | | | 1006 | | /* In addition, for scalefactor bands coded by perceptual | 1007 | | noise substitution the predictors belonging to the | 1008 | | corresponding spectral coefficients are reset. | 1009 | | */ | 1010 | | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 1011 | | } | 1012 | | #endif | 1013 | | | 1014 | 203k | #ifdef LTP_DEC | 1015 | 203k | if (is_ltp_ot(hDecoder->object_type)) | 1016 | 125k | { | 1017 | 125k | #ifdef LD_DEC | 1018 | 125k | if (hDecoder->object_type == LD) | 1019 | 494 | { | 1020 | 494 | if (ics->ltp.data_present) | 1021 | 57 | { | 1022 | 57 | if (ics->ltp.lag_update) | 1023 | 21 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1024 | 57 | } | 1025 | 494 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1026 | 494 | } | 1027 | 125k | #endif | 1028 | | | 1029 | | /* long term prediction */ | 1030 | 125k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1031 | 125k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1032 | 125k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1033 | 125k | } | 1034 | 203k | #endif | 1035 | | | 1036 | | /* tns decoding */ | 1037 | 203k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1038 | 203k | spec_coef, hDecoder->frameLength); | 1039 | | | 1040 | | /* drc decoding */ | 1041 | 203k | #ifdef APPLY_DRC | 1042 | 203k | if (hDecoder->drc->present) | 1043 | 13.4k | { | 1044 | 13.4k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1045 | 11.7k | drc_decode(hDecoder->drc, spec_coef); | 1046 | 13.4k | } | 1047 | 203k | #endif | 1048 | | /* filter bank */ | 1049 | | #ifdef SSR_DEC | 1050 | | if (hDecoder->object_type != SSR) | 1051 | | { | 1052 | | #endif | 1053 | 203k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1054 | 203k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1055 | 203k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1056 | 203k | hDecoder->object_type, hDecoder->frameLength); | 1057 | | #ifdef SSR_DEC | 1058 | | } else { | 1059 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1060 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1061 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1062 | | hDecoder->frameLength); | 1063 | | } | 1064 | | #endif | 1065 | | | 1066 | | /* save window shape for next frame */ | 1067 | 203k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1068 | | | 1069 | 203k | #ifdef LTP_DEC | 1070 | 203k | if (is_ltp_ot(hDecoder->object_type)) | 1071 | 125k | { | 1072 | 125k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1073 | 125k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1074 | 125k | } | 1075 | 203k | #endif | 1076 | | | 1077 | 203k | #ifdef SBR_DEC | 1078 | 203k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1079 | 155k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1080 | 155k | { | 1081 | 155k | int ele = hDecoder->fr_ch_ele; | 1082 | 155k | int ch = sce->channel; | 1083 | | | 1084 | | /* following case can happen when forceUpSampling == 1 */ | 1085 | 155k | if (hDecoder->sbr[ele] == NULL) | 1086 | 126k | { | 1087 | 126k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1088 | 126k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1089 | 126k | hDecoder->downSampledSBR | 1090 | | #ifdef DRM | 1091 | | , 0 | 1092 | | #endif | 1093 | 126k | ); | 1094 | 126k | } | 1095 | 155k | if (!hDecoder->sbr[ele]) | 1096 | 56 | return 19; | 1097 | | | 1098 | 155k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1099 | 13.3k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1100 | 142k | else | 1101 | 142k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1102 | | | 1103 | | /* check if any of the PS tools is used */ | 1104 | 155k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1105 | 155k | if (hDecoder->ps_used[ele] == 0) | 1106 | 149k | { | 1107 | 149k | #endif | 1108 | 149k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1109 | 149k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1110 | 149k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1111 | 149k | } else { | 1112 | 5.56k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1113 | 5.56k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1114 | 5.56k | hDecoder->downSampledSBR); | 1115 | 5.56k | } | 1116 | 155k | #endif | 1117 | 155k | if (retval > 0) | 1118 | 29 | return retval; | 1119 | 155k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1120 | 5 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1121 | 5 | { | 1122 | 5 | return 23; | 1123 | 5 | } | 1124 | 203k | #endif | 1125 | | | 1126 | | /* copy L to R when no PS is used */ | 1127 | 203k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1128 | 203k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1129 | 197k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1130 | 0 | { | 1131 | 0 | int ele = hDecoder->fr_ch_ele; | 1132 | 0 | int ch = sce->channel; | 1133 | 0 | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1134 | 0 | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1135 | |
| 1136 | 0 | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1137 | 0 | } | 1138 | 203k | #endif | 1139 | | | 1140 | 203k | return 0; | 1141 | 203k | } |
|
1142 | | |
1143 | | uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, |
1144 | | element *cpe, int16_t *spec_data1, int16_t *spec_data2) |
1145 | 71.3k | { |
1146 | 71.3k | uint8_t retval; |
1147 | 71.3k | ALIGN real_t spec_coef1[1024]; |
1148 | 71.3k | ALIGN real_t spec_coef2[1024]; |
1149 | | |
1150 | | #ifdef PROFILE |
1151 | | int64_t count = faad_get_ts(); |
1152 | | #endif |
1153 | 71.3k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) |
1154 | 59.7k | { |
1155 | 59.7k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); |
1156 | 59.7k | if (retval > 0) |
1157 | 0 | return retval; |
1158 | | |
1159 | 59.7k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; |
1160 | 59.7k | } |
1161 | | |
1162 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ |
1163 | 71.3k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) |
1164 | 0 | return 15; |
1165 | 71.3k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) |
1166 | 0 | return 15; |
1167 | | |
1168 | | /* dequantisation and scaling */ |
1169 | 71.3k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); |
1170 | 71.3k | if (retval > 0) |
1171 | 134 | return retval; |
1172 | 71.2k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); |
1173 | 71.2k | if (retval > 0) |
1174 | 11 | return retval; |
1175 | | |
1176 | | #ifdef PROFILE |
1177 | | count = faad_get_ts() - count; |
1178 | | hDecoder->requant_cycles += count; |
1179 | | #endif |
1180 | | |
1181 | | /* pns decoding */ |
1182 | 71.2k | if (ics1->ms_mask_present) |
1183 | 19.2k | { |
1184 | 19.2k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, |
1185 | 19.2k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1186 | 51.9k | } else { |
1187 | 51.9k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, |
1188 | 51.9k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1189 | 51.9k | } |
1190 | | |
1191 | | /* mid/side decoding */ |
1192 | 71.2k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); |
1193 | | |
1194 | | #if 0 |
1195 | | { |
1196 | | int i; |
1197 | | for (i = 0; i < 1024; i++) |
1198 | | { |
1199 | | //printf("%d\n", spec_coef1[i]); |
1200 | | printf("0x%.8X\n", spec_coef1[i]); |
1201 | | } |
1202 | | for (i = 0; i < 1024; i++) |
1203 | | { |
1204 | | //printf("%d\n", spec_coef2[i]); |
1205 | | printf("0x%.8X\n", spec_coef2[i]); |
1206 | | } |
1207 | | } |
1208 | | #endif |
1209 | | |
1210 | | /* intensity stereo decoding */ |
1211 | 71.2k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); |
1212 | | |
1213 | | #if 0 |
1214 | | { |
1215 | | int i; |
1216 | | for (i = 0; i < 1024; i++) |
1217 | | { |
1218 | | printf("%d\n", spec_coef1[i]); |
1219 | | //printf("0x%.8X\n", spec_coef1[i]); |
1220 | | } |
1221 | | for (i = 0; i < 1024; i++) |
1222 | | { |
1223 | | printf("%d\n", spec_coef2[i]); |
1224 | | //printf("0x%.8X\n", spec_coef2[i]); |
1225 | | } |
1226 | | } |
1227 | | #endif |
1228 | | |
1229 | | #ifdef MAIN_DEC |
1230 | | /* MAIN object type prediction */ |
1231 | 23.2k | if (hDecoder->object_type == MAIN) |
1232 | 11.4k | { |
1233 | | /* intra channel prediction */ |
1234 | 11.4k | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, |
1235 | 11.4k | hDecoder->sf_index); |
1236 | 11.4k | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, |
1237 | 11.4k | hDecoder->sf_index); |
1238 | | |
1239 | | /* In addition, for scalefactor bands coded by perceptual |
1240 | | noise substitution the predictors belonging to the |
1241 | | corresponding spectral coefficients are reset. |
1242 | | */ |
1243 | 11.4k | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); |
1244 | 11.4k | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); |
1245 | 11.4k | } |
1246 | | #endif |
1247 | | |
1248 | | #ifdef LTP_DEC |
1249 | 43.0k | if (is_ltp_ot(hDecoder->object_type)) |
1250 | 17.7k | { |
1251 | 17.7k | ltp_info *ltp1 = &(ics1->ltp); |
1252 | 17.7k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); |
1253 | 17.7k | #ifdef LD_DEC |
1254 | 17.7k | if (hDecoder->object_type == LD) |
1255 | 1.80k | { |
1256 | 1.80k | if (ltp1->data_present) |
1257 | 260 | { |
1258 | 260 | if (ltp1->lag_update) |
1259 | 107 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; |
1260 | 260 | } |
1261 | 1.80k | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; |
1262 | 1.80k | if (ltp2->data_present) |
1263 | 129 | { |
1264 | 129 | if (ltp2->lag_update) |
1265 | 62 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; |
1266 | 129 | } |
1267 | 1.80k | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; |
1268 | 1.80k | } |
1269 | 17.7k | #endif |
1270 | | |
1271 | | /* long term prediction */ |
1272 | 17.7k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, |
1273 | 17.7k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], |
1274 | 17.7k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1275 | 17.7k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, |
1276 | 17.7k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], |
1277 | 17.7k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1278 | 17.7k | } |
1279 | | #endif |
1280 | | |
1281 | | /* tns decoding */ |
1282 | 71.2k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, |
1283 | 71.2k | spec_coef1, hDecoder->frameLength); |
1284 | 71.2k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, |
1285 | 71.2k | spec_coef2, hDecoder->frameLength); |
1286 | | |
1287 | | /* drc decoding */ |
1288 | 71.2k | #if APPLY_DRC |
1289 | 71.2k | if (hDecoder->drc->present) |
1290 | 1.50k | { |
1291 | 1.50k | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) |
1292 | 1.28k | drc_decode(hDecoder->drc, spec_coef1); |
1293 | 1.50k | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) |
1294 | 1.30k | drc_decode(hDecoder->drc, spec_coef2); |
1295 | 1.50k | } |
1296 | 71.2k | #endif |
1297 | | /* filter bank */ |
1298 | | #ifdef SSR_DEC |
1299 | | if (hDecoder->object_type != SSR) |
1300 | | { |
1301 | | #endif |
1302 | 71.2k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, |
1303 | 71.2k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, |
1304 | 71.2k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], |
1305 | 71.2k | hDecoder->object_type, hDecoder->frameLength); |
1306 | 71.2k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, |
1307 | 71.2k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, |
1308 | 71.2k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], |
1309 | 71.2k | hDecoder->object_type, hDecoder->frameLength); |
1310 | | #ifdef SSR_DEC |
1311 | | } else { |
1312 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, |
1313 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], |
1314 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], |
1315 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); |
1316 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, |
1317 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], |
1318 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], |
1319 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); |
1320 | | } |
1321 | | #endif |
1322 | | |
1323 | | /* save window shape for next frame */ |
1324 | 71.2k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; |
1325 | 71.2k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; |
1326 | | |
1327 | | #ifdef LTP_DEC |
1328 | 43.0k | if (is_ltp_ot(hDecoder->object_type)) |
1329 | 17.7k | { |
1330 | 17.7k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], |
1331 | 17.7k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); |
1332 | 17.7k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], |
1333 | 17.7k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); |
1334 | 17.7k | } |
1335 | | #endif |
1336 | | |
1337 | 71.2k | #ifdef SBR_DEC |
1338 | 71.2k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1339 | 59.9k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1340 | 59.9k | { |
1341 | 59.9k | int ele = hDecoder->fr_ch_ele; |
1342 | 59.9k | int ch0 = cpe->channel; |
1343 | 59.9k | int ch1 = cpe->paired_channel; |
1344 | | |
1345 | | /* following case can happen when forceUpSampling == 1 */ |
1346 | 59.9k | if (hDecoder->sbr[ele] == NULL) |
1347 | 18.5k | { |
1348 | 18.5k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, |
1349 | 18.5k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
1350 | 18.5k | hDecoder->downSampledSBR |
1351 | | #ifdef DRM |
1352 | | , 0 |
1353 | | #endif |
1354 | 18.5k | ); |
1355 | 18.5k | } |
1356 | 59.9k | if (!hDecoder->sbr[ele]) |
1357 | 90 | return 19; |
1358 | | |
1359 | 59.8k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
1360 | 3.24k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); |
1361 | 56.6k | else |
1362 | 56.6k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); |
1363 | | |
1364 | 59.8k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], |
1365 | 59.8k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], |
1366 | 59.8k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
1367 | 59.8k | if (retval > 0) |
1368 | 5 | return retval; |
1369 | 59.8k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1370 | 3 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1371 | 3 | { |
1372 | 3 | return 23; |
1373 | 3 | } |
1374 | 71.1k | #endif |
1375 | | |
1376 | 71.1k | return 0; |
1377 | 71.2k | } Line | Count | Source | 1145 | 28.2k | { | 1146 | 28.2k | uint8_t retval; | 1147 | 28.2k | ALIGN real_t spec_coef1[1024]; | 1148 | 28.2k | ALIGN real_t spec_coef2[1024]; | 1149 | | | 1150 | | #ifdef PROFILE | 1151 | | int64_t count = faad_get_ts(); | 1152 | | #endif | 1153 | 28.2k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1154 | 23.7k | { | 1155 | 23.7k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1156 | 23.7k | if (retval > 0) | 1157 | 0 | return retval; | 1158 | | | 1159 | 23.7k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1160 | 23.7k | } | 1161 | | | 1162 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1163 | 28.2k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1164 | 0 | return 15; | 1165 | 28.2k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1166 | 0 | return 15; | 1167 | | | 1168 | | /* dequantisation and scaling */ | 1169 | 28.2k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1170 | 28.2k | if (retval > 0) | 1171 | 63 | return retval; | 1172 | 28.2k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1173 | 28.2k | if (retval > 0) | 1174 | 5 | return retval; | 1175 | | | 1176 | | #ifdef PROFILE | 1177 | | count = faad_get_ts() - count; | 1178 | | hDecoder->requant_cycles += count; | 1179 | | #endif | 1180 | | | 1181 | | /* pns decoding */ | 1182 | 28.2k | if (ics1->ms_mask_present) | 1183 | 7.48k | { | 1184 | 7.48k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1185 | 7.48k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1186 | 20.7k | } else { | 1187 | 20.7k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1188 | 20.7k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1189 | 20.7k | } | 1190 | | | 1191 | | /* mid/side decoding */ | 1192 | 28.2k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1193 | | | 1194 | | #if 0 | 1195 | | { | 1196 | | int i; | 1197 | | for (i = 0; i < 1024; i++) | 1198 | | { | 1199 | | //printf("%d\n", spec_coef1[i]); | 1200 | | printf("0x%.8X\n", spec_coef1[i]); | 1201 | | } | 1202 | | for (i = 0; i < 1024; i++) | 1203 | | { | 1204 | | //printf("%d\n", spec_coef2[i]); | 1205 | | printf("0x%.8X\n", spec_coef2[i]); | 1206 | | } | 1207 | | } | 1208 | | #endif | 1209 | | | 1210 | | /* intensity stereo decoding */ | 1211 | 28.2k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1212 | | | 1213 | | #if 0 | 1214 | | { | 1215 | | int i; | 1216 | | for (i = 0; i < 1024; i++) | 1217 | | { | 1218 | | printf("%d\n", spec_coef1[i]); | 1219 | | //printf("0x%.8X\n", spec_coef1[i]); | 1220 | | } | 1221 | | for (i = 0; i < 1024; i++) | 1222 | | { | 1223 | | printf("%d\n", spec_coef2[i]); | 1224 | | //printf("0x%.8X\n", spec_coef2[i]); | 1225 | | } | 1226 | | } | 1227 | | #endif | 1228 | | | 1229 | | #ifdef MAIN_DEC | 1230 | | /* MAIN object type prediction */ | 1231 | | if (hDecoder->object_type == MAIN) | 1232 | | { | 1233 | | /* intra channel prediction */ | 1234 | | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1235 | | hDecoder->sf_index); | 1236 | | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1237 | | hDecoder->sf_index); | 1238 | | | 1239 | | /* In addition, for scalefactor bands coded by perceptual | 1240 | | noise substitution the predictors belonging to the | 1241 | | corresponding spectral coefficients are reset. | 1242 | | */ | 1243 | | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1244 | | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1245 | | } | 1246 | | #endif | 1247 | | | 1248 | | #ifdef LTP_DEC | 1249 | | if (is_ltp_ot(hDecoder->object_type)) | 1250 | | { | 1251 | | ltp_info *ltp1 = &(ics1->ltp); | 1252 | | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1253 | | #ifdef LD_DEC | 1254 | | if (hDecoder->object_type == LD) | 1255 | | { | 1256 | | if (ltp1->data_present) | 1257 | | { | 1258 | | if (ltp1->lag_update) | 1259 | | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1260 | | } | 1261 | | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1262 | | if (ltp2->data_present) | 1263 | | { | 1264 | | if (ltp2->lag_update) | 1265 | | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1266 | | } | 1267 | | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1268 | | } | 1269 | | #endif | 1270 | | | 1271 | | /* long term prediction */ | 1272 | | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1273 | | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1274 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1275 | | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1276 | | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1277 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1278 | | } | 1279 | | #endif | 1280 | | | 1281 | | /* tns decoding */ | 1282 | 28.2k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1283 | 28.2k | spec_coef1, hDecoder->frameLength); | 1284 | 28.2k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1285 | 28.2k | spec_coef2, hDecoder->frameLength); | 1286 | | | 1287 | | /* drc decoding */ | 1288 | 28.2k | #if APPLY_DRC | 1289 | 28.2k | if (hDecoder->drc->present) | 1290 | 0 | { | 1291 | 0 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1292 | 0 | drc_decode(hDecoder->drc, spec_coef1); | 1293 | 0 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1294 | 0 | drc_decode(hDecoder->drc, spec_coef2); | 1295 | 0 | } | 1296 | 28.2k | #endif | 1297 | | /* filter bank */ | 1298 | | #ifdef SSR_DEC | 1299 | | if (hDecoder->object_type != SSR) | 1300 | | { | 1301 | | #endif | 1302 | 28.2k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1303 | 28.2k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1304 | 28.2k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1305 | 28.2k | hDecoder->object_type, hDecoder->frameLength); | 1306 | 28.2k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1307 | 28.2k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1308 | 28.2k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1309 | 28.2k | hDecoder->object_type, hDecoder->frameLength); | 1310 | | #ifdef SSR_DEC | 1311 | | } else { | 1312 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1313 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1314 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1315 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1316 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1317 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1318 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1319 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1320 | | } | 1321 | | #endif | 1322 | | | 1323 | | /* save window shape for next frame */ | 1324 | 28.2k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1325 | 28.2k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1326 | | | 1327 | | #ifdef LTP_DEC | 1328 | | if (is_ltp_ot(hDecoder->object_type)) | 1329 | | { | 1330 | | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1331 | | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1332 | | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1333 | | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1334 | | } | 1335 | | #endif | 1336 | | | 1337 | 28.2k | #ifdef SBR_DEC | 1338 | 28.2k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1339 | 25.3k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1340 | 25.3k | { | 1341 | 25.3k | int ele = hDecoder->fr_ch_ele; | 1342 | 25.3k | int ch0 = cpe->channel; | 1343 | 25.3k | int ch1 = cpe->paired_channel; | 1344 | | | 1345 | | /* following case can happen when forceUpSampling == 1 */ | 1346 | 25.3k | if (hDecoder->sbr[ele] == NULL) | 1347 | 6.36k | { | 1348 | 6.36k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1349 | 6.36k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1350 | 6.36k | hDecoder->downSampledSBR | 1351 | 6.36k | #ifdef DRM | 1352 | 6.36k | , 0 | 1353 | 6.36k | #endif | 1354 | 6.36k | ); | 1355 | 6.36k | } | 1356 | 25.3k | if (!hDecoder->sbr[ele]) | 1357 | 0 | return 19; | 1358 | | | 1359 | 25.3k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1360 | 1.26k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1361 | 24.1k | else | 1362 | 24.1k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1363 | | | 1364 | 25.3k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1365 | 25.3k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1366 | 25.3k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1367 | 25.3k | if (retval > 0) | 1368 | 5 | return retval; | 1369 | 25.3k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1370 | 1 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1371 | 1 | { | 1372 | 1 | return 23; | 1373 | 1 | } | 1374 | 28.2k | #endif | 1375 | | | 1376 | 28.2k | return 0; | 1377 | 28.2k | } |
Line | Count | Source | 1145 | 23.3k | { | 1146 | 23.3k | uint8_t retval; | 1147 | 23.3k | ALIGN real_t spec_coef1[1024]; | 1148 | 23.3k | ALIGN real_t spec_coef2[1024]; | 1149 | | | 1150 | | #ifdef PROFILE | 1151 | | int64_t count = faad_get_ts(); | 1152 | | #endif | 1153 | 23.3k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1154 | 19.5k | { | 1155 | 19.5k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1156 | 19.5k | if (retval > 0) | 1157 | 0 | return retval; | 1158 | | | 1159 | 19.5k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1160 | 19.5k | } | 1161 | | | 1162 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1163 | 23.3k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1164 | 0 | return 15; | 1165 | 23.3k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1166 | 0 | return 15; | 1167 | | | 1168 | | /* dequantisation and scaling */ | 1169 | 23.3k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1170 | 23.3k | if (retval > 0) | 1171 | 54 | return retval; | 1172 | 23.3k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1173 | 23.3k | if (retval > 0) | 1174 | 3 | return retval; | 1175 | | | 1176 | | #ifdef PROFILE | 1177 | | count = faad_get_ts() - count; | 1178 | | hDecoder->requant_cycles += count; | 1179 | | #endif | 1180 | | | 1181 | | /* pns decoding */ | 1182 | 23.2k | if (ics1->ms_mask_present) | 1183 | 6.88k | { | 1184 | 6.88k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1185 | 6.88k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1186 | 16.4k | } else { | 1187 | 16.4k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1188 | 16.4k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1189 | 16.4k | } | 1190 | | | 1191 | | /* mid/side decoding */ | 1192 | 23.2k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1193 | | | 1194 | | #if 0 | 1195 | | { | 1196 | | int i; | 1197 | | for (i = 0; i < 1024; i++) | 1198 | | { | 1199 | | //printf("%d\n", spec_coef1[i]); | 1200 | | printf("0x%.8X\n", spec_coef1[i]); | 1201 | | } | 1202 | | for (i = 0; i < 1024; i++) | 1203 | | { | 1204 | | //printf("%d\n", spec_coef2[i]); | 1205 | | printf("0x%.8X\n", spec_coef2[i]); | 1206 | | } | 1207 | | } | 1208 | | #endif | 1209 | | | 1210 | | /* intensity stereo decoding */ | 1211 | 23.2k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1212 | | | 1213 | | #if 0 | 1214 | | { | 1215 | | int i; | 1216 | | for (i = 0; i < 1024; i++) | 1217 | | { | 1218 | | printf("%d\n", spec_coef1[i]); | 1219 | | //printf("0x%.8X\n", spec_coef1[i]); | 1220 | | } | 1221 | | for (i = 0; i < 1024; i++) | 1222 | | { | 1223 | | printf("%d\n", spec_coef2[i]); | 1224 | | //printf("0x%.8X\n", spec_coef2[i]); | 1225 | | } | 1226 | | } | 1227 | | #endif | 1228 | | | 1229 | 23.2k | #ifdef MAIN_DEC | 1230 | | /* MAIN object type prediction */ | 1231 | 23.2k | if (hDecoder->object_type == MAIN) | 1232 | 11.4k | { | 1233 | | /* intra channel prediction */ | 1234 | 11.4k | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1235 | 11.4k | hDecoder->sf_index); | 1236 | 11.4k | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1237 | 11.4k | hDecoder->sf_index); | 1238 | | | 1239 | | /* In addition, for scalefactor bands coded by perceptual | 1240 | | noise substitution the predictors belonging to the | 1241 | | corresponding spectral coefficients are reset. | 1242 | | */ | 1243 | 11.4k | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1244 | 11.4k | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1245 | 11.4k | } | 1246 | 23.2k | #endif | 1247 | | | 1248 | 23.2k | #ifdef LTP_DEC | 1249 | 23.2k | if (is_ltp_ot(hDecoder->object_type)) | 1250 | 9.29k | { | 1251 | 9.29k | ltp_info *ltp1 = &(ics1->ltp); | 1252 | 9.29k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1253 | 9.29k | #ifdef LD_DEC | 1254 | 9.29k | if (hDecoder->object_type == LD) | 1255 | 968 | { | 1256 | 968 | if (ltp1->data_present) | 1257 | 164 | { | 1258 | 164 | if (ltp1->lag_update) | 1259 | 74 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1260 | 164 | } | 1261 | 968 | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1262 | 968 | if (ltp2->data_present) | 1263 | 70 | { | 1264 | 70 | if (ltp2->lag_update) | 1265 | 27 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1266 | 70 | } | 1267 | 968 | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1268 | 968 | } | 1269 | 9.29k | #endif | 1270 | | | 1271 | | /* long term prediction */ | 1272 | 9.29k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1273 | 9.29k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1274 | 9.29k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1275 | 9.29k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1276 | 9.29k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1277 | 9.29k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1278 | 9.29k | } | 1279 | 23.2k | #endif | 1280 | | | 1281 | | /* tns decoding */ | 1282 | 23.2k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1283 | 23.2k | spec_coef1, hDecoder->frameLength); | 1284 | 23.2k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1285 | 23.2k | spec_coef2, hDecoder->frameLength); | 1286 | | | 1287 | | /* drc decoding */ | 1288 | 23.2k | #if APPLY_DRC | 1289 | 23.2k | if (hDecoder->drc->present) | 1290 | 725 | { | 1291 | 725 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1292 | 598 | drc_decode(hDecoder->drc, spec_coef1); | 1293 | 725 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1294 | 609 | drc_decode(hDecoder->drc, spec_coef2); | 1295 | 725 | } | 1296 | 23.2k | #endif | 1297 | | /* filter bank */ | 1298 | | #ifdef SSR_DEC | 1299 | | if (hDecoder->object_type != SSR) | 1300 | | { | 1301 | | #endif | 1302 | 23.2k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1303 | 23.2k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1304 | 23.2k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1305 | 23.2k | hDecoder->object_type, hDecoder->frameLength); | 1306 | 23.2k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1307 | 23.2k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1308 | 23.2k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1309 | 23.2k | hDecoder->object_type, hDecoder->frameLength); | 1310 | | #ifdef SSR_DEC | 1311 | | } else { | 1312 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1313 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1314 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1315 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1316 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1317 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1318 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1319 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1320 | | } | 1321 | | #endif | 1322 | | | 1323 | | /* save window shape for next frame */ | 1324 | 23.2k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1325 | 23.2k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1326 | | | 1327 | 23.2k | #ifdef LTP_DEC | 1328 | 23.2k | if (is_ltp_ot(hDecoder->object_type)) | 1329 | 9.29k | { | 1330 | 9.29k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1331 | 9.29k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1332 | 9.29k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1333 | 9.29k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1334 | 9.29k | } | 1335 | 23.2k | #endif | 1336 | | | 1337 | 23.2k | #ifdef SBR_DEC | 1338 | 23.2k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1339 | 17.6k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1340 | 17.6k | { | 1341 | 17.6k | int ele = hDecoder->fr_ch_ele; | 1342 | 17.6k | int ch0 = cpe->channel; | 1343 | 17.6k | int ch1 = cpe->paired_channel; | 1344 | | | 1345 | | /* following case can happen when forceUpSampling == 1 */ | 1346 | 17.6k | if (hDecoder->sbr[ele] == NULL) | 1347 | 6.19k | { | 1348 | 6.19k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1349 | 6.19k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1350 | 6.19k | hDecoder->downSampledSBR | 1351 | | #ifdef DRM | 1352 | | , 0 | 1353 | | #endif | 1354 | 6.19k | ); | 1355 | 6.19k | } | 1356 | 17.6k | if (!hDecoder->sbr[ele]) | 1357 | 50 | return 19; | 1358 | | | 1359 | 17.6k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1360 | 1.23k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1361 | 16.3k | else | 1362 | 16.3k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1363 | | | 1364 | 17.6k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1365 | 17.6k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1366 | 17.6k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1367 | 17.6k | if (retval > 0) | 1368 | 0 | return retval; | 1369 | 17.6k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1370 | 1 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1371 | 1 | { | 1372 | 1 | return 23; | 1373 | 1 | } | 1374 | 23.2k | #endif | 1375 | | | 1376 | 23.2k | return 0; | 1377 | 23.2k | } |
Line | Count | Source | 1145 | 19.7k | { | 1146 | 19.7k | uint8_t retval; | 1147 | 19.7k | ALIGN real_t spec_coef1[1024]; | 1148 | 19.7k | ALIGN real_t spec_coef2[1024]; | 1149 | | | 1150 | | #ifdef PROFILE | 1151 | | int64_t count = faad_get_ts(); | 1152 | | #endif | 1153 | 19.7k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1154 | 16.4k | { | 1155 | 16.4k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1156 | 16.4k | if (retval > 0) | 1157 | 0 | return retval; | 1158 | | | 1159 | 16.4k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1160 | 16.4k | } | 1161 | | | 1162 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1163 | 19.7k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1164 | 0 | return 15; | 1165 | 19.7k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1166 | 0 | return 15; | 1167 | | | 1168 | | /* dequantisation and scaling */ | 1169 | 19.7k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1170 | 19.7k | if (retval > 0) | 1171 | 17 | return retval; | 1172 | 19.7k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1173 | 19.7k | if (retval > 0) | 1174 | 3 | return retval; | 1175 | | | 1176 | | #ifdef PROFILE | 1177 | | count = faad_get_ts() - count; | 1178 | | hDecoder->requant_cycles += count; | 1179 | | #endif | 1180 | | | 1181 | | /* pns decoding */ | 1182 | 19.7k | if (ics1->ms_mask_present) | 1183 | 4.88k | { | 1184 | 4.88k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1185 | 4.88k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1186 | 14.8k | } else { | 1187 | 14.8k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1188 | 14.8k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1189 | 14.8k | } | 1190 | | | 1191 | | /* mid/side decoding */ | 1192 | 19.7k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1193 | | | 1194 | | #if 0 | 1195 | | { | 1196 | | int i; | 1197 | | for (i = 0; i < 1024; i++) | 1198 | | { | 1199 | | //printf("%d\n", spec_coef1[i]); | 1200 | | printf("0x%.8X\n", spec_coef1[i]); | 1201 | | } | 1202 | | for (i = 0; i < 1024; i++) | 1203 | | { | 1204 | | //printf("%d\n", spec_coef2[i]); | 1205 | | printf("0x%.8X\n", spec_coef2[i]); | 1206 | | } | 1207 | | } | 1208 | | #endif | 1209 | | | 1210 | | /* intensity stereo decoding */ | 1211 | 19.7k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1212 | | | 1213 | | #if 0 | 1214 | | { | 1215 | | int i; | 1216 | | for (i = 0; i < 1024; i++) | 1217 | | { | 1218 | | printf("%d\n", spec_coef1[i]); | 1219 | | //printf("0x%.8X\n", spec_coef1[i]); | 1220 | | } | 1221 | | for (i = 0; i < 1024; i++) | 1222 | | { | 1223 | | printf("%d\n", spec_coef2[i]); | 1224 | | //printf("0x%.8X\n", spec_coef2[i]); | 1225 | | } | 1226 | | } | 1227 | | #endif | 1228 | | | 1229 | | #ifdef MAIN_DEC | 1230 | | /* MAIN object type prediction */ | 1231 | | if (hDecoder->object_type == MAIN) | 1232 | | { | 1233 | | /* intra channel prediction */ | 1234 | | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1235 | | hDecoder->sf_index); | 1236 | | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1237 | | hDecoder->sf_index); | 1238 | | | 1239 | | /* In addition, for scalefactor bands coded by perceptual | 1240 | | noise substitution the predictors belonging to the | 1241 | | corresponding spectral coefficients are reset. | 1242 | | */ | 1243 | | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1244 | | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1245 | | } | 1246 | | #endif | 1247 | | | 1248 | 19.7k | #ifdef LTP_DEC | 1249 | 19.7k | if (is_ltp_ot(hDecoder->object_type)) | 1250 | 8.43k | { | 1251 | 8.43k | ltp_info *ltp1 = &(ics1->ltp); | 1252 | 8.43k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1253 | 8.43k | #ifdef LD_DEC | 1254 | 8.43k | if (hDecoder->object_type == LD) | 1255 | 836 | { | 1256 | 836 | if (ltp1->data_present) | 1257 | 96 | { | 1258 | 96 | if (ltp1->lag_update) | 1259 | 33 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1260 | 96 | } | 1261 | 836 | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1262 | 836 | if (ltp2->data_present) | 1263 | 59 | { | 1264 | 59 | if (ltp2->lag_update) | 1265 | 35 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1266 | 59 | } | 1267 | 836 | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1268 | 836 | } | 1269 | 8.43k | #endif | 1270 | | | 1271 | | /* long term prediction */ | 1272 | 8.43k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1273 | 8.43k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1274 | 8.43k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1275 | 8.43k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1276 | 8.43k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1277 | 8.43k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1278 | 8.43k | } | 1279 | 19.7k | #endif | 1280 | | | 1281 | | /* tns decoding */ | 1282 | 19.7k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1283 | 19.7k | spec_coef1, hDecoder->frameLength); | 1284 | 19.7k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1285 | 19.7k | spec_coef2, hDecoder->frameLength); | 1286 | | | 1287 | | /* drc decoding */ | 1288 | 19.7k | #if APPLY_DRC | 1289 | 19.7k | if (hDecoder->drc->present) | 1290 | 783 | { | 1291 | 783 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1292 | 682 | drc_decode(hDecoder->drc, spec_coef1); | 1293 | 783 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1294 | 694 | drc_decode(hDecoder->drc, spec_coef2); | 1295 | 783 | } | 1296 | 19.7k | #endif | 1297 | | /* filter bank */ | 1298 | | #ifdef SSR_DEC | 1299 | | if (hDecoder->object_type != SSR) | 1300 | | { | 1301 | | #endif | 1302 | 19.7k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1303 | 19.7k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1304 | 19.7k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1305 | 19.7k | hDecoder->object_type, hDecoder->frameLength); | 1306 | 19.7k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1307 | 19.7k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1308 | 19.7k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1309 | 19.7k | hDecoder->object_type, hDecoder->frameLength); | 1310 | | #ifdef SSR_DEC | 1311 | | } else { | 1312 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1313 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1314 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1315 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1316 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1317 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1318 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1319 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1320 | | } | 1321 | | #endif | 1322 | | | 1323 | | /* save window shape for next frame */ | 1324 | 19.7k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1325 | 19.7k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1326 | | | 1327 | 19.7k | #ifdef LTP_DEC | 1328 | 19.7k | if (is_ltp_ot(hDecoder->object_type)) | 1329 | 8.43k | { | 1330 | 8.43k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1331 | 8.43k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1332 | 8.43k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1333 | 8.43k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1334 | 8.43k | } | 1335 | 19.7k | #endif | 1336 | | | 1337 | 19.7k | #ifdef SBR_DEC | 1338 | 19.7k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1339 | 16.9k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1340 | 16.9k | { | 1341 | 16.9k | int ele = hDecoder->fr_ch_ele; | 1342 | 16.9k | int ch0 = cpe->channel; | 1343 | 16.9k | int ch1 = cpe->paired_channel; | 1344 | | | 1345 | | /* following case can happen when forceUpSampling == 1 */ | 1346 | 16.9k | if (hDecoder->sbr[ele] == NULL) | 1347 | 5.97k | { | 1348 | 5.97k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1349 | 5.97k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1350 | 5.97k | hDecoder->downSampledSBR | 1351 | | #ifdef DRM | 1352 | | , 0 | 1353 | | #endif | 1354 | 5.97k | ); | 1355 | 5.97k | } | 1356 | 16.9k | if (!hDecoder->sbr[ele]) | 1357 | 40 | return 19; | 1358 | | | 1359 | 16.8k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1360 | 738 | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1361 | 16.1k | else | 1362 | 16.1k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1363 | | | 1364 | 16.8k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1365 | 16.8k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1366 | 16.8k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1367 | 16.8k | if (retval > 0) | 1368 | 0 | return retval; | 1369 | 16.8k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1370 | 1 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1371 | 1 | { | 1372 | 1 | return 23; | 1373 | 1 | } | 1374 | 19.6k | #endif | 1375 | | | 1376 | 19.6k | return 0; | 1377 | 19.7k | } |
|