Coverage Report

Created: 2025-12-14 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_mps_parse.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <math.h>
21
#include "ixheaac_type_def.h"
22
#include "ixheaac_constants.h"
23
#include "ixheaacd_bitbuffer.h"
24
#include "ixheaacd_common_rom.h"
25
#include "ixheaacd_sbrdecsettings.h"
26
#include "ixheaacd_sbr_scale.h"
27
#include "ixheaacd_env_extr_part.h"
28
#include "ixheaacd_sbr_rom.h"
29
#include "ixheaacd_hybrid.h"
30
#include "ixheaacd_ps_dec.h"
31
#include "ixheaacd_config.h"
32
#include "ixheaacd_qmf_dec.h"
33
#include "ixheaacd_audioobjtypes.h"
34
#include "ixheaacd_mps_polyphase.h"
35
#include "ixheaacd_mps_struct_def.h"
36
#include "ixheaacd_mps_res_rom.h"
37
#include "ixheaacd_mps_defines.h"
38
#include "ixheaacd_mps_aac_struct.h"
39
#include "ixheaacd_mps_dec.h"
40
#include "ixheaacd_mps_nlc_dec.h"
41
#include "ixheaac_error_standards.h"
42
43
static const WORD32 ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4};
44
45
static const WORD32 ixheaacd_freq_res_table_ld[] = {0, 23, 15, 12, 9, 7, 5, 4};
46
47
static const WORD32
48
    ixheaacd_hybrid_band_71_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = {
49
        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
50
        2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
51
        3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
52
53
static const WORD32
54
    ixheaacd_hybrid_band_71_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = {
55
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
56
        3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
57
        4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
58
59
static const WORD32
60
    ixheaacd_hybrid_band_71_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = {
61
        0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
62
        5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
63
        6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
64
65
static const WORD32
66
    ixheaacd_hybrid_band_71_to_processing_band_10_map[MAX_HYBRID_BANDS_MPS] = {
67
        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8,
68
        8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
69
        9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
70
71
static const WORD32
72
    ixheaacd_hybrid_band_71_to_processing_band_14_map[MAX_HYBRID_BANDS_MPS] = {
73
        0,  0,  0,  0,  1,  1,  2,  3,  4,  4,  5,  6,  6,  7,  7,  8,  8,  8,
74
        9,  9,  9,  10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
75
        12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
76
        13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13};
77
78
const WORD32
79
    ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = {
80
        1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 14,
81
        15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
82
        18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
83
        19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19};
84
85
const WORD32
86
    ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = {
87
        1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
88
        16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23,
89
        23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
90
        26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27};
91
92
const WORD32
93
    ixheaacd_hybrid_band_64_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] =
94
        {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95
         2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
96
         3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
97
         3, 3, 3, 3, 3};
98
99
const WORD32
100
    ixheaacd_hybrid_band_64_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] =
101
        {0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
102
         3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
103
         4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
104
         4, 4, 4, 4, 4};
105
106
const WORD32
107
    ixheaacd_hybrid_band_64_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] =
108
        {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
109
         5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
110
         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
111
         6, 6, 6, 6, 6};
112
113
const WORD32
114
    ixheaacd_hybrid_band_64_to_processing_band_9_map[MAX_HYBRID_BANDS_MPS] =
115
        {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
116
         7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
117
         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
118
         8, 8, 8, 8, 8};
119
120
const WORD32
121
    ixheaacd_hybrid_band_64_to_processing_band_12_map[MAX_HYBRID_BANDS_MPS] =
122
        {0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,
123
         8,  8,  9,  9,  9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 10,
124
         10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
125
         11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
126
         11, 11, 11, 11, 11, 11, 11};
127
128
const WORD32
129
    ixheaacd_hybrid_band_64_to_processing_band_15_map[MAX_HYBRID_BANDS_MPS] =
130
        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  10, 10, 10, 11, 11,
131
         11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
132
         13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
133
         14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
134
         14, 14, 14, 14, 14, 14, 14};
135
136
const WORD32
137
    ixheaacd_hybrid_band_64_to_processing_band_23_map[MAX_HYBRID_BANDS_MPS] =
138
        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 12, 13, 13,
139
         14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19,
140
         19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,
141
         22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
142
         22, 22, 22, 22, 22, 22, 22};
143
144
static const FLOAT32 ixheaacd_mps_clip_gain_table[] = {
145
    1.000000f, 1.189207f, 1.414213f, 1.681792f,
146
    2.000000f, 2.378414f, 2.828427f, 4.000000f};
147
148
static const WORD32 ixheaacd_mps_stride_table[] = {1, 2, 5, 28};
149
150
static const FLOAT32 ixheaacd_cld_de_quant_table[] = {
151
    -150.0, -45.0, -40.0, -35.0, -30.0, -25.0, -22.0, -19.0,
152
    -16.0,  -13.0, -10.0, -8.0,  -6.0,  -4.0,  -2.0,  0.0,
153
    2.0,    4.0,   6.0,   8.0,   10.0,  13.0,  16.0,  19.0,
154
    22.0,   25.0,  30.0,  35.0,  40.0,  45.0,  150.0};
155
156
static const FLOAT32 ixheaacd_icc_de_quant_table[] = {
157
    1.0000f, 0.9370f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.5890f, -0.9900f};
158
159
const FLOAT32 ixheaacd_ipd_de_quant_table[] = {
160
    0.f,          0.392699082f, 0.785398163f, 1.178097245f,
161
    1.570796327f, 1.963495408f, 2.35619449f,  2.748893572f,
162
    3.141592654f, 3.534291735f, 3.926990817f, 4.319689899f,
163
    4.71238898f,  5.105088062f, 5.497787144f, 5.890486225f};
164
const WORD32 ixheaacd_ipd_de_quant_table_q28[] = {
165
    0,          105414360,  210828720,  316243072, 421657440,  527071776,
166
    632486144,  737900480,  843314880,  948729216, 1054143552, 1159557888,
167
    1264972288, 1370386688, 1475800960, 1581215360};
168
static const WORD32 ixheaacd_smoothing_time_table[] = {64, 128, 256, 512};
169
170
static const FLOAT32 ixheaacd_inverse_smoothing_time_table[] = {
171
    1.0f / 64.0f, 1.0f / 128.0f, 1.0f / 256.0f, 1.0f / 512.0f};
172
173
3.65M
static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
174
3.65M
  var = min(var, upper_bound);
175
3.65M
  var = max(var, lower_bound);
176
3.65M
  return var;
