Coverage Report

Created: 2026-06-10 06:29

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
2.46M
static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
174
2.46M
  var = min(var, upper_bound);
175
2.46M
  var = max(var, lower_bound);
176
2.46M
  return var;
177
2.46M
}
178
179
static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b,
180
979k
                               UWORD16 d[], WORD32 len) {
181
979k
  WORD32 k;
182
979k
  UWORD32 tmp;
183
979k
  UWORD32 b0 = (UWORD32)b;
184
185
979k
  tmp = ((UWORD32)a[0]) * b0;
186
979k
  d[0] = (UWORD16)tmp;
187
188
4.89M
  for (k = 1; k < len; k++) {
189
3.91M
    tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0;
190
3.91M
    d[k] = (UWORD16)tmp;
191
3.91M
  }
192
979k
}
193
194
static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a,
195
979k
                             UWORD16 d[], UWORD16 *pr, WORD32 len) {
196
979k
  UWORD32 r;
197
979k
  UWORD32 tmp;
198
979k
  UWORD32 temp;
199
979k
  WORD32 k;
200
201
979k
  if (a == 0)
202
0
    return;
203
204
979k
  r = 0;
205
206
5.87M
  for (k = len - 1; k >= 0; k--) {
207
4.89M
    tmp = ((UWORD32)b[k]) + (r << 16);
208
209
4.89M
    if (tmp) {
210
1.53M
      d[k] = (UWORD16)(tmp / a);
211
1.53M
      temp = d[k] * a;
212
1.53M
      r = tmp - temp;
213
3.36M
    } else {
214
3.36M
      d[k] = 0;
215
3.36M
    }
216
4.89M
  }
217
979k
  *pr = (UWORD16)r;
218
979k
}
219
220
static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena,
221
59.2k
                             WORD32 lenb) {
222
59.2k
  WORD32 h;
223
59.2k
  WORD32 carry = 0;
224
225
59.2k
  if (lenb > lena)
226
0
    return;
227
228
296k
  for (h = 0; h < lenb; h++) {
229
237k
    carry = carry + (WORD32)(a[h] - b[h]);
230
237k
    a[h] = (UWORD16)carry;
231
237k
    carry = carry >> 16;
232
237k
  }
233
234
59.2k
  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
59.2k
  if (carry != 0)
241
0
    return;
242
59.2k
  return;
243
59.2k
}
244
245
static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[],
246
345k
                                WORD32 len) {
247
345k
  WORD32 i;
248
249
1.27M
  for (i = len - 1; i > 0; i--) {
250
1.02M
    if (a[i] != b[i]) break;
251
1.02M
  }
252
345k
  return (a[i] >= b[i]) ? 1 : 0;
253
345k
}
254
255
static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type,
256
34.1k
                                     WORD32 band_start, WORD32 ixheaacd_num_bands) {
257
34.1k
  WORD32 i;
258
259
573k
  for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
260
538k
    data[i] <<= 1;
261
538k
  }
262
263
34.1k
  if (data_type == CLD) {
264
144k
    for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
265
135k
      if (data[i] == -14)
266
14.3k
        data[i] = -15;
267
121k
      else if (data[i] == 14)
268
3.68k
        data[i] = 15;
269
135k
    }
270
9.23k
  }
271
34.1k
}
272
273
7.98k
static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) {
274
7.98k
  WORD32 i;
275
276
91.7k
  for (i = 0; i < ixheaacd_num_bands; i++) {
277
83.8k
    data[i] /= 2;
278
83.8k
  }
279
7.98k
}
280
281
static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start,
282
26.0k
                                     WORD32 band_stop, WORD32 *strides) {
283
26.0k
  WORD32 i, pb, ch_fac, data_bands, start_offset;
284
285
26.0k
  ch_fac = ixheaacd_mps_stride_table[freq_res_stride];
286
26.0k
  data_bands = (band_stop - band_start - 1) / ch_fac + 1;
287
288
26.0k
  strides[0] = band_start;
289
226k
  for (pb = 1; pb <= data_bands; pb++) {
290
199k
    strides[pb] = strides[pb - 1] + ch_fac;
291
199k
  }
292
26.0k
  start_offset = 0;
293
122k
  while (strides[data_bands] > band_stop) {
294
96.8k
    if (start_offset < data_bands)
295
8.74k
      start_offset++;
296
88.0k
    else
297
88.0k
      start_offset = 1;
298
299
207k
    for (i = start_offset; i <= data_bands; i++) {
300
110k
      strides[i]--;
301
110k
    }
302
96.8k
  }
303
304
26.0k
  return data_bands;
305
26.0k
}
306
307
static IA_ERRORCODE ixheaacd_mps_ecdata_decoding(
308
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream,
309
170k
    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) {
310
170k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
311
170k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
312
170k
  WORD32 band_stop = 0;
313
314
170k
  WORD32 *lastdata = NULL;
315
170k
  ia_mps_data_struct *frame_xxx_data = NULL;
316
170k
  WORD32 default_val = 0;
317
170k
  IA_ERRORCODE err = IA_NO_ERROR;
318
319
170k
  ia_mps_bs_frame *frame = &(self->bs_frame);
320
321
170k
  if (datatype == 0) {
322
77.5k
    frame_xxx_data = &frame->cld_data;
323
77.5k
    lastdata = frame->cmp_cld_idx_prev;
324
77.5k
    band_stop = self->bs_param_bands;
325
92.6k
  } else if (datatype == 1) {
326
77.4k
    frame_xxx_data = &frame->icc_data;
327
77.4k
    lastdata = frame->cmp_icc_idx_prev;
328
77.4k
    band_stop = self->bs_param_bands;
329
77.4k
  } else if (datatype == 2) {
330
15.1k
    frame_xxx_data = &frame->ipd_data;
331
15.1k
    lastdata = frame->ipd_idx_data_prev;
332
15.1k
    band_stop = self->num_bands_ipd;
333
15.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
366k
  for (i = 0; i < self->num_parameter_sets; i++) {
340
196k
    frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2);
341
196k
  }
342
343
170k
  set_index = 0;
344
170k
  bs_data_pair = 0;
345
170k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
346
347
366k
  for (i = 0; i < self->num_parameter_sets; i++) {
348
196k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
349
1.53M
      for (pb = 0; pb < band_stop; pb++) {
350
1.42M
        lastdata[pb] = default_val;
351
1.42M
      }
352
353
111k
      old_quant_coarse_xxx = 0;
354
111k
    }
355
356
196k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
357
20.9k
      if (bs_data_pair) {
358
714
        bs_data_pair = 0;
359
20.1k
      } else {
360
20.1k
        bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1);
361
20.1k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
362
20.1k
            ixheaacd_read_bits_buf(bitstream, 1);
363
20.1k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
364
20.1k
            ixheaacd_read_bits_buf(bitstream, 2);
365
366
20.1k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
367
20.1k
            old_quant_coarse_xxx) {
368
4.88k
          if (old_quant_coarse_xxx) {
369
598
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
370
4.28k
          } else {
371
4.28k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
372
4.28k
          }
373
4.88k
        }
