Coverage Report

Created: 2025-11-10 06:22

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