177
3.65M
}
178
179
static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b,
180
912k
                               UWORD16 d[], WORD32 len) {
181
912k
  WORD32 k;
182
912k
  UWORD32 tmp;
183
912k
  UWORD32 b0 = (UWORD32)b;
184
185
912k
  tmp = ((UWORD32)a[0]) * b0;
186
912k
  d[0] = (UWORD16)tmp;
187
188
4.56M
  for (k = 1; k < len; k++) {
189
3.65M
    tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0;
190
3.65M
    d[k] = (UWORD16)tmp;
191
3.65M
  }
192
912k
}
193
194
static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a,
195
912k
                             UWORD16 d[], UWORD16 *pr, WORD32 len) {
196
912k
  UWORD32 r;
197
912k
  UWORD32 tmp;
198
912k
  UWORD32 temp;
199
912k
  WORD32 k;
200
201
912k
  if (a == 0)
202
0
    return;
203
204
912k
  r = 0;
205
206
5.47M
  for (k = len - 1; k >= 0; k--) {
207
4.56M
    tmp = ((UWORD32)b[k]) + (r << 16);
208
209
4.56M
    if (tmp) {
210
1.40M
      d[k] = (UWORD16)(tmp / a);
211
1.40M
      temp = d[k] * a;
212
1.40M
      r = tmp - temp;
213
3.15M
    } else {
214
3.15M
      d[k] = 0;
215
3.15M
    }
216
4.56M
  }
217
912k
  *pr = (UWORD16)r;
218
912k
}
219
220
static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena,
221
58.1k
                             WORD32 lenb) {
222
58.1k
  WORD32 h;
223
58.1k
  WORD32 carry = 0;
224
225
58.1k
  if (lenb > lena)
226
0
    return;
227
228
290k
  for (h = 0; h < lenb; h++) {
229
232k
    carry = carry + (WORD32)(a[h] - b[h]);
230
232k
    a[h] = (UWORD16)carry;
231
232k
    carry = carry >> 16;
232
232k
  }
233
234
58.1k
  for (; h < lena; h++) {
235
0
    carry = ((UWORD32)a[h]) + carry;
236
0
    a[h] = (UWORD16)carry;
237
0
    carry = carry >> 16;
238
0
  }
239
240
58.1k
  if (carry != 0)
241
0
    return;
242
58.1k
  return;
243
58.1k
}
244
245
static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[],
246
288k
                                WORD32 len) {
247
288k
  WORD32 i;
248
249
1.06M
  for (i = len - 1; i > 0; i--) {
250
855k
    if (a[i] != b[i]) break;
251
855k
  }
252
288k
  return (a[i] >= b[i]) ? 1 : 0;
253
288k
}
254
255
static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type,
256
48.1k
                                     WORD32 band_start, WORD32 ixheaacd_num_bands) {
257
48.1k
  WORD32 i;
258
259
793k
  for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
260
745k
    data[i] <<= 1;
261
745k
  }
262
263
48.1k
  if (data_type == CLD) {
264
168k
    for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
265
156k
      if (data[i] == -14)
266
22.6k
        data[i] = -15;
267
133k
      else if (data[i] == 14)
268
8.30k
        data[i] = 15;
269
156k
    }
270
11.5k
  }
271
48.1k
}
272
273
11.4k
static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) {
274
11.4k
  WORD32 i;
275
276
137k
  for (i = 0; i < ixheaacd_num_bands; i++) {
277
126k
    data[i] /= 2;
278
126k
  }
279
11.4k
}
280
281
static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start,
282
34.7k
                                     WORD32 band_stop, WORD32 *strides) {
283
34.7k
  WORD32 i, pb, ch_fac, data_bands, start_offset;
284
285
34.7k
  ch_fac = ixheaacd_mps_stride_table[freq_res_stride];
286
34.7k
  data_bands = (band_stop - band_start - 1) / ch_fac + 1;
287
288
34.7k
  strides[0] = band_start;
289
300k
  for (pb = 1; pb <= data_bands; pb++) {
290
266k
    strides[pb] = strides[pb - 1] + ch_fac;
291
266k
  }
292
34.7k
  start_offset = 0;
293
180k
  while (strides[data_bands] > band_stop) {
294
145k
    if (start_offset < data_bands)
295
12.3k
      start_offset++;
296
133k
    else
297
133k
      start_offset = 1;
298
299
308k
    for (i = start_offset; i <= data_bands; i++) {
300
162k
      strides[i]--;
301
162k
    }
302
145k
  }
303
304
34.7k
  return data_bands;
305
34.7k
}
306
307
static IA_ERRORCODE ixheaacd_mps_ecdata_decoding(
308
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream,
309
238k
    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) {
310
238k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
311
238k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
312
238k
  WORD32 band_stop = 0;
313
314
238k
  WORD32 *lastdata = NULL;
315
238k
  ia_mps_data_struct *frame_xxx_data = NULL;
316
238k
  WORD32 default_val = 0;
317
238k
  IA_ERRORCODE err = IA_NO_ERROR;
318
319
238k
  ia_mps_bs_frame *frame = &(self->bs_frame);
320
321
238k
  if (datatype == 0) {
322
110k
    frame_xxx_data = &frame->cld_data;
323
110k
    lastdata = frame->cmp_cld_idx_prev;
324
110k
    band_stop = self->bs_param_bands;
325
128k
  } else if (datatype == 1) {
326
110k
    frame_xxx_data = &frame->icc_data;
327
110k
    lastdata = frame->cmp_icc_idx_prev;
328
110k
    band_stop = self->bs_param_bands;
329
110k
  } else if (datatype == 2) {
330
18.1k
    frame_xxx_data = &frame->ipd_data;
331
18.1k
    lastdata = frame->ipd_idx_data_prev;
332
18.1k
    band_stop = self->num_bands_ipd;
333
18.1k
  } else {
334
0
    frame_xxx_data = &frame->cld_data;
335
0
    lastdata = frame->cmp_cld_idx_prev;
336
0
    band_stop = self->bs_param_bands;
337
0
  }
338
339
514k
  for (i = 0; i < self->num_parameter_sets; i++) {
340
275k
    frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2);
341
275k
  }
342
343
238k
  set_index = 0;
344
238k
  bs_data_pair = 0;
345
238k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
346
347
513k
  for (i = 0; i < self->num_parameter_sets; i++) {
348
275k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
349
2.51M
      for (pb = 0; pb < band_stop; pb++) {
350
2.33M
        lastdata[pb] = default_val;
351
2.33M
      }
352
353
175k
      old_quant_coarse_xxx = 0;
354
175k
    }
355
356
275k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
357
28.6k
      if (bs_data_pair) {
358
1.39k
        bs_data_pair = 0;
359
27.2k
      } else {
360
27.2k
        bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1);
361
27.2k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
362
27.2k
            ixheaacd_read_bits_buf(bitstream, 1);
363
27.2k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
364
27.2k
            ixheaacd_read_bits_buf(bitstream, 2);
365
366
27.2k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
367
27.2k
            old_quant_coarse_xxx) {
368
7.85k
          if (old_quant_coarse_xxx) {
369
910
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
370
6.94k
          } else {
371
6.94k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
372
6.94k
          }
373
7.85k
        }
374
375
27.2k
        data_bands = ixheaacd_mps_getstridemap(
376
27.2k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop,
377
27.2k
            strides);
378
379
256k
        for (pb = 0; pb < data_bands; pb++) {
380
229k
          lastdata[pb] = lastdata[strides[pb]];
381
229k
        }
382
383
27.2k
        err = ixheaacd_mps_ecdatapairdec(
384
27.2k
            bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
385
27.2k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
386
27.2k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag);
387
27.2k
        if (err) return err;
388
389
256k
        for (pb = 0; pb < data_bands; pb++) {
390
575k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
391
346k
            if (datatype == IPD) {
392
67.5k
              if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
393
35.1k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
394
35.1k
              } else {
395
32.3k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
396
32.3k
              }
397
278k
            } else {
398
278k
              lastdata[j] = data[set_index + bs_data_pair][pb];
399
278k
            }
400
346k
          }
401
228k
        }
402
403
27.2k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
404
405
27.2k
        if (bs_data_pair) {
406
10.4k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
407
10.4k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
408
10.4k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
409
10.4k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
410
10.4k
        }
411
27.2k
        set_index += bs_data_pair + 1;
412
27.2k
      }
413
28.6k
    }
