Coverage Report

Created: 2026-05-30 06:09

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