374
375
20.1k
        data_bands = ixheaacd_mps_getstridemap(
376
20.1k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop,
377
20.1k
            strides);
378
379
190k
        for (pb = 0; pb < data_bands; pb++) {
380
170k
          lastdata[pb] = lastdata[strides[pb]];
381
170k
        }
382
383
20.1k
        err = ixheaacd_mps_ecdatapairdec(
384
20.1k
            bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
385
20.1k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
386
20.1k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag);
387
20.1k
        if (err) return err;
388
389
190k
        for (pb = 0; pb < data_bands; pb++) {
390
418k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
391
248k
            if (datatype == IPD) {
392
51.9k
              if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
393
26.6k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
394
26.6k
              } else {
395
25.2k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
396
25.2k
              }
397
196k
            } else {
398
196k
              lastdata[j] = data[set_index + bs_data_pair][pb];
399
196k
            }
400
248k
          }
401
169k
        }
402
403
20.1k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
404
405
20.1k
        if (bs_data_pair) {
406
6.43k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
407
6.43k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
408
6.43k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
409
6.43k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
410
6.43k
        }
411
20.1k
        set_index += bs_data_pair + 1;
412
20.1k
      }
413
20.9k
    }
414
196k
  }
415
170k
  return err;
416
170k
}
417
418
IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self,
419
                                        WORD32 usac_independency_flag,
420
77.5k
                                        ia_bit_buf_struct *bitstream) {
421
77.5k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
422
77.5k
  WORD32 ps, pg, ts, pb;
423
77.5k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
424
425
77.5k
  WORD32 bits_param_slot = 0;
426
427
77.5k
  ia_mps_bs_frame *frame = &(self->bs_frame);
428
77.5k
  IA_ERRORCODE err = IA_NO_ERROR;
429
430
77.5k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
431
432
77.5k
  self->num_parameter_sets_prev = self->num_parameter_sets;
433
434
77.5k
  if (self->bs_high_rate_mode) {
435
18.2k
    bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1);
436
18.2k
    self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1;
437
59.2k
  } else {
438
59.2k
    bs_frame_type = 0;
439
59.2k
    self->num_parameter_sets = 1;
440
59.2k
  }
441
442
77.5k
  if (self->time_slots == 32)
443
63.1k
    bits_param_slot = 5;
444
14.3k
  else if (self->time_slots == 64)
445
14.3k
    bits_param_slot = 6;
446
447
77.5k
  if (bs_frame_type) {
448
3.09k
    WORD32 prev_param_slot = -1;
449
6.26k
    for (i = 0; i < self->num_parameter_sets; i++) {
450
3.20k
      self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot);
451
452
3.20k
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
453
34
        return IA_FATAL_ERROR;
454
34
      }
455
3.17k
      prev_param_slot = self->param_slots[i];
456
3.17k
    }
457
74.4k
  } else {
458
160k
    for (i = 0; i < self->num_parameter_sets; i++) {
459
86.3k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
460
86.3k
                              self->num_parameter_sets) -
461
86.3k
                             1;
462
86.3k
    }
463
74.4k
  }
464
465
77.5k
  if (!usac_independency_flag) {
466
75.8k
    frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1);
467
75.8k
  } else {
468
1.70k
    frame->independency_flag = 1;
469
1.70k
  }
470
471
77.5k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD);
472
77.5k
  if (err) return err;
473
474
77.5k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC);
475
77.5k
  if (err) return err;
476
477
77.5k
  if (self->config->bs_phase_coding) {
478
62.1k
    self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1);
479
480
62.1k
    if (!self->bs_phase_mode) {
481
654k
      for (pb = 0; pb < self->num_bands_ipd; pb++) {
482
607k
        frame->ipd_idx_data_prev[pb] = 0;
483
1.32M
        for (i = 0; i < self->num_parameter_sets; i++) {
484
717k
          frame->ipd_idx_data[i][pb] = 0;
485
717k
          self->bs_frame.ipd_idx[i][pb] = 0;
486
717k
        }
487
607k
        self->bs_frame.ipd_idx_prev[pb] = 0;
488
607k
      }
489
46.9k
      self->opd_smoothing_mode = 0;
490
46.9k
    } else {
491
15.1k
      self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1);
492
15.1k
      err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data,
493
15.1k
                                         IPD);
494
15.1k
      if (err) return err;
495
15.1k
    }
496
62.1k
  }
497
498
15.3k
  else {
499
15.3k
    self->bs_phase_mode = 0;
500
88.0k
    for (pb = 0; pb < self->num_bands_ipd; pb++) {
501
72.6k
      frame->ipd_idx_data_prev[pb] = 0;
502
168k
      for (i = 0; i < self->num_parameter_sets; i++) {
503
95.6k
        frame->ipd_idx_data[i][pb] = 0;
504
95.6k
        self->bs_frame.ipd_idx[i][pb] = 0;
505
95.6k
      }
506
72.6k
      self->bs_frame.ipd_idx_prev[pb] = 0;
507
72.6k
    }
508
15.3k
    self->opd_smoothing_mode = 0;
509
15.3k
  }
510
511
77.5k
  if (self->bs_high_rate_mode) {
512
48.1k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
513
30.0k
      frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2);
514
30.0k
      if (frame->bs_smooth_mode[ps] >= 2) {
515
8.40k
        frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2);
516
8.40k
      }
517
30.0k
      if (frame->bs_smooth_mode[ps] == 3) {
518
2.17k
        frame->bs_freq_res_stride_smg[ps] =
519
2.17k
            ixheaacd_read_bits_buf(bitstream, 2);
520
2.17k
        data_bands =
521
2.17k
            (self->bs_param_bands - 1) /
522
2.17k
                ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
523
2.17k
            1;
524
22.0k
        for (pg = 0; pg < data_bands; pg++) {
525
19.8k
          frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1);
526
19.8k
        }
527
2.17k
      }
528
30.0k
    }