414
275k
  }
415
238k
  return err;
416
238k
}
417
418
IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self,
419
                                        WORD32 usac_independency_flag,
420
110k
                                        ia_bit_buf_struct *bitstream) {
421
110k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
422
110k
  WORD32 ps, pg, ts, pb;
423
110k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
424
425
110k
  WORD32 bits_param_slot = 0;
426
427
110k
  ia_mps_bs_frame *frame = &(self->bs_frame);
428
110k
  IA_ERRORCODE err = IA_NO_ERROR;
429
430
110k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
431
432
110k
  self->num_parameter_sets_prev = self->num_parameter_sets;
433
434
110k
  if (self->bs_high_rate_mode) {
435
26.1k
    bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1);
436
26.1k
    self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1;
437
84.0k
  } else {
438
84.0k
    bs_frame_type = 0;
439
84.0k
    self->num_parameter_sets = 1;
440
84.0k
  }
441
442
110k
  if (self->time_slots == 32)
443
99.0k
    bits_param_slot = 5;
444
11.1k
  else if (self->time_slots == 64)
445
11.1k
    bits_param_slot = 6;
446
447
110k
  if (bs_frame_type) {
448
2.79k
    WORD32 prev_param_slot = -1;
449
5.76k
    for (i = 0; i < self->num_parameter_sets; i++) {
450
3.07k
      self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot);
451
452
3.07k
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
453
98
        return IA_FATAL_ERROR;
454
98
      }
455
2.97k
      prev_param_slot = self->param_slots[i];
456
2.97k
    }
457
107k
  } else {
458
232k
    for (i = 0; i < self->num_parameter_sets; i++) {
459
124k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
460
124k
                              self->num_parameter_sets) -
461
124k
                             1;
462
124k
    }
463
107k
  }
464
465
110k
  if (!usac_independency_flag) {
466
107k
    frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1);
467
107k
  } else {
468
2.71k
    frame->independency_flag = 1;
469
2.71k
  }
470
471
110k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD);
472
110k
  if (err) return err;
473
474
110k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC);
475
110k
  if (err) return err;
476
477
110k
  if (self->config->bs_phase_coding) {
478
86.8k
    self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1);
479
480
86.8k
    if (!self->bs_phase_mode) {
481
1.01M
      for (pb = 0; pb < self->num_bands_ipd; pb++) {
482
941k
        frame->ipd_idx_data_prev[pb] = 0;
483
2.04M
        for (i = 0; i < self->num_parameter_sets; i++) {
484
1.10M
          frame->ipd_idx_data[i][pb] = 0;
485
1.10M
          self->bs_frame.ipd_idx[i][pb] = 0;
486
1.10M
        }
487
941k
        self->bs_frame.ipd_idx_prev[pb] = 0;
488
941k
      }
489
68.7k
      self->opd_smoothing_mode = 0;
490
68.7k
    } else {
491
18.1k
      self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1);
492
18.1k
      err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data,
493
18.1k
                                         IPD);
494
18.1k
      if (err) return err;
495
18.1k
    }
496
86.8k
  }
497
498
23.1k
  else {
499
23.1k
    self->bs_phase_mode = 0;
500
180k
    for (pb = 0; pb < self->num_bands_ipd; pb++) {
501
156k
      frame->ipd_idx_data_prev[pb] = 0;
502
352k
      for (i = 0; i < self->num_parameter_sets; i++) {
503
196k
        frame->ipd_idx_data[i][pb] = 0;
504
196k
        self->bs_frame.ipd_idx[i][pb] = 0;
505
196k
      }
506
156k
      self->bs_frame.ipd_idx_prev[pb] = 0;
507
156k
    }
508
23.1k
    self->opd_smoothing_mode = 0;
509
23.1k
  }
510
511
110k
  if (self->bs_high_rate_mode) {
512
68.8k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
513
42.8k
      frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2);
514
42.8k
      if (frame->bs_smooth_mode[ps] >= 2) {
515
7.75k
        frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2);
516
7.75k
      }
517
42.8k
      if (frame->bs_smooth_mode[ps] == 3) {
518
1.70k
        frame->bs_freq_res_stride_smg[ps] =
519
1.70k
            ixheaacd_read_bits_buf(bitstream, 2);
520
1.70k
        data_bands =
521
1.70k
            (self->bs_param_bands - 1) /
522
1.70k
                ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
523
1.70k
            1;
524
13.4k
        for (pg = 0; pg < data_bands; pg++) {
525
11.7k
          frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1);
526
11.7k
        }
527
1.70k
      }
528
42.8k
    }
529
84.1k
  } else {
530
168k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
531
84.0k
      frame->bs_smooth_mode[ps] = 0;
532
84.0k
    }
533
84.1k
  }
534
535
329k
  for (i = 0; i < 2; i++) {
536
219k
    self->temp_shape_enable_ch_stp[i] = 0;
537
219k
    self->temp_shape_enable_ch_ges[i] = 0;
538
219k
  }
539
540
110k
  self->bs_tsd_enable = 0;
541
110k
  if (self->config->bs_temp_shape_config == 3) {
542
50.5k
    self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1);
543
59.5k
  } else if (self->config->bs_temp_shape_config != 0) {
544
40.5k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1);
545
40.5k
    if (bs_temp_shape_enable) {
546
5.91k
      num_of_temp_shape_ch = 2;
547
5.91k
      switch (self->config->bs_temp_shape_config) {
548
2.01k
        case 1:
549
6.03k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
550
4.02k
            self->temp_shape_enable_ch_stp[i] =
551
4.02k
                ixheaacd_read_bits_buf(bitstream, 1);
552
4.02k
          }
553
2.01k
          break;
554
3.89k
        case 2:
555
11.6k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
556
7.79k
            self->temp_shape_enable_ch_ges[i] =
557
7.79k
                ixheaacd_read_bits_buf(bitstream, 1);
558
7.79k
          }
559
11.6k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
560
7.77k
            if (self->temp_shape_enable_ch_ges[i]) {
561
3.55k
              ixheaacd_mps_huff_decode(bitstream, env_shape_data,
562
3.55k
                                       self->time_slots);
563
119k
              for (ts = 0; ts < self->time_slots; ts++) {
564
115k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
565
115k
                    2, (FLOAT32)env_shape_data[ts] /
566
115k
                               (self->config->bs_env_quant_mode + 2) -
567
115k
                           1);
568
115k
              }
569
3.55k
            }
570
7.77k
          }
571
3.89k
          break;
572
0
        default:
573
0
          return -1;
574
5.91k
      }
575
5.91k
    }
576
40.5k
  }
577
578
110k
  if (self->bs_tsd_enable) {
579
8.63k
    UWORD16 s[4];
580
8.63k
    UWORD64 s_64;
581
8.63k
    UWORD16 c[5];
582
8.63k
    UWORD64 c_64;
583
8.63k
    UWORD16 b;
584
8.63k
    UWORD16 r[1];
585
8.63k
    static const UWORD16 table_64[] = {
586
8.63k
        6,  11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49,
587
8.63k
        51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61};
588
8.63k
    static const UWORD16 table_32[] = {5,  9,  13, 16, 18, 20, 22, 24,
589
8.63k
                                              25, 26, 27, 28, 29, 29, 30, 30};
590
8.63k
    unsigned const short *tab = NULL;
591
8.63k
    WORD32 k;
592
8.63k
    UWORD16 h;
593
8.63k
    WORD32 nbits_tr_slots = 0;
594
595
8.63k
    if (self->time_slots == 32) {
596
6.34k
      nbits_tr_slots = 4;
597
6.34k
      tab = table_32;
598
6.34k
    } else if (self->time_slots == 64) {
599
2.28k
      nbits_tr_slots = 5;
600
2.28k
      tab = table_64;
601
2.28k
    }
602
603
8.63k
    self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots);
