/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 | 579k | { |
304 | 579k | uint8_t i, g; |
305 | | |
306 | 579k | uint8_t sf_index = hDecoder->sf_index; |
307 | | |
308 | 579k | if (sf_index >= 12) |
309 | 9 | return 32; |
310 | | |
311 | 579k | switch (ics->window_sequence) { |
312 | 468k | case ONLY_LONG_SEQUENCE: |
313 | 502k | case LONG_START_SEQUENCE: |
314 | 514k | case LONG_STOP_SEQUENCE: |
315 | 514k | ics->num_windows = 1; |
316 | 514k | ics->num_window_groups = 1; |
317 | 514k | ics->window_group_length[ics->num_window_groups-1] = 1; |
318 | | #ifdef LD_DEC |
319 | 320k | if (hDecoder->object_type == LD) |
320 | 3.77k | { |
321 | 3.77k | if (hDecoder->frameLength == 512) |
322 | 1.68k | ics->num_swb = num_swb_512_window[sf_index]; |
323 | 2.09k | else /* if (hDecoder->frameLength == 480) */ |
324 | 2.09k | ics->num_swb = num_swb_480_window[sf_index]; |
325 | 316k | } else { |
326 | 316k | #endif |
327 | 510k | if (hDecoder->frameLength == 1024) |
328 | 413k | ics->num_swb = num_swb_1024_window[sf_index]; |
329 | 97.3k | else /* if (hDecoder->frameLength == 960) */ |
330 | 97.3k | ics->num_swb = num_swb_960_window[sf_index]; |
331 | | #ifdef LD_DEC |
332 | | } |
333 | | #endif |
334 | | |
335 | 514k | if (ics->max_sfb > ics->num_swb) |
336 | 290 | { |
337 | 290 | return 32; |
338 | 290 | } |
339 | | |
340 | | /* preparation of sect_sfb_offset for long blocks */ |
341 | | /* also copy the last value! */ |
342 | | #ifdef LD_DEC |
343 | 320k | if (hDecoder->object_type == LD) |
344 | 3.76k | { |
345 | 3.76k | if (hDecoder->frameLength == 512) |
346 | 1.68k | { |
347 | 43.1k | for (i = 0; i < ics->num_swb; i++) |
348 | 41.4k | { |
349 | 41.4k | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; |
350 | 41.4k | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; |
351 | 41.4k | } |
352 | 2.08k | } else /* if (hDecoder->frameLength == 480) */ { |
353 | 64.7k | for (i = 0; i < ics->num_swb; i++) |
354 | 62.6k | { |
355 | 62.6k | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; |
356 | 62.6k | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; |
357 | 62.6k | } |
358 | 2.08k | } |
359 | 3.76k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; |
360 | 3.76k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; |
361 | 3.76k | ics->swb_offset_max = hDecoder->frameLength; |
362 | 316k | } else { |
363 | 316k | #endif |
364 | 22.1M | for (i = 0; i < ics->num_swb; i++) |
365 | 21.6M | { |
366 | 21.6M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; |
367 | 21.6M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; |
368 | 21.6M | } |
369 | 193k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; |
370 | 193k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; |
371 | 193k | ics->swb_offset_max = hDecoder->frameLength; |
372 | | #ifdef LD_DEC |
373 | | } |
374 | | #endif |
375 | 513k | if (ics->num_swb > 0 && ics->swb_offset[ics->num_swb] < ics->swb_offset[ics->num_swb-1]) { |
376 | 0 | return 32; |
377 | 0 | } |
378 | 513k | return 0; |
379 | 64.7k | case EIGHT_SHORT_SEQUENCE: |
380 | 64.7k | ics->num_windows = 8; |
381 | 64.7k | ics->num_window_groups = 1; |
382 | 64.7k | ics->window_group_length[ics->num_window_groups-1] = 1; |
383 | 64.7k | ics->num_swb = num_swb_128_window[sf_index]; |
384 | | |
385 | 64.7k | if (ics->max_sfb > ics->num_swb) |
386 | 17 | { |
387 | 17 | return 32; |
388 | 17 | } |
389 | | |
390 | 955k | for (i = 0; i < ics->num_swb; i++) |
391 | 890k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; |
392 | 64.7k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; |
393 | 64.7k | ics->swb_offset_max = hDecoder->frameLength/8; |
394 | | |
395 | 518k | for (i = 0; i < ics->num_windows-1; i++) { |
396 | 453k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) |
397 | 366k | { |
398 | 366k | ics->num_window_groups += 1; |
399 | 366k | ics->window_group_length[ics->num_window_groups-1] = 1; |
400 | 366k | } else { |
401 | 87.2k | ics->window_group_length[ics->num_window_groups-1] += 1; |
402 | 87.2k | } |
403 | 453k | } |
404 | | |
405 | | /* preparation of sect_sfb_offset for short blocks */ |
406 | 495k | for (g = 0; g < ics->num_window_groups; g++) |
407 | 430k | { |
408 | 430k | uint16_t width; |
409 | 430k | uint8_t sect_sfb = 0; |
410 | 430k | uint16_t offset = 0; |
411 | | |
412 | 6.34M | for (i = 0; i < ics->num_swb; i++) |
413 | 5.91M | { |
414 | 5.91M | if (i+1 == ics->num_swb) |
415 | 430k | { |
416 | 430k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; |
417 | 5.47M | } else { |
418 | 5.47M | width = swb_offset_128_window[sf_index][i+1] - |
419 | 5.47M | swb_offset_128_window[sf_index][i]; |
420 | 5.47M | } |
421 | 5.91M | width *= ics->window_group_length[g]; |
422 | 5.91M | ics->sect_sfb_offset[g][sect_sfb++] = offset; |
423 | 5.91M | offset += width; |
424 | 5.91M | } |
425 | 430k | ics->sect_sfb_offset[g][sect_sfb] = offset; |
426 | 430k | } |
427 | 64.7k | return 0; |
428 | 0 | default: |
429 | 0 | return 32; |
430 | 579k | } |
431 | 579k | } Line | Count | Source | 303 | 218k | { | 304 | 218k | uint8_t i, g; | 305 | | | 306 | 218k | uint8_t sf_index = hDecoder->sf_index; | 307 | | | 308 | 218k | if (sf_index >= 12) | 309 | 6 | return 32; | 310 | | | 311 | 218k | switch (ics->window_sequence) { | 312 | 180k | case ONLY_LONG_SEQUENCE: | 313 | 188k | case LONG_START_SEQUENCE: | 314 | 193k | case LONG_STOP_SEQUENCE: | 315 | 193k | ics->num_windows = 1; | 316 | 193k | ics->num_window_groups = 1; | 317 | 193k | 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 | 193k | if (hDecoder->frameLength == 1024) | 328 | 156k | ics->num_swb = num_swb_1024_window[sf_index]; | 329 | 37.0k | else /* if (hDecoder->frameLength == 960) */ | 330 | 37.0k | ics->num_swb = num_swb_960_window[sf_index]; | 331 | | #ifdef LD_DEC | 332 | | } | 333 | | #endif | 334 | | | 335 | 193k | if (ics->max_sfb > ics->num_swb) | 336 | 110 | { | 337 | 110 | return 32; | 338 | 110 | } | 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 | 8.46M | for (i = 0; i < ics->num_swb; i++) | 365 | 8.26M | { | 366 | 8.26M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | 367 | 8.26M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | 368 | 8.26M | } | 369 | 193k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 370 | 193k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 371 | 193k | ics->swb_offset_max = hDecoder->frameLength; | 372 | | #ifdef LD_DEC | 373 | | } | 374 | | #endif | 375 | 193k | if (ics->num_swb > 0 && ics->swb_offset[ics->num_swb] < ics->swb_offset[ics->num_swb-1]) { | 376 | 0 | return 32; | 377 | 0 | } | 378 | 193k | return 0; | 379 | 24.8k | case EIGHT_SHORT_SEQUENCE: | 380 | 24.8k | ics->num_windows = 8; | 381 | 24.8k | ics->num_window_groups = 1; | 382 | 24.8k | ics->window_group_length[ics->num_window_groups-1] = 1; | 383 | 24.8k | ics->num_swb = num_swb_128_window[sf_index]; | 384 | | | 385 | 24.8k | if (ics->max_sfb > ics->num_swb) | 386 | 8 | { | 387 | 8 | return 32; | 388 | 8 | } | 389 | | | 390 | 371k | for (i = 0; i < ics->num_swb; i++) | 391 | 346k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | 392 | 24.8k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | 393 | 24.8k | ics->swb_offset_max = hDecoder->frameLength/8; | 394 | | | 395 | 198k | for (i = 0; i < ics->num_windows-1; i++) { | 396 | 174k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | 397 | 139k | { | 398 | 139k | ics->num_window_groups += 1; | 399 | 139k | ics->window_group_length[ics->num_window_groups-1] = 1; | 400 | 139k | } else { | 401 | 34.3k | ics->window_group_length[ics->num_window_groups-1] += 1; | 402 | 34.3k | } | 403 | 174k | } | 404 | | | 405 | | /* preparation of sect_sfb_offset for short blocks */ | 406 | 189k | for (g = 0; g < ics->num_window_groups; g++) | 407 | 164k | { | 408 | 164k | uint16_t width; | 409 | 164k | uint8_t sect_sfb = 0; | 410 | 164k | uint16_t offset = 0; | 411 | | | 412 | 2.45M | for (i = 0; i < ics->num_swb; i++) | 413 | 2.29M | { | 414 | 2.29M | if (i+1 == ics->num_swb) | 415 | 164k | { | 416 | 164k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | 417 | 2.12M | } else { | 418 | 2.12M | width = swb_offset_128_window[sf_index][i+1] - | 419 | 2.12M | swb_offset_128_window[sf_index][i]; | 420 | 2.12M | } | 421 | 2.29M | width *= ics->window_group_length[g]; | 422 | 2.29M | ics->sect_sfb_offset[g][sect_sfb++] = offset; | 423 | 2.29M | offset += width; | 424 | 2.29M | } | 425 | 164k | ics->sect_sfb_offset[g][sect_sfb] = offset; | 426 | 164k | } | 427 | 24.8k | return 0; | 428 | 0 | default: | 429 | 0 | return 32; | 430 | 218k | } | 431 | 218k | } |
Line | Count | Source | 303 | 360k | { | 304 | 360k | uint8_t i, g; | 305 | | | 306 | 360k | uint8_t sf_index = hDecoder->sf_index; | 307 | | | 308 | 360k | if (sf_index >= 12) | 309 | 3 | return 32; | 310 | | | 311 | 360k | switch (ics->window_sequence) { | 312 | 288k | case ONLY_LONG_SEQUENCE: | 313 | 313k | case LONG_START_SEQUENCE: | 314 | 320k | case LONG_STOP_SEQUENCE: | 315 | 320k | ics->num_windows = 1; | 316 | 320k | ics->num_window_groups = 1; | 317 | 320k | ics->window_group_length[ics->num_window_groups-1] = 1; | 318 | 320k | #ifdef LD_DEC | 319 | 320k | if (hDecoder->object_type == LD) | 320 | 3.77k | { | 321 | 3.77k | if (hDecoder->frameLength == 512) | 322 | 1.68k | ics->num_swb = num_swb_512_window[sf_index]; | 323 | 2.09k | else /* if (hDecoder->frameLength == 480) */ | 324 | 2.09k | ics->num_swb = num_swb_480_window[sf_index]; | 325 | 316k | } else { | 326 | 316k | #endif | 327 | 316k | if (hDecoder->frameLength == 1024) | 328 | 256k | ics->num_swb = num_swb_1024_window[sf_index]; | 329 | 60.3k | else /* if (hDecoder->frameLength == 960) */ | 330 | 60.3k | ics->num_swb = num_swb_960_window[sf_index]; | 331 | 316k | #ifdef LD_DEC | 332 | 316k | } | 333 | 320k | #endif | 334 | | | 335 | 320k | if (ics->max_sfb > ics->num_swb) | 336 | 180 | { | 337 | 180 | return 32; | 338 | 180 | } | 339 | | | 340 | | /* preparation of sect_sfb_offset for long blocks */ | 341 | | /* also copy the last value! */ | 342 | 320k | #ifdef LD_DEC | 343 | 320k | if (hDecoder->object_type == LD) | 344 | 3.76k | { | 345 | 3.76k | if (hDecoder->frameLength == 512) | 346 | 1.68k | { | 347 | 43.1k | for (i = 0; i < ics->num_swb; i++) | 348 | 41.4k | { | 349 | 41.4k | ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; | 350 | 41.4k | ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; | 351 | 41.4k | } | 352 | 2.08k | } else /* if (hDecoder->frameLength == 480) */ { | 353 | 64.7k | for (i = 0; i < ics->num_swb; i++) | 354 | 62.6k | { | 355 | 62.6k | ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; | 356 | 62.6k | ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; | 357 | 62.6k | } | 358 | 2.08k | } | 359 | 3.76k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 360 | 3.76k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 361 | 3.76k | ics->swb_offset_max = hDecoder->frameLength; | 362 | 316k | } else { | 363 | 316k | #endif | 364 | 13.6M | for (i = 0; i < ics->num_swb; i++) | 365 | 13.3M | { | 366 | 13.3M | ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | 367 | 13.3M | ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | 368 | 13.3M | } | 369 | 316k | ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | 370 | 316k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | 371 | 316k | ics->swb_offset_max = hDecoder->frameLength; | 372 | 316k | #ifdef LD_DEC | 373 | 316k | } | 374 | 320k | #endif | 375 | 320k | if (ics->num_swb > 0 && ics->swb_offset[ics->num_swb] < ics->swb_offset[ics->num_swb-1]) { | 376 | 0 | return 32; | 377 | 0 | } | 378 | 320k | return 0; | 379 | 39.9k | case EIGHT_SHORT_SEQUENCE: | 380 | 39.9k | ics->num_windows = 8; | 381 | 39.9k | ics->num_window_groups = 1; | 382 | 39.9k | ics->window_group_length[ics->num_window_groups-1] = 1; | 383 | 39.9k | ics->num_swb = num_swb_128_window[sf_index]; | 384 | | | 385 | 39.9k | if (ics->max_sfb > ics->num_swb) | 386 | 9 | { | 387 | 9 | return 32; | 388 | 9 | } | 389 | | | 390 | 583k | for (i = 0; i < ics->num_swb; i++) | 391 | 543k | ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | 392 | 39.9k | ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | 393 | 39.9k | ics->swb_offset_max = hDecoder->frameLength/8; | 394 | | | 395 | 319k | for (i = 0; i < ics->num_windows-1; i++) { | 396 | 279k | if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | 397 | 226k | { | 398 | 226k | ics->num_window_groups += 1; | 399 | 226k | ics->window_group_length[ics->num_window_groups-1] = 1; | 400 | 226k | } else { | 401 | 52.8k | ics->window_group_length[ics->num_window_groups-1] += 1; | 402 | 52.8k | } | 403 | 279k | } | 404 | | | 405 | | /* preparation of sect_sfb_offset for short blocks */ | 406 | 306k | for (g = 0; g < ics->num_window_groups; g++) | 407 | 266k | { | 408 | 266k | uint16_t width; | 409 | 266k | uint8_t sect_sfb = 0; | 410 | 266k | uint16_t offset = 0; | 411 | | | 412 | 3.88M | for (i = 0; i < ics->num_swb; i++) | 413 | 3.61M | { | 414 | 3.61M | if (i+1 == ics->num_swb) | 415 | 266k | { | 416 | 266k | width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | 417 | 3.35M | } else { | 418 | 3.35M | width = swb_offset_128_window[sf_index][i+1] - | 419 | 3.35M | swb_offset_128_window[sf_index][i]; | 420 | 3.35M | } | 421 | 3.61M | width *= ics->window_group_length[g]; | 422 | 3.61M | ics->sect_sfb_offset[g][sect_sfb++] = offset; | 423 | 3.61M | offset += width; | 424 | 3.61M | } | 425 | 266k | ics->sect_sfb_offset[g][sect_sfb] = offset; | 426 | 266k | } | 427 | 39.9k | return 0; | 428 | 0 | default: | 429 | 0 | return 32; | 430 | 360k | } | 431 | 360k | } |
|
432 | | |
433 | | /* iquant() * output = sign(input)*abs(input)^(4/3) */ |
434 | | static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) |
435 | 616M | { |
436 | | #ifdef FIXED_POINT |
437 | | /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ |
438 | | /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not |
439 | | * defined a 1026 value table and interpolation will be used |
440 | | */ |
441 | | #ifndef BIG_IQ_TABLE |
442 | | static const real_t errcorr[] = { |
443 | 267M | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), |
444 | 267M | REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), |
445 | 267M | REAL_CONST(0) |
446 | | }; |
447 | | real_t x1, x2; |
448 | | #endif |
449 | | int16_t sgn = 1; |
450 | | /* compute the magnitude in int: -q is evaluated as int and so does not |
451 | | wrap for q == -32768 the way an int16_t negation would, which keeps the |
452 | | comparison against IQ_TABLE_SIZE in range like the floating-point path */ |
453 | | int aq = q; |
454 | | |
455 | 267M | if (aq < 0) |
456 | 166k | { |
457 | 166k | aq = -aq; |
458 | 166k | sgn = -1; |
459 | 166k | } |
460 | | |
461 | 267M | if (aq < IQ_TABLE_SIZE) |
462 | 267M | { |
463 | | //#define IQUANT_PRINT |
464 | | #ifdef IQUANT_PRINT |
465 | | //printf("0x%.8X\n", sgn * tab[aq]); |
466 | | printf("%d\n", sgn * tab[aq]); |
467 | | #endif |
468 | 267M | return sgn * tab[aq]; |
469 | 267M | } |
470 | | |
471 | 3.25k | #ifndef BIG_IQ_TABLE |
472 | 3.25k | if (aq >= 8192) |
473 | 1.08k | { |
474 | 1.08k | *error = 17; |
475 | 1.08k | return 0; |
476 | 1.08k | } |
477 | | |
478 | | /* linear interpolation */ |
479 | 2.17k | x1 = tab[aq>>3]; |
480 | 2.17k | x2 = tab[(aq>>3) + 1]; |
481 | 2.17k | return sgn * 16 * (MUL_R(errcorr[aq&7],(x2-x1)) + x1); |
482 | | #else |
483 | | *error = 17; |
484 | | return 0; |
485 | | #endif |
486 | | |
487 | | #else |
488 | 349M | if (q < 0) |
489 | 147k | { |
490 | | /* tab contains a value for all possible q [0,8192] */ |
491 | 147k | if (-q < IQ_TABLE_SIZE) |
492 | 145k | return -tab[-q]; |
493 | | |
494 | 1.59k | *error = 17; |
495 | 1.59k | return 0; |
496 | 348M | } else { |
497 | | /* tab contains a value for all possible q [0,8192] */ |
498 | 348M | if (q < IQ_TABLE_SIZE) |
499 | 348M | return tab[q]; |
500 | | |
501 | 1.45k | *error = 17; |
502 | 1.45k | return 0; |
503 | 348M | } |
504 | | #endif |
505 | 3.25k | } Line | Count | Source | 435 | 267M | { | 436 | 267M | #ifdef FIXED_POINT | 437 | | /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ | 438 | | /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not | 439 | | * defined a 1026 value table and interpolation will be used | 440 | | */ | 441 | 267M | #ifndef BIG_IQ_TABLE | 442 | 267M | static const real_t errcorr[] = { | 443 | 267M | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), | 444 | 267M | REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), | 445 | 267M | REAL_CONST(0) | 446 | 267M | }; | 447 | 267M | real_t x1, x2; | 448 | 267M | #endif | 449 | 267M | int16_t sgn = 1; | 450 | | /* compute the magnitude in int: -q is evaluated as int and so does not | 451 | | wrap for q == -32768 the way an int16_t negation would, which keeps the | 452 | | comparison against IQ_TABLE_SIZE in range like the floating-point path */ | 453 | 267M | int aq = q; | 454 | | | 455 | 267M | if (aq < 0) | 456 | 166k | { | 457 | 166k | aq = -aq; | 458 | 166k | sgn = -1; | 459 | 166k | } | 460 | | | 461 | 267M | if (aq < IQ_TABLE_SIZE) | 462 | 267M | { | 463 | | //#define IQUANT_PRINT | 464 | | #ifdef IQUANT_PRINT | 465 | | //printf("0x%.8X\n", sgn * tab[aq]); | 466 | | printf("%d\n", sgn * tab[aq]); | 467 | | #endif | 468 | 267M | return sgn * tab[aq]; | 469 | 267M | } | 470 | | | 471 | 3.25k | #ifndef BIG_IQ_TABLE | 472 | 3.25k | if (aq >= 8192) | 473 | 1.08k | { | 474 | 1.08k | *error = 17; | 475 | 1.08k | return 0; | 476 | 1.08k | } | 477 | | | 478 | | /* linear interpolation */ | 479 | 2.17k | x1 = tab[aq>>3]; | 480 | 2.17k | x2 = tab[(aq>>3) + 1]; | 481 | 2.17k | return sgn * 16 * (MUL_R(errcorr[aq&7],(x2-x1)) + x1); | 482 | | #else | 483 | | *error = 17; | 484 | | return 0; | 485 | | #endif | 486 | | | 487 | | #else | 488 | | if (q < 0) | 489 | | { | 490 | | /* tab contains a value for all possible q [0,8192] */ | 491 | | if (-q < IQ_TABLE_SIZE) | 492 | | return -tab[-q]; | 493 | | | 494 | | *error = 17; | 495 | | return 0; | 496 | | } else { | 497 | | /* tab contains a value for all possible q [0,8192] */ | 498 | | if (q < IQ_TABLE_SIZE) | 499 | | return tab[q]; | 500 | | | 501 | | *error = 17; | 502 | | return 0; | 503 | | } | 504 | | #endif | 505 | 3.25k | } |
Line | Count | Source | 435 | 349M | { | 436 | | #ifdef FIXED_POINT | 437 | | /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ | 438 | | /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not | 439 | | * defined a 1026 value table and interpolation will be used | 440 | | */ | 441 | | #ifndef BIG_IQ_TABLE | 442 | | static const real_t errcorr[] = { | 443 | | REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), | 444 | | REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), | 445 | | REAL_CONST(0) | 446 | | }; | 447 | | real_t x1, x2; | 448 | | #endif | 449 | | int16_t sgn = 1; | 450 | | /* compute the magnitude in int: -q is evaluated as int and so does not | 451 | | wrap for q == -32768 the way an int16_t negation would, which keeps the | 452 | | comparison against IQ_TABLE_SIZE in range like the floating-point path */ | 453 | | int aq = q; | 454 | | | 455 | | if (aq < 0) | 456 | | { | 457 | | aq = -aq; | 458 | | sgn = -1; | 459 | | } | 460 | | | 461 | | if (aq < IQ_TABLE_SIZE) | 462 | | { | 463 | | //#define IQUANT_PRINT | 464 | | #ifdef IQUANT_PRINT | 465 | | //printf("0x%.8X\n", sgn * tab[aq]); | 466 | | printf("%d\n", sgn * tab[aq]); | 467 | | #endif | 468 | | return sgn * tab[aq]; | 469 | | } | 470 | | | 471 | | #ifndef BIG_IQ_TABLE | 472 | | if (aq >= 8192) | 473 | | { | 474 | | *error = 17; | 475 | | return 0; | 476 | | } | 477 | | | 478 | | /* linear interpolation */ | 479 | | x1 = tab[aq>>3]; | 480 | | x2 = tab[(aq>>3) + 1]; | 481 | | return sgn * 16 * (MUL_R(errcorr[aq&7],(x2-x1)) + x1); | 482 | | #else | 483 | | *error = 17; | 484 | | return 0; | 485 | | #endif | 486 | | | 487 | | #else | 488 | 349M | if (q < 0) | 489 | 147k | { | 490 | | /* tab contains a value for all possible q [0,8192] */ | 491 | 147k | if (-q < IQ_TABLE_SIZE) | 492 | 145k | return -tab[-q]; | 493 | | | 494 | 1.59k | *error = 17; | 495 | 1.59k | return 0; | 496 | 348M | } else { | 497 | | /* tab contains a value for all possible q [0,8192] */ | 498 | 348M | if (q < IQ_TABLE_SIZE) | 499 | 348M | return tab[q]; | 500 | | | 501 | 1.45k | *error = 17; | 502 | 1.45k | return 0; | 503 | 348M | } | 504 | 349M | #endif | 505 | 349M | } |
|
506 | | |
507 | | #ifndef FIXED_POINT |
508 | | ALIGN static const real_t pow2sf_tab[] = { |
509 | | 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, |
510 | | 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, |
511 | | 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, |
512 | | 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, |
513 | | 0.0001220703125, 0.000244140625, 0.00048828125, |
514 | | 0.0009765625, 0.001953125, 0.00390625, |
515 | | 0.0078125, 0.015625, 0.03125, |
516 | | 0.0625, 0.125, 0.25, |
517 | | 0.5, 1.0, 2.0, |
518 | | 4.0, 8.0, 16.0, 32.0, |
519 | | 64.0, 128.0, 256.0, |
520 | | 512.0, 1024.0, 2048.0, |
521 | | 4096.0, 8192.0, 16384.0, |
522 | | 32768.0, 65536.0, 131072.0, |
523 | | 262144.0, 524288.0, 1048576.0, |
524 | | 2097152.0, 4194304.0, 8388608.0, |
525 | | 16777216.0, 33554432.0, 67108864.0, |
526 | | 134217728.0, 268435456.0, 536870912.0, |
527 | | 1073741824.0, 2147483648.0, 4294967296.0, |
528 | | 8589934592.0, 17179869184.0, 34359738368.0, |
529 | | 68719476736.0, 137438953472.0, 274877906944.0 |
530 | | }; |
531 | | #endif |
532 | | |
533 | | /* quant_to_spec: perform dequantisation and scaling |
534 | | * and in case of short block it also does the deinterleaving |
535 | | */ |
536 | | /* |
537 | | For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, |
538 | | window_group_length[0] = 1) the spectral data is in ascending spectral |
539 | | order. |
540 | | For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the |
541 | | grouping in the following manner: |
542 | | - Groups are ordered sequentially |
543 | | - Within a group, a scalefactor band consists of the spectral data of all |
544 | | grouped SHORT_WINDOWs for the associated scalefactor window band. To |
545 | | clarify via example, the length of a group is in the range of one to eight |
546 | | SHORT_WINDOWs. |
547 | | - If there are eight groups each with length one (num_window_groups = 8, |
548 | | window_group_length[0..7] = 1), the result is a sequence of eight spectra, |
549 | | each in ascending spectral order. |
550 | | - If there is only one group with length eight (num_window_groups = 1, |
551 | | window_group_length[0] = 8), the result is that spectral data of all eight |
552 | | SHORT_WINDOWs is interleaved by scalefactor window bands. |
553 | | - Within a scalefactor window band, the coefficients are in ascending |
554 | | spectral order. |
555 | | */ |
556 | | static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, |
557 | | ic_stream *ics, int16_t *quant_data, |
558 | | real_t *spec_data, uint16_t frame_len) |
559 | 611k | { |
560 | 611k | ALIGN static const real_t pow2_table[] = |
561 | 611k | { |
562 | 611k | COEF_CONST(1.0), |
563 | 611k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ |
564 | 611k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ |
565 | 611k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ |
566 | 611k | }; |
567 | 611k | const real_t *tab = iq_table; |
568 | | |
569 | 611k | uint8_t g, sfb, win; |
570 | 611k | uint16_t width, bin, k, gindex; |
571 | 611k | uint8_t error = 0; /* Init error flag */ |
572 | | #ifndef FIXED_POINT |
573 | | real_t scf; |
574 | | #else |
575 | | int32_t sat_shift_mask = 0; |
576 | | #endif |
577 | | |
578 | 611k | k = 0; |
579 | 611k | gindex = 0; |
580 | | |
581 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. |
582 | | * Without peeking into AAC specification, there is no strong evidence if |
583 | | * such streams are invalid -> just calm down MSAN. */ |
584 | 611k | if (ics->num_swb == 0) |
585 | 852 | memset(spec_data, 0, frame_len * sizeof(real_t)); |
586 | | |
587 | 1.60M | for (g = 0; g < ics->num_window_groups; g++) |
588 | 991k | { |
589 | 991k | uint16_t j = 0; |
590 | 991k | uint16_t gincrease = 0; |
591 | 991k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; |
592 | | |
593 | 30.1M | for (sfb = 0; sfb < ics->num_swb; sfb++) |
594 | 29.1M | { |
595 | 29.1M | int32_t exp, frac; |
596 | 29.1M | uint16_t wa = gindex + j; |
597 | 29.1M | int16_t scale_factor = ics->scale_factors[g][sfb]; |
598 | | |
599 | 29.1M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; |
600 | 29.1M | if (width + 3 >= 1024) |
601 | 0 | { |
602 | | // quant_data contains 1024 uint16_t, the k iterator + 3 |
603 | | // should never reach more 1024 |
604 | 0 | error = 17; |
605 | 0 | continue; |
606 | 0 | } |
607 | | |
608 | | #ifdef FIXED_POINT |
609 | 12.7M | scale_factor -= 100; |
610 | | /* IMDCT pre-scaling */ |
611 | 12.7M | if (hDecoder->object_type == LD) |
612 | 58.2k | { |
613 | 58.2k | scale_factor -= 24 /*9*/; |
614 | 12.6M | } else { |
615 | 12.6M | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) |
616 | 2.84M | scale_factor -= 16 /*7*/; |
617 | 9.81M | else |
618 | 9.81M | scale_factor -= 28 /*10*/; |
619 | 12.6M | } |
620 | 12.7M | if (scale_factor > 120) |
621 | 385 | scale_factor = 120; /* => exp <= 30 */ |
622 | | #else |
623 | 16.3M | (void)hDecoder; |
624 | 16.3M | #endif |
625 | | |
626 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ |
627 | 29.1M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) |
628 | 75.2k | { |
629 | 75.2k | scale_factor = 0; |
630 | 75.2k | } |
631 | | |
632 | | /* scale_factor must be between 0 and 255 */ |
633 | 16.3M | exp = (scale_factor /* - 100 */) >> 2; |
634 | | /* frac must always be > 0 */ |
635 | 16.3M | frac = (scale_factor /* - 100 */) & 3; |
636 | | |
637 | | #ifndef FIXED_POINT |
638 | | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; |
639 | | #else |
640 | 12.7M | if (exp > 0) |
641 | 32.6k | sat_shift_mask = SAT_SHIFT_MASK(exp); |
642 | | #endif |
643 | | |
644 | 59.5M | for (win = 0; win < ics->window_group_length[g]; win++) |
645 | 30.4M | { |
646 | 184M | for (bin = 0; bin < width; bin += 4) |
647 | 154M | { |
648 | 154M | uint16_t wb = wa + bin; |
649 | | #ifndef FIXED_POINT |
650 | | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; |
651 | | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; |
652 | | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; |
653 | | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; |
654 | | #else |
655 | | real_t iq0 = iquant(quant_data[k+0], tab, &error); |
656 | | real_t iq1 = iquant(quant_data[k+1], tab, &error); |
657 | | real_t iq2 = iquant(quant_data[k+2], tab, &error); |
658 | | real_t iq3 = iquant(quant_data[k+3], tab, &error); |
659 | | |
660 | 66.8M | if (exp == -32) |
661 | 58.3M | { |
662 | 58.3M | spec_data[wb+0] = 0; |
663 | 58.3M | spec_data[wb+1] = 0; |
664 | 58.3M | spec_data[wb+2] = 0; |
665 | 58.3M | spec_data[wb+3] = 0; |
666 | 58.3M | } else if (exp <= 0) { |
667 | 8.31M | spec_data[wb+0] = iq0 >> -exp; |
668 | 8.31M | spec_data[wb+1] = iq1 >> -exp; |
669 | 8.31M | spec_data[wb+2] = iq2 >> -exp; |
670 | 8.31M | spec_data[wb+3] = iq3 >> -exp; |
671 | 8.31M | } else { /* exp > 0 */ |
672 | 169k | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); |
673 | 169k | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); |
674 | 169k | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); |
675 | 169k | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); |
676 | 169k | } |
677 | 66.8M | if (frac != 0) |
678 | 255k | { |
679 | 255k | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); |
680 | 255k | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); |
681 | 255k | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); |
682 | 255k | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); |
683 | 255k | } |
684 | | |
685 | | //#define SCFS_PRINT |
686 | | #ifdef SCFS_PRINT |
687 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
688 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); |
689 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); |
690 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); |
691 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
692 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); |
693 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); |
694 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); |
695 | | #endif |
696 | | #endif |
697 | | |
698 | 154M | gincrease += 4; |
699 | 154M | k += 4; |
700 | 154M | } |
701 | 30.4M | wa += win_inc; |
702 | 30.4M | } |
703 | 16.3M | j += width; |
704 | 16.3M | } |
705 | 991k | gindex += gincrease; |
706 | 991k | } |
707 | | |
708 | 611k | return error; |
709 | 611k | } Line | Count | Source | 559 | 264k | { | 560 | 264k | ALIGN static const real_t pow2_table[] = | 561 | 264k | { | 562 | 264k | COEF_CONST(1.0), | 563 | 264k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ | 564 | 264k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ | 565 | 264k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ | 566 | 264k | }; | 567 | 264k | const real_t *tab = iq_table; | 568 | | | 569 | 264k | uint8_t g, sfb, win; | 570 | 264k | uint16_t width, bin, k, gindex; | 571 | 264k | uint8_t error = 0; /* Init error flag */ | 572 | | #ifndef FIXED_POINT | 573 | | real_t scf; | 574 | | #else | 575 | 264k | int32_t sat_shift_mask = 0; | 576 | 264k | #endif | 577 | | | 578 | 264k | k = 0; | 579 | 264k | gindex = 0; | 580 | | | 581 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. | 582 | | * Without peeking into AAC specification, there is no strong evidence if | 583 | | * such streams are invalid -> just calm down MSAN. */ | 584 | 264k | if (ics->num_swb == 0) | 585 | 98 | memset(spec_data, 0, frame_len * sizeof(real_t)); | 586 | | | 587 | 708k | for (g = 0; g < ics->num_window_groups; g++) | 588 | 443k | { | 589 | 443k | uint16_t j = 0; | 590 | 443k | uint16_t gincrease = 0; | 591 | 443k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; | 592 | | | 593 | 13.1M | for (sfb = 0; sfb < ics->num_swb; sfb++) | 594 | 12.7M | { | 595 | 12.7M | int32_t exp, frac; | 596 | 12.7M | uint16_t wa = gindex + j; | 597 | 12.7M | int16_t scale_factor = ics->scale_factors[g][sfb]; | 598 | | | 599 | 12.7M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; | 600 | 12.7M | if (width + 3 >= 1024) | 601 | 0 | { | 602 | | // quant_data contains 1024 uint16_t, the k iterator + 3 | 603 | | // should never reach more 1024 | 604 | 0 | error = 17; | 605 | 0 | continue; | 606 | 0 | } | 607 | | | 608 | 12.7M | #ifdef FIXED_POINT | 609 | 12.7M | scale_factor -= 100; | 610 | | /* IMDCT pre-scaling */ | 611 | 12.7M | if (hDecoder->object_type == LD) | 612 | 58.2k | { | 613 | 58.2k | scale_factor -= 24 /*9*/; | 614 | 12.6M | } else { | 615 | 12.6M | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 616 | 2.84M | scale_factor -= 16 /*7*/; | 617 | 9.81M | else | 618 | 9.81M | scale_factor -= 28 /*10*/; | 619 | 12.6M | } | 620 | 12.7M | if (scale_factor > 120) | 621 | 385 | scale_factor = 120; /* => exp <= 30 */ | 622 | | #else | 623 | | (void)hDecoder; | 624 | | #endif | 625 | | | 626 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ | 627 | 12.7M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) | 628 | 41.1k | { | 629 | 41.1k | scale_factor = 0; | 630 | 41.1k | } | 631 | | | 632 | | /* scale_factor must be between 0 and 255 */ | 633 | 12.7M | exp = (scale_factor /* - 100 */) >> 2; | 634 | | /* frac must always be > 0 */ | 635 | 12.7M | frac = (scale_factor /* - 100 */) & 3; | 636 | | | 637 | | #ifndef FIXED_POINT | 638 | | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | 639 | | #else | 640 | 12.7M | if (exp > 0) | 641 | 32.6k | sat_shift_mask = SAT_SHIFT_MASK(exp); | 642 | 12.7M | #endif | 643 | | | 644 | 25.9M | for (win = 0; win < ics->window_group_length[g]; win++) | 645 | 13.2M | { | 646 | 80.0M | for (bin = 0; bin < width; bin += 4) | 647 | 66.8M | { | 648 | 66.8M | uint16_t wb = wa + bin; | 649 | | #ifndef FIXED_POINT | 650 | | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | 651 | | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | 652 | | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | 653 | | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | 654 | | #else | 655 | 66.8M | real_t iq0 = iquant(quant_data[k+0], tab, &error); | 656 | 66.8M | real_t iq1 = iquant(quant_data[k+1], tab, &error); | 657 | 66.8M | real_t iq2 = iquant(quant_data[k+2], tab, &error); | 658 | 66.8M | real_t iq3 = iquant(quant_data[k+3], tab, &error); | 659 | | | 660 | 66.8M | if (exp == -32) | 661 | 58.3M | { | 662 | 58.3M | spec_data[wb+0] = 0; | 663 | 58.3M | spec_data[wb+1] = 0; | 664 | 58.3M | spec_data[wb+2] = 0; | 665 | 58.3M | spec_data[wb+3] = 0; | 666 | 58.3M | } else if (exp <= 0) { | 667 | 8.31M | spec_data[wb+0] = iq0 >> -exp; | 668 | 8.31M | spec_data[wb+1] = iq1 >> -exp; | 669 | 8.31M | spec_data[wb+2] = iq2 >> -exp; | 670 | 8.31M | spec_data[wb+3] = iq3 >> -exp; | 671 | 8.31M | } else { /* exp > 0 */ | 672 | 169k | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); | 673 | 169k | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); | 674 | 169k | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); | 675 | 169k | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); | 676 | 169k | } | 677 | 66.8M | if (frac != 0) | 678 | 255k | { | 679 | 255k | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | 680 | 255k | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | 681 | 255k | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | 682 | 255k | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | 683 | 255k | } | 684 | | | 685 | | //#define SCFS_PRINT | 686 | | #ifdef SCFS_PRINT | 687 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 688 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 689 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 690 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 691 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 692 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 693 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 694 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 695 | | #endif | 696 | 66.8M | #endif | 697 | | | 698 | 66.8M | gincrease += 4; | 699 | 66.8M | k += 4; | 700 | 66.8M | } | 701 | 13.2M | wa += win_inc; | 702 | 13.2M | } | 703 | 12.7M | j += width; | 704 | 12.7M | } | 705 | 443k | gindex += gincrease; | 706 | 443k | } | 707 | | | 708 | 264k | return error; | 709 | 264k | } |
Line | Count | Source | 559 | 346k | { | 560 | 346k | ALIGN static const real_t pow2_table[] = | 561 | 346k | { | 562 | 346k | COEF_CONST(1.0), | 563 | 346k | COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ | 564 | 346k | COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ | 565 | 346k | COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ | 566 | 346k | }; | 567 | 346k | const real_t *tab = iq_table; | 568 | | | 569 | 346k | uint8_t g, sfb, win; | 570 | 346k | uint16_t width, bin, k, gindex; | 571 | 346k | uint8_t error = 0; /* Init error flag */ | 572 | 346k | #ifndef FIXED_POINT | 573 | 346k | real_t scf; | 574 | | #else | 575 | | int32_t sat_shift_mask = 0; | 576 | | #endif | 577 | | | 578 | 346k | k = 0; | 579 | 346k | gindex = 0; | 580 | | | 581 | | /* In this case quant_to_spec is no-op and spec_data remains undefined. | 582 | | * Without peeking into AAC specification, there is no strong evidence if | 583 | | * such streams are invalid -> just calm down MSAN. */ | 584 | 346k | if (ics->num_swb == 0) | 585 | 754 | memset(spec_data, 0, frame_len * sizeof(real_t)); | 586 | | | 587 | 894k | for (g = 0; g < ics->num_window_groups; g++) | 588 | 547k | { | 589 | 547k | uint16_t j = 0; | 590 | 547k | uint16_t gincrease = 0; | 591 | 547k | uint16_t win_inc = ics->swb_offset[ics->num_swb]; | 592 | | | 593 | 16.9M | for (sfb = 0; sfb < ics->num_swb; sfb++) | 594 | 16.3M | { | 595 | 16.3M | int32_t exp, frac; | 596 | 16.3M | uint16_t wa = gindex + j; | 597 | 16.3M | int16_t scale_factor = ics->scale_factors[g][sfb]; | 598 | | | 599 | 16.3M | width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; | 600 | 16.3M | if (width + 3 >= 1024) | 601 | 0 | { | 602 | | // quant_data contains 1024 uint16_t, the k iterator + 3 | 603 | | // should never reach more 1024 | 604 | 0 | error = 17; | 605 | 0 | continue; | 606 | 0 | } | 607 | | | 608 | | #ifdef FIXED_POINT | 609 | | scale_factor -= 100; | 610 | | /* IMDCT pre-scaling */ | 611 | | if (hDecoder->object_type == LD) | 612 | | { | 613 | | scale_factor -= 24 /*9*/; | 614 | | } else { | 615 | | if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | 616 | | scale_factor -= 16 /*7*/; | 617 | | else | 618 | | scale_factor -= 28 /*10*/; | 619 | | } | 620 | | if (scale_factor > 120) | 621 | | scale_factor = 120; /* => exp <= 30 */ | 622 | | #else | 623 | 16.3M | (void)hDecoder; | 624 | 16.3M | #endif | 625 | | | 626 | | /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ | 627 | 16.3M | if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) | 628 | 34.1k | { | 629 | 34.1k | scale_factor = 0; | 630 | 34.1k | } | 631 | | | 632 | | /* scale_factor must be between 0 and 255 */ | 633 | 16.3M | exp = (scale_factor /* - 100 */) >> 2; | 634 | | /* frac must always be > 0 */ | 635 | 16.3M | frac = (scale_factor /* - 100 */) & 3; | 636 | | | 637 | 16.3M | #ifndef FIXED_POINT | 638 | 16.3M | scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | 639 | | #else | 640 | | if (exp > 0) | 641 | | sat_shift_mask = SAT_SHIFT_MASK(exp); | 642 | | #endif | 643 | | | 644 | 33.5M | for (win = 0; win < ics->window_group_length[g]; win++) | 645 | 17.1M | { | 646 | 104M | for (bin = 0; bin < width; bin += 4) | 647 | 87.2M | { | 648 | 87.2M | uint16_t wb = wa + bin; | 649 | 87.2M | #ifndef FIXED_POINT | 650 | 87.2M | spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | 651 | 87.2M | spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | 652 | 87.2M | spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | 653 | 87.2M | spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | 654 | | #else | 655 | | real_t iq0 = iquant(quant_data[k+0], tab, &error); | 656 | | real_t iq1 = iquant(quant_data[k+1], tab, &error); | 657 | | real_t iq2 = iquant(quant_data[k+2], tab, &error); | 658 | | real_t iq3 = iquant(quant_data[k+3], tab, &error); | 659 | | | 660 | | if (exp == -32) | 661 | | { | 662 | | spec_data[wb+0] = 0; | 663 | | spec_data[wb+1] = 0; | 664 | | spec_data[wb+2] = 0; | 665 | | spec_data[wb+3] = 0; | 666 | | } else if (exp <= 0) { | 667 | | spec_data[wb+0] = iq0 >> -exp; | 668 | | spec_data[wb+1] = iq1 >> -exp; | 669 | | spec_data[wb+2] = iq2 >> -exp; | 670 | | spec_data[wb+3] = iq3 >> -exp; | 671 | | } else { /* exp > 0 */ | 672 | | spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); | 673 | | spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); | 674 | | spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); | 675 | | spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); | 676 | | } | 677 | | if (frac != 0) | 678 | | { | 679 | | spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | 680 | | spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | 681 | | spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | 682 | | spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | 683 | | } | 684 | | | 685 | | //#define SCFS_PRINT | 686 | | #ifdef SCFS_PRINT | 687 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 688 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 689 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 690 | | printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 691 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | 692 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | 693 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | 694 | | //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | 695 | | #endif | 696 | | #endif | 697 | | | 698 | 87.2M | gincrease += 4; | 699 | 87.2M | k += 4; | 700 | 87.2M | } | 701 | 17.1M | wa += win_inc; | 702 | 17.1M | } | 703 | 16.3M | j += width; | 704 | 16.3M | } | 705 | 547k | gindex += gincrease; | 706 | 547k | } | 707 | | | 708 | 346k | return error; | 709 | 346k | } |
|
710 | | |
711 | | static uint8_t allocate_single_channel(NeAACDecStruct *hDecoder, uint8_t channel, |
712 | | uint8_t output_channels) |
713 | 335k | { |
714 | 335k | int mul = 1; |
715 | | |
716 | | #ifdef MAIN_DEC |
717 | | /* MAIN object type prediction */ |
718 | 184k | if (hDecoder->object_type == MAIN) |
719 | 72.2k | { |
720 | | /* allocate the state only when needed */ |
721 | 72.2k | if (hDecoder->pred_stat[channel] != NULL) |
722 | 1.78k | { |
723 | 1.78k | faad_free(hDecoder->pred_stat[channel]); |
724 | 1.78k | hDecoder->pred_stat[channel] = NULL; |
725 | 1.78k | } |
726 | | |
727 | 72.2k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
728 | 72.2k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
729 | 72.2k | } |
730 | | #endif |
731 | | |
732 | | #ifdef LTP_DEC |
733 | 184k | if (is_ltp_ot(hDecoder->object_type)) |
734 | 54.5k | { |
735 | | /* allocate the state only when needed */ |
736 | 54.5k | if (hDecoder->lt_pred_stat[channel] != NULL) |
737 | 778 | { |
738 | 778 | faad_free(hDecoder->lt_pred_stat[channel]); |
739 | 778 | hDecoder->lt_pred_stat[channel] = NULL; |
740 | 778 | } |
741 | | |
742 | 54.5k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
743 | 54.5k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
744 | 54.5k | } |
745 | | #endif |
746 | | |
747 | 335k | if (hDecoder->time_out[channel] != NULL) |
748 | 4.96k | { |
749 | 4.96k | faad_free(hDecoder->time_out[channel]); |
750 | 4.96k | hDecoder->time_out[channel] = NULL; |
751 | 4.96k | } |
752 | | |
753 | 335k | { |
754 | 335k | mul = 1; |
755 | 335k | #ifdef SBR_DEC |
756 | 335k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; |
757 | 335k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
758 | 265k | { |
759 | | /* SBR requires 2 times as much output data */ |
760 | 265k | mul = 2; |
761 | 265k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; |
762 | 265k | } |
763 | 335k | #endif |
764 | 335k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
765 | 335k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
766 | 335k | } |
767 | | |
768 | 335k | #if (defined(PS_DEC) || defined(DRM_PS)) |
769 | 335k | if (output_channels == 2) |
770 | 153k | { |
771 | 153k | if (hDecoder->time_out[channel+1] != NULL) |
772 | 1.06k | { |
773 | 1.06k | faad_free(hDecoder->time_out[channel+1]); |
774 | 1.06k | hDecoder->time_out[channel+1] = NULL; |
775 | 1.06k | } |
776 | | |
777 | 153k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
778 | 153k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
779 | 153k | } |
780 | 335k | #endif |
781 | | |
782 | 335k | if (hDecoder->fb_intermed[channel] != NULL) |
783 | 4.44k | { |
784 | 4.44k | faad_free(hDecoder->fb_intermed[channel]); |
785 | 4.44k | hDecoder->fb_intermed[channel] = NULL; |
786 | 4.44k | } |
787 | | |
788 | 335k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
789 | 335k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
790 | | |
791 | | #ifdef SSR_DEC |
792 | | if (hDecoder->object_type == SSR) |
793 | | { |
794 | | if (hDecoder->ssr_overlap[channel] == NULL) |
795 | | { |
796 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
797 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
798 | | } |
799 | | if (hDecoder->prev_fmd[channel] == NULL) |
800 | | { |
801 | | uint16_t k; |
802 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
803 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
804 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); |
805 | | } |
806 | | } |
807 | | #endif |
808 | | |
809 | 335k | return 0; |
810 | 335k | } specrec.c:allocate_single_channel Line | Count | Source | 713 | 150k | { | 714 | 150k | int mul = 1; | 715 | | | 716 | | #ifdef MAIN_DEC | 717 | | /* MAIN object type prediction */ | 718 | | if (hDecoder->object_type == MAIN) | 719 | | { | 720 | | /* allocate the state only when needed */ | 721 | | if (hDecoder->pred_stat[channel] != NULL) | 722 | | { | 723 | | faad_free(hDecoder->pred_stat[channel]); | 724 | | hDecoder->pred_stat[channel] = NULL; | 725 | | } | 726 | | | 727 | | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 728 | | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 729 | | } | 730 | | #endif | 731 | | | 732 | | #ifdef LTP_DEC | 733 | | if (is_ltp_ot(hDecoder->object_type)) | 734 | | { | 735 | | /* allocate the state only when needed */ | 736 | | if (hDecoder->lt_pred_stat[channel] != NULL) | 737 | | { | 738 | | faad_free(hDecoder->lt_pred_stat[channel]); | 739 | | hDecoder->lt_pred_stat[channel] = NULL; | 740 | | } | 741 | | | 742 | | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 743 | | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 744 | | } | 745 | | #endif | 746 | | | 747 | 150k | if (hDecoder->time_out[channel] != NULL) | 748 | 0 | { | 749 | 0 | faad_free(hDecoder->time_out[channel]); | 750 | 0 | hDecoder->time_out[channel] = NULL; | 751 | 0 | } | 752 | | | 753 | 150k | { | 754 | 150k | mul = 1; | 755 | 150k | #ifdef SBR_DEC | 756 | 150k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 757 | 150k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 758 | 127k | { | 759 | | /* SBR requires 2 times as much output data */ | 760 | 127k | mul = 2; | 761 | 127k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 762 | 127k | } | 763 | 150k | #endif | 764 | 150k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 765 | 150k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 766 | 150k | } | 767 | | | 768 | 150k | #if (defined(PS_DEC) || defined(DRM_PS)) | 769 | 150k | if (output_channels == 2) | 770 | 150k | { | 771 | 150k | if (hDecoder->time_out[channel+1] != NULL) | 772 | 0 | { | 773 | 0 | faad_free(hDecoder->time_out[channel+1]); | 774 | 0 | hDecoder->time_out[channel+1] = NULL; | 775 | 0 | } | 776 | | | 777 | 150k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 778 | 150k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 779 | 150k | } | 780 | 150k | #endif | 781 | | | 782 | 150k | if (hDecoder->fb_intermed[channel] != NULL) | 783 | 0 | { | 784 | 0 | faad_free(hDecoder->fb_intermed[channel]); | 785 | 0 | hDecoder->fb_intermed[channel] = NULL; | 786 | 0 | } | 787 | | | 788 | 150k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 789 | 150k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 790 | | | 791 | | #ifdef SSR_DEC | 792 | | if (hDecoder->object_type == SSR) | 793 | | { | 794 | | if (hDecoder->ssr_overlap[channel] == NULL) | 795 | | { | 796 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 797 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 798 | | } | 799 | | if (hDecoder->prev_fmd[channel] == NULL) | 800 | | { | 801 | | uint16_t k; | 802 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 803 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 804 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | 805 | | } | 806 | | } | 807 | | #endif | 808 | | | 809 | 150k | return 0; | 810 | 150k | } |
specrec.c:allocate_single_channel Line | Count | Source | 713 | 184k | { | 714 | 184k | int mul = 1; | 715 | | | 716 | 184k | #ifdef MAIN_DEC | 717 | | /* MAIN object type prediction */ | 718 | 184k | if (hDecoder->object_type == MAIN) | 719 | 72.2k | { | 720 | | /* allocate the state only when needed */ | 721 | 72.2k | if (hDecoder->pred_stat[channel] != NULL) | 722 | 1.78k | { | 723 | 1.78k | faad_free(hDecoder->pred_stat[channel]); | 724 | 1.78k | hDecoder->pred_stat[channel] = NULL; | 725 | 1.78k | } | 726 | | | 727 | 72.2k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 728 | 72.2k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 729 | 72.2k | } | 730 | 184k | #endif | 731 | | | 732 | 184k | #ifdef LTP_DEC | 733 | 184k | if (is_ltp_ot(hDecoder->object_type)) | 734 | 54.5k | { | 735 | | /* allocate the state only when needed */ | 736 | 54.5k | if (hDecoder->lt_pred_stat[channel] != NULL) | 737 | 778 | { | 738 | 778 | faad_free(hDecoder->lt_pred_stat[channel]); | 739 | 778 | hDecoder->lt_pred_stat[channel] = NULL; | 740 | 778 | } | 741 | | | 742 | 54.5k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 743 | 54.5k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 744 | 54.5k | } | 745 | 184k | #endif | 746 | | | 747 | 184k | if (hDecoder->time_out[channel] != NULL) | 748 | 4.96k | { | 749 | 4.96k | faad_free(hDecoder->time_out[channel]); | 750 | 4.96k | hDecoder->time_out[channel] = NULL; | 751 | 4.96k | } | 752 | | | 753 | 184k | { | 754 | 184k | mul = 1; | 755 | 184k | #ifdef SBR_DEC | 756 | 184k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 757 | 184k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 758 | 137k | { | 759 | | /* SBR requires 2 times as much output data */ | 760 | 137k | mul = 2; | 761 | 137k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 762 | 137k | } | 763 | 184k | #endif | 764 | 184k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 765 | 184k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 766 | 184k | } | 767 | | | 768 | 184k | #if (defined(PS_DEC) || defined(DRM_PS)) | 769 | 184k | if (output_channels == 2) | 770 | 3.87k | { | 771 | 3.87k | if (hDecoder->time_out[channel+1] != NULL) | 772 | 1.06k | { | 773 | 1.06k | faad_free(hDecoder->time_out[channel+1]); | 774 | 1.06k | hDecoder->time_out[channel+1] = NULL; | 775 | 1.06k | } | 776 | | | 777 | 3.87k | hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 778 | 3.87k | memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 779 | 3.87k | } | 780 | 184k | #endif | 781 | | | 782 | 184k | if (hDecoder->fb_intermed[channel] != NULL) | 783 | 4.44k | { | 784 | 4.44k | faad_free(hDecoder->fb_intermed[channel]); | 785 | 4.44k | hDecoder->fb_intermed[channel] = NULL; | 786 | 4.44k | } | 787 | | | 788 | 184k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 789 | 184k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 790 | | | 791 | | #ifdef SSR_DEC | 792 | | if (hDecoder->object_type == SSR) | 793 | | { | 794 | | if (hDecoder->ssr_overlap[channel] == NULL) | 795 | | { | 796 | | hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 797 | | memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 798 | | } | 799 | | if (hDecoder->prev_fmd[channel] == NULL) | 800 | | { | 801 | | uint16_t k; | 802 | | hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 803 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 804 | | hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | 805 | | } | 806 | | } | 807 | | #endif | 808 | | | 809 | 184k | return 0; | 810 | 184k | } |
|
811 | | |
812 | | static uint8_t allocate_channel_pair(NeAACDecStruct *hDecoder, |
813 | | uint8_t channel, uint8_t paired_channel) |
814 | 45.4k | { |
815 | 45.4k | int mul = 1; |
816 | | |
817 | | #ifdef MAIN_DEC |
818 | | /* MAIN object type prediction */ |
819 | 21.3k | if (hDecoder->object_type == MAIN) |
820 | 10.6k | { |
821 | | /* allocate the state only when needed */ |
822 | 10.6k | if (hDecoder->pred_stat[channel] == NULL) |
823 | 10.6k | { |
824 | 10.6k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
825 | 10.6k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
826 | 10.6k | } |
827 | 10.6k | if (hDecoder->pred_stat[paired_channel] == NULL) |
828 | 10.6k | { |
829 | 10.6k | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); |
830 | 10.6k | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); |
831 | 10.6k | } |
832 | 10.6k | } |
833 | | #endif |
834 | | |
835 | | #ifdef LTP_DEC |
836 | 21.3k | if (is_ltp_ot(hDecoder->object_type)) |
837 | 8.04k | { |
838 | | /* allocate the state only when needed */ |
839 | 8.04k | if (hDecoder->lt_pred_stat[channel] == NULL) |
840 | 8.00k | { |
841 | 8.00k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
842 | 8.00k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
843 | 8.00k | } |
844 | 8.04k | if (hDecoder->lt_pred_stat[paired_channel] == NULL) |
845 | 8.00k | { |
846 | 8.00k | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); |
847 | 8.00k | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
848 | 8.00k | } |
849 | 8.04k | } |
850 | | #endif |
851 | | |
852 | 45.4k | { |
853 | 45.4k | mul = 1; |
854 | 45.4k | #ifdef SBR_DEC |
855 | 45.4k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; |
856 | 45.4k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
857 | 36.6k | { |
858 | | /* SBR requires 2 times as much output data */ |
859 | 36.6k | mul = 2; |
860 | 36.6k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; |
861 | 36.6k | } |
862 | 45.4k | #endif |
863 | 45.4k | } |
864 | 45.4k | if (hDecoder->time_out[channel] != NULL) |
865 | 92 | { |
866 | 92 | faad_free(hDecoder->time_out[channel]); |
867 | 92 | hDecoder->time_out[channel] = NULL; |
868 | 92 | } |
869 | 45.4k | if (hDecoder->time_out[paired_channel] != NULL) |
870 | 88 | { |
871 | 88 | faad_free(hDecoder->time_out[paired_channel]); |
872 | 88 | hDecoder->time_out[paired_channel] = NULL; |
873 | 88 | } |
874 | 45.4k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
875 | 45.4k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
876 | 45.4k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); |
877 | 45.4k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
878 | | |
879 | 45.4k | if (hDecoder->fb_intermed[channel] != NULL) |
880 | 92 | { |
881 | 92 | faad_free(hDecoder->fb_intermed[channel]); |
882 | 92 | hDecoder->fb_intermed[channel] = NULL; |
883 | 92 | } |
884 | 45.4k | if (hDecoder->fb_intermed[paired_channel] != NULL) |
885 | 84 | { |
886 | 84 | faad_free(hDecoder->fb_intermed[paired_channel]); |
887 | 84 | hDecoder->fb_intermed[paired_channel] = NULL; |
888 | 84 | } |
889 | 45.4k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
890 | 45.4k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
891 | 45.4k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); |
892 | 45.4k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); |
893 | | |
894 | | #ifdef SSR_DEC |
895 | | if (hDecoder->object_type == SSR) |
896 | | { |
897 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) |
898 | | { |
899 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
900 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
901 | | } |
902 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) |
903 | | { |
904 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
905 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
906 | | } |
907 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) |
908 | | { |
909 | | uint16_t k; |
910 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
911 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
912 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); |
913 | | } |
914 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) |
915 | | { |
916 | | uint16_t k; |
917 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); |
918 | | for (k = 0; k < 2*hDecoder->frameLength; k++) |
919 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); |
920 | | } |
921 | | } |
922 | | #endif |
923 | | |
924 | 45.4k | return 0; |
925 | 45.4k | } specrec.c:allocate_channel_pair Line | Count | Source | 814 | 24.0k | { | 815 | 24.0k | int mul = 1; | 816 | | | 817 | | #ifdef MAIN_DEC | 818 | | /* MAIN object type prediction */ | 819 | | if (hDecoder->object_type == MAIN) | 820 | | { | 821 | | /* allocate the state only when needed */ | 822 | | if (hDecoder->pred_stat[channel] == NULL) | 823 | | { | 824 | | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 825 | | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 826 | | } | 827 | | if (hDecoder->pred_stat[paired_channel] == NULL) | 828 | | { | 829 | | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 830 | | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | 831 | | } | 832 | | } | 833 | | #endif | 834 | | | 835 | | #ifdef LTP_DEC | 836 | | if (is_ltp_ot(hDecoder->object_type)) | 837 | | { | 838 | | /* allocate the state only when needed */ | 839 | | if (hDecoder->lt_pred_stat[channel] == NULL) | 840 | | { | 841 | | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 842 | | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 843 | | } | 844 | | if (hDecoder->lt_pred_stat[paired_channel] == NULL) | 845 | | { | 846 | | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 847 | | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 848 | | } | 849 | | } | 850 | | #endif | 851 | | | 852 | 24.0k | { | 853 | 24.0k | mul = 1; | 854 | 24.0k | #ifdef SBR_DEC | 855 | 24.0k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 856 | 24.0k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 857 | 20.3k | { | 858 | | /* SBR requires 2 times as much output data */ | 859 | 20.3k | mul = 2; | 860 | 20.3k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 861 | 20.3k | } | 862 | 24.0k | #endif | 863 | 24.0k | } | 864 | 24.0k | if (hDecoder->time_out[channel] != NULL) | 865 | 4 | { | 866 | 4 | faad_free(hDecoder->time_out[channel]); | 867 | 4 | hDecoder->time_out[channel] = NULL; | 868 | 4 | } | 869 | 24.0k | if (hDecoder->time_out[paired_channel] != NULL) | 870 | 4 | { | 871 | 4 | faad_free(hDecoder->time_out[paired_channel]); | 872 | 4 | hDecoder->time_out[paired_channel] = NULL; | 873 | 4 | } | 874 | 24.0k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 875 | 24.0k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 876 | 24.0k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 877 | 24.0k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 878 | | | 879 | 24.0k | if (hDecoder->fb_intermed[channel] != NULL) | 880 | 4 | { | 881 | 4 | faad_free(hDecoder->fb_intermed[channel]); | 882 | 4 | hDecoder->fb_intermed[channel] = NULL; | 883 | 4 | } | 884 | 24.0k | if (hDecoder->fb_intermed[paired_channel] != NULL) | 885 | 0 | { | 886 | 0 | faad_free(hDecoder->fb_intermed[paired_channel]); | 887 | 0 | hDecoder->fb_intermed[paired_channel] = NULL; | 888 | 0 | } | 889 | 24.0k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 890 | 24.0k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 891 | 24.0k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 892 | 24.0k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | 893 | | | 894 | | #ifdef SSR_DEC | 895 | | if (hDecoder->object_type == SSR) | 896 | | { | 897 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) | 898 | | { | 899 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 900 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 901 | | } | 902 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | 903 | | { | 904 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 905 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 906 | | } | 907 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) | 908 | | { | 909 | | uint16_t k; | 910 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 911 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 912 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | 913 | | } | 914 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | 915 | | { | 916 | | uint16_t k; | 917 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 918 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 919 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | 920 | | } | 921 | | } | 922 | | #endif | 923 | | | 924 | 24.0k | return 0; | 925 | 24.0k | } |
specrec.c:allocate_channel_pair Line | Count | Source | 814 | 21.3k | { | 815 | 21.3k | int mul = 1; | 816 | | | 817 | 21.3k | #ifdef MAIN_DEC | 818 | | /* MAIN object type prediction */ | 819 | 21.3k | if (hDecoder->object_type == MAIN) | 820 | 10.6k | { | 821 | | /* allocate the state only when needed */ | 822 | 10.6k | if (hDecoder->pred_stat[channel] == NULL) | 823 | 10.6k | { | 824 | 10.6k | hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 825 | 10.6k | reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | 826 | 10.6k | } | 827 | 10.6k | if (hDecoder->pred_stat[paired_channel] == NULL) | 828 | 10.6k | { | 829 | 10.6k | hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | 830 | 10.6k | reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | 831 | 10.6k | } | 832 | 10.6k | } | 833 | 21.3k | #endif | 834 | | | 835 | 21.3k | #ifdef LTP_DEC | 836 | 21.3k | if (is_ltp_ot(hDecoder->object_type)) | 837 | 8.04k | { | 838 | | /* allocate the state only when needed */ | 839 | 8.04k | if (hDecoder->lt_pred_stat[channel] == NULL) | 840 | 8.00k | { | 841 | 8.00k | hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 842 | 8.00k | memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 843 | 8.00k | } | 844 | 8.04k | if (hDecoder->lt_pred_stat[paired_channel] == NULL) | 845 | 8.00k | { | 846 | 8.00k | hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | 847 | 8.00k | memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | 848 | 8.00k | } | 849 | 8.04k | } | 850 | 21.3k | #endif | 851 | | | 852 | 21.3k | { | 853 | 21.3k | mul = 1; | 854 | 21.3k | #ifdef SBR_DEC | 855 | 21.3k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | 856 | 21.3k | if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 857 | 16.2k | { | 858 | | /* SBR requires 2 times as much output data */ | 859 | 16.2k | mul = 2; | 860 | 16.2k | hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | 861 | 16.2k | } | 862 | 21.3k | #endif | 863 | 21.3k | } | 864 | 21.3k | if (hDecoder->time_out[channel] != NULL) | 865 | 88 | { | 866 | 88 | faad_free(hDecoder->time_out[channel]); | 867 | 88 | hDecoder->time_out[channel] = NULL; | 868 | 88 | } | 869 | 21.3k | if (hDecoder->time_out[paired_channel] != NULL) | 870 | 84 | { | 871 | 84 | faad_free(hDecoder->time_out[paired_channel]); | 872 | 84 | hDecoder->time_out[paired_channel] = NULL; | 873 | 84 | } | 874 | 21.3k | hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 875 | 21.3k | memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 876 | 21.3k | hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | 877 | 21.3k | memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | 878 | | | 879 | 21.3k | if (hDecoder->fb_intermed[channel] != NULL) | 880 | 88 | { | 881 | 88 | faad_free(hDecoder->fb_intermed[channel]); | 882 | 88 | hDecoder->fb_intermed[channel] = NULL; | 883 | 88 | } | 884 | 21.3k | if (hDecoder->fb_intermed[paired_channel] != NULL) | 885 | 84 | { | 886 | 84 | faad_free(hDecoder->fb_intermed[paired_channel]); | 887 | 84 | hDecoder->fb_intermed[paired_channel] = NULL; | 888 | 84 | } | 889 | 21.3k | hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 890 | 21.3k | memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | 891 | 21.3k | hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | 892 | 21.3k | memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | 893 | | | 894 | | #ifdef SSR_DEC | 895 | | if (hDecoder->object_type == SSR) | 896 | | { | 897 | | if (hDecoder->ssr_overlap[cpe->channel] == NULL) | 898 | | { | 899 | | hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 900 | | memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 901 | | } | 902 | | if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | 903 | | { | 904 | | hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 905 | | memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | 906 | | } | 907 | | if (hDecoder->prev_fmd[cpe->channel] == NULL) | 908 | | { | 909 | | uint16_t k; | 910 | | hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 911 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 912 | | hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | 913 | | } | 914 | | if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | 915 | | { | 916 | | uint16_t k; | 917 | | hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | 918 | | for (k = 0; k < 2*hDecoder->frameLength; k++) | 919 | | hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | 920 | | } | 921 | | } | 922 | | #endif | 923 | | | 924 | 21.3k | return 0; | 925 | 21.3k | } |
|
926 | | |
927 | | uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, |
928 | | element *sce, int16_t *spec_data) |
929 | 468k | { |
930 | 468k | uint8_t retval; |
931 | 468k | uint8_t output_channels; |
932 | 468k | ALIGN real_t spec_coef[1024]; |
933 | | |
934 | | #ifdef PROFILE |
935 | | int64_t count = faad_get_ts(); |
936 | | #endif |
937 | | |
938 | | |
939 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ |
940 | | #if ( (defined(DRM) && defined(DRM_PS)) ) |
941 | | output_channels = 2; |
942 | | #elif defined(PS_DEC) |
943 | 297k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) |
944 | 10.6k | output_channels = 2; |
945 | 286k | else |
946 | 286k | output_channels = 1; |
947 | | #else |
948 | | output_channels = 1; |
949 | | #endif |
950 | | |
951 | 468k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) |
952 | 406k | { |
953 | | /* element_output_channels not set yet */ |
954 | 406k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
955 | 406k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { |
956 | | /* element inconsistency */ |
957 | | |
958 | | /* this only happens if PS is actually found but not in the first frame |
959 | | * this means that there is only 1 bitstream element! |
960 | | */ |
961 | | |
962 | | /* The simplest way to fix the accounting, |
963 | | * is to reallocate this and all the following channels. |
964 | | */ |
965 | 1.27k | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, |
966 | 1.27k | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); |
967 | | |
968 | 1.27k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
969 | | |
970 | | //return 21; |
971 | 1.27k | } |
972 | | |
973 | 468k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) |
974 | 416k | { |
975 | 416k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); |
976 | 416k | if (retval > 0) |
977 | 0 | return retval; |
978 | | |
979 | 416k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; |
980 | 416k | } |
981 | | |
982 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ |
983 | 468k | if(!hDecoder->time_out[sce->channel]) |
984 | 0 | return 15; |
985 | 468k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) |
986 | 0 | return 15; |
987 | 468k | if(!hDecoder->fb_intermed[sce->channel]) |
988 | 0 | return 15; |
989 | | |
990 | | /* dequantisation and scaling */ |
991 | 468k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); |
992 | 468k | if (retval > 0) |
993 | 230 | return retval; |
994 | | |
995 | | #ifdef PROFILE |
996 | | count = faad_get_ts() - count; |
997 | | hDecoder->requant_cycles += count; |
998 | | #endif |
999 | | |
1000 | | |
1001 | | /* pns decoding */ |
1002 | 468k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, |
1003 | 468k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1004 | | |
1005 | | #ifdef MAIN_DEC |
1006 | | /* MAIN object type prediction */ |
1007 | 206k | if (hDecoder->object_type == MAIN) |
1008 | 79.8k | { |
1009 | 79.8k | if (!hDecoder->pred_stat[sce->channel]) |
1010 | 0 | return 33; |
1011 | | |
1012 | | /* intra channel prediction */ |
1013 | 79.8k | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, |
1014 | 79.8k | hDecoder->sf_index); |
1015 | | |
1016 | | /* In addition, for scalefactor bands coded by perceptual |
1017 | | noise substitution the predictors belonging to the |
1018 | | corresponding spectral coefficients are reset. |
1019 | | */ |
1020 | 79.8k | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); |
1021 | 79.8k | } |
1022 | 206k | #endif |
1023 | | |
1024 | | #ifdef LTP_DEC |
1025 | 296k | if (is_ltp_ot(hDecoder->object_type)) |
1026 | 100k | { |
1027 | 100k | #ifdef LD_DEC |
1028 | 100k | if (hDecoder->object_type == LD) |
1029 | 923 | { |
1030 | 923 | if (ics->ltp.data_present) |
1031 | 148 | { |
1032 | 148 | if (ics->ltp.lag_update) |
1033 | 49 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; |
1034 | 148 | } |
1035 | 923 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; |
1036 | 923 | } |
1037 | 100k | #endif |
1038 | | |
1039 | 100k | if (!hDecoder->lt_pred_stat[sce->channel]) |
1040 | 0 | return 34; |
1041 | | |
1042 | | /* long term prediction */ |
1043 | 100k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, |
1044 | 100k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], |
1045 | 100k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1046 | 100k | } |
1047 | 296k | #endif |
1048 | | |
1049 | | /* tns decoding */ |
1050 | 296k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, |
1051 | 296k | spec_coef, hDecoder->frameLength); |
1052 | | |
1053 | | /* drc decoding */ |
1054 | 296k | #ifdef APPLY_DRC |
1055 | 468k | if (hDecoder->drc->present) |
1056 | 19.3k | { |
1057 | 19.3k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) |
1058 | 17.4k | drc_decode(hDecoder->drc, spec_coef); |
1059 | 19.3k | } |
1060 | 296k | #endif |
1061 | | /* filter bank */ |
1062 | | #ifdef SSR_DEC |
1063 | | if (hDecoder->object_type != SSR) |
1064 | | { |
1065 | | #endif |
1066 | 296k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, |
1067 | 296k | hDecoder->window_shape_prev[sce->channel], spec_coef, |
1068 | 296k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], |
1069 | 296k | hDecoder->object_type, hDecoder->frameLength); |
1070 | | #ifdef SSR_DEC |
1071 | | } else { |
1072 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, |
1073 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], |
1074 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], |
1075 | | hDecoder->frameLength); |
1076 | | } |
1077 | | #endif |
1078 | | |
1079 | | /* save window shape for next frame */ |
1080 | 296k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; |
1081 | | |
1082 | | #ifdef LTP_DEC |
1083 | 296k | if (is_ltp_ot(hDecoder->object_type)) |
1084 | 100k | { |
1085 | 100k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], |
1086 | 100k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); |
1087 | 100k | } |
1088 | | #endif |
1089 | | |
1090 | 296k | #ifdef SBR_DEC |
1091 | 468k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1092 | 373k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1093 | 373k | { |
1094 | 373k | int ele = hDecoder->fr_ch_ele; |
1095 | 373k | int ch = sce->channel; |
1096 | | |
1097 | | /* following case can happen when forceUpSampling == 1 */ |
1098 | 373k | if (hDecoder->sbr[ele] == NULL) |
1099 | 277k | { |
1100 | 277k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, |
1101 | 277k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
1102 | 277k | hDecoder->downSampledSBR |
1103 | | #ifdef DRM |
1104 | | , 0 |
1105 | | #endif |
1106 | 277k | ); |
1107 | 277k | } |
1108 | 373k | if (!hDecoder->sbr[ele]) |
1109 | 68 | return 19; |
1110 | | |
1111 | 373k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
1112 | 47.0k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); |
1113 | 326k | else |
1114 | 326k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); |
1115 | | |
1116 | | /* check if any of the PS tools is used */ |
1117 | 373k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1118 | 373k | if (hDecoder->ps_used[ele] == 0) |
1119 | 353k | { |
1120 | 353k | #endif |
1121 | 353k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], |
1122 | 353k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
1123 | 353k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1124 | 353k | } else { |
1125 | 19.6k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], |
1126 | 19.6k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, |
1127 | 19.6k | hDecoder->downSampledSBR); |
1128 | 19.6k | } |
1129 | 373k | #endif |
1130 | 373k | if (retval > 0) |
1131 | 60 | return retval; |
1132 | 373k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1133 | 11 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1134 | 11 | { |
1135 | 11 | return 23; |
1136 | 11 | } |
1137 | 468k | #endif |
1138 | | |
1139 | | /* copy L to R when no PS is used */ |
1140 | 468k | #if (defined(PS_DEC) || defined(DRM_PS)) |
1141 | 468k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && |
1142 | 448k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) |
1143 | 162k | { |
1144 | 162k | int ele = hDecoder->fr_ch_ele; |
1145 | 162k | int ch = sce->channel; |
1146 | 162k | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; |
1147 | 162k | frame_size *= hDecoder->frameLength*sizeof(real_t); |
1148 | | |
1149 | 162k | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); |
1150 | 162k | } |
1151 | 468k | #endif |
1152 | | |
1153 | 468k | return 0; |
1154 | 296k | } reconstruct_single_channel Line | Count | Source | 929 | 171k | { | 930 | 171k | uint8_t retval; | 931 | 171k | uint8_t output_channels; | 932 | 171k | ALIGN real_t spec_coef[1024]; | 933 | | | 934 | | #ifdef PROFILE | 935 | | int64_t count = faad_get_ts(); | 936 | | #endif | 937 | | | 938 | | | 939 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 940 | 171k | #if ( (defined(DRM) && defined(DRM_PS)) ) | 941 | 171k | output_channels = 2; | 942 | | #elif defined(PS_DEC) | 943 | | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 944 | | output_channels = 2; | 945 | | else | 946 | | output_channels = 1; | 947 | | #else | 948 | | output_channels = 1; | 949 | | #endif | 950 | | | 951 | 171k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 952 | 150k | { | 953 | | /* element_output_channels not set yet */ | 954 | 150k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 955 | 150k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 956 | | /* element inconsistency */ | 957 | | | 958 | | /* this only happens if PS is actually found but not in the first frame | 959 | | * this means that there is only 1 bitstream element! | 960 | | */ | 961 | | | 962 | | /* The simplest way to fix the accounting, | 963 | | * is to reallocate this and all the following channels. | 964 | | */ | 965 | 0 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 966 | 0 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 967 | |
| 968 | 0 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 969 | | | 970 | | //return 21; | 971 | 0 | } | 972 | | | 973 | 171k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 974 | 150k | { | 975 | 150k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 976 | 150k | if (retval > 0) | 977 | 0 | return retval; | 978 | | | 979 | 150k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 980 | 150k | } | 981 | | | 982 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 983 | 171k | if(!hDecoder->time_out[sce->channel]) | 984 | 0 | return 15; | 985 | 171k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 986 | 0 | return 15; | 987 | 171k | if(!hDecoder->fb_intermed[sce->channel]) | 988 | 0 | return 15; | 989 | | | 990 | | /* dequantisation and scaling */ | 991 | 171k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 992 | 171k | if (retval > 0) | 993 | 123 | return retval; | 994 | | | 995 | | #ifdef PROFILE | 996 | | count = faad_get_ts() - count; | 997 | | hDecoder->requant_cycles += count; | 998 | | #endif | 999 | | | 1000 | | | 1001 | | /* pns decoding */ | 1002 | 171k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 1003 | 171k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1004 | | | 1005 | | #ifdef MAIN_DEC | 1006 | | /* MAIN object type prediction */ | 1007 | | if (hDecoder->object_type == MAIN) | 1008 | | { | 1009 | | if (!hDecoder->pred_stat[sce->channel]) | 1010 | | return 33; | 1011 | | | 1012 | | /* intra channel prediction */ | 1013 | | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 1014 | | hDecoder->sf_index); | 1015 | | | 1016 | | /* In addition, for scalefactor bands coded by perceptual | 1017 | | noise substitution the predictors belonging to the | 1018 | | corresponding spectral coefficients are reset. | 1019 | | */ | 1020 | | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 1021 | | } | 1022 | | #endif | 1023 | | | 1024 | | #ifdef LTP_DEC | 1025 | | if (is_ltp_ot(hDecoder->object_type)) | 1026 | | { | 1027 | | #ifdef LD_DEC | 1028 | | if (hDecoder->object_type == LD) | 1029 | | { | 1030 | | if (ics->ltp.data_present) | 1031 | | { | 1032 | | if (ics->ltp.lag_update) | 1033 | | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1034 | | } | 1035 | | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1036 | | } | 1037 | | #endif | 1038 | | | 1039 | | if (!hDecoder->lt_pred_stat[sce->channel]) | 1040 | | return 34; | 1041 | | | 1042 | | /* long term prediction */ | 1043 | | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1044 | | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1045 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1046 | | } | 1047 | | #endif | 1048 | | | 1049 | | /* tns decoding */ | 1050 | 171k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1051 | 171k | spec_coef, hDecoder->frameLength); | 1052 | | | 1053 | | /* drc decoding */ | 1054 | 171k | #ifdef APPLY_DRC | 1055 | 171k | if (hDecoder->drc->present) | 1056 | 0 | { | 1057 | 0 | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1058 | 0 | drc_decode(hDecoder->drc, spec_coef); | 1059 | 0 | } | 1060 | 171k | #endif | 1061 | | /* filter bank */ | 1062 | | #ifdef SSR_DEC | 1063 | | if (hDecoder->object_type != SSR) | 1064 | | { | 1065 | | #endif | 1066 | 171k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1067 | 171k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1068 | 171k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1069 | 171k | hDecoder->object_type, hDecoder->frameLength); | 1070 | | #ifdef SSR_DEC | 1071 | | } else { | 1072 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1073 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1074 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1075 | | hDecoder->frameLength); | 1076 | | } | 1077 | | #endif | 1078 | | | 1079 | | /* save window shape for next frame */ | 1080 | 171k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1081 | | | 1082 | | #ifdef LTP_DEC | 1083 | | if (is_ltp_ot(hDecoder->object_type)) | 1084 | | { | 1085 | | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1086 | | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1087 | | } | 1088 | | #endif | 1089 | | | 1090 | 171k | #ifdef SBR_DEC | 1091 | 171k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1092 | 146k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1093 | 146k | { | 1094 | 146k | int ele = hDecoder->fr_ch_ele; | 1095 | 146k | int ch = sce->channel; | 1096 | | | 1097 | | /* following case can happen when forceUpSampling == 1 */ | 1098 | 146k | if (hDecoder->sbr[ele] == NULL) | 1099 | 110k | { | 1100 | 110k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1101 | 110k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1102 | 110k | hDecoder->downSampledSBR | 1103 | 110k | #ifdef DRM | 1104 | 110k | , 0 | 1105 | 110k | #endif | 1106 | 110k | ); | 1107 | 110k | } | 1108 | 146k | if (!hDecoder->sbr[ele]) | 1109 | 0 | return 19; | 1110 | | | 1111 | 146k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1112 | 16.2k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1113 | 130k | else | 1114 | 130k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1115 | | | 1116 | | /* check if any of the PS tools is used */ | 1117 | 146k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1118 | 146k | if (hDecoder->ps_used[ele] == 0) | 1119 | 137k | { | 1120 | 137k | #endif | 1121 | 137k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1122 | 137k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1123 | 137k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1124 | 137k | } else { | 1125 | 8.92k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1126 | 8.92k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1127 | 8.92k | hDecoder->downSampledSBR); | 1128 | 8.92k | } | 1129 | 146k | #endif | 1130 | 146k | if (retval > 0) | 1131 | 19 | return retval; | 1132 | 146k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1133 | 5 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1134 | 5 | { | 1135 | 5 | return 23; | 1136 | 5 | } | 1137 | 171k | #endif | 1138 | | | 1139 | | /* copy L to R when no PS is used */ | 1140 | 171k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1141 | 171k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1142 | 162k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1143 | 162k | { | 1144 | 162k | int ele = hDecoder->fr_ch_ele; | 1145 | 162k | int ch = sce->channel; | 1146 | 162k | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1147 | 162k | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1148 | | | 1149 | 162k | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1150 | 162k | } | 1151 | 171k | #endif | 1152 | | | 1153 | 171k | return 0; | 1154 | 171k | } |
reconstruct_single_channel Line | Count | Source | 929 | 206k | { | 930 | 206k | uint8_t retval; | 931 | 206k | uint8_t output_channels; | 932 | 206k | ALIGN real_t spec_coef[1024]; | 933 | | | 934 | | #ifdef PROFILE | 935 | | int64_t count = faad_get_ts(); | 936 | | #endif | 937 | | | 938 | | | 939 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 940 | | #if ( (defined(DRM) && defined(DRM_PS)) ) | 941 | | output_channels = 2; | 942 | | #elif defined(PS_DEC) | 943 | 206k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 944 | 5.36k | output_channels = 2; | 945 | 201k | else | 946 | 201k | output_channels = 1; | 947 | | #else | 948 | | output_channels = 1; | 949 | | #endif | 950 | | | 951 | 206k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 952 | 179k | { | 953 | | /* element_output_channels not set yet */ | 954 | 179k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 955 | 179k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 956 | | /* element inconsistency */ | 957 | | | 958 | | /* this only happens if PS is actually found but not in the first frame | 959 | | * this means that there is only 1 bitstream element! | 960 | | */ | 961 | | | 962 | | /* The simplest way to fix the accounting, | 963 | | * is to reallocate this and all the following channels. | 964 | | */ | 965 | 519 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 966 | 519 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 967 | | | 968 | 519 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 969 | | | 970 | | //return 21; | 971 | 519 | } | 972 | | | 973 | 206k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 974 | 184k | { | 975 | 184k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 976 | 184k | if (retval > 0) | 977 | 0 | return retval; | 978 | | | 979 | 184k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 980 | 184k | } | 981 | | | 982 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 983 | 206k | if(!hDecoder->time_out[sce->channel]) | 984 | 0 | return 15; | 985 | 206k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 986 | 0 | return 15; | 987 | 206k | if(!hDecoder->fb_intermed[sce->channel]) | 988 | 0 | return 15; | 989 | | | 990 | | /* dequantisation and scaling */ | 991 | 206k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 992 | 206k | if (retval > 0) | 993 | 80 | return retval; | 994 | | | 995 | | #ifdef PROFILE | 996 | | count = faad_get_ts() - count; | 997 | | hDecoder->requant_cycles += count; | 998 | | #endif | 999 | | | 1000 | | | 1001 | | /* pns decoding */ | 1002 | 206k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 1003 | 206k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1004 | | | 1005 | 206k | #ifdef MAIN_DEC | 1006 | | /* MAIN object type prediction */ | 1007 | 206k | if (hDecoder->object_type == MAIN) | 1008 | 79.8k | { | 1009 | 79.8k | if (!hDecoder->pred_stat[sce->channel]) | 1010 | 0 | return 33; | 1011 | | | 1012 | | /* intra channel prediction */ | 1013 | 79.8k | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 1014 | 79.8k | hDecoder->sf_index); | 1015 | | | 1016 | | /* In addition, for scalefactor bands coded by perceptual | 1017 | | noise substitution the predictors belonging to the | 1018 | | corresponding spectral coefficients are reset. | 1019 | | */ | 1020 | 79.8k | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 1021 | 79.8k | } | 1022 | 206k | #endif | 1023 | | | 1024 | 206k | #ifdef LTP_DEC | 1025 | 206k | if (is_ltp_ot(hDecoder->object_type)) | 1026 | 57.8k | { | 1027 | 57.8k | #ifdef LD_DEC | 1028 | 57.8k | if (hDecoder->object_type == LD) | 1029 | 633 | { | 1030 | 633 | if (ics->ltp.data_present) | 1031 | 102 | { | 1032 | 102 | if (ics->ltp.lag_update) | 1033 | 28 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1034 | 102 | } | 1035 | 633 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1036 | 633 | } | 1037 | 57.8k | #endif | 1038 | | | 1039 | 57.8k | if (!hDecoder->lt_pred_stat[sce->channel]) | 1040 | 0 | return 34; | 1041 | | | 1042 | | /* long term prediction */ | 1043 | 57.8k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1044 | 57.8k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1045 | 57.8k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1046 | 57.8k | } | 1047 | 206k | #endif | 1048 | | | 1049 | | /* tns decoding */ | 1050 | 206k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1051 | 206k | spec_coef, hDecoder->frameLength); | 1052 | | | 1053 | | /* drc decoding */ | 1054 | 206k | #ifdef APPLY_DRC | 1055 | 206k | if (hDecoder->drc->present) | 1056 | 13.6k | { | 1057 | 13.6k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1058 | 12.6k | drc_decode(hDecoder->drc, spec_coef); | 1059 | 13.6k | } | 1060 | 206k | #endif | 1061 | | /* filter bank */ | 1062 | | #ifdef SSR_DEC | 1063 | | if (hDecoder->object_type != SSR) | 1064 | | { | 1065 | | #endif | 1066 | 206k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1067 | 206k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1068 | 206k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1069 | 206k | hDecoder->object_type, hDecoder->frameLength); | 1070 | | #ifdef SSR_DEC | 1071 | | } else { | 1072 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1073 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1074 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1075 | | hDecoder->frameLength); | 1076 | | } | 1077 | | #endif | 1078 | | | 1079 | | /* save window shape for next frame */ | 1080 | 206k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1081 | | | 1082 | 206k | #ifdef LTP_DEC | 1083 | 206k | if (is_ltp_ot(hDecoder->object_type)) | 1084 | 57.8k | { | 1085 | 57.8k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1086 | 57.8k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1087 | 57.8k | } | 1088 | 206k | #endif | 1089 | | | 1090 | 206k | #ifdef SBR_DEC | 1091 | 206k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1092 | 154k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1093 | 154k | { | 1094 | 154k | int ele = hDecoder->fr_ch_ele; | 1095 | 154k | int ch = sce->channel; | 1096 | | | 1097 | | /* following case can happen when forceUpSampling == 1 */ | 1098 | 154k | if (hDecoder->sbr[ele] == NULL) | 1099 | 117k | { | 1100 | 117k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1101 | 117k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1102 | 117k | hDecoder->downSampledSBR | 1103 | | #ifdef DRM | 1104 | | , 0 | 1105 | | #endif | 1106 | 117k | ); | 1107 | 117k | } | 1108 | 154k | if (!hDecoder->sbr[ele]) | 1109 | 28 | return 19; | 1110 | | | 1111 | 154k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1112 | 18.2k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1113 | 136k | else | 1114 | 136k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1115 | | | 1116 | | /* check if any of the PS tools is used */ | 1117 | 154k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1118 | 154k | if (hDecoder->ps_used[ele] == 0) | 1119 | 149k | { | 1120 | 149k | #endif | 1121 | 149k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1122 | 149k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1123 | 149k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1124 | 149k | } else { | 1125 | 5.36k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1126 | 5.36k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1127 | 5.36k | hDecoder->downSampledSBR); | 1128 | 5.36k | } | 1129 | 154k | #endif | 1130 | 154k | if (retval > 0) | 1131 | 30 | return retval; | 1132 | 154k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1133 | 3 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1134 | 3 | { | 1135 | 3 | return 23; | 1136 | 3 | } | 1137 | 206k | #endif | 1138 | | | 1139 | | /* copy L to R when no PS is used */ | 1140 | 206k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1141 | 206k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1142 | 201k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1143 | 0 | { | 1144 | 0 | int ele = hDecoder->fr_ch_ele; | 1145 | 0 | int ch = sce->channel; | 1146 | 0 | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1147 | 0 | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1148 | |
| 1149 | 0 | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1150 | 0 | } | 1151 | 206k | #endif | 1152 | | | 1153 | 206k | return 0; | 1154 | 206k | } |
reconstruct_single_channel Line | Count | Source | 929 | 90.5k | { | 930 | 90.5k | uint8_t retval; | 931 | 90.5k | uint8_t output_channels; | 932 | 90.5k | ALIGN real_t spec_coef[1024]; | 933 | | | 934 | | #ifdef PROFILE | 935 | | int64_t count = faad_get_ts(); | 936 | | #endif | 937 | | | 938 | | | 939 | | /* always allocate 2 channels, PS can always "suddenly" turn up */ | 940 | | #if ( (defined(DRM) && defined(DRM_PS)) ) | 941 | | output_channels = 2; | 942 | | #elif defined(PS_DEC) | 943 | 90.5k | if (hDecoder->ps_used[hDecoder->fr_ch_ele]) | 944 | 5.32k | output_channels = 2; | 945 | 85.1k | else | 946 | 85.1k | output_channels = 1; | 947 | | #else | 948 | | output_channels = 1; | 949 | | #endif | 950 | | | 951 | 90.5k | if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) | 952 | 76.7k | { | 953 | | /* element_output_channels not set yet */ | 954 | 76.7k | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 955 | 76.7k | } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { | 956 | | /* element inconsistency */ | 957 | | | 958 | | /* this only happens if PS is actually found but not in the first frame | 959 | | * this means that there is only 1 bitstream element! | 960 | | */ | 961 | | | 962 | | /* The simplest way to fix the accounting, | 963 | | * is to reallocate this and all the following channels. | 964 | | */ | 965 | 759 | memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, | 966 | 759 | sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); | 967 | | | 968 | 759 | hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; | 969 | | | 970 | | //return 21; | 971 | 759 | } | 972 | | | 973 | 90.5k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | 974 | 81.1k | { | 975 | 81.1k | retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | 976 | 81.1k | if (retval > 0) | 977 | 0 | return retval; | 978 | | | 979 | 81.1k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | 980 | 81.1k | } | 981 | | | 982 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 983 | 90.5k | if(!hDecoder->time_out[sce->channel]) | 984 | 0 | return 15; | 985 | 90.5k | if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) | 986 | 0 | return 15; | 987 | 90.5k | if(!hDecoder->fb_intermed[sce->channel]) | 988 | 0 | return 15; | 989 | | | 990 | | /* dequantisation and scaling */ | 991 | 90.5k | retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); | 992 | 90.5k | if (retval > 0) | 993 | 27 | return retval; | 994 | | | 995 | | #ifdef PROFILE | 996 | | count = faad_get_ts() - count; | 997 | | hDecoder->requant_cycles += count; | 998 | | #endif | 999 | | | 1000 | | | 1001 | | /* pns decoding */ | 1002 | 90.4k | pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, | 1003 | 90.4k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1004 | | | 1005 | | #ifdef MAIN_DEC | 1006 | | /* MAIN object type prediction */ | 1007 | | if (hDecoder->object_type == MAIN) | 1008 | | { | 1009 | | if (!hDecoder->pred_stat[sce->channel]) | 1010 | | return 33; | 1011 | | | 1012 | | /* intra channel prediction */ | 1013 | | ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | 1014 | | hDecoder->sf_index); | 1015 | | | 1016 | | /* In addition, for scalefactor bands coded by perceptual | 1017 | | noise substitution the predictors belonging to the | 1018 | | corresponding spectral coefficients are reset. | 1019 | | */ | 1020 | | pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | 1021 | | } | 1022 | | #endif | 1023 | | | 1024 | 90.4k | #ifdef LTP_DEC | 1025 | 90.4k | if (is_ltp_ot(hDecoder->object_type)) | 1026 | 42.3k | { | 1027 | 42.3k | #ifdef LD_DEC | 1028 | 42.3k | if (hDecoder->object_type == LD) | 1029 | 290 | { | 1030 | 290 | if (ics->ltp.data_present) | 1031 | 46 | { | 1032 | 46 | if (ics->ltp.lag_update) | 1033 | 21 | hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | 1034 | 46 | } | 1035 | 290 | ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | 1036 | 290 | } | 1037 | 42.3k | #endif | 1038 | | | 1039 | 42.3k | if (!hDecoder->lt_pred_stat[sce->channel]) | 1040 | 0 | return 34; | 1041 | | | 1042 | | /* long term prediction */ | 1043 | 42.3k | lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | 1044 | 42.3k | ics->window_shape, hDecoder->window_shape_prev[sce->channel], | 1045 | 42.3k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1046 | 42.3k | } | 1047 | 90.4k | #endif | 1048 | | | 1049 | | /* tns decoding */ | 1050 | 90.4k | tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | 1051 | 90.4k | spec_coef, hDecoder->frameLength); | 1052 | | | 1053 | | /* drc decoding */ | 1054 | 90.4k | #ifdef APPLY_DRC | 1055 | 90.4k | if (hDecoder->drc->present) | 1056 | 5.70k | { | 1057 | 5.70k | if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | 1058 | 4.83k | drc_decode(hDecoder->drc, spec_coef); | 1059 | 5.70k | } | 1060 | 90.4k | #endif | 1061 | | /* filter bank */ | 1062 | | #ifdef SSR_DEC | 1063 | | if (hDecoder->object_type != SSR) | 1064 | | { | 1065 | | #endif | 1066 | 90.4k | ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | 1067 | 90.4k | hDecoder->window_shape_prev[sce->channel], spec_coef, | 1068 | 90.4k | hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | 1069 | 90.4k | hDecoder->object_type, hDecoder->frameLength); | 1070 | | #ifdef SSR_DEC | 1071 | | } else { | 1072 | | ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | 1073 | | hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | 1074 | | hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | 1075 | | hDecoder->frameLength); | 1076 | | } | 1077 | | #endif | 1078 | | | 1079 | | /* save window shape for next frame */ | 1080 | 90.4k | hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | 1081 | | | 1082 | 90.4k | #ifdef LTP_DEC | 1083 | 90.4k | if (is_ltp_ot(hDecoder->object_type)) | 1084 | 42.3k | { | 1085 | 42.3k | lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | 1086 | 42.3k | hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | 1087 | 42.3k | } | 1088 | 90.4k | #endif | 1089 | | | 1090 | 90.4k | #ifdef SBR_DEC | 1091 | 90.4k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1092 | 71.7k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1093 | 71.7k | { | 1094 | 71.7k | int ele = hDecoder->fr_ch_ele; | 1095 | 71.7k | int ch = sce->channel; | 1096 | | | 1097 | | /* following case can happen when forceUpSampling == 1 */ | 1098 | 71.7k | if (hDecoder->sbr[ele] == NULL) | 1099 | 49.1k | { | 1100 | 49.1k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1101 | 49.1k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1102 | 49.1k | hDecoder->downSampledSBR | 1103 | | #ifdef DRM | 1104 | | , 0 | 1105 | | #endif | 1106 | 49.1k | ); | 1107 | 49.1k | } | 1108 | 71.7k | if (!hDecoder->sbr[ele]) | 1109 | 40 | return 19; | 1110 | | | 1111 | 71.6k | if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1112 | 12.5k | hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1113 | 59.1k | else | 1114 | 59.1k | hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); | 1115 | | | 1116 | | /* check if any of the PS tools is used */ | 1117 | 71.6k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1118 | 71.6k | if (hDecoder->ps_used[ele] == 0) | 1119 | 66.3k | { | 1120 | 66.3k | #endif | 1121 | 66.3k | retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1122 | 66.3k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1123 | 66.3k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1124 | 66.3k | } else { | 1125 | 5.32k | retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | 1126 | 5.32k | hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | 1127 | 5.32k | hDecoder->downSampledSBR); | 1128 | 5.32k | } | 1129 | 71.6k | #endif | 1130 | 71.6k | if (retval > 0) | 1131 | 11 | return retval; | 1132 | 71.6k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1133 | 3 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1134 | 3 | { | 1135 | 3 | return 23; | 1136 | 3 | } | 1137 | 90.4k | #endif | 1138 | | | 1139 | | /* copy L to R when no PS is used */ | 1140 | 90.4k | #if (defined(PS_DEC) || defined(DRM_PS)) | 1141 | 90.4k | if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && | 1142 | 85.1k | (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) | 1143 | 0 | { | 1144 | 0 | int ele = hDecoder->fr_ch_ele; | 1145 | 0 | int ch = sce->channel; | 1146 | 0 | int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; | 1147 | 0 | frame_size *= hDecoder->frameLength*sizeof(real_t); | 1148 | |
| 1149 | 0 | memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); | 1150 | 0 | } | 1151 | 90.4k | #endif | 1152 | | | 1153 | 90.4k | return 0; | 1154 | 90.4k | } |
|
1155 | | |
1156 | | uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, |
1157 | | element *cpe, int16_t *spec_data1, int16_t *spec_data2) |
1158 | 71.2k | { |
1159 | 71.2k | uint8_t retval; |
1160 | 71.2k | ALIGN real_t spec_coef1[1024]; |
1161 | 71.2k | ALIGN real_t spec_coef2[1024]; |
1162 | | |
1163 | | #ifdef PROFILE |
1164 | | int64_t count = faad_get_ts(); |
1165 | | #endif |
1166 | 71.2k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) |
1167 | 59.2k | { |
1168 | 59.2k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); |
1169 | 59.2k | if (retval > 0) |
1170 | 0 | return retval; |
1171 | | |
1172 | 59.2k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; |
1173 | 59.2k | } |
1174 | | |
1175 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ |
1176 | 71.2k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) |
1177 | 0 | return 15; |
1178 | 71.2k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) |
1179 | 0 | return 15; |
1180 | | |
1181 | | /* dequantisation and scaling */ |
1182 | 71.2k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); |
1183 | 71.2k | if (retval > 0) |
1184 | 110 | return retval; |
1185 | 71.1k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); |
1186 | 71.1k | if (retval > 0) |
1187 | 13 | return retval; |
1188 | | |
1189 | | #ifdef PROFILE |
1190 | | count = faad_get_ts() - count; |
1191 | | hDecoder->requant_cycles += count; |
1192 | | #endif |
1193 | | |
1194 | | /* pns decoding */ |
1195 | 71.1k | if (ics1->ms_mask_present) |
1196 | 18.5k | { |
1197 | 18.5k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, |
1198 | 18.5k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1199 | 52.5k | } else { |
1200 | 52.5k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, |
1201 | 52.5k | &(hDecoder->__r1), &(hDecoder->__r2)); |
1202 | 52.5k | } |
1203 | | |
1204 | | /* mid/side decoding */ |
1205 | 71.1k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); |
1206 | | |
1207 | | #if 0 |
1208 | | { |
1209 | | int i; |
1210 | | for (i = 0; i < 1024; i++) |
1211 | | { |
1212 | | //printf("%d\n", spec_coef1[i]); |
1213 | | printf("0x%.8X\n", spec_coef1[i]); |
1214 | | } |
1215 | | for (i = 0; i < 1024; i++) |
1216 | | { |
1217 | | //printf("%d\n", spec_coef2[i]); |
1218 | | printf("0x%.8X\n", spec_coef2[i]); |
1219 | | } |
1220 | | } |
1221 | | #endif |
1222 | | |
1223 | | /* intensity stereo decoding */ |
1224 | 71.1k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); |
1225 | | |
1226 | | #if 0 |
1227 | | { |
1228 | | int i; |
1229 | | for (i = 0; i < 1024; i++) |
1230 | | { |
1231 | | printf("%d\n", spec_coef1[i]); |
1232 | | //printf("0x%.8X\n", spec_coef1[i]); |
1233 | | } |
1234 | | for (i = 0; i < 1024; i++) |
1235 | | { |
1236 | | printf("%d\n", spec_coef2[i]); |
1237 | | //printf("0x%.8X\n", spec_coef2[i]); |
1238 | | } |
1239 | | } |
1240 | | #endif |
1241 | | |
1242 | | #ifdef MAIN_DEC |
1243 | | /* MAIN object type prediction */ |
1244 | 25.4k | if (hDecoder->object_type == MAIN) |
1245 | 12.4k | { |
1246 | 12.4k | if (!hDecoder->pred_stat[cpe->channel] || !hDecoder->pred_stat[cpe->paired_channel]) |
1247 | 0 | return 33; |
1248 | | |
1249 | | /* intra channel prediction */ |
1250 | 12.4k | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, |
1251 | 12.4k | hDecoder->sf_index); |
1252 | 12.4k | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, |
1253 | 12.4k | hDecoder->sf_index); |
1254 | | |
1255 | | /* In addition, for scalefactor bands coded by perceptual |
1256 | | noise substitution the predictors belonging to the |
1257 | | corresponding spectral coefficients are reset. |
1258 | | */ |
1259 | 12.4k | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); |
1260 | 12.4k | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); |
1261 | 12.4k | } |
1262 | 25.4k | #endif |
1263 | | |
1264 | | #ifdef LTP_DEC |
1265 | 42.1k | if (is_ltp_ot(hDecoder->object_type)) |
1266 | 16.2k | { |
1267 | 16.2k | ltp_info *ltp1 = &(ics1->ltp); |
1268 | 16.2k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); |
1269 | 16.2k | #ifdef LD_DEC |
1270 | 16.2k | if (hDecoder->object_type == LD) |
1271 | 1.40k | { |
1272 | 1.40k | if (ltp1->data_present) |
1273 | 205 | { |
1274 | 205 | if (ltp1->lag_update) |
1275 | 81 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; |
1276 | 205 | } |
1277 | 1.40k | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; |
1278 | 1.40k | if (ltp2->data_present) |
1279 | 116 | { |
1280 | 116 | if (ltp2->lag_update) |
1281 | 54 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; |
1282 | 116 | } |
1283 | 1.40k | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; |
1284 | 1.40k | } |
1285 | 16.2k | #endif |
1286 | | |
1287 | 16.2k | if (!hDecoder->lt_pred_stat[cpe->channel] || !hDecoder->lt_pred_stat[cpe->paired_channel]) |
1288 | 0 | return 34; |
1289 | | |
1290 | | /* long term prediction */ |
1291 | 16.2k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, |
1292 | 16.2k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], |
1293 | 16.2k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1294 | 16.2k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, |
1295 | 16.2k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], |
1296 | 16.2k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); |
1297 | 16.2k | } |
1298 | 42.1k | #endif |
1299 | | |
1300 | | /* tns decoding */ |
1301 | 42.1k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, |
1302 | 42.1k | spec_coef1, hDecoder->frameLength); |
1303 | 42.1k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, |
1304 | 42.1k | spec_coef2, hDecoder->frameLength); |
1305 | | |
1306 | | /* drc decoding */ |
1307 | 42.1k | #if APPLY_DRC |
1308 | 71.1k | if (hDecoder->drc->present) |
1309 | 1.46k | { |
1310 | 1.46k | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) |
1311 | 1.26k | drc_decode(hDecoder->drc, spec_coef1); |
1312 | 1.46k | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) |
1313 | 1.28k | drc_decode(hDecoder->drc, spec_coef2); |
1314 | 1.46k | } |
1315 | 42.1k | #endif |
1316 | | /* filter bank */ |
1317 | | #ifdef SSR_DEC |
1318 | | if (hDecoder->object_type != SSR) |
1319 | | { |
1320 | | #endif |
1321 | 42.1k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, |
1322 | 42.1k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, |
1323 | 42.1k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], |
1324 | 42.1k | hDecoder->object_type, hDecoder->frameLength); |
1325 | 42.1k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, |
1326 | 42.1k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, |
1327 | 42.1k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], |
1328 | 42.1k | hDecoder->object_type, hDecoder->frameLength); |
1329 | | #ifdef SSR_DEC |
1330 | | } else { |
1331 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, |
1332 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], |
1333 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], |
1334 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); |
1335 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, |
1336 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], |
1337 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], |
1338 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); |
1339 | | } |
1340 | | #endif |
1341 | | |
1342 | | /* save window shape for next frame */ |
1343 | 42.1k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; |
1344 | 42.1k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; |
1345 | | |
1346 | | #ifdef LTP_DEC |
1347 | 42.1k | if (is_ltp_ot(hDecoder->object_type)) |
1348 | 16.2k | { |
1349 | 16.2k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], |
1350 | 16.2k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); |
1351 | 16.2k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], |
1352 | 16.2k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); |
1353 | 16.2k | } |
1354 | | #endif |
1355 | | |
1356 | 42.1k | #ifdef SBR_DEC |
1357 | 71.1k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1358 | 59.2k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1359 | 59.2k | { |
1360 | 59.2k | int ele = hDecoder->fr_ch_ele; |
1361 | 59.2k | int ch0 = cpe->channel; |
1362 | 59.2k | int ch1 = cpe->paired_channel; |
1363 | | |
1364 | | /* following case can happen when forceUpSampling == 1 */ |
1365 | 59.2k | if (hDecoder->sbr[ele] == NULL) |
1366 | 18.5k | { |
1367 | 18.5k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, |
1368 | 18.5k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
1369 | 18.5k | hDecoder->downSampledSBR |
1370 | | #ifdef DRM |
1371 | | , 0 |
1372 | | #endif |
1373 | 18.5k | ); |
1374 | 18.5k | } |
1375 | 59.2k | if (!hDecoder->sbr[ele]) |
1376 | 51 | return 19; |
1377 | | |
1378 | 59.2k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
1379 | 3.32k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); |
1380 | 55.9k | else |
1381 | 55.9k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); |
1382 | | |
1383 | 59.2k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], |
1384 | 59.2k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], |
1385 | 59.2k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
1386 | 59.2k | if (retval > 0) |
1387 | 4 | return retval; |
1388 | 59.2k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) |
1389 | 5 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) |
1390 | 5 | { |
1391 | 5 | return 23; |
1392 | 5 | } |
1393 | 71.0k | #endif |
1394 | | |
1395 | 71.0k | return 0; |
1396 | 42.1k | } Line | Count | Source | 1158 | 29.0k | { | 1159 | 29.0k | uint8_t retval; | 1160 | 29.0k | ALIGN real_t spec_coef1[1024]; | 1161 | 29.0k | ALIGN real_t spec_coef2[1024]; | 1162 | | | 1163 | | #ifdef PROFILE | 1164 | | int64_t count = faad_get_ts(); | 1165 | | #endif | 1166 | 29.0k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1167 | 24.0k | { | 1168 | 24.0k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1169 | 24.0k | if (retval > 0) | 1170 | 0 | return retval; | 1171 | | | 1172 | 24.0k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1173 | 24.0k | } | 1174 | | | 1175 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1176 | 29.0k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1177 | 0 | return 15; | 1178 | 29.0k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1179 | 0 | return 15; | 1180 | | | 1181 | | /* dequantisation and scaling */ | 1182 | 29.0k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1183 | 29.0k | if (retval > 0) | 1184 | 56 | return retval; | 1185 | 28.9k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1186 | 28.9k | if (retval > 0) | 1187 | 7 | return retval; | 1188 | | | 1189 | | #ifdef PROFILE | 1190 | | count = faad_get_ts() - count; | 1191 | | hDecoder->requant_cycles += count; | 1192 | | #endif | 1193 | | | 1194 | | /* pns decoding */ | 1195 | 28.9k | if (ics1->ms_mask_present) | 1196 | 6.41k | { | 1197 | 6.41k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1198 | 6.41k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1199 | 22.5k | } else { | 1200 | 22.5k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1201 | 22.5k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1202 | 22.5k | } | 1203 | | | 1204 | | /* mid/side decoding */ | 1205 | 28.9k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1206 | | | 1207 | | #if 0 | 1208 | | { | 1209 | | int i; | 1210 | | for (i = 0; i < 1024; i++) | 1211 | | { | 1212 | | //printf("%d\n", spec_coef1[i]); | 1213 | | printf("0x%.8X\n", spec_coef1[i]); | 1214 | | } | 1215 | | for (i = 0; i < 1024; i++) | 1216 | | { | 1217 | | //printf("%d\n", spec_coef2[i]); | 1218 | | printf("0x%.8X\n", spec_coef2[i]); | 1219 | | } | 1220 | | } | 1221 | | #endif | 1222 | | | 1223 | | /* intensity stereo decoding */ | 1224 | 28.9k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1225 | | | 1226 | | #if 0 | 1227 | | { | 1228 | | int i; | 1229 | | for (i = 0; i < 1024; i++) | 1230 | | { | 1231 | | printf("%d\n", spec_coef1[i]); | 1232 | | //printf("0x%.8X\n", spec_coef1[i]); | 1233 | | } | 1234 | | for (i = 0; i < 1024; i++) | 1235 | | { | 1236 | | printf("%d\n", spec_coef2[i]); | 1237 | | //printf("0x%.8X\n", spec_coef2[i]); | 1238 | | } | 1239 | | } | 1240 | | #endif | 1241 | | | 1242 | | #ifdef MAIN_DEC | 1243 | | /* MAIN object type prediction */ | 1244 | | if (hDecoder->object_type == MAIN) | 1245 | | { | 1246 | | if (!hDecoder->pred_stat[cpe->channel] || !hDecoder->pred_stat[cpe->paired_channel]) | 1247 | | return 33; | 1248 | | | 1249 | | /* intra channel prediction */ | 1250 | | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1251 | | hDecoder->sf_index); | 1252 | | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1253 | | hDecoder->sf_index); | 1254 | | | 1255 | | /* In addition, for scalefactor bands coded by perceptual | 1256 | | noise substitution the predictors belonging to the | 1257 | | corresponding spectral coefficients are reset. | 1258 | | */ | 1259 | | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1260 | | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1261 | | } | 1262 | | #endif | 1263 | | | 1264 | | #ifdef LTP_DEC | 1265 | | if (is_ltp_ot(hDecoder->object_type)) | 1266 | | { | 1267 | | ltp_info *ltp1 = &(ics1->ltp); | 1268 | | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1269 | | #ifdef LD_DEC | 1270 | | if (hDecoder->object_type == LD) | 1271 | | { | 1272 | | if (ltp1->data_present) | 1273 | | { | 1274 | | if (ltp1->lag_update) | 1275 | | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1276 | | } | 1277 | | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1278 | | if (ltp2->data_present) | 1279 | | { | 1280 | | if (ltp2->lag_update) | 1281 | | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1282 | | } | 1283 | | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1284 | | } | 1285 | | #endif | 1286 | | | 1287 | | if (!hDecoder->lt_pred_stat[cpe->channel] || !hDecoder->lt_pred_stat[cpe->paired_channel]) | 1288 | | return 34; | 1289 | | | 1290 | | /* long term prediction */ | 1291 | | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1292 | | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1293 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1294 | | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1295 | | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1296 | | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1297 | | } | 1298 | | #endif | 1299 | | | 1300 | | /* tns decoding */ | 1301 | 28.9k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1302 | 28.9k | spec_coef1, hDecoder->frameLength); | 1303 | 28.9k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1304 | 28.9k | spec_coef2, hDecoder->frameLength); | 1305 | | | 1306 | | /* drc decoding */ | 1307 | 28.9k | #if APPLY_DRC | 1308 | 28.9k | if (hDecoder->drc->present) | 1309 | 0 | { | 1310 | 0 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1311 | 0 | drc_decode(hDecoder->drc, spec_coef1); | 1312 | 0 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1313 | 0 | drc_decode(hDecoder->drc, spec_coef2); | 1314 | 0 | } | 1315 | 28.9k | #endif | 1316 | | /* filter bank */ | 1317 | | #ifdef SSR_DEC | 1318 | | if (hDecoder->object_type != SSR) | 1319 | | { | 1320 | | #endif | 1321 | 28.9k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1322 | 28.9k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1323 | 28.9k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1324 | 28.9k | hDecoder->object_type, hDecoder->frameLength); | 1325 | 28.9k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1326 | 28.9k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1327 | 28.9k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1328 | 28.9k | hDecoder->object_type, hDecoder->frameLength); | 1329 | | #ifdef SSR_DEC | 1330 | | } else { | 1331 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1332 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1333 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1334 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1335 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1336 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1337 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1338 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1339 | | } | 1340 | | #endif | 1341 | | | 1342 | | /* save window shape for next frame */ | 1343 | 28.9k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1344 | 28.9k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1345 | | | 1346 | | #ifdef LTP_DEC | 1347 | | if (is_ltp_ot(hDecoder->object_type)) | 1348 | | { | 1349 | | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1350 | | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1351 | | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1352 | | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1353 | | } | 1354 | | #endif | 1355 | | | 1356 | 28.9k | #ifdef SBR_DEC | 1357 | 28.9k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1358 | 24.8k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1359 | 24.8k | { | 1360 | 24.8k | int ele = hDecoder->fr_ch_ele; | 1361 | 24.8k | int ch0 = cpe->channel; | 1362 | 24.8k | int ch1 = cpe->paired_channel; | 1363 | | | 1364 | | /* following case can happen when forceUpSampling == 1 */ | 1365 | 24.8k | if (hDecoder->sbr[ele] == NULL) | 1366 | 6.78k | { | 1367 | 6.78k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1368 | 6.78k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1369 | 6.78k | hDecoder->downSampledSBR | 1370 | 6.78k | #ifdef DRM | 1371 | 6.78k | , 0 | 1372 | 6.78k | #endif | 1373 | 6.78k | ); | 1374 | 6.78k | } | 1375 | 24.8k | if (!hDecoder->sbr[ele]) | 1376 | 0 | return 19; | 1377 | | | 1378 | 24.8k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1379 | 1.34k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1380 | 23.4k | else | 1381 | 23.4k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1382 | | | 1383 | 24.8k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1384 | 24.8k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1385 | 24.8k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1386 | 24.8k | if (retval > 0) | 1387 | 4 | return retval; | 1388 | 24.8k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1389 | 4 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1390 | 4 | { | 1391 | 4 | return 23; | 1392 | 4 | } | 1393 | 28.9k | #endif | 1394 | | | 1395 | 28.9k | return 0; | 1396 | 28.9k | } |
Line | Count | Source | 1158 | 25.4k | { | 1159 | 25.4k | uint8_t retval; | 1160 | 25.4k | ALIGN real_t spec_coef1[1024]; | 1161 | 25.4k | ALIGN real_t spec_coef2[1024]; | 1162 | | | 1163 | | #ifdef PROFILE | 1164 | | int64_t count = faad_get_ts(); | 1165 | | #endif | 1166 | 25.4k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1167 | 21.3k | { | 1168 | 21.3k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1169 | 21.3k | if (retval > 0) | 1170 | 0 | return retval; | 1171 | | | 1172 | 21.3k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1173 | 21.3k | } | 1174 | | | 1175 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1176 | 25.4k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1177 | 0 | return 15; | 1178 | 25.4k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1179 | 0 | return 15; | 1180 | | | 1181 | | /* dequantisation and scaling */ | 1182 | 25.4k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1183 | 25.4k | if (retval > 0) | 1184 | 49 | return retval; | 1185 | 25.4k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1186 | 25.4k | if (retval > 0) | 1187 | 3 | return retval; | 1188 | | | 1189 | | #ifdef PROFILE | 1190 | | count = faad_get_ts() - count; | 1191 | | hDecoder->requant_cycles += count; | 1192 | | #endif | 1193 | | | 1194 | | /* pns decoding */ | 1195 | 25.4k | if (ics1->ms_mask_present) | 1196 | 7.85k | { | 1197 | 7.85k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1198 | 7.85k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1199 | 17.5k | } else { | 1200 | 17.5k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1201 | 17.5k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1202 | 17.5k | } | 1203 | | | 1204 | | /* mid/side decoding */ | 1205 | 25.4k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1206 | | | 1207 | | #if 0 | 1208 | | { | 1209 | | int i; | 1210 | | for (i = 0; i < 1024; i++) | 1211 | | { | 1212 | | //printf("%d\n", spec_coef1[i]); | 1213 | | printf("0x%.8X\n", spec_coef1[i]); | 1214 | | } | 1215 | | for (i = 0; i < 1024; i++) | 1216 | | { | 1217 | | //printf("%d\n", spec_coef2[i]); | 1218 | | printf("0x%.8X\n", spec_coef2[i]); | 1219 | | } | 1220 | | } | 1221 | | #endif | 1222 | | | 1223 | | /* intensity stereo decoding */ | 1224 | 25.4k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1225 | | | 1226 | | #if 0 | 1227 | | { | 1228 | | int i; | 1229 | | for (i = 0; i < 1024; i++) | 1230 | | { | 1231 | | printf("%d\n", spec_coef1[i]); | 1232 | | //printf("0x%.8X\n", spec_coef1[i]); | 1233 | | } | 1234 | | for (i = 0; i < 1024; i++) | 1235 | | { | 1236 | | printf("%d\n", spec_coef2[i]); | 1237 | | //printf("0x%.8X\n", spec_coef2[i]); | 1238 | | } | 1239 | | } | 1240 | | #endif | 1241 | | | 1242 | 25.4k | #ifdef MAIN_DEC | 1243 | | /* MAIN object type prediction */ | 1244 | 25.4k | if (hDecoder->object_type == MAIN) | 1245 | 12.4k | { | 1246 | 12.4k | if (!hDecoder->pred_stat[cpe->channel] || !hDecoder->pred_stat[cpe->paired_channel]) | 1247 | 0 | return 33; | 1248 | | | 1249 | | /* intra channel prediction */ | 1250 | 12.4k | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1251 | 12.4k | hDecoder->sf_index); | 1252 | 12.4k | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1253 | 12.4k | hDecoder->sf_index); | 1254 | | | 1255 | | /* In addition, for scalefactor bands coded by perceptual | 1256 | | noise substitution the predictors belonging to the | 1257 | | corresponding spectral coefficients are reset. | 1258 | | */ | 1259 | 12.4k | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1260 | 12.4k | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1261 | 12.4k | } | 1262 | 25.4k | #endif | 1263 | | | 1264 | 25.4k | #ifdef LTP_DEC | 1265 | 25.4k | if (is_ltp_ot(hDecoder->object_type)) | 1266 | 9.76k | { | 1267 | 9.76k | ltp_info *ltp1 = &(ics1->ltp); | 1268 | 9.76k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1269 | 9.76k | #ifdef LD_DEC | 1270 | 9.76k | if (hDecoder->object_type == LD) | 1271 | 941 | { | 1272 | 941 | if (ltp1->data_present) | 1273 | 161 | { | 1274 | 161 | if (ltp1->lag_update) | 1275 | 65 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1276 | 161 | } | 1277 | 941 | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1278 | 941 | if (ltp2->data_present) | 1279 | 66 | { | 1280 | 66 | if (ltp2->lag_update) | 1281 | 25 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1282 | 66 | } | 1283 | 941 | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1284 | 941 | } | 1285 | 9.76k | #endif | 1286 | | | 1287 | 9.76k | if (!hDecoder->lt_pred_stat[cpe->channel] || !hDecoder->lt_pred_stat[cpe->paired_channel]) | 1288 | 0 | return 34; | 1289 | | | 1290 | | /* long term prediction */ | 1291 | 9.76k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1292 | 9.76k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1293 | 9.76k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1294 | 9.76k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1295 | 9.76k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1296 | 9.76k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1297 | 9.76k | } | 1298 | 25.4k | #endif | 1299 | | | 1300 | | /* tns decoding */ | 1301 | 25.4k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1302 | 25.4k | spec_coef1, hDecoder->frameLength); | 1303 | 25.4k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1304 | 25.4k | spec_coef2, hDecoder->frameLength); | 1305 | | | 1306 | | /* drc decoding */ | 1307 | 25.4k | #if APPLY_DRC | 1308 | 25.4k | if (hDecoder->drc->present) | 1309 | 825 | { | 1310 | 825 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1311 | 700 | drc_decode(hDecoder->drc, spec_coef1); | 1312 | 825 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1313 | 699 | drc_decode(hDecoder->drc, spec_coef2); | 1314 | 825 | } | 1315 | 25.4k | #endif | 1316 | | /* filter bank */ | 1317 | | #ifdef SSR_DEC | 1318 | | if (hDecoder->object_type != SSR) | 1319 | | { | 1320 | | #endif | 1321 | 25.4k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1322 | 25.4k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1323 | 25.4k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1324 | 25.4k | hDecoder->object_type, hDecoder->frameLength); | 1325 | 25.4k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1326 | 25.4k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1327 | 25.4k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1328 | 25.4k | hDecoder->object_type, hDecoder->frameLength); | 1329 | | #ifdef SSR_DEC | 1330 | | } else { | 1331 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1332 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1333 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1334 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1335 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1336 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1337 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1338 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1339 | | } | 1340 | | #endif | 1341 | | | 1342 | | /* save window shape for next frame */ | 1343 | 25.4k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1344 | 25.4k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1345 | | | 1346 | 25.4k | #ifdef LTP_DEC | 1347 | 25.4k | if (is_ltp_ot(hDecoder->object_type)) | 1348 | 9.76k | { | 1349 | 9.76k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1350 | 9.76k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1351 | 9.76k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1352 | 9.76k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1353 | 9.76k | } | 1354 | 25.4k | #endif | 1355 | | | 1356 | 25.4k | #ifdef SBR_DEC | 1357 | 25.4k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1358 | 19.4k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1359 | 19.4k | { | 1360 | 19.4k | int ele = hDecoder->fr_ch_ele; | 1361 | 19.4k | int ch0 = cpe->channel; | 1362 | 19.4k | int ch1 = cpe->paired_channel; | 1363 | | | 1364 | | /* following case can happen when forceUpSampling == 1 */ | 1365 | 19.4k | if (hDecoder->sbr[ele] == NULL) | 1366 | 6.68k | { | 1367 | 6.68k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1368 | 6.68k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1369 | 6.68k | hDecoder->downSampledSBR | 1370 | | #ifdef DRM | 1371 | | , 0 | 1372 | | #endif | 1373 | 6.68k | ); | 1374 | 6.68k | } | 1375 | 19.4k | if (!hDecoder->sbr[ele]) | 1376 | 51 | return 19; | 1377 | | | 1378 | 19.3k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1379 | 1.46k | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1380 | 17.9k | else | 1381 | 17.9k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1382 | | | 1383 | 19.3k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1384 | 19.3k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1385 | 19.3k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1386 | 19.3k | if (retval > 0) | 1387 | 0 | return retval; | 1388 | 19.3k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1389 | 1 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1390 | 1 | { | 1391 | 1 | return 23; | 1392 | 1 | } | 1393 | 25.3k | #endif | 1394 | | | 1395 | 25.3k | return 0; | 1396 | 25.4k | } |
Line | Count | Source | 1158 | 16.7k | { | 1159 | 16.7k | uint8_t retval; | 1160 | 16.7k | ALIGN real_t spec_coef1[1024]; | 1161 | 16.7k | ALIGN real_t spec_coef2[1024]; | 1162 | | | 1163 | | #ifdef PROFILE | 1164 | | int64_t count = faad_get_ts(); | 1165 | | #endif | 1166 | 16.7k | if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) | 1167 | 13.7k | { | 1168 | 13.7k | retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); | 1169 | 13.7k | if (retval > 0) | 1170 | 0 | return retval; | 1171 | | | 1172 | 13.7k | hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; | 1173 | 13.7k | } | 1174 | | | 1175 | | /* sanity check, CVE-2018-20199, CVE-2018-20360 */ | 1176 | 16.7k | if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) | 1177 | 0 | return 15; | 1178 | 16.7k | if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) | 1179 | 0 | return 15; | 1180 | | | 1181 | | /* dequantisation and scaling */ | 1182 | 16.7k | retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); | 1183 | 16.7k | if (retval > 0) | 1184 | 5 | return retval; | 1185 | 16.7k | retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); | 1186 | 16.7k | if (retval > 0) | 1187 | 3 | return retval; | 1188 | | | 1189 | | #ifdef PROFILE | 1190 | | count = faad_get_ts() - count; | 1191 | | hDecoder->requant_cycles += count; | 1192 | | #endif | 1193 | | | 1194 | | /* pns decoding */ | 1195 | 16.7k | if (ics1->ms_mask_present) | 1196 | 4.31k | { | 1197 | 4.31k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, | 1198 | 4.31k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1199 | 12.4k | } else { | 1200 | 12.4k | pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, | 1201 | 12.4k | &(hDecoder->__r1), &(hDecoder->__r2)); | 1202 | 12.4k | } | 1203 | | | 1204 | | /* mid/side decoding */ | 1205 | 16.7k | ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1206 | | | 1207 | | #if 0 | 1208 | | { | 1209 | | int i; | 1210 | | for (i = 0; i < 1024; i++) | 1211 | | { | 1212 | | //printf("%d\n", spec_coef1[i]); | 1213 | | printf("0x%.8X\n", spec_coef1[i]); | 1214 | | } | 1215 | | for (i = 0; i < 1024; i++) | 1216 | | { | 1217 | | //printf("%d\n", spec_coef2[i]); | 1218 | | printf("0x%.8X\n", spec_coef2[i]); | 1219 | | } | 1220 | | } | 1221 | | #endif | 1222 | | | 1223 | | /* intensity stereo decoding */ | 1224 | 16.7k | is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | 1225 | | | 1226 | | #if 0 | 1227 | | { | 1228 | | int i; | 1229 | | for (i = 0; i < 1024; i++) | 1230 | | { | 1231 | | printf("%d\n", spec_coef1[i]); | 1232 | | //printf("0x%.8X\n", spec_coef1[i]); | 1233 | | } | 1234 | | for (i = 0; i < 1024; i++) | 1235 | | { | 1236 | | printf("%d\n", spec_coef2[i]); | 1237 | | //printf("0x%.8X\n", spec_coef2[i]); | 1238 | | } | 1239 | | } | 1240 | | #endif | 1241 | | | 1242 | | #ifdef MAIN_DEC | 1243 | | /* MAIN object type prediction */ | 1244 | | if (hDecoder->object_type == MAIN) | 1245 | | { | 1246 | | if (!hDecoder->pred_stat[cpe->channel] || !hDecoder->pred_stat[cpe->paired_channel]) | 1247 | | return 33; | 1248 | | | 1249 | | /* intra channel prediction */ | 1250 | | ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | 1251 | | hDecoder->sf_index); | 1252 | | ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | 1253 | | hDecoder->sf_index); | 1254 | | | 1255 | | /* In addition, for scalefactor bands coded by perceptual | 1256 | | noise substitution the predictors belonging to the | 1257 | | corresponding spectral coefficients are reset. | 1258 | | */ | 1259 | | pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | 1260 | | pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | 1261 | | } | 1262 | | #endif | 1263 | | | 1264 | 16.7k | #ifdef LTP_DEC | 1265 | 16.7k | if (is_ltp_ot(hDecoder->object_type)) | 1266 | 6.50k | { | 1267 | 6.50k | ltp_info *ltp1 = &(ics1->ltp); | 1268 | 6.50k | ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | 1269 | 6.50k | #ifdef LD_DEC | 1270 | 6.50k | if (hDecoder->object_type == LD) | 1271 | 460 | { | 1272 | 460 | if (ltp1->data_present) | 1273 | 44 | { | 1274 | 44 | if (ltp1->lag_update) | 1275 | 16 | hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | 1276 | 44 | } | 1277 | 460 | ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | 1278 | 460 | if (ltp2->data_present) | 1279 | 50 | { | 1280 | 50 | if (ltp2->lag_update) | 1281 | 29 | hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | 1282 | 50 | } | 1283 | 460 | ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | 1284 | 460 | } | 1285 | 6.50k | #endif | 1286 | | | 1287 | 6.50k | if (!hDecoder->lt_pred_stat[cpe->channel] || !hDecoder->lt_pred_stat[cpe->paired_channel]) | 1288 | 0 | return 34; | 1289 | | | 1290 | | /* long term prediction */ | 1291 | 6.50k | lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | 1292 | 6.50k | ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | 1293 | 6.50k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1294 | 6.50k | lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | 1295 | 6.50k | ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | 1296 | 6.50k | hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | 1297 | 6.50k | } | 1298 | 16.7k | #endif | 1299 | | | 1300 | | /* tns decoding */ | 1301 | 16.7k | tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | 1302 | 16.7k | spec_coef1, hDecoder->frameLength); | 1303 | 16.7k | tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | 1304 | 16.7k | spec_coef2, hDecoder->frameLength); | 1305 | | | 1306 | | /* drc decoding */ | 1307 | 16.7k | #if APPLY_DRC | 1308 | 16.7k | if (hDecoder->drc->present) | 1309 | 638 | { | 1310 | 638 | if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | 1311 | 565 | drc_decode(hDecoder->drc, spec_coef1); | 1312 | 638 | if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | 1313 | 583 | drc_decode(hDecoder->drc, spec_coef2); | 1314 | 638 | } | 1315 | 16.7k | #endif | 1316 | | /* filter bank */ | 1317 | | #ifdef SSR_DEC | 1318 | | if (hDecoder->object_type != SSR) | 1319 | | { | 1320 | | #endif | 1321 | 16.7k | ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1322 | 16.7k | hDecoder->window_shape_prev[cpe->channel], spec_coef1, | 1323 | 16.7k | hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | 1324 | 16.7k | hDecoder->object_type, hDecoder->frameLength); | 1325 | 16.7k | ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1326 | 16.7k | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | 1327 | 16.7k | hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | 1328 | 16.7k | hDecoder->object_type, hDecoder->frameLength); | 1329 | | #ifdef SSR_DEC | 1330 | | } else { | 1331 | | ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | 1332 | | hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | 1333 | | hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | 1334 | | hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | 1335 | | ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | 1336 | | hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | 1337 | | hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | 1338 | | hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | 1339 | | } | 1340 | | #endif | 1341 | | | 1342 | | /* save window shape for next frame */ | 1343 | 16.7k | hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | 1344 | 16.7k | hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | 1345 | | | 1346 | 16.7k | #ifdef LTP_DEC | 1347 | 16.7k | if (is_ltp_ot(hDecoder->object_type)) | 1348 | 6.50k | { | 1349 | 6.50k | lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | 1350 | 6.50k | hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | 1351 | 6.50k | lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | 1352 | 6.50k | hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | 1353 | 6.50k | } | 1354 | 16.7k | #endif | 1355 | | | 1356 | 16.7k | #ifdef SBR_DEC | 1357 | 16.7k | if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1358 | 15.0k | && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1359 | 15.0k | { | 1360 | 15.0k | int ele = hDecoder->fr_ch_ele; | 1361 | 15.0k | int ch0 = cpe->channel; | 1362 | 15.0k | int ch1 = cpe->paired_channel; | 1363 | | | 1364 | | /* following case can happen when forceUpSampling == 1 */ | 1365 | 15.0k | if (hDecoder->sbr[ele] == NULL) | 1366 | 5.06k | { | 1367 | 5.06k | hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | 1368 | 5.06k | hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), | 1369 | 5.06k | hDecoder->downSampledSBR | 1370 | | #ifdef DRM | 1371 | | , 0 | 1372 | | #endif | 1373 | 5.06k | ); | 1374 | 5.06k | } | 1375 | 15.0k | if (!hDecoder->sbr[ele]) | 1376 | 0 | return 19; | 1377 | | | 1378 | 15.0k | if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) | 1379 | 509 | hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1380 | 14.5k | else | 1381 | 14.5k | hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); | 1382 | | | 1383 | 15.0k | retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], | 1384 | 15.0k | hDecoder->time_out[ch0], hDecoder->time_out[ch1], | 1385 | 15.0k | hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); | 1386 | 15.0k | if (retval > 0) | 1387 | 0 | return retval; | 1388 | 15.0k | } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | 1389 | 0 | && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | 1390 | 0 | { | 1391 | 0 | return 23; | 1392 | 0 | } | 1393 | 16.7k | #endif | 1394 | | | 1395 | 16.7k | return 0; | 1396 | 16.7k | } |
|