529
59.3k
  } else {
530
118k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
531
59.2k
      frame->bs_smooth_mode[ps] = 0;
532
59.2k
    }
533
59.3k
  }
534
535
232k
  for (i = 0; i < 2; i++) {
536
154k
    self->temp_shape_enable_ch_stp[i] = 0;
537
154k
    self->temp_shape_enable_ch_ges[i] = 0;
538
154k
  }
539
540
77.5k
  self->bs_tsd_enable = 0;
541
77.5k
  if (self->config->bs_temp_shape_config == 3) {
542
38.9k
    self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1);
543
38.9k
  } else if (self->config->bs_temp_shape_config != 0) {
544
24.2k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1);
545
24.2k
    if (bs_temp_shape_enable) {
546
3.52k
      num_of_temp_shape_ch = 2;
547
3.52k
      switch (self->config->bs_temp_shape_config) {
548
2.61k
        case 1:
549
7.83k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
550
5.22k
            self->temp_shape_enable_ch_stp[i] =
551
5.22k
                ixheaacd_read_bits_buf(bitstream, 1);
552
5.22k
          }
553
2.61k
          break;
554
914
        case 2:
555
2.74k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
556
1.82k
            self->temp_shape_enable_ch_ges[i] =
557
1.82k
                ixheaacd_read_bits_buf(bitstream, 1);
558
1.82k
          }
559
2.73k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
560
1.81k
            if (self->temp_shape_enable_ch_ges[i]) {
561
535
              ixheaacd_mps_huff_decode(bitstream, env_shape_data,
562
535
                                       self->time_slots);
563
19.1k
              for (ts = 0; ts < self->time_slots; ts++) {
564
18.6k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
565
18.6k
                    2, (FLOAT32)env_shape_data[ts] /
566
18.6k
                               (self->config->bs_env_quant_mode + 2) -
567
18.6k
                           1);
568
18.6k
              }
569
535
            }
570
1.81k
          }
571
914
          break;
572
0
        default:
573
0
          return -1;
574
3.52k
      }
575
3.52k
    }
576
24.2k
  }
577
578
77.4k
  if (self->bs_tsd_enable) {
579
8.91k
    UWORD16 s[4];
580
8.91k
    UWORD64 s_64;
581
8.91k
    UWORD16 c[5];
582
8.91k
    UWORD64 c_64;
583
8.91k
    UWORD16 b;
584
8.91k
    UWORD16 r[1];
585
8.91k
    static const UWORD16 table_64[] = {
586
8.91k
        6,  11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49,
587
8.91k
        51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61};
588
8.91k
    static const UWORD16 table_32[] = {5,  9,  13, 16, 18, 20, 22, 24,
589
8.91k
                                              25, 26, 27, 28, 29, 29, 30, 30};
590
8.91k
    unsigned const short *tab = NULL;
591
8.91k
    WORD32 k;
592
8.91k
    UWORD16 h;
593
8.91k
    WORD32 nbits_tr_slots = 0;
594
595
8.91k
    if (self->time_slots == 32) {
596
4.43k
      nbits_tr_slots = 4;
597
4.43k
      tab = table_32;
598
4.48k
    } else if (self->time_slots == 64) {
599
4.48k
      nbits_tr_slots = 5;
600
4.48k
      tab = table_64;
601
4.48k
    }
602
603
8.91k
    self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots);
604
8.91k
    self->tsd_num_tr_slots++;
605
8.91k
    self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1];
606
607
8.91k
    if (self->tsd_codeword_len > 48) {
608
41
      s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48);
609
41
      s_64 = s[3];
610
41
      s[2] = ixheaacd_read_bits_buf(bitstream, 16);
611
41
      s_64 = (s_64 << 16) | s[2];
612
41
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
613
41
      s_64 = (s_64 << 16) | s[1];
614
41
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
615
41
      s_64 = (s_64 << 16) | s[0];
616
8.87k
    } else if (self->tsd_codeword_len > 32) {
617
1.75k
      s[3] = 0;
618
1.75k
      s_64 = s[3];
619
1.75k
      s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32);
620
1.75k
      s_64 = (s_64 << 16) | s[2];
621
1.75k
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
622
1.75k
      s_64 = (s_64 << 16) | s[1];
623
1.75k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
624
1.75k
      s_64 = (s_64 << 16) | s[0];
625
7.11k
    } else if (self->tsd_codeword_len > 16) {
626
3.61k
      s[3] = 0;
627
3.61k
      s_64 = s[3];
628
3.61k
      s[2] = 0;
629
3.61k
      s_64 = (s_64 << 16) | s[2];
630
3.61k
      s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16);
631
3.61k
      s_64 = (s_64 << 16) | s[1];
632
3.61k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
633
3.61k
      s_64 = (s_64 << 16) | s[0];
634
3.61k
    } else {
635
3.49k
      s[3] = 0;
636
3.49k
      s_64 = s[3];
637
3.49k
      s[2] = 0;
638
3.49k
      s_64 = (s_64 << 16) | s[2];
639
3.49k
      s[1] = 0;
640
3.49k
      s_64 = (s_64 << 16) | s[1];
641
3.49k
      s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len);
642
3.49k
      s_64 = (s_64 << 16) | s[0];
643
3.49k
    }
644
645
8.91k
    {
646
8.91k
      WORD32 p = self->tsd_num_tr_slots;
647
648
437k
      for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0;
649
650
346k
      for (k = self->time_slots - 1; k >= 0; k--) {
651
346k
        if (p > k) {
652
2.88k
          for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1;
653
994
          break;
654
994
        }
655
656
345k
        c[0] = k - p + 1;
657
345k
        c_64 = c[0];
658
1.72M
        for (i = 1; i < 5; i++) c[i] = 0;
659
660
1.32M
        for (h = 2; h <= p; h++) {
661
979k
          b = k - p + h;
662
979k
          c_64 = c_64 * (b / h);
663
979k
          ixheaacd_longmult1(c, b, c, 5);
664
979k
          b = h;
665
979k
          ixheaacd_longdiv(c, b, c, r, 5);
666
979k
        }
667
668
345k
        if (ixheaacd_longcompare(s, c, 4)) {
669
59.2k
          ixheaacd_longsub(s, c, 4, 4);
670
59.2k
          self->bs_tsd_sep_data[k] = 1;
671
59.2k
          p--;
672
59.2k
          if (p == 0) break;
673
59.2k
        }
674
345k
      }
675
8.91k
    }
676
677
437k
    for (i = 0; i < self->time_slots; i++) {
678
428k
      if (self->bs_tsd_sep_data[i])
679
61.0k
        self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3);