604
8.63k
    self->tsd_num_tr_slots++;
605
8.63k
    self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1];
606
607
8.63k
    if (self->tsd_codeword_len > 48) {
608
72
      s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48);
609
72
      s_64 = s[3];
610
72
      s[2] = ixheaacd_read_bits_buf(bitstream, 16);
611
72
      s_64 = (s_64 << 16) | s[2];
612
72
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
613
72
      s_64 = (s_64 << 16) | s[1];
614
72
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
615
72
      s_64 = (s_64 << 16) | s[0];
616
8.56k
    } else if (self->tsd_codeword_len > 32) {
617
1.06k
      s[3] = 0;
618
1.06k
      s_64 = s[3];
619
1.06k
      s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32);
620
1.06k
      s_64 = (s_64 << 16) | s[2];
621
1.06k
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
622
1.06k
      s_64 = (s_64 << 16) | s[1];
623
1.06k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
624
1.06k
      s_64 = (s_64 << 16) | s[0];
625
7.50k
    } else if (self->tsd_codeword_len > 16) {
626
4.15k
      s[3] = 0;
627
4.15k
      s_64 = s[3];
628
4.15k
      s[2] = 0;
629
4.15k
      s_64 = (s_64 << 16) | s[2];
630
4.15k
      s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16);
631
4.15k
      s_64 = (s_64 << 16) | s[1];
632
4.15k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
633
4.15k
      s_64 = (s_64 << 16) | s[0];
634
4.15k
    } else {
635
3.34k
      s[3] = 0;
636
3.34k
      s_64 = s[3];
637
3.34k
      s[2] = 0;
638
3.34k
      s_64 = (s_64 << 16) | s[2];
639
3.34k
      s[1] = 0;
640
3.34k
      s_64 = (s_64 << 16) | s[1];
641
3.34k
      s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len);
642
3.34k
      s_64 = (s_64 << 16) | s[0];
643
3.34k
    }
644
645
8.63k
    {
646
8.63k
      WORD32 p = self->tsd_num_tr_slots;
647
648
358k
      for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0;
649
650
290k
      for (k = self->time_slots - 1; k >= 0; k--) {
651
290k
        if (p > k) {
652
3.84k
          for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1;
653
1.27k
          break;
654
1.27k
        }
655
656
288k
        c[0] = k - p + 1;
657
288k
        c_64 = c[0];
658
1.44M
        for (i = 1; i < 5; i++) c[i] = 0;
659
660
1.20M
        for (h = 2; h <= p; h++) {
661
912k
          b = k - p + h;
662
912k
          c_64 = c_64 * (b / h);
663
912k
          ixheaacd_longmult1(c, b, c, 5);
664
912k
          b = h;
665
912k
          ixheaacd_longdiv(c, b, c, r, 5);
666
912k
        }
667
668
288k
        if (ixheaacd_longcompare(s, c, 4)) {
669
58.1k
          ixheaacd_longsub(s, c, 4, 4);
670
58.1k
          self->bs_tsd_sep_data[k] = 1;
671
58.1k
          p--;
672
58.1k
          if (p == 0) break;
673
58.1k
        }
674
288k
      }
675
8.63k
    }
676
677
357k
    for (i = 0; i < self->time_slots; i++) {
678
349k
      if (self->bs_tsd_sep_data[i])
679
60.6k
        self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3);
680
349k
    }
681
8.63k
  }
682
683
110k
  self->parse_nxt_frame = 0;
684
110k
  return err;
685
110k
}
686
687
static VOID ixheaacd_ld_mps_ecdata_decoding(
688
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff,
689
    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype,
690
20.9k
    WORD32 start_band) {
691
20.9k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
692
20.9k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
693
20.9k
  WORD32 band_stop = 0;
694
695
20.9k
  WORD32 *lastdata = NULL;
696
20.9k
  ia_mps_data_struct *frame_xxx_data = NULL;
697
20.9k
  WORD32 default_val = 0;
698
699
20.9k
  ia_mps_bs_frame *frame = &(self->bs_frame);
700
701
20.9k
  if (datatype == CLD) {
702
15.1k
    frame_xxx_data = &frame->cld_data;
703
15.1k
    lastdata = frame->cmp_cld_idx_prev;
704
15.1k
    band_stop = self->bs_param_bands;
705
15.1k
  } else if (datatype == ICC) {
706
5.80k
    frame_xxx_data = &frame->icc_data;
707
5.80k
    lastdata = frame->cmp_icc_idx_prev;
708
5.80k
    band_stop = self->bs_param_bands;
709
5.80k
  } else if (datatype == IPD) {
710
0
    frame_xxx_data = &frame->ipd_data;
711
0
    lastdata = frame->ipd_idx_data_prev;
712
0
    band_stop = self->num_bands_ipd;
713
0
  } else {
714
0
    frame_xxx_data = &frame->cld_data;
715
0
    lastdata = frame->cmp_cld_idx_prev;
716
0
    band_stop = self->bs_param_bands;
717
0
  }
718
48.2k
  for (i = 0; i < self->num_parameter_sets; i++) {
719
27.3k
    frame_xxx_data->bs_xxx_data_mode[i] =
720
27.3k
        ixheaacd_read_bits_buf(it_bit_buff, 2);
721
27.3k
  }
722
723
20.9k
  set_index = 0;
724
20.9k
  bs_data_pair = 0;
725
20.9k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
726
727
48.2k
  for (i = 0; i < self->num_parameter_sets; i++) {
728
27.2k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
729
107k
      for (pb = 0; pb < band_stop; pb++) {
730
95.1k
        lastdata[pb] = default_val;
731
95.1k
      }
732
733
12.3k
      old_quant_coarse_xxx = 0;
734
12.3k
    }
735
736
27.2k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
737
8.99k
      if (bs_data_pair) {
738
1.54k
        bs_data_pair = 0;
739
7.44k
      } else {
740
7.44k
        bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
741
7.44k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
742
7.44k
            ixheaacd_read_bits_buf(it_bit_buff, 1);
743
7.44k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
744
7.44k
            ixheaacd_read_bits_buf(it_bit_buff, 2);
745
746
7.44k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
747
7.44k
            old_quant_coarse_xxx) {
748
5.38k
          if (old_quant_coarse_xxx) {
749
844
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
750
4.53k
          } else {
751
4.53k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
752
4.53k
          }
753
5.38k
        }
754
755
7.44k
        data_bands = ixheaacd_mps_getstridemap(
756
7.44k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
757
7.44k
            band_stop, strides);
758
43.9k
        for (pb = 0; pb < data_bands; pb++) {
759
36.5k
          lastdata[pb] = lastdata[strides[pb]];
760
36.5k
        }
761
762
7.44k
        ixheaacd_mps_ecdatapairdec(
763
7.44k
            it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
764
7.44k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
765
7.44k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
766
767
43.7k
        for (pb = 0; pb < data_bands; pb++) {
768
111k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
769
75.0k
            if (datatype == IPD) {
770
0
              if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
771
0
                lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
772
0
              } else {
773
0
                lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
774
0
              }
775
75.0k
            } else {
776
75.0k
              lastdata[j] = data[set_index + bs_data_pair][pb];
777
75.0k
            }
778
75.0k
          }
779
36.3k
        }