680
428k
    }
681
8.91k
  }
682
683
77.4k
  self->parse_nxt_frame = 0;
684
77.4k
  return err;
685
77.5k
}
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
17.3k
    WORD32 start_band) {
691
17.3k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
692
17.3k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
693
17.3k
  WORD32 band_stop = 0;
694
695
17.3k
  WORD32 *lastdata = NULL;
696
17.3k
  ia_mps_data_struct *frame_xxx_data = NULL;
697
17.3k
  WORD32 default_val = 0;
698
699
17.3k
  ia_mps_bs_frame *frame = &(self->bs_frame);
700
701
17.3k
  if (datatype == CLD) {
702
11.9k
    frame_xxx_data = &frame->cld_data;
703
11.9k
    lastdata = frame->cmp_cld_idx_prev;
704
11.9k
    band_stop = self->bs_param_bands;
705
11.9k
  } else if (datatype == ICC) {
706
5.34k
    frame_xxx_data = &frame->icc_data;
707
5.34k
    lastdata = frame->cmp_icc_idx_prev;
708
5.34k
    band_stop = self->bs_param_bands;
709
5.34k
  } 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
40.4k
  for (i = 0; i < self->num_parameter_sets; i++) {
719
23.1k
    frame_xxx_data->bs_xxx_data_mode[i] =
720
23.1k
        ixheaacd_read_bits_buf(it_bit_buff, 2);
721
23.1k
  }
722
723
17.3k
  set_index = 0;
724
17.3k
  bs_data_pair = 0;
725
17.3k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
726
727
40.4k
  for (i = 0; i < self->num_parameter_sets; i++) {
728
23.0k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
729
87.7k
      for (pb = 0; pb < band_stop; pb++) {
730
76.5k
        lastdata[pb] = default_val;
731
76.5k
      }
732
733
11.1k
      old_quant_coarse_xxx = 0;
734
11.1k
    }
735
736
23.0k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
737
6.74k
      if (bs_data_pair) {
738
839
        bs_data_pair = 0;
739
5.90k
      } else {
740
5.90k
        bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
741
5.90k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
742
5.90k
            ixheaacd_read_bits_buf(it_bit_buff, 1);
743
5.90k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
744
5.90k
            ixheaacd_read_bits_buf(it_bit_buff, 2);
745
746
5.90k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
747
5.90k
            old_quant_coarse_xxx) {
748
4.37k
          if (old_quant_coarse_xxx) {
749
665
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
750
3.70k
          } else {
751
3.70k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
752
3.70k
          }
753
4.37k
        }
754
755
5.90k
        data_bands = ixheaacd_mps_getstridemap(
756
5.90k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
757
5.90k
            band_stop, strides);
758
35.7k
        for (pb = 0; pb < data_bands; pb++) {
759
29.8k
          lastdata[pb] = lastdata[strides[pb]];
760
29.8k
        }
761
762
5.90k
        ixheaacd_mps_ecdatapairdec(
763
5.90k
            it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
764
5.90k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
765
5.90k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
766
767
35.5k
        for (pb = 0; pb < data_bands; pb++) {
768
86.7k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
769
57.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
57.0k
            } else {
776
57.0k
              lastdata[j] = data[set_index + bs_data_pair][pb];
777
57.0k
            }
778
57.0k
          }
779
29.6k
        }
780
781
5.90k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
782
783
5.90k
        if (bs_data_pair) {
784
4.11k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
785
4.11k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
786
4.11k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
787
4.11k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
788
4.11k
        }
789
5.90k
        set_index += bs_data_pair + 1;
790
5.90k
      }
791
6.74k
    }
792
23.0k
  }
793
17.3k
}
794
795
IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
796
2.14k
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
797
2.14k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
798
2.14k
      num_of_temp_shape_ch;
799
2.14k
  WORD32 ps, pg, ts, ic;
800
2.14k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
801
2.14k
  WORD32 alignment;
802
2.14k
  WORD32 bits_param_slot = 0;
803
804
2.14k
  ia_mps_bs_frame *frame = &(self->bs_frame);
805
2.14k
  alignment = it_bit_buff->cnt_bits;
806
2.14k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
807
808
2.14k
  self->num_parameter_sets_prev = self->num_parameter_sets;
809
810
2.14k
  bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
811
2.14k
  self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
812
813
2.14k
  if (self->time_slots == 32)
814
410
    bits_param_slot = 5;
815
1.73k
  else if (self->time_slots == 64)
816
0
    bits_param_slot = 6;
817
1.73k
  else if (self->time_slots == 8)
818
23
    bits_param_slot = 3;
819
1.71k
  else if (self->time_slots == 16 || self->time_slots == 15)
820
71
    bits_param_slot = 4;
821
822
2.14k
  if (bs_frame_type) {
823
402
    WORD32 prev_param_slot = -1;
824
821
    for (i = 0; i < self->num_parameter_sets; i++) {
825
455
      self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
826
827
455
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
828
36
        return IA_FATAL_ERROR;
829
36
      }
830
419
      prev_param_slot = self->param_slots[i];
831
419
    }
832
1.74k
  } else {
833
4.14k
    for (i = 0; i < self->num_parameter_sets; i++) {
834
2.40k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
835
2.40k
                              self->num_parameter_sets) -
836
2.40k
                             1;
837
2.40k
    }
838
1.74k
  }
839
840
2.11k
  frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
841
842
10.5k
  for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
843
8.40k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
844
8.40k
                                    0);
845
8.40k
  }
846
847
2.11k
  if (self->ldmps_config.bs_one_icc) {
848
813
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
849
813
                                    0);
850
1.29k
  } else {
851
6.87k
    for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
852
5.57k
      if (!self->ldmps_config.ott_mode_lfe[i])
853
4.53k
        ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
854
4.53k
                                        ICC, 0);
855
5.57k
    }
856
1.29k
  }
857
858
4.86k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
859
2.75k
    frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
860
2.75k
    if (frame->bs_smooth_mode[ps] >= 2) {
861
980
      frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
862
980
    }
863
2.75k
    if (frame->bs_smooth_mode[ps] == 3) {
864
673
      frame->bs_freq_res_stride_smg[ps] =
865
673
          ixheaacd_read_bits_buf(it_bit_buff, 2);
866
673
      data_bands =
867
673
          (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
868
673
              ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
869
673
          1;
870
3.13k
      for (pg = 0; pg < data_bands; pg++) {
871
2.46k
        frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
872
2.46k
      }
873
673
    }
874
2.75k
  }
875
876
6.28k
  for (i = 0; i < 2; i++) {
877
4.17k
    self->temp_shape_enable_ch_stp[i] = 0;
878
4.17k
    self->temp_shape_enable_ch_ges[i] = 0;
879
4.17k
  }
880
881
2.11k
  if (self->ldmps_config.bs_temp_shape_config != 0) {
882
1.68k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
883
1.68k
    if (bs_temp_shape_enable) {
884
678
      num_of_temp_shape_ch = 2;
885
678
      switch (self->ldmps_config.bs_temp_shape_config) {
886
201
        case 1:
887
603
          for (i = 0; i < num_of_temp_shape_ch; i++) {
888
402
            self->temp_shape_enable_ch_stp[i] =
889
402
                ixheaacd_read_bits_buf(it_bit_buff, 1);
890
402
          }
891
201
          break;
892
463
        case 2:
893
1.38k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
894
926
            self->temp_shape_enable_ch_ges[i] =
895
926
                ixheaacd_read_bits_buf(it_bit_buff, 1);
896
926
          }
897
1.38k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
898
926
            if (self->temp_shape_enable_ch_ges[i]) {
899
599
              ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
900
599
                                       self->time_slots);
901
2.85k
              for (ts = 0; ts < self->time_slots; ts++) {
902
2.25k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
903
2.25k
                    2, (FLOAT32)env_shape_data[ts] /
904
2.25k
                               (self->ldmps_config.bs_env_quant_mode + 2) -
905
2.25k
                           1);
906
2.25k
              }
907
599
            }
908
926
          }
909
463
          break;
910
14
        default:
911
14
          if (self->ec_flag == 0) {
912
14
          return IA_FATAL_ERROR;
913
14
      }
914
0
          break;
915
678
      }
916
678
    }
917
1.68k
  }
918
919
2.09k
  if (self->ldmps_config.bs_arbitrary_downmix != 0) {
920
5.21k
    for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
921
3.56k
      ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
922
3.56k
                                      CLD, 0);
923
3.56k
    }
924
1.64k
  }
925
926
2.09k
  ixheaacd_byte_align(it_bit_buff, &alignment);
927
928
9.11M
  while (it_bit_buff->cnt_bits > 8) {
929
9.11M
    ixheaacd_read_bits_buf(it_bit_buff, 8);
930
9.11M
  }
931
2.09k
  ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
932
2.09k
  return IA_NO_ERROR;
933
2.11k
}
934
935
static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
936
                                       WORD32 band_start, WORD32 band_stop,
937
38.7k
                                       WORD32 ch_fac) {
938
38.7k
  WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
939
38.7k
  WORD32 vdk[MAX_PARAMETER_BANDS + 1];
940
38.7k
  input_bands = band_stop - band_start;
941
38.7k
  out_bands = (input_bands - 1) / ch_fac + 1;
942
38.7k
  if (out_bands < 1) {
943
0
    out_bands = 1;
944
0
  }
945
946
38.7k
  bands_achived = out_bands * ch_fac;
947
38.7k
  bands_diff = input_bands - bands_achived;
948
354k
  for (i = 0; i < out_bands; i++) {
949
315k
    vdk[i] = ch_fac;
950
315k
  }
951
952
38.7k
  if (bands_diff > 0) {
953
0
    incr = -1;
954
0
    k = out_bands - 1;
955
38.7k
  } else {
956
38.7k
    incr = 1;
957
38.7k
    k = 0;
958
38.7k
  }
959
960
157k
  while (bands_diff != 0) {
961
118k
    vdk[k] = vdk[k] - incr;
962
118k
    k = k + incr;
963
118k
    bands_diff = bands_diff + incr;
964
118k
    if (k >= out_bands) {
965
110k
      if (bands_diff > 0) {
966
0
        k = out_bands - 1;
967
110k
      } else if (bands_diff < 0) {
968
102k
        k = 0;
969
102k
      }
970
110k
    }
971
118k
  }
972
38.7k
  map[0] = band_start;
973
354k
  for (i = 0; i < out_bands; i++) {
974
315k
    map[i + 1] = map[i] + vdk[i];
975
315k
  }
976
38.7k
}
977
978
static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
979
35.8k
                                      WORD32 data_bands) {
980
35.8k
  WORD32 i, j, band_start, band_stop, value;
981
35.8k
  WORD32 start_band_0 = map[0];
982
983
325k
  for (i = 0; i < data_bands; i++) {
984
289k
    value = in[i + start_band_0];
985
986
289k
    band_start = map[i];
987
289k
    band_stop = map[i + 1];
988
792k
    for (j = band_start; j < band_stop; j++) {
989
502k
      out[j] = value;
990
502k
    }
991
289k
  }
992
35.8k
}
993
994
3.45M
static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
995
3.45M
  switch (param_type) {
996
1.23M
    case CLD:
997
1.23M
      return ixheaacd_cld_de_quant_table[(value + 15)];
998
999
1.23M
    case ICC:
1000
1.23M
      return ixheaacd_icc_de_quant_table[value];
1001
1002
997k
    case IPD:
1003
997k
      return ixheaacd_ipd_de_quant_table[(value & 15)];
1004
1005
0
    default:
1006
0
      return 0;
1007
0
      return 0;
1008
3.45M
  }
1009
3.45M
}
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
221k
    WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) {
1017
221k
  WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
1018
221k
  WORD32 map[MAX_PARAMETER_BANDS + 1];
1019
1020
221k
  WORD32 set_index, i, band, parm_slot;
1021
221k
  WORD32 data_bands, ch_fac;
1022
221k
  WORD32 ps;
1023
1024
221k
  WORD32 i1, i2, x1, xi, x2;
1025
221k
  WORD32 band_start = 0;
1026
221k
  WORD32 ext_frame_flag = self->ext_frame_flag;
1027
221k
  WORD32 *param_slots = self->param_slots;
1028
221k
  WORD32 num_parameter_sets = self->num_parameter_sets;
1029
221k
  WORD32 band_stop = self->bs_param_bands;
1030
221k
  WORD32 default_val = 0;
1031
1032
221k
  set_index = 0;
1033
1034
478k
  for (i = 0; i < num_parameter_sets; i++) {
1035
257k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
1036
147k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1037
2.08M
      for (band = band_start; band < band_stop; band++) {
1038
1.94M
        out_idx_data[i][band] = default_val;
1039
1.94M
      }
1040
2.08M
      for (band = band_start; band < band_stop; band++) {
1041
1.94M
        idx_prev[band] = out_idx_data[i][band];
1042
1.94M
      }
1043
1044
147k
      frame_xxx_data->bs_quant_coarse_xxx_prev = 0;
1045
147k
    }
1046
1047
257k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 1) {
1048
557k
      for (band = band_start; band < band_stop; band++) {
1049
518k
        out_idx_data[i][band] = idx_prev[band];
1050
518k
      }
1051
38.7k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1052
38.7k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1053
38.7k
    }
1054
1055
257k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 2) {
1056
536k
      for (band = band_start; band < band_stop; band++) {
1057
501k
        out_idx_data[i][band] = idx_prev[band];
1058
501k
      }
1059
35.1k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1060
35.1k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1061
35.1k
      interpolate_local[i] = 1;
1062
222k
    } else {
1063
222k
      interpolate_local[i] = 0;
1064
222k
    }
1065
1066
257k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
1067
35.8k
      parm_slot = i;
1068
35.8k
      ch_fac =
1069
35.8k
          ixheaacd_mps_stride_table[frame_xxx_data
1070
35.8k
                                        ->bs_freq_res_stride_xxx[set_index]];
1071
35.8k
      data_bands = (band_stop - band_start - 1) / ch_fac + 1;
1072
35.8k
      ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac);
1073
35.8k
      ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0],
1074
35.8k
                                &out_idx_data[parm_slot][0], map, data_bands);
1075
1076
538k
      for (band = band_start; band < band_stop; band++) {
1077
502k
        idx_prev[band] = out_idx_data[parm_slot][band];
1078
502k
      }
1079
1080
35.8k
      frame_xxx_data->bs_quant_coarse_xxx_prev =
1081
35.8k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1082
35.8k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1083
35.8k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1084
1085
35.8k
      set_index++;
1086
35.8k
    }
1087
257k
  }
1088
1089
478k
  for (i = 0; i < num_parameter_sets; i++) {
1090
257k
    if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) {
1091
32.9k
      ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start,
1092
32.9k
                               band_stop - band_start);
1093
32.9k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1094
32.9k
    }
1095
257k
  }
1096
1097
221k
  i1 = -1;
1098
221k
  x1 = 0;
1099
221k
  i2 = 0;
1100
478k
  for (i = 0; i < num_parameter_sets; i++) {
1101
257k
    if (interpolate_local[i] != 1) {
1102
221k
      i1 = i;
1103
221k
    }
1104
257k
    i2 = i;
1105
292k
    while (interpolate_local[i2] == 1) {
1106
35.3k
      i2++;
1107
35.3k
    }
1108
257k
    if (i1 == -1) {
1109
32.9k
      x1 = 0;
1110
32.9k
      i1 = 0;
1111
224k
    } else {
1112
224k
      x1 = param_slots[i1];
1113
224k
    }
1114
257k
    xi = param_slots[i];
1115
257k
    x2 = param_slots[i2];
1116
1117
257k
    if (interpolate_local[i] == 1) {
1118
35.1k
      if (i2 < num_parameter_sets) {
1119
61
        if (self->ec_flag == 0) {
1120
61
          return IA_FATAL_ERROR;
1121
61
        }
1122
61
      }
1123
1124
535k
      for (band = band_start; band < band_stop; band++) {
1125
500k
        WORD32 yi, y1, y2;
1126
500k
        yi = 0;
1127
500k
        y1 = out_idx_data[i1][band];
1128
500k
        y2 = out_idx_data[i2][band];
1129
500k
        if (param_type == IPD) {
1130
114k
          if (y2 - y1 > 8) y1 += 16;
1131
114k
          if (y1 - y2 > 8) y2 += 16;
1132
1133
114k
          if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
1134
385k
        } else {
1135
385k
          if (x2 != x1) {
1136
34.0k
            yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1137
34.0k
          }
1138
385k
        }
1139
500k
        out_idx_data[i][band] = yi;
1140
500k
      }
1141
35.1k
    }
1142
257k
  }
1143
1144
478k
  for (ps = 0; ps < num_parameter_sets; ps++) {
1145
3.71M
    for (band = band_start; band < band_stop; band++) {
1146
3.45M
      if (param_type == CLD) {
1147
1.23M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
1148
2.22M
      } else if (param_type == ICC)
1149
1.23M
      {
1150
1.23M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
1151
1.23M
      }
1152
3.45M
      out_data[ps][band] =
1153
3.45M
          ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type);
1154
3.45M
    }
1155
256k
  }
1156
1157
221k
  if (ext_frame_flag) {
1158
93.1k
    for (band = band_start; band < band_stop; band++) {
1159
84.1k
      out_data[num_parameter_sets][band] =
1160
84.1k
          out_data[num_parameter_sets - 1][band];
1161
84.1k
      out_idx_data[num_parameter_sets][band] =
1162
84.1k
          out_idx_data[num_parameter_sets - 1][band];
1163
84.1k
    }
1164
9.02k
  }
1165
221k
  return IA_NO_ERROR;
1166
221k
}
1167
1168
static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott(
1169
79.6k
    ia_mps_dec_state_struct *self) {
1170
79.6k
  ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame);
1171
79.6k
  IA_ERRORCODE err_code = 0;
1172
1173
79.6k
  err_code = ixheaacd_mps_mapindexdata(
1174
79.6k
      self, &cur_bit_stream_ptr->cld_data, self->cld_data,
1175
79.6k
      cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx,
1176
79.6k
      cur_bit_stream_ptr->cld_idx_pre, CLD);
1177
79.6k
  if (err_code != IA_NO_ERROR) return err_code;
1178
79.5k
  err_code = ixheaacd_mps_mapindexdata(
1179
79.5k
      self, &cur_bit_stream_ptr->icc_data, self->icc_data,
1180
79.5k
      cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx,
1181
79.5k
      cur_bit_stream_ptr->icc_idx_pre, ICC);
1182
79.5k
  if (err_code != IA_NO_ERROR) return err_code;
1183
79.5k
  if ((self->config->bs_phase_coding)) {
1184
62.0k
    err_code = ixheaacd_mps_mapindexdata(
1185
62.0k
        self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
1186
62.0k
        cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
1187
62.0k
        cur_bit_stream_ptr->ipd_idx_prev, IPD);
1188
1189
62.0k
    if (err_code != IA_NO_ERROR) return err_code;
1190
62.0k
  }
1191
79.5k
  return IA_NO_ERROR;
1192
79.5k
}
1193
1194
79.5k
static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) {
1195
79.5k
  WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
1196
79.5k
      group_to_band[MAX_PARAMETER_BANDS + 1];
1197
79.5k
  ia_mps_bs_frame *frame = &(self->bs_frame);
1198
172k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
1199
92.6k
    switch (frame->bs_smooth_mode[ps]) {
1200
80.6k
      case 0:
1201
80.6k
        self->smoothing_time[ps] = 256;
1202
80.6k
        self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
1203
1204
1.15M
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1205
1.06M
          self->smoothing_data[ps][pb] = 0;
1206
1.06M
        }
1207
80.6k
        break;
1208
1209
2.70k
      case 1:
1210
2.70k
        if (ps > 0) {
1211
838
          self->smoothing_time[ps] = self->smoothing_time[ps - 1];
1212
838
          self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1];
1213
1.86k
        } else {
1214
1.86k
          self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time;
1215
1.86k
          self->inv_smoothing_time[ps] =
1216
1.86k
              self->smoothing_filt_state.inv_prev_smg_time;
1217
1.86k
        }
1218
1219
35.8k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1220
33.1k
          if (ps > 0)
1221
11.5k
            self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb];
1222
21.6k
          else
1223
21.6k
            self->smoothing_data[ps][pb] =
1224
21.6k
                self->smoothing_filt_state.prev_smg_data[pb];
1225
33.1k
        }
1226
2.70k
        break;
1227
1228
6.39k
      case 2:
1229
6.39k
        self->smoothing_time[ps] =
1230
6.39k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1231
6.39k
        self->inv_smoothing_time[ps] =
1232
6.39k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1233
89.6k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1234
83.2k
          self->smoothing_data[ps][pb] = 1;
1235
83.2k
        }
1236
6.39k
        break;
1237
1238
2.94k
      case 3:
1239
2.94k
        self->smoothing_time[ps] =
1240
2.94k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1241
2.94k
        self->inv_smoothing_time[ps] =
1242
2.94k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1243
1244
2.94k
        ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
1245
2.94k
        data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
1246
2.94k
        ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands,
1247
2.94k
                                   ch_fac);
1248
28.6k
        for (pg = 0; pg < data_bands; pg++) {
1249
25.7k
          param_band_start = group_to_band[pg];
1250
25.7k
          param_band_stop = group_to_band[pg + 1];
1251
69.6k
          for (pb = param_band_start; pb < param_band_stop; pb++) {
1252
43.9k
            self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg];
1253
43.9k
          }
1254
25.7k
        }
1255
2.94k
        break;
1256
92.6k
    }
1257
92.6k
  }
1258
1259
79.5k
  self->smoothing_filt_state.prev_smg_time =
1260
79.5k
      self->smoothing_time[self->num_parameter_sets - 1];
1261
79.5k
  self->smoothing_filt_state.inv_prev_smg_time =
1262
79.5k
      self->inv_smoothing_time[self->num_parameter_sets - 1];
1263
1.12M
  for (pb = 0; pb < self->bs_param_bands; pb++) {
1264
1.04M
    self->smoothing_filt_state.prev_smg_data[pb] =
1265
1.04M
        self->smoothing_data[self->num_parameter_sets - 1][pb];
1266
1.04M
  }
1267
1268
79.5k
  if (self->ext_frame_flag) {
1269
3.29k
    self->smoothing_time[self->num_parameter_sets] =
1270
3.29k
        self->smoothing_time[self->num_parameter_sets - 1];
1271
3.29k
    self->inv_smoothing_time[self->num_parameter_sets] =
1272
3.29k
        self->inv_smoothing_time[self->num_parameter_sets - 1];
1273
34.2k
    for (pb = 0; pb < self->bs_param_bands; pb++) {
1274
30.9k
      self->smoothing_data[self->num_parameter_sets][pb] =
1275
30.9k
          self->smoothing_data[self->num_parameter_sets - 1][pb];
1276
30.9k
    }
1277
3.29k
  }
1278
79.5k
}
1279
1280
79.6k
IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
1281
79.6k
  WORD32 i;
1282
79.6k
  IA_ERRORCODE err_code = 0;
1283
79.6k
  if (self->ldmps_config.ldmps_present_flag != 1)
1284
77.4k
    if (self->parse_nxt_frame == 1) return err_code;
1285
79.6k
  self->ext_frame_flag = 0;
1286
79.6k
  if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) {
1287
3.29k
    self->ext_frame_flag = 1;
1288
3.29k
  }
1289
1290
79.6k
  err_code = ixheaacd_mps_dec_and_mapframeott(self);
1291
79.6k
  if (err_code != IA_NO_ERROR) return err_code;
1292
79.5k
  ixheaacd_mps_dec_and_mapframesmg(self);
1293
1294
79.5k
  if (self->ext_frame_flag) {
1295
3.29k
    self->num_parameter_sets++;
1296
3.29k
    self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
1297
3.29k
  }
1298
79.5k
  self->param_slot_diff[0] = self->param_slots[0] + 1;
1299
79.5k
  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
79.5k
  self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0];
1307
79.5k
  self->inv_param_slot_diff_Q30[0] =
1308
79.5k
      (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
1309
95.9k
  for (i = 1; i < self->num_parameter_sets; i++) {
1310
16.4k
    self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
1311
16.4k
    if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) ||
1312
16.4k
        (self->param_slot_diff[i] == 0)) {
1313
7
      if (self->ec_flag == 0) {
1314
7
        return -1;
1315
7
      } else {
1316
0
        self->param_slot_diff[i] = 1;
1317
0
        self->inv_param_slot_diff[i] = 1;
1318
0
      }
1319
7
    }
1320
16.4k
    self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
1321
16.4k
    self->inv_param_slot_diff_Q30[i] =
1322
16.4k
        (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
1323
16.4k
  }
1324
79.5k
  return IA_NO_ERROR;
1325
79.5k
}
1326
1327
2.22k
WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
1328
2.22k
  WORD32 samp_freq;
1329
2.22k
  WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
1330
2.22k
                                24000, 22050, 16000, 12000, 11025, 8000,
1331
2.22k
                                7350,  0,     0,     0};
1332
1333
2.22k
  if (self->ldmps_config.ldmps_present_flag == 1)
1334
962
    self->time_slots = self->frame_length + 1;
1335
1.26k
  else
1336
1.26k
    self->time_slots = self->frame_length;
1337
1338
2.22k
  self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
1339
1340
2.22k
  if (self->ldmps_config.ldmps_present_flag == 1) {
1341
962
    if (self->ldmps_config.bs_sampling_freq_index == 15) {
1342
6
      samp_freq = self->ldmps_config.bs_fampling_frequency;
1343
956
    } else {
1344
956
      samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
1345
956
    }
1346
1347
962
    if (samp_freq < 27713.0) {
1348
564
      self->qmf_band_count = 32;
1349
564
    } else if (samp_freq >= 55426.0) {
1350
13
      self->qmf_band_count = 128;
1351
385
    } else {
1352
385
      self->qmf_band_count = 64;
1353
385
    }
1354
962
  }
1355
1356
2.22k
  if (self->object_type == AOT_ER_AAC_ELD ||
1357
1.26k
      self->object_type == AOT_ER_AAC_LD) {
1358
962
    self->bs_param_bands =
1359
962
        ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
1360
962
    self->hyb_band_count_max = self->qmf_band_count;
1361
962
  } else
1362
1.26k
    self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
1363
1364
2.22k
  if (self->object_type == AOT_ER_AAC_ELD ||
1365
1.26k
      self->object_type == AOT_ER_AAC_LD) {
1366
962
    switch (self->bs_param_bands) {
1367
71
      case 4:
1368
1369
71
        self->hyb_band_to_processing_band_table =
1370
71
            ixheaacd_hybrid_band_64_to_processing_band_4_map;
1371
71
        break;
1372
25
      case 5:
1373
1374
25
        self->hyb_band_to_processing_band_table =
1375
25
            ixheaacd_hybrid_band_64_to_processing_band_5_map;
1376
25
        break;
1377
63
      case 7:
1378
1379
63
        self->hyb_band_to_processing_band_table =
1380
63
            ixheaacd_hybrid_band_64_to_processing_band_7_map;
1381
63
        break;
1382
108
      case 9:
1383
1384
108
        self->hyb_band_to_processing_band_table =
1385
108
            ixheaacd_hybrid_band_64_to_processing_band_9_map;
1386
108
        break;
1387
100
      case 12:
1388
1389
100
        self->hyb_band_to_processing_band_table =
1390
100
            ixheaacd_hybrid_band_64_to_processing_band_12_map;
1391
100
        break;
1392
126
      case 15:
1393
1394
126
        self->hyb_band_to_processing_band_table =
1395
126
            ixheaacd_hybrid_band_64_to_processing_band_15_map;
1396
126
        break;
1397
463
      case 23:
1398
1399
463
        self->hyb_band_to_processing_band_table =
1400
463
            ixheaacd_hybrid_band_64_to_processing_band_23_map;
1401
463
        break;
1402
6
      default:
1403
6
        self->hyb_band_to_processing_band_table = NULL;
1404
6
        return -1;
1405
0
        break;
1406
962
    }
1407
1.26k
  } else {
1408
1.26k
    switch (self->bs_param_bands) {
1409
336
      case 4:
1410
336
        self->hyb_band_to_processing_band_table =
1411
336
            ixheaacd_hybrid_band_71_to_processing_band_4_map;
1412
336
        break;
1413
151
      case 5:
1414
151
        self->hyb_band_to_processing_band_table =
1415
151
            ixheaacd_hybrid_band_71_to_processing_band_5_map;
1416
151
        break;
1417
178
      case 7:
1418
178
        self->hyb_band_to_processing_band_table =
1419
178
            ixheaacd_hybrid_band_71_to_processing_band_7_map;
1420
178
        break;
1421
150
      case 10:
1422
150
        self->hyb_band_to_processing_band_table =
1423
150
            ixheaacd_hybrid_band_71_to_processing_band_10_map;
1424
150
        break;
1425
144
      case 14:
1426
144
        self->hyb_band_to_processing_band_table =
1427
144
            ixheaacd_hybrid_band_71_to_processing_band_14_map;
1428
144
        break;
1429
71
      case 20:
1430
71
        self->hyb_band_to_processing_band_table =
1431
71
            ixheaacd_hybrid_band_71_to_processing_band_20_map;
1432
71
        break;
1433
236
      case 28:
1434
236
        self->hyb_band_to_processing_band_table =
1435
236
            ixheaacd_hybrid_band_71_to_processing_band_28_map;
1436
236
        break;
1437
1
      default:
1438
1
        self->hyb_band_to_processing_band_table = NULL;
1439
1
        return -1;
1440
0
        break;
1441
1.26k
    }
1442
1.26k
  }
1443
2.22k
  self->in_ch_count = 1;
1444
2.22k
  self->out_ch_count = 2;
1445
1446
2.22k
  self->input_gain =
1447
2.22k
      ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx];
1448
1449
2.22k
  if (self->config->bs_ott_bands_phase_present) {
1450
501
    self->num_bands_ipd = self->config->bs_ott_bands_phase;
1451
1.72k
  } else {
1452
1.72k
    if (!(self->object_type == AOT_ER_AAC_ELD ||
1453
765
          self->object_type == AOT_ER_AAC_LD)) {
1454
765
      switch (self->bs_param_bands) {
1455
292
        case 4:
1456
361
        case 5:
1457
361
          self->num_bands_ipd = 2;
1458
361
          break;
1459
134
        case 7:
1460
134
          self->num_bands_ipd = 3;
1461
134
          break;
1462
44
        case 10:
1463
44
          self->num_bands_ipd = 5;
1464
44
          break;
1465
89
        case 14:
1466
89
          self->num_bands_ipd = 7;
1467
89
          break;
1468
20
        case 20:
1469
137
        case 28:
1470
137
          self->num_bands_ipd = 10;
1471
137
          break;
1472
0
        default:
1473
0
          return -1;
1474
0
          break;
1475
765
      }
1476
765
    }
1477
1.72k
  }
1478
1479
2.22k
  if (self->residual_coding) {
1480
827
    self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd);
1481
827
    self->max_res_bands = 0;
1482
827
    if (self->bs_residual_present) {
1483
827
      self->res_bands = self->bs_residual_bands;
1484
827
      if (self->res_bands > self->max_res_bands) {
1485
601
        self->max_res_bands = self->res_bands;
1486
601
      }
1487
827
    } else {
1488
0
      self->res_bands = 0;
1489
0
    }
1490
827
  }
1491
1492
2.22k
  if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1;
1493
1494
2.22k
  self->dir_sig_count = 1;
1495
2.22k
  self->decor_sig_count = 1;
1496
1497
2.22k
  self->bs_high_rate_mode = self->config->bs_high_rate_mode;
1498
2.22k
  self->pre_mix_req = 1;
1499
1500
2.22k
  return 0;
1501
2.22k
}