780
781
7.44k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
782
783
7.44k
        if (bs_data_pair) {
784
5.33k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
785
5.33k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
786
5.33k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
787
5.33k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
788
5.33k
        }
789
7.44k
        set_index += bs_data_pair + 1;
790
7.44k
      }
791
8.99k
    }
792
27.2k
  }
793
20.9k
}
794
795
IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
796
2.90k
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
797
2.90k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
798
2.90k
      num_of_temp_shape_ch;
799
2.90k
  WORD32 ps, pg, ts, ic;
800
2.90k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
801
2.90k
  WORD32 alignment;
802
2.90k
  WORD32 bits_param_slot = 0;
803
804
2.90k
  ia_mps_bs_frame *frame = &(self->bs_frame);
805
2.90k
  alignment = it_bit_buff->cnt_bits;
806
2.90k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
807
808
2.90k
  self->num_parameter_sets_prev = self->num_parameter_sets;
809
810
2.90k
  bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
811
2.90k
  self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
812
813
2.90k
  if (self->time_slots == 32)
814
530
    bits_param_slot = 5;
815
2.37k
  else if (self->time_slots == 64)
816
0
    bits_param_slot = 6;
817
2.37k
  else if (self->time_slots == 8)
818
34
    bits_param_slot = 3;
819
2.34k
  else if (self->time_slots == 16 || self->time_slots == 15)
820
104
    bits_param_slot = 4;
821
822
2.90k
  if (bs_frame_type) {
823
576
    WORD32 prev_param_slot = -1;
824
1.16k
    for (i = 0; i < self->num_parameter_sets; i++) {
825
619
      self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
826
827
619
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
828
27
        return IA_FATAL_ERROR;
829
27
      }
830
592
      prev_param_slot = self->param_slots[i];
831
592
    }
832
2.33k
  } else {
833
5.50k
    for (i = 0; i < self->num_parameter_sets; i++) {
834
3.17k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
835
3.17k
                              self->num_parameter_sets) -
836
3.17k
                             1;
837
3.17k
    }
838
2.33k
  }
839
840
2.88k
  frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
841
842
13.0k
  for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
843
10.1k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
844
10.1k
                                    0);
845
10.1k
  }
846
847
2.88k
  if (self->ldmps_config.bs_one_icc) {
848
1.60k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
849
1.60k
                                    0);
850
1.60k
  } else {
851
6.40k
    for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
852
5.12k
      if (!self->ldmps_config.ott_mode_lfe[i])
853
4.20k
        ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
854
4.20k
                                        ICC, 0);
855
5.12k
    }
856
1.27k
  }
857
858
6.57k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
859
3.69k
    frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
860
3.69k
    if (frame->bs_smooth_mode[ps] >= 2) {
861
1.70k
      frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
862
1.70k
    }
863
3.69k
    if (frame->bs_smooth_mode[ps] == 3) {
864
1.20k
      frame->bs_freq_res_stride_smg[ps] =
865
1.20k
          ixheaacd_read_bits_buf(it_bit_buff, 2);
866
1.20k
      data_bands =
867
1.20k
          (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
868
1.20k
              ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
869
1.20k
          1;
870
4.61k
      for (pg = 0; pg < data_bands; pg++) {
871
3.40k
        frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
872
3.40k
      }
873
1.20k
    }
874
3.69k
  }
875
876
8.59k
  for (i = 0; i < 2; i++) {
877
5.70k
    self->temp_shape_enable_ch_stp[i] = 0;
878
5.70k
    self->temp_shape_enable_ch_ges[i] = 0;
879
5.70k
  }
880
881
2.88k
  if (self->ldmps_config.bs_temp_shape_config != 0) {
882
1.97k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
883
1.97k
    if (bs_temp_shape_enable) {
884
1.19k
      num_of_temp_shape_ch = 2;
885
1.19k
      switch (self->ldmps_config.bs_temp_shape_config) {
886
335
        case 1:
887
1.00k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
888
670
            self->temp_shape_enable_ch_stp[i] =
889
670
                ixheaacd_read_bits_buf(it_bit_buff, 1);
890
670
          }
891
335
          break;
892
834
        case 2:
893
2.50k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
894
1.66k
            self->temp_shape_enable_ch_ges[i] =
895
1.66k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
896
1.66k
          }
897
2.50k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
898
1.66k
            if (self->temp_shape_enable_ch_ges[i]) {
899
725
              ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
900
725
                                       self->time_slots);
901
1.88k
              for (ts = 0; ts < self->time_slots; ts++) {
902
1.16k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
903
1.16k
                    2, (FLOAT32)env_shape_data[ts] /
904
1.16k
                               (self->ldmps_config.bs_env_quant_mode + 2) -
905
1.16k
                           1);
906
1.16k
              }
907
725
            }
908
1.66k
          }
909
834
          break;
910
22
        default:
911
22
          if (self->ec_flag == 0) {
912
22
          return IA_FATAL_ERROR;
913
22
      }
914
0
          break;
915
1.19k
      }
916
1.19k
    }
917
1.97k
  }
918
919
2.85k
  if (self->ldmps_config.bs_arbitrary_downmix != 0) {
920
7.42k
    for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
921
5.02k
      ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
922
5.02k
                                      CLD, 0);
923
5.02k
    }
924
2.40k
  }
925
926
2.85k
  ixheaacd_byte_align(it_bit_buff, &alignment);
927
928
13.1M
  while (it_bit_buff->cnt_bits > 8) {
929
13.1M
    ixheaacd_read_bits_buf(it_bit_buff, 8);
930
13.1M
  }
931
2.85k
  ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
932
2.85k
  return IA_NO_ERROR;
933
2.88k
}
934
935
static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
936
                                       WORD32 band_start, WORD32 band_stop,
937
54.5k
                                       WORD32 ch_fac) {
938
54.5k
  WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
939
54.5k
  WORD32 vdk[MAX_PARAMETER_BANDS + 1];
940
54.5k
  input_bands = band_stop - band_start;
941
54.5k
  out_bands = (input_bands - 1) / ch_fac + 1;
942
54.5k
  if (out_bands < 1) {
943
0
    out_bands = 1;
944
0
  }
945
946
54.5k
  bands_achived = out_bands * ch_fac;
947
54.5k
  bands_diff = input_bands - bands_achived;
948
525k
  for (i = 0; i < out_bands; i++) {
949
470k
    vdk[i] = ch_fac;
950
470k
  }
951
952
54.5k
  if (bands_diff > 0) {
953
0
    incr = -1;
954
0
    k = out_bands - 1;
955
54.5k
  } else {
956
54.5k
    incr = 1;
957
54.5k
    k = 0;
958
54.5k
  }
959
960
224k
  while (bands_diff != 0) {
961
170k
    vdk[k] = vdk[k] - incr;
962
170k
    k = k + incr;
963
170k
    bands_diff = bands_diff + incr;
964
170k
    if (k >= out_bands) {
965
157k
      if (bands_diff > 0) {
966
0
        k = out_bands - 1;
967
157k
      } else if (bands_diff < 0) {
968
146k
        k = 0;
969
146k
      }
970
157k
    }
971
170k
  }
972
54.5k
  map[0] = band_start;
973
525k
  for (i = 0; i < out_bands; i++) {
974
470k
    map[i + 1] = map[i] + vdk[i];
975
470k
  }
976
54.5k
}
977
978
static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
979
51.9k
                                      WORD32 data_bands) {
980
51.9k
  WORD32 i, j, band_start, band_stop, value;
981
51.9k
  WORD32 start_band_0 = map[0];
982
983
504k
  for (i = 0; i < data_bands; i++) {
984
452k
    value = in[i + start_band_0];
985
986
452k
    band_start = map[i];
987
452k
    band_stop = map[i + 1];
988
1.22M
    for (j = band_start; j < band_stop; j++) {
989
770k
      out[j] = value;
990
770k
    }
991
452k
  }
992
51.9k
}
993
994
5.15M
static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
995
5.15M
  switch (param_type) {
996
1.82M
    case CLD:
997
1.82M
      return ixheaacd_cld_de_quant_table[(value + 15)];
998
999
1.82M
    case ICC:
1000
1.82M
      return ixheaacd_icc_de_quant_table[value];
1001
1002
1.50M
    case IPD:
1003
1.50M
      return ixheaacd_ipd_de_quant_table[(value & 15)];
1004
1005
0
    default:
1006
0
      return 0;
1007
0
      return 0;
1008
5.15M
  }
1009
5.15M
}
1010
1011
static IA_ERRORCODE ixheaacd_mps_mapindexdata(
1012
    ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data,
1013
    FLOAT32 out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1014
    WORD32 out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1015
    WORD32 cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1016
312k
    WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) {
1017
312k
  WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
1018
312k
  WORD32 map[MAX_PARAMETER_BANDS + 1];
1019
1020
312k
  WORD32 set_index, i, band, parm_slot;
1021
312k
  WORD32 data_bands, ch_fac;
1022
312k
  WORD32 ps;
1023
1024
312k
  WORD32 i1, i2, x1, xi, x2;
1025
312k
  WORD32 band_start = 0;
1026
312k
  WORD32 ext_frame_flag = self->ext_frame_flag;
1027
312k
  WORD32 *param_slots = self->param_slots;
1028
312k
  WORD32 num_parameter_sets = self->num_parameter_sets;
1029
312k
  WORD32 band_stop = self->bs_param_bands;
1030
312k
  WORD32 default_val = 0;
1031
1032
312k
  set_index = 0;
1033
1034
676k
  for (i = 0; i < num_parameter_sets; i++) {
1035
364k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
1036
224k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1037
3.34M
      for (band = band_start; band < band_stop; band++) {
1038
3.11M
        out_idx_data[i][band] = default_val;
1039
3.11M
      }
1040
3.34M
      for (band = band_start; band < band_stop; band++) {
1041
3.11M
        idx_prev[band] = out_idx_data[i][band];
1042
3.11M
      }
1043
1044
224k
      frame_xxx_data->bs_quant_coarse_xxx_prev = 0;
1045
224k
    }
1046
1047
364k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 1) {
1048
701k
      for (band = band_start; band < band_stop; band++) {
1049
656k
        out_idx_data[i][band] = idx_prev[band];
1050
656k
      }
1051
44.6k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1052
44.6k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1053
44.6k
    }
1054
1055
364k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 2) {
1056
669k
      for (band = band_start; band < band_stop; band++) {
1057
626k
        out_idx_data[i][band] = idx_prev[band];
1058
626k
      }
1059
42.9k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1060
42.9k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1061
42.9k
      interpolate_local[i] = 1;
1062
321k
    } else {
1063
321k
      interpolate_local[i] = 0;
1064
321k
    }
1065
1066
364k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
1067
51.9k
      parm_slot = i;
1068
51.9k
      ch_fac =
1069
51.9k
          ixheaacd_mps_stride_table[frame_xxx_data
1070
51.9k
                                        ->bs_freq_res_stride_xxx[set_index]];
1071
51.9k
      data_bands = (band_stop - band_start - 1) / ch_fac + 1;
1072
51.9k
      ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac);
1073
51.9k
      ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0],
1074
51.9k
                                &out_idx_data[parm_slot][0], map, data_bands);
1075
1076
822k
      for (band = band_start; band < band_stop; band++) {
1077
770k
        idx_prev[band] = out_idx_data[parm_slot][band];
1078
770k
      }
1079
1080
51.9k
      frame_xxx_data->bs_quant_coarse_xxx_prev =
1081
51.9k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1082
51.9k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1083
51.9k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1084
1085
51.9k
      set_index++;
1086
51.9k
    }
1087
364k
  }
1088
1089
676k
  for (i = 0; i < num_parameter_sets; i++) {
1090
364k
    if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) {
1091
46.4k
      ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start,
1092
46.4k
                               band_stop - band_start);
1093
46.4k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1094
46.4k
    }
1095
364k
  }
1096
1097
312k
  i1 = -1;
1098
312k
  x1 = 0;
1099
312k
  i2 = 0;
1100
675k
  for (i = 0; i < num_parameter_sets; i++) {
1101
363k
    if (interpolate_local[i] != 1) {
1102
320k
      i1 = i;
1103
320k
    }
1104
363k
    i2 = i;
1105
406k
    while (interpolate_local[i2] == 1) {
1106
43.2k
      i2++;
1107
43.2k
    }
1108
363k
    if (i1 == -1) {
1109
39.9k
      x1 = 0;
1110
39.9k
      i1 = 0;
1111
323k
    } else {
1112
323k
      x1 = param_slots[i1];
1113
323k
    }
1114
363k
    xi = param_slots[i];
1115
363k
    x2 = param_slots[i2];
1116
1117
363k
    if (interpolate_local[i] == 1) {
1118
42.8k
      if (i2 < num_parameter_sets) {
1119
189
        if (self->ec_flag == 0) {
1120
189
          return IA_FATAL_ERROR;
1121
189
        }
1122
189
      }
1123
1124
665k
      for (band = band_start; band < band_stop; band++) {
1125
623k
        WORD32 yi, y1, y2;
1126
623k
        yi = 0;
1127
623k
        y1 = out_idx_data[i1][band];
1128
623k
        y2 = out_idx_data[i2][band];
1129
623k
        if (param_type == IPD) {
1130
152k
          if (y2 - y1 > 8) y1 += 16;
1131
152k
          if (y1 - y2 > 8) y2 += 16;
1132
1133
152k
          if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
1134
470k
        } else {
1135
470k
          if (x2 != x1) {
1136
36.1k
            yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1137
36.1k
          }
1138
470k
        }
1139
623k
        out_idx_data[i][band] = yi;
1140
623k
      }
1141
42.6k
    }
1142
363k
  }
1143
1144
675k
  for (ps = 0; ps < num_parameter_sets; ps++) {
1145
5.52M
    for (band = band_start; band < band_stop; band++) {
1146
5.15M
      if (param_type == CLD) {
1147
1.82M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
1148
3.33M
      } else if (param_type == ICC)
1149
1.82M
      {
1150
1.82M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
1151
1.82M
      }
1152
5.15M
      out_data[ps][band] =
1153
5.15M
          ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type);
1154
5.15M
    }
1155
363k
  }
1156
1157
312k
  if (ext_frame_flag) {
1158
76.7k
    for (band = band_start; band < band_stop; band++) {
1159
69.6k
      out_data[num_parameter_sets][band] =
1160
69.6k
          out_data[num_parameter_sets - 1][band];
1161
69.6k
      out_idx_data[num_parameter_sets][band] =
1162
69.6k
          out_idx_data[num_parameter_sets - 1][band];
1163
69.6k
    }
1164
7.09k
  }
1165
312k
  return IA_NO_ERROR;
1166
312k
}
1167
1168
static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott(
1169
112k
    ia_mps_dec_state_struct *self) {
1170
112k
  ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame);
1171
112k
  IA_ERRORCODE err_code = 0;
1172
1173
112k
  err_code = ixheaacd_mps_mapindexdata(
1174
112k
      self, &cur_bit_stream_ptr->cld_data, self->cld_data,
1175
112k
      cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx,
1176
112k
      cur_bit_stream_ptr->cld_idx_pre, CLD);
1177
112k
  if (err_code != IA_NO_ERROR) return err_code;
1178
112k
  err_code = ixheaacd_mps_mapindexdata(
1179
112k
      self, &cur_bit_stream_ptr->icc_data, self->icc_data,
1180
112k
      cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx,
1181
112k
      cur_bit_stream_ptr->icc_idx_pre, ICC);
1182
112k
  if (err_code != IA_NO_ERROR) return err_code;
1183
112k
  if ((self->config->bs_phase_coding)) {
1184
86.6k
    err_code = ixheaacd_mps_mapindexdata(
1185
86.6k
        self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
1186
86.6k
        cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
1187
86.6k
        cur_bit_stream_ptr->ipd_idx_prev, IPD);
1188
1189
86.6k
    if (err_code != IA_NO_ERROR) return err_code;
1190
86.6k
  }
1191
112k
  return IA_NO_ERROR;
1192
112k
}
1193
1194
112k
static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) {
1195
112k
  WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
1196
112k
      group_to_band[MAX_PARAMETER_BANDS + 1];
1197
112k
  ia_mps_bs_frame *frame = &(self->bs_frame);
1198
243k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
1199
130k
    switch (frame->bs_smooth_mode[ps]) {
1200
116k
      case 0:
1201
116k
        self->smoothing_time[ps] = 256;
1202
116k
        self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
1203
1204
1.73M
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1205
1.61M
          self->smoothing_data[ps][pb] = 0;
1206
1.61M
        }
1207
116k
        break;
1208
1209
5.78k
      case 1:
1210
5.78k
        if (ps > 0) {
1211
2.67k
          self->smoothing_time[ps] = self->smoothing_time[ps - 1];
1212
2.67k
          self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1];
1213
3.11k
        } else {
1214
3.11k
          self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time;
1215
3.11k
          self->inv_smoothing_time[ps] =
1216
3.11k
              self->smoothing_filt_state.inv_prev_smg_time;
1217
3.11k
        }
1218
1219
74.8k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1220
69.0k
          if (ps > 0)
1221
36.5k
            self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb];
1222
32.5k
          else
1223
32.5k
            self->smoothing_data[ps][pb] =
1224
32.5k
                self->smoothing_filt_state.prev_smg_data[pb];
1225
69.0k
        }
1226
5.78k
        break;
1227
1228
6.32k
      case 2:
1229
6.32k
        self->smoothing_time[ps] =
1230
6.32k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1231
6.32k
        self->inv_smoothing_time[ps] =
1232
6.32k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1233
100k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1234
94.2k
          self->smoothing_data[ps][pb] = 1;
1235
94.2k
        }
1236
6.32k
        break;
1237
1238
2.60k
      case 3:
1239
2.60k
        self->smoothing_time[ps] =
1240
2.60k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1241
2.60k
        self->inv_smoothing_time[ps] =
1242
2.60k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1243
1244
2.60k
        ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
1245
2.60k
        data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
1246
2.60k
        ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands,
1247
2.60k
                                   ch_fac);
1248
20.9k
        for (pg = 0; pg < data_bands; pg++) {
1249
18.3k
          param_band_start = group_to_band[pg];
1250
18.3k
          param_band_stop = group_to_band[pg + 1];
1251
62.4k
          for (pb = param_band_start; pb < param_band_stop; pb++) {
1252
44.1k
            self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg];
1253
44.1k
          }
1254
18.3k
        }
1255
2.60k
        break;
1256
130k
    }
1257
130k
  }
1258
1259
112k
  self->smoothing_filt_state.prev_smg_time =
1260
112k
      self->smoothing_time[self->num_parameter_sets - 1];
1261
112k
  self->smoothing_filt_state.inv_prev_smg_time =
1262
112k
      self->inv_smoothing_time[self->num_parameter_sets - 1];
1263
1.67M
  for (pb = 0; pb < self->bs_param_bands; pb++) {
1264
1.56M
    self->smoothing_filt_state.prev_smg_data[pb] =
1265
1.56M
        self->smoothing_data[self->num_parameter_sets - 1][pb];
1266
1.56M
  }
1267
1268
112k
  if (self->ext_frame_flag) {
1269
3.06k
    self->smoothing_time[self->num_parameter_sets] =
1270
3.06k
        self->smoothing_time[self->num_parameter_sets - 1];
1271
3.06k
    self->inv_smoothing_time[self->num_parameter_sets] =
1272
3.06k
        self->inv_smoothing_time[self->num_parameter_sets - 1];
1273
32.9k
    for (pb = 0; pb < self->bs_param_bands; pb++) {
1274
29.9k
      self->smoothing_data[self->num_parameter_sets][pb] =
1275
29.9k
          self->smoothing_data[self->num_parameter_sets - 1][pb];
1276
29.9k
    }
1277
3.06k
  }
1278
112k
}
1279
1280
112k
IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
1281
112k
  WORD32 i;
1282
112k
  IA_ERRORCODE err_code = 0;
1283
112k
  if (self->ldmps_config.ldmps_present_flag != 1)
1284
109k
    if (self->parse_nxt_frame == 1) return err_code;
1285
112k
  self->ext_frame_flag = 0;
1286
112k
  if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) {
1287
3.07k
    self->ext_frame_flag = 1;
1288
3.07k
  }
1289
1290
112k
  err_code = ixheaacd_mps_dec_and_mapframeott(self);
1291
112k
  if (err_code != IA_NO_ERROR) return err_code;
1292
112k
  ixheaacd_mps_dec_and_mapframesmg(self);
1293
1294
112k
  if (self->ext_frame_flag) {
1295
3.06k
    self->num_parameter_sets++;
1296
3.06k
    self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
1297
3.06k
  }
1298
112k
  self->param_slot_diff[0] = self->param_slots[0] + 1;
1299
112k
  if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) {
1300
0
    if (self->ec_flag == 0) {
1301
0
      return -1;
1302
0
    } else {
1303
0
      self->param_slot_diff[0] = MAX_TIME_SLOTS;
1304
0
    }
1305
0
  }
1306
112k
  self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0];
1307
112k
  self->inv_param_slot_diff_Q30[0] =
1308
112k
      (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
1309
133k
  for (i = 1; i < self->num_parameter_sets; i++) {
1310
21.3k
    self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
1311
21.3k
    if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) ||
1312
21.3k
        (self->param_slot_diff[i] == 0)) {
1313
5
      if (self->ec_flag == 0) {
1314
5
        return -1;
1315
5
      } else {
1316
0
        self->param_slot_diff[i] = 1;
1317
0
        self->inv_param_slot_diff[i] = 1;
1318
0
      }
1319
5
    }
1320
21.3k
    self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
1321
21.3k
    self->inv_param_slot_diff_Q30[i] =
1322
21.3k
        (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
1323
21.3k
  }
1324
112k
  return IA_NO_ERROR;
1325
112k
}
1326
1327
4.07k
WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
1328
4.07k
  WORD32 samp_freq;
1329
4.07k
  WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
1330
4.07k
                                24000, 22050, 16000, 12000, 11025, 8000,
1331
4.07k
                                7350,  0,     0,     0};
1332
1333
4.07k
  if (self->ldmps_config.ldmps_present_flag == 1)
1334
1.31k
    self->time_slots = self->frame_length + 1;
1335
2.75k
  else
1336
2.75k
    self->time_slots = self->frame_length;
1337
1338
4.07k
  self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
1339
1340
4.07k
  if (self->ldmps_config.ldmps_present_flag == 1) {
1341
1.31k
    if (self->ldmps_config.bs_sampling_freq_index == 15) {
1342
11
      samp_freq = self->ldmps_config.bs_fampling_frequency;
1343
1.30k
    } else {
1344
1.30k
      samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
1345
1.30k
    }
1346
1347
1.31k
    if (samp_freq < 27713.0) {
1348
829
      self->qmf_band_count = 32;
1349
829
    } else if (samp_freq >= 55426.0) {
1350
28
      self->qmf_band_count = 128;
1351
461
    } else {
1352
461
      self->qmf_band_count = 64;
1353
461
    }
1354
1.31k
  }
1355
1356
4.07k
  if (self->object_type == AOT_ER_AAC_ELD ||
1357
2.75k
      self->object_type == AOT_ER_AAC_LD) {
1358
1.31k
    self->bs_param_bands =
1359
1.31k
        ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
1360
1.31k
    self->hyb_band_count_max = self->qmf_band_count;
1361
1.31k
  } else
1362
2.75k
    self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
1363
1364
4.07k
  if (self->object_type == AOT_ER_AAC_ELD ||
1365
2.75k
      self->object_type == AOT_ER_AAC_LD) {
1366
1.31k
    switch (self->bs_param_bands) {
1367
66
      case 4:
1368
1369
66
        self->hyb_band_to_processing_band_table =
1370
66
            ixheaacd_hybrid_band_64_to_processing_band_4_map;
1371
66
        break;
1372
29
      case 5:
1373
1374
29
        self->hyb_band_to_processing_band_table =
1375
29
            ixheaacd_hybrid_band_64_to_processing_band_5_map;
1376
29
        break;
1377
57
      case 7:
1378
1379
57
        self->hyb_band_to_processing_band_table =
1380
57
            ixheaacd_hybrid_band_64_to_processing_band_7_map;
1381
57
        break;
1382
121
      case 9:
1383
1384
121
        self->hyb_band_to_processing_band_table =
1385
121
            ixheaacd_hybrid_band_64_to_processing_band_9_map;
1386
121
        break;
1387
101
      case 12:
1388
1389
101
        self->hyb_band_to_processing_band_table =
1390
101
            ixheaacd_hybrid_band_64_to_processing_band_12_map;
1391
101
        break;
1392
153
      case 15:
1393
1394
153
        self->hyb_band_to_processing_band_table =
1395
153
            ixheaacd_hybrid_band_64_to_processing_band_15_map;
1396
153
        break;
1397
781
      case 23:
1398
1399
781
        self->hyb_band_to_processing_band_table =
1400
781
            ixheaacd_hybrid_band_64_to_processing_band_23_map;
1401
781
        break;
1402
10
      default:
1403
10
        self->hyb_band_to_processing_band_table = NULL;
1404
10
        return -1;
1405
0
        break;
1406
1.31k
    }
1407
2.75k
  } else {
1408
2.75k
    switch (self->bs_param_bands) {
1409
830
      case 4:
1410
830
        self->hyb_band_to_processing_band_table =
1411
830
            ixheaacd_hybrid_band_71_to_processing_band_4_map;
1412
830
        break;
1413
315
      case 5:
1414
315
        self->hyb_band_to_processing_band_table =
1415
315
            ixheaacd_hybrid_band_71_to_processing_band_5_map;
1416
315
        break;
1417
387
      case 7:
1418
387
        self->hyb_band_to_processing_band_table =
1419
387
            ixheaacd_hybrid_band_71_to_processing_band_7_map;
1420
387
        break;
1421
433
      case 10:
1422
433
        self->hyb_band_to_processing_band_table =
1423
433
            ixheaacd_hybrid_band_71_to_processing_band_10_map;
1424
433
        break;
1425
164
      case 14:
1426
164
        self->hyb_band_to_processing_band_table =
1427
164
            ixheaacd_hybrid_band_71_to_processing_band_14_map;
1428
164
        break;
1429
159
      case 20:
1430
159
        self->hyb_band_to_processing_band_table =
1431
159
            ixheaacd_hybrid_band_71_to_processing_band_20_map;
1432
159
        break;
1433
464
      case 28:
1434
464
        self->hyb_band_to_processing_band_table =
1435
464
            ixheaacd_hybrid_band_71_to_processing_band_28_map;
1436
464
        break;
1437
2
      default:
1438
2
        self->hyb_band_to_processing_band_table = NULL;
1439
2
        return -1;
1440
0
        break;
1441
2.75k
    }
1442
2.75k
  }
1443
4.06k
  self->in_ch_count = 1;
1444
4.06k
  self->out_ch_count = 2;
1445
1446
4.06k
  self->input_gain =
1447
4.06k
      ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx];
1448
1449
4.06k
  if (self->config->bs_ott_bands_phase_present) {
1450
967
    self->num_bands_ipd = self->config->bs_ott_bands_phase;
1451
3.09k
  } else {
1452
3.09k
    if (!(self->object_type == AOT_ER_AAC_ELD ||
1453
1.78k
          self->object_type == AOT_ER_AAC_LD)) {
1454
1.78k
      switch (self->bs_param_bands) {
1455
738
        case 4:
1456
935
        case 5:
1457
935
          self->num_bands_ipd = 2;
1458
935
          break;
1459
327
        case 7:
1460
327
          self->num_bands_ipd = 3;
1461
327
          break;
1462
96
        case 10:
1463
96
          self->num_bands_ipd = 5;
1464
96
          break;
1465
114
        case 14:
1466
114
          self->num_bands_ipd = 7;
1467
114
          break;
1468
45
        case 20:
1469
313
        case 28:
1470
313
          self->num_bands_ipd = 10;
1471
313
          break;
1472
0
        default:
1473
0
          return -1;
1474
0
          break;
1475
1.78k
      }
1476
1.78k
    }
1477
3.09k
  }
1478
1479
4.06k
  if (self->residual_coding) {
1480
1.50k
    self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd);
1481
1.50k
    self->max_res_bands = 0;
1482
1.50k
    if (self->bs_residual_present) {
1483
1.50k
      self->res_bands = self->bs_residual_bands;
1484
1.50k
      if (self->res_bands > self->max_res_bands) {
1485
1.06k
        self->max_res_bands = self->res_bands;
1486
1.06k
      }
1487
1.50k
    } else {
1488
0
      self->res_bands = 0;
1489
0
    }
1490
1.50k
  }
1491
1492
4.06k
  if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1;
1493
1494
4.06k
  self->dir_sig_count = 1;
1495
4.06k
  self->decor_sig_count = 1;
1496
1497
4.06k
  self->bs_high_rate_mode = self->config->bs_high_rate_mode;
1498
4.06k
  self->pre_mix_req = 1;
1499
1500
4.06k
  return 0;
1501
4.06k
}