Coverage Report

Created: 2026-10-17 07:12

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.68M
static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
174
3.68M
  var = min(var, upper_bound);
175
3.68M
  var = max(var, lower_bound);
176
3.68M
  return var;
177
3.68M
}
178
179
static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b,
180
1.67M
                               UWORD16 d[], WORD32 len) {
181
1.67M
  WORD32 k;
182
1.67M
  UWORD32 tmp;
183
1.67M
  UWORD32 b0 = (UWORD32)b;
184
185
1.67M
  tmp = ((UWORD32)a[0]) * b0;
186
1.67M
  d[0] = (UWORD16)tmp;
187
188
8.39M
  for (k = 1; k < len; k++) {
189
6.71M
    tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0;
190
6.71M
    d[k] = (UWORD16)tmp;
191
6.71M
  }
192
1.67M
}
193
194
static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a,
195
1.67M
                             UWORD16 d[], UWORD16 *pr, WORD32 len) {
196
1.67M
  UWORD32 r;
197
1.67M
  UWORD32 tmp;
198
1.67M
  UWORD32 temp;
199
1.67M
  WORD32 k;
200
201
1.67M
  if (a == 0)
202
0
    return;
203
204
1.67M
  r = 0;
205
206
10.0M
  for (k = len - 1; k >= 0; k--) {
207
8.39M
    tmp = ((UWORD32)b[k]) + (r << 16);
208
209
8.39M
    if (tmp) {
210
3.20M
      d[k] = (UWORD16)(tmp / a);
211
3.20M
      temp = d[k] * a;
212
3.20M
      r = tmp - temp;
213
5.19M
    } else {
214
5.19M
      d[k] = 0;
215
5.19M
    }
216
8.39M
  }
217
1.67M
  *pr = (UWORD16)r;
218
1.67M
}
219
220
static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena,
221
78.8k
                             WORD32 lenb) {
222
78.8k
  WORD32 h;
223
78.8k
  WORD32 carry = 0;
224
225
78.8k
  if (lenb > lena)
226
0
    return;
227
228
394k
  for (h = 0; h < lenb; h++) {
229
315k
    carry = carry + (WORD32)(a[h] - b[h]);
230
315k
    a[h] = (UWORD16)carry;
231
315k
    carry = carry >> 16;
232
315k
  }
233
234
78.8k
  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
78.8k
  if (carry != 0)
241
0
    return;
242
78.8k
  return;
243
78.8k
}
244
245
static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[],
246
404k
                                WORD32 len) {
247
404k
  WORD32 i;
248
249
1.42M
  for (i = len - 1; i > 0; i--) {
250
1.15M
    if (a[i] != b[i]) break;
251
1.15M
  }
252
404k
  return (a[i] >= b[i]) ? 1 : 0;
253
404k
}
254
255
static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type,
256
50.6k
                                     WORD32 band_start, WORD32 ixheaacd_num_bands) {
257
50.6k
  WORD32 i;
258
259
733k
  for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
260
682k
    data[i] <<= 1;
261
682k
  }
262
263
50.6k
  if (data_type == CLD) {
264
182k
    for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
265
169k
      if (data[i] == -14)
266
29.0k
        data[i] = -15;
267
140k
      else if (data[i] == 14)
268
9.24k
        data[i] = 15;
269
169k
    }
270
13.2k
  }
271
50.6k
}
272
273
14.3k
static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) {
274
14.3k
  WORD32 i;
275
276
157k
  for (i = 0; i < ixheaacd_num_bands; i++) {
277
142k
    data[i] /= 2;
278
142k
  }
279
14.3k
}
280
281
static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start,
282
41.3k
                                     WORD32 band_stop, WORD32 *strides) {
283
41.3k
  WORD32 i, pb, ch_fac, data_bands, start_offset;
284
285
41.3k
  ch_fac = ixheaacd_mps_stride_table[freq_res_stride];
286
41.3k
  data_bands = (band_stop - band_start - 1) / ch_fac + 1;
287
288
41.3k
  strides[0] = band_start;
289
398k
  for (pb = 1; pb <= data_bands; pb++) {
290
357k
    strides[pb] = strides[pb - 1] + ch_fac;
291
357k
  }
292
41.3k
  start_offset = 0;
293
230k
  while (strides[data_bands] > band_stop) {
294
189k
    if (start_offset < data_bands)
295
17.0k
      start_offset++;
296
172k
    else
297
172k
      start_offset = 1;
298
299
403k
    for (i = start_offset; i <= data_bands; i++) {
300
214k
      strides[i]--;
301
214k
    }
302
189k
  }
303
304
41.3k
  return data_bands;
305
41.3k
}
306
307
static IA_ERRORCODE ixheaacd_mps_ecdata_decoding(
308
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream,
309
239k
    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) {
310
239k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
311
239k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
312
239k
  WORD32 band_stop = 0;
313
314
239k
  WORD32 *lastdata = NULL;
315
239k
  ia_mps_data_struct *frame_xxx_data = NULL;
316
239k
  WORD32 default_val = 0;
317
239k
  IA_ERRORCODE err = IA_NO_ERROR;
318
319
239k
  ia_mps_bs_frame *frame = &(self->bs_frame);
320
321
239k
  if (datatype == 0) {
322
113k
    frame_xxx_data = &frame->cld_data;
323
113k
    lastdata = frame->cmp_cld_idx_prev;
324
113k
    band_stop = self->bs_param_bands;
325
125k
  } else if (datatype == 1) {
326
113k
    frame_xxx_data = &frame->icc_data;
327
113k
    lastdata = frame->cmp_icc_idx_prev;
328
113k
    band_stop = self->bs_param_bands;
329
113k
  } else if (datatype == 2) {
330
12.6k
    frame_xxx_data = &frame->ipd_data;
331
12.6k
    lastdata = frame->ipd_idx_data_prev;
332
12.6k
    band_stop = self->num_bands_ipd;
333
12.6k
  } 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
529k
  for (i = 0; i < self->num_parameter_sets; i++) {
340
290k
    frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2);
341
290k
  }
342
343
239k
  set_index = 0;
344
239k
  bs_data_pair = 0;
345
239k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
346
347
529k
  for (i = 0; i < self->num_parameter_sets; i++) {
348
289k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
349
2.32M
      for (pb = 0; pb < band_stop; pb++) {
350
2.14M
        lastdata[pb] = default_val;
351
2.14M
      }
352
353
180k
      old_quant_coarse_xxx = 0;
354
180k
    }
355
356
289k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
357
31.7k
      if (bs_data_pair) {
358
2.02k
        bs_data_pair = 0;
359
29.7k
      } else {
360
29.7k
        bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1);
361
29.7k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
362
29.7k
            ixheaacd_read_bits_buf(bitstream, 1);
363
29.7k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
364
29.7k
            ixheaacd_read_bits_buf(bitstream, 2);
365
366
29.7k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
367
29.7k
            old_quant_coarse_xxx) {
368
9.27k
          if (old_quant_coarse_xxx) {
369
1.30k
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
370
7.97k
          } else {
371
7.97k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
372
7.97k
          }
373
9.27k
        }
374
375
29.7k
        data_bands = ixheaacd_mps_getstridemap(
376
29.7k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop,
377
29.7k
            strides);
378
379
317k
        for (pb = 0; pb < data_bands; pb++) {
380
287k
          lastdata[pb] = lastdata[strides[pb]];
381
287k
        }
382
383
29.7k
        err = ixheaacd_mps_ecdatapairdec(
384
29.7k
            bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
385
29.7k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
386
29.7k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag);
387
29.7k
        if (err) return err;
388
389
316k
        for (pb = 0; pb < data_bands; pb++) {
390
688k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
391
401k
            if (datatype == IPD) {
392
63.8k
              if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
393
37.0k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
394
37.0k
              } else {
395
26.8k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
396
26.8k
              }
397
338k
            } else {
398
338k
              lastdata[j] = data[set_index + bs_data_pair][pb];
399
338k
            }
400
401k
          }
401
286k
        }
402
403
29.7k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
404
405
29.7k
        if (bs_data_pair) {
406
10.7k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
407
10.7k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
408
10.7k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
409
10.7k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
410
10.7k
        }
411
29.7k
        set_index += bs_data_pair + 1;
412
29.7k
      }
413
31.7k
    }
414
289k
  }
415
239k
  return err;
416
239k
}
417
418
IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self,
419
                                        WORD32 usac_independency_flag,
420
113k
                                        ia_bit_buf_struct *bitstream) {
421
113k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
422
113k
  WORD32 ps, pg, ts, pb;
423
113k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
424
425
113k
  WORD32 bits_param_slot = 0;
426
427
113k
  ia_mps_bs_frame *frame = &(self->bs_frame);
428
113k
  IA_ERRORCODE err = IA_NO_ERROR;
429
430
113k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
431
432
113k
  self->num_parameter_sets_prev = self->num_parameter_sets;
433
434
113k
  if (self->bs_high_rate_mode) {
435
33.8k
    bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1);
436
33.8k
    self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1;
437
79.5k
  } else {
438
79.5k
    bs_frame_type = 0;
439
79.5k
    self->num_parameter_sets = 1;
440
79.5k
  }
441
442
113k
  if (self->time_slots == 32)
443
89.1k
    bits_param_slot = 5;
444
24.2k
  else if (self->time_slots == 64)
445
24.2k
    bits_param_slot = 6;
446
447
113k
  if (bs_frame_type) {
448
3.70k
    WORD32 prev_param_slot = -1;
449
8.15k
    for (i = 0; i < self->num_parameter_sets; i++) {
450
4.52k
      self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot);
451
452
4.52k
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
453
75
        return IA_FATAL_ERROR;
454
75
      }
455
4.44k
      prev_param_slot = self->param_slots[i];
456
4.44k
    }
457
109k
  } else {
458
242k
    for (i = 0; i < self->num_parameter_sets; i++) {
459
132k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
460
132k
                              self->num_parameter_sets) -
461
132k
                             1;
462
132k
    }
463
109k
  }
464
465
113k
  if (!usac_independency_flag) {
466
110k
    frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1);
467
110k
  } else {
468
2.43k
    frame->independency_flag = 1;
469
2.43k
  }
470
471
113k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD);
472
113k
  if (err) return err;
473
474
113k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC);
475
113k
  if (err) return err;
476
477
113k
  if (self->config->bs_phase_coding) {
478
91.7k
    self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1);
479
480
91.7k
    if (!self->bs_phase_mode) {
481
1.15M
      for (pb = 0; pb < self->num_bands_ipd; pb++) {
482
1.07M
        frame->ipd_idx_data_prev[pb] = 0;
483
2.36M
        for (i = 0; i < self->num_parameter_sets; i++) {
484
1.28M
          frame->ipd_idx_data[i][pb] = 0;
485
1.28M
          self->bs_frame.ipd_idx[i][pb] = 0;
486
1.28M
        }
487
1.07M
        self->bs_frame.ipd_idx_prev[pb] = 0;
488
1.07M
      }
489
79.0k
      self->opd_smoothing_mode = 0;
490
79.0k
    } else {
491
12.6k
      self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1);
492
12.6k
      err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data,
493
12.6k
                                         IPD);
494
12.6k
      if (err) return err;
495
12.6k
    }
496
91.7k
  }
497
498
21.5k
  else {
499
21.5k
    self->bs_phase_mode = 0;
500
251k
    for (pb = 0; pb < self->num_bands_ipd; pb++) {
501
230k
      frame->ipd_idx_data_prev[pb] = 0;
502
530k
      for (i = 0; i < self->num_parameter_sets; i++) {
503
300k
        frame->ipd_idx_data[i][pb] = 0;
504
300k
        self->bs_frame.ipd_idx[i][pb] = 0;
505
300k
      }
506
230k
      self->bs_frame.ipd_idx_prev[pb] = 0;
507
230k
    }
508
21.5k
    self->opd_smoothing_mode = 0;
509
21.5k
  }
510
511
113k
  if (self->bs_high_rate_mode) {
512
90.6k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
513
56.9k
      frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2);
514
56.9k
      if (frame->bs_smooth_mode[ps] >= 2) {
515
13.9k
        frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2);
516
13.9k
      }
517
56.9k
      if (frame->bs_smooth_mode[ps] == 3) {
518
4.40k
        frame->bs_freq_res_stride_smg[ps] =
519
4.40k
            ixheaacd_read_bits_buf(bitstream, 2);
520
4.40k
        data_bands =
521
4.40k
            (self->bs_param_bands - 1) /
522
4.40k
                ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
523
4.40k
            1;
524
20.8k
        for (pg = 0; pg < data_bands; pg++) {
525
16.4k
          frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1);
526
16.4k
        }
527
4.40k
      }
528
56.9k
    }
529
79.6k
  } else {
530
159k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
531
79.4k
      frame->bs_smooth_mode[ps] = 0;
532
79.4k
    }
533
79.6k
  }
534
535
339k
  for (i = 0; i < 2; i++) {
536
226k
    self->temp_shape_enable_ch_stp[i] = 0;
537
226k
    self->temp_shape_enable_ch_ges[i] = 0;
538
226k
  }
539
540
113k
  self->bs_tsd_enable = 0;
541
113k
  if (self->config->bs_temp_shape_config == 3) {
542
49.1k
    self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1);
543
64.1k
  } else if (self->config->bs_temp_shape_config != 0) {
544
35.9k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1);
545
35.9k
    if (bs_temp_shape_enable) {
546
5.02k
      num_of_temp_shape_ch = 2;
547
5.02k
      switch (self->config->bs_temp_shape_config) {
548
3.33k
        case 1:
549
9.99k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
550
6.66k
            self->temp_shape_enable_ch_stp[i] =
551
6.66k
                ixheaacd_read_bits_buf(bitstream, 1);
552
6.66k
          }
553
3.33k
          break;
554
1.69k
        case 2:
555
5.07k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
556
3.38k
            self->temp_shape_enable_ch_ges[i] =
557
3.38k
                ixheaacd_read_bits_buf(bitstream, 1);
558
3.38k
          }
559
5.05k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
560
3.36k
            if (self->temp_shape_enable_ch_ges[i]) {
561
1.72k
              ixheaacd_mps_huff_decode(bitstream, env_shape_data,
562
1.72k
                                       self->time_slots);
563
56.9k
              for (ts = 0; ts < self->time_slots; ts++) {
564
55.2k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
565
55.2k
                    2, (FLOAT32)env_shape_data[ts] /
566
55.2k
                               (self->config->bs_env_quant_mode + 2) -
567
55.2k
                           1);
568
55.2k
              }
569
1.72k
            }
570
3.36k
          }
571
1.69k
          break;
572
0
        default:
573
0
          return -1;
574
5.02k
      }
575
5.02k
    }
576
35.9k
  }
577
578
113k
  if (self->bs_tsd_enable) {
579
9.88k
    UWORD16 s[4];
580
9.88k
    UWORD64 s_64;
581
9.88k
    UWORD16 c[5];
582
9.88k
    UWORD64 c_64;
583
9.88k
    UWORD16 b;
584
9.88k
    UWORD16 r[1];
585
9.88k
    static const UWORD16 table_64[] = {
586
9.88k
        6,  11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49,
587
9.88k
        51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61};
588
9.88k
    static const UWORD16 table_32[] = {5,  9,  13, 16, 18, 20, 22, 24,
589
9.88k
                                              25, 26, 27, 28, 29, 29, 30, 30};
590
9.88k
    unsigned const short *tab = NULL;
591
9.88k
    WORD32 k;
592
9.88k
    UWORD16 h;
593
9.88k
    WORD32 nbits_tr_slots = 0;
594
595
9.88k
    if (self->time_slots == 32) {
596
4.76k
      nbits_tr_slots = 4;
597
4.76k
      tab = table_32;
598
5.11k
    } else if (self->time_slots == 64) {
599
5.11k
      nbits_tr_slots = 5;
600
5.11k
      tab = table_64;
601
5.11k
    }
602
603
9.88k
    self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots);
604
9.88k
    self->tsd_num_tr_slots++;
605
9.88k
    self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1];
606
607
9.88k
    if (self->tsd_codeword_len > 48) {
608
1.00k
      s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48);
609
1.00k
      s_64 = s[3];
610
1.00k
      s[2] = ixheaacd_read_bits_buf(bitstream, 16);
611
1.00k
      s_64 = (s_64 << 16) | s[2];
612
1.00k
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
613
1.00k
      s_64 = (s_64 << 16) | s[1];
614
1.00k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
615
1.00k
      s_64 = (s_64 << 16) | s[0];
616
8.88k
    } else if (self->tsd_codeword_len > 32) {
617
1.86k
      s[3] = 0;
618
1.86k
      s_64 = s[3];
619
1.86k
      s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32);
620
1.86k
      s_64 = (s_64 << 16) | s[2];
621
1.86k
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
622
1.86k
      s_64 = (s_64 << 16) | s[1];
623
1.86k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
624
1.86k
      s_64 = (s_64 << 16) | s[0];
625
7.02k
    } else if (self->tsd_codeword_len > 16) {
626
2.85k
      s[3] = 0;
627
2.85k
      s_64 = s[3];
628
2.85k
      s[2] = 0;
629
2.85k
      s_64 = (s_64 << 16) | s[2];
630
2.85k
      s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16);
631
2.85k
      s_64 = (s_64 << 16) | s[1];
632
2.85k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
633
2.85k
      s_64 = (s_64 << 16) | s[0];
634
4.16k
    } else {
635
4.16k
      s[3] = 0;
636
4.16k
      s_64 = s[3];
637
4.16k
      s[2] = 0;
638
4.16k
      s_64 = (s_64 << 16) | s[2];
639
4.16k
      s[1] = 0;
640
4.16k
      s_64 = (s_64 << 16) | s[1];
641
4.16k
      s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len);
642
4.16k
      s_64 = (s_64 << 16) | s[0];
643
4.16k
    }
644
645
9.88k
    {
646
9.88k
      WORD32 p = self->tsd_num_tr_slots;
647
648
489k
      for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0;
649
650
406k
      for (k = self->time_slots - 1; k >= 0; k--) {
651
406k
        if (p > k) {
652
4.54k
          for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1;
653
1.67k
          break;
654
1.67k
        }
655
656
404k
        c[0] = k - p + 1;
657
404k
        c_64 = c[0];
658
2.02M
        for (i = 1; i < 5; i++) c[i] = 0;
659
660
2.08M
        for (h = 2; h <= p; h++) {
661
1.67M
          b = k - p + h;
662
1.67M
          c_64 = c_64 * (b / h);
663
1.67M
          ixheaacd_longmult1(c, b, c, 5);
664
1.67M
          b = h;
665
1.67M
          ixheaacd_longdiv(c, b, c, r, 5);
666
1.67M
        }
667
668
404k
        if (ixheaacd_longcompare(s, c, 4)) {
669
78.8k
          ixheaacd_longsub(s, c, 4, 4);
670
78.8k
          self->bs_tsd_sep_data[k] = 1;
671
78.8k
          p--;
672
78.8k
          if (p == 0) break;
673
78.8k
        }
674
404k
      }
675
9.88k
    }
676
677
489k
    for (i = 0; i < self->time_slots; i++) {
678
479k
      if (self->bs_tsd_sep_data[i])
679
81.6k
        self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3);
680
479k
    }
681
9.88k
  }
682
683
113k
  self->parse_nxt_frame = 0;
684
113k
  return err;
685
113k
}
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
30.6k
    WORD32 start_band) {
691
30.6k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
692
30.6k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
693
30.6k
  WORD32 band_stop = 0;
694
695
30.6k
  WORD32 *lastdata = NULL;
696
30.6k
  ia_mps_data_struct *frame_xxx_data = NULL;
697
30.6k
  WORD32 default_val = 0;
698
699
30.6k
  ia_mps_bs_frame *frame = &(self->bs_frame);
700
701
30.6k
  if (datatype == CLD) {
702
21.5k
    frame_xxx_data = &frame->cld_data;
703
21.5k
    lastdata = frame->cmp_cld_idx_prev;
704
21.5k
    band_stop = self->bs_param_bands;
705
21.5k
  } else if (datatype == ICC) {
706
9.13k
    frame_xxx_data = &frame->icc_data;
707
9.13k
    lastdata = frame->cmp_icc_idx_prev;
708
9.13k
    band_stop = self->bs_param_bands;
709
9.13k
  } 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
73.4k
  for (i = 0; i < self->num_parameter_sets; i++) {
719
42.8k
    frame_xxx_data->bs_xxx_data_mode[i] =
720
42.8k
        ixheaacd_read_bits_buf(it_bit_buff, 2);
721
42.8k
  }
722
723
30.6k
  set_index = 0;
724
30.6k
  bs_data_pair = 0;
725
30.6k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
726
727
73.4k
  for (i = 0; i < self->num_parameter_sets; i++) {
728
42.8k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
729
175k
      for (pb = 0; pb < band_stop; pb++) {
730
155k
        lastdata[pb] = default_val;
731
155k
      }
732
733
19.4k
      old_quant_coarse_xxx = 0;
734
19.4k
    }
735
736
42.8k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
737
13.7k
      if (bs_data_pair) {
738
2.22k
        bs_data_pair = 0;
739
11.5k
      } else {
740
11.5k
        bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
741
11.5k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
742
11.5k
            ixheaacd_read_bits_buf(it_bit_buff, 1);
743
11.5k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
744
11.5k
            ixheaacd_read_bits_buf(it_bit_buff, 2);
745
746
11.5k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
747
11.5k
            old_quant_coarse_xxx) {
748
7.70k
          if (old_quant_coarse_xxx) {
749
1.37k
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
750
6.33k
          } else {
751
6.33k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
752
6.33k
          }
753
7.70k
        }
754
755
11.5k
        data_bands = ixheaacd_mps_getstridemap(
756
11.5k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
757
11.5k
            band_stop, strides);
758
81.5k
        for (pb = 0; pb < data_bands; pb++) {
759
69.9k
          lastdata[pb] = lastdata[strides[pb]];
760
69.9k
        }
761
762
11.5k
        ixheaacd_mps_ecdatapairdec(
763
11.5k
            it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
764
11.5k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
765
11.5k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
766
767
81.2k
        for (pb = 0; pb < data_bands; pb++) {
768
192k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
769
123k
            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
123k
            } else {
776
123k
              lastdata[j] = data[set_index + bs_data_pair][pb];
777
123k
            }
778
123k
          }
779
69.7k
        }
780
781
11.5k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
782
783
11.5k
        if (bs_data_pair) {
784
7.95k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
785
7.95k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
786
7.95k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
787
7.95k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
788
7.95k
        }
789
11.5k
        set_index += bs_data_pair + 1;
790
11.5k
      }
791
13.7k
    }
792
42.8k
  }
793
30.6k
}
794
795
IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
796
4.12k
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
797
4.12k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
798
4.12k
      num_of_temp_shape_ch;
799
4.12k
  WORD32 ps, pg, ts, ic;
800
4.12k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
801
4.12k
  WORD32 alignment;
802
4.12k
  WORD32 bits_param_slot = 0;
803
804
4.12k
  ia_mps_bs_frame *frame = &(self->bs_frame);
805
4.12k
  alignment = it_bit_buff->cnt_bits;
806
4.12k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
807
808
4.12k
  self->num_parameter_sets_prev = self->num_parameter_sets;
809
810
4.12k
  bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
811
4.12k
  self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
812
813
4.12k
  if (self->time_slots == 32)
814
869
    bits_param_slot = 5;
815
3.26k
  else if (self->time_slots == 64)
816
0
    bits_param_slot = 6;
817
3.26k
  else if (self->time_slots == 8)
818
19
    bits_param_slot = 3;
819
3.24k
  else if (self->time_slots == 16 || self->time_slots == 15)
820
224
    bits_param_slot = 4;
821
822
4.12k
  if (bs_frame_type) {
823
711
    WORD32 prev_param_slot = -1;
824
1.45k
    for (i = 0; i < self->num_parameter_sets; i++) {
825
861
      self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
826
827
861
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
828
117
        return IA_FATAL_ERROR;
829
117
      }
830
744
      prev_param_slot = self->param_slots[i];
831
744
    }
832
3.41k
  } else {
833
8.31k
    for (i = 0; i < self->num_parameter_sets; i++) {
834
4.89k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
835
4.89k
                              self->num_parameter_sets) -
836
4.89k
                             1;
837
4.89k
    }
838
3.41k
  }
839
840
4.01k
  frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
841
842
18.8k
  for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
843
14.8k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
844
14.8k
                                    0);
845
14.8k
  }
846
847
4.01k
  if (self->ldmps_config.bs_one_icc) {
848
1.87k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
849
1.87k
                                    0);
850
2.14k
  } else {
851
11.0k
    for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
852
8.93k
      if (!self->ldmps_config.ott_mode_lfe[i])
853
7.26k
        ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
854
7.26k
                                        ICC, 0);
855
8.93k
    }
856
2.14k
  }
857
858
9.52k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
859
5.51k
    frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
860
5.51k
    if (frame->bs_smooth_mode[ps] >= 2) {
861
2.11k
      frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
862
2.11k
    }
863
5.51k
    if (frame->bs_smooth_mode[ps] == 3) {
864
1.50k
      frame->bs_freq_res_stride_smg[ps] =
865
1.50k
          ixheaacd_read_bits_buf(it_bit_buff, 2);
866
1.50k
      data_bands =
867
1.50k
          (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
868
1.50k
              ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
869
1.50k
          1;
870
5.93k
      for (pg = 0; pg < data_bands; pg++) {
871
4.42k
        frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
872
4.42k
      }
873
1.50k
    }
874
5.51k
  }
875
876
11.9k
  for (i = 0; i < 2; i++) {
877
7.94k
    self->temp_shape_enable_ch_stp[i] = 0;
878
7.94k
    self->temp_shape_enable_ch_ges[i] = 0;
879
7.94k
  }
880
881
4.01k
  if (self->ldmps_config.bs_temp_shape_config != 0) {
882
3.09k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
883
3.09k
    if (bs_temp_shape_enable) {
884
1.47k
      num_of_temp_shape_ch = 2;
885
1.47k
      switch (self->ldmps_config.bs_temp_shape_config) {
886
564
        case 1:
887
1.69k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
888
1.12k
            self->temp_shape_enable_ch_stp[i] =
889
1.12k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
890
1.12k
          }
891
564
          break;
892
903
        case 2:
893
2.70k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
894
1.80k
            self->temp_shape_enable_ch_ges[i] =
895
1.80k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
896
1.80k
          }
897
2.70k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
898
1.80k
            if (self->temp_shape_enable_ch_ges[i]) {
899
542
              ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
900
542
                                       self->time_slots);
901
5.81k
              for (ts = 0; ts < self->time_slots; ts++) {
902
5.27k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
903
5.27k
                    2, (FLOAT32)env_shape_data[ts] /
904
5.27k
                               (self->ldmps_config.bs_env_quant_mode + 2) -
905
5.27k
                           1);
906
5.27k
              }
907
542
            }
908
1.80k
          }
909
903
          break;
910
12
        default:
911
12
          if (self->ec_flag == 0) {
912
12
          return IA_FATAL_ERROR;
913
12
      }
914
0
          break;
915
1.47k
      }
916
1.47k
    }
917
3.09k
  }
918
919
3.99k
  if (self->ldmps_config.bs_arbitrary_downmix != 0) {
920
9.78k
    for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
921
6.62k
      ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
922
6.62k
                                      CLD, 0);
923
6.62k
    }
924
3.16k
  }
925
926
3.99k
  ixheaacd_byte_align(it_bit_buff, &alignment);
927
928
16.7M
  while (it_bit_buff->cnt_bits > 8) {
929
16.7M
    ixheaacd_read_bits_buf(it_bit_buff, 8);
930
16.7M
  }
931
3.99k
  ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
932
3.99k
  return IA_NO_ERROR;
933
4.01k
}
934
935
static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
936
                                       WORD32 band_start, WORD32 band_stop,
937
71.4k
                                       WORD32 ch_fac) {
938
71.4k
  WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
939
71.4k
  WORD32 vdk[MAX_PARAMETER_BANDS + 1];
940
71.4k
  input_bands = band_stop - band_start;
941
71.4k
  out_bands = (input_bands - 1) / ch_fac + 1;
942
71.4k
  if (out_bands < 1) {
943
0
    out_bands = 1;
944
0
  }
945
946
71.4k
  bands_achived = out_bands * ch_fac;
947
71.4k
  bands_diff = input_bands - bands_achived;
948
580k
  for (i = 0; i < out_bands; i++) {
949
509k
    vdk[i] = ch_fac;
950
509k
  }
951
952
71.4k
  if (bands_diff > 0) {
953
0
    incr = -1;
954
0
    k = out_bands - 1;
955
71.4k
  } else {
956
71.4k
    incr = 1;
957
71.4k
    k = 0;
958
71.4k
  }
959
960
410k
  while (bands_diff != 0) {
961
338k
    vdk[k] = vdk[k] - incr;
962
338k
    k = k + incr;
963
338k
    bands_diff = bands_diff + incr;
964
338k
    if (k >= out_bands) {
965
316k
      if (bands_diff > 0) {
966
0
        k = out_bands - 1;
967
316k
      } else if (bands_diff < 0) {
968
297k
        k = 0;
969
297k
      }
970
316k
    }
971
338k
  }
972
71.4k
  map[0] = band_start;
973
580k
  for (i = 0; i < out_bands; i++) {
974
509k
    map[i + 1] = map[i] + vdk[i];
975
509k
  }
976
71.4k
}
977
978
static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
979
65.9k
                                      WORD32 data_bands) {
980
65.9k
  WORD32 i, j, band_start, band_stop, value;
981
65.9k
  WORD32 start_band_0 = map[0];
982
983
548k
  for (i = 0; i < data_bands; i++) {
984
482k
    value = in[i + start_band_0];
985
986
482k
    band_start = map[i];
987
482k
    band_stop = map[i + 1];
988
1.32M
    for (j = band_start; j < band_stop; j++) {
989
839k
      out[j] = value;
990
839k
    }
991
482k
  }
992
65.9k
}
993
994
5.00M
static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
995
5.00M
  switch (param_type) {
996
1.84M
    case CLD:
997
1.84M
      return ixheaacd_cld_de_quant_table[(value + 15)];
998
999
1.83M
    case ICC:
1000
1.83M
      return ixheaacd_icc_de_quant_table[value];
1001
1002
1.32M
    case IPD:
1003
1.32M
      return ixheaacd_ipd_de_quant_table[(value & 15)];
1004
1005
0
    default:
1006
0
      return 0;
1007
0
      return 0;
1008
5.00M
  }
1009
5.00M
}
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
723k
  for (i = 0; i < num_parameter_sets; i++) {
1035
397k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
1036
235k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1037
3.14M
      for (band = band_start; band < band_stop; band++) {
1038
2.91M
        out_idx_data[i][band] = default_val;
1039
2.91M
      }
1040
3.14M
      for (band = band_start; band < band_stop; band++) {
1041
2.91M
        idx_prev[band] = out_idx_data[i][band];
1042
2.91M
      }
1043
1044
235k
      frame_xxx_data->bs_quant_coarse_xxx_prev = 0;
1045
235k
    }
1046
1047
397k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 1) {
1048
760k
      for (band = band_start; band < band_stop; band++) {
1049
705k
        out_idx_data[i][band] = idx_prev[band];
1050
705k
      }
1051
55.1k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1052
55.1k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1053
55.1k
    }
1054
1055
397k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 2) {
1056
599k
      for (band = band_start; band < band_stop; band++) {
1057
559k
        out_idx_data[i][band] = idx_prev[band];
1058
559k
      }
1059
40.1k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1060
40.1k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1061
40.1k
      interpolate_local[i] = 1;
1062
357k
    } else {
1063
357k
      interpolate_local[i] = 0;
1064
357k
    }
1065
1066
397k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
1067
65.9k
      parm_slot = i;
1068
65.9k
      ch_fac =
1069
65.9k
          ixheaacd_mps_stride_table[frame_xxx_data
1070
65.9k
                                        ->bs_freq_res_stride_xxx[set_index]];
1071
65.9k
      data_bands = (band_stop - band_start - 1) / ch_fac + 1;
1072
65.9k
      ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac);
1073
65.9k
      ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0],
1074
65.9k
                                &out_idx_data[parm_slot][0], map, data_bands);
1075
1076
905k
      for (band = band_start; band < band_stop; band++) {
1077
839k
        idx_prev[band] = out_idx_data[parm_slot][band];
1078
839k
      }
1079
1080
65.9k
      frame_xxx_data->bs_quant_coarse_xxx_prev =
1081
65.9k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1082
65.9k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1083
65.9k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1084
1085
65.9k
      set_index++;
1086
65.9k
    }
1087
397k
  }
1088
1089
723k
  for (i = 0; i < num_parameter_sets; i++) {
1090
397k
    if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) {
1091
48.0k
      ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start,
1092
48.0k
                               band_stop - band_start);
1093
48.0k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1094
48.0k
    }
1095
397k
  }
1096
1097
326k
  i1 = -1;
1098
326k
  x1 = 0;
1099
326k
  i2 = 0;
1100
722k
  for (i = 0; i < num_parameter_sets; i++) {
1101
396k
    if (interpolate_local[i] != 1) {
1102
356k
      i1 = i;
1103
356k
    }
1104
396k
    i2 = i;
1105
437k
    while (interpolate_local[i2] == 1) {
1106
41.0k
      i2++;
1107
41.0k
    }
1108
396k
    if (i1 == -1) {
1109
36.8k
      x1 = 0;
1110
36.8k
      i1 = 0;
1111
359k
    } else {
1112
359k
      x1 = param_slots[i1];
1113
359k
    }
1114
396k
    xi = param_slots[i];
1115
396k
    x2 = param_slots[i2];
1116
1117
396k
    if (interpolate_local[i] == 1) {
1118
40.1k
      if (i2 < num_parameter_sets) {
1119
148
        if (self->ec_flag == 0) {
1120
148
          return IA_FATAL_ERROR;
1121
148
        }
1122
148
      }
1123
1124
597k
      for (band = band_start; band < band_stop; band++) {
1125
557k
        WORD32 yi, y1, y2;
1126
557k
        yi = 0;
1127
557k
        y1 = out_idx_data[i1][band];
1128
557k
        y2 = out_idx_data[i2][band];
1129
557k
        if (param_type == IPD) {
1130
127k
          if (y2 - y1 > 8) y1 += 16;
1131
127k
          if (y1 - y2 > 8) y2 += 16;
1132
1133
127k
          if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
1134
430k
        } else {
1135
430k
          if (x2 != x1) {
1136
37.3k
            yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1137
37.3k
          }
1138
430k
        }
1139
557k
        out_idx_data[i][band] = yi;
1140
557k
      }
1141
39.9k
    }
1142
396k
  }
1143
1144
722k
  for (ps = 0; ps < num_parameter_sets; ps++) {
1145
5.40M
    for (band = band_start; band < band_stop; band++) {
1146
5.00M
      if (param_type == CLD) {
1147
1.84M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
1148
3.16M
      } else if (param_type == ICC)
1149
1.83M
      {
1150
1.83M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
1151
1.83M
      }
1152
5.00M
      out_data[ps][band] =
1153
5.00M
          ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type);
1154
5.00M
    }
1155
396k
  }
1156
1157
325k
  if (ext_frame_flag) {
1158
110k
    for (band = band_start; band < band_stop; band++) {
1159
99.3k
      out_data[num_parameter_sets][band] =
1160
99.3k
          out_data[num_parameter_sets - 1][band];
1161
99.3k
      out_idx_data[num_parameter_sets][band] =
1162
99.3k
          out_idx_data[num_parameter_sets - 1][band];
1163
99.3k
    }
1164
11.0k
  }
1165
325k
  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.5k
    err_code = ixheaacd_mps_mapindexdata(
1185
91.5k
        self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
1186
91.5k
        cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
1187
91.5k
        cur_bit_stream_ptr->ipd_idx_prev, IPD);
1188
1189
91.5k
    if (err_code != IA_NO_ERROR) return err_code;
1190
91.5k
  }
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
260k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
1199
142k
    switch (frame->bs_smooth_mode[ps]) {
1200
122k
      case 0:
1201
122k
        self->smoothing_time[ps] = 256;
1202
122k
        self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
1203
1204
1.74M
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1205
1.61M
          self->smoothing_data[ps][pb] = 0;
1206
1.61M
        }
1207
122k
        break;
1208
1209
4.56k
      case 1:
1210
4.56k
        if (ps > 0) {
1211
2.50k
          self->smoothing_time[ps] = self->smoothing_time[ps - 1];
1212
2.50k
          self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1];
1213
2.50k
        } else {
1214
2.05k
          self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time;
1215
2.05k
          self->inv_smoothing_time[ps] =
1216
2.05k
              self->smoothing_filt_state.inv_prev_smg_time;
1217
2.05k
        }
1218
1219
65.5k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1220
60.9k
          if (ps > 0)
1221
32.9k
            self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb];
1222
28.0k
          else
1223
28.0k
            self->smoothing_data[ps][pb] =
1224
28.0k
                self->smoothing_filt_state.prev_smg_data[pb];
1225
60.9k
        }
1226
4.56k
        break;
1227
1228
10.0k
      case 2:
1229
10.0k
        self->smoothing_time[ps] =
1230
10.0k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1231
10.0k
        self->inv_smoothing_time[ps] =
1232
10.0k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1233
107k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1234
97.4k
          self->smoothing_data[ps][pb] = 1;
1235
97.4k
        }
1236
10.0k
        break;
1237
1238
5.48k
      case 3:
1239
5.48k
        self->smoothing_time[ps] =
1240
5.48k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1241
5.48k
        self->inv_smoothing_time[ps] =
1242
5.48k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1243
1244
5.48k
        ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
1245
5.48k
        data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
1246
5.48k
        ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands,
1247
5.48k
                                   ch_fac);
1248
32.1k
        for (pg = 0; pg < data_bands; pg++) {
1249
26.6k
          param_band_start = group_to_band[pg];
1250
26.6k
          param_band_stop = group_to_band[pg + 1];
1251
87.8k
          for (pb = param_band_start; pb < param_band_stop; pb++) {
1252
61.2k
            self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg];
1253
61.2k
          }
1254
26.6k
        }
1255
5.48k
        break;
1256
142k
    }
1257
142k
  }
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.67M
  for (pb = 0; pb < self->bs_param_bands; pb++) {
1264
1.56M
    self->smoothing_filt_state.prev_smg_data[pb] =
1265
1.56M
        self->smoothing_data[self->num_parameter_sets - 1][pb];
1266
1.56M
  }
1267
1268
117k
  if (self->ext_frame_flag) {
1269
4.03k
    self->smoothing_time[self->num_parameter_sets] =
1270
4.03k
        self->smoothing_time[self->num_parameter_sets - 1];
1271
4.03k
    self->inv_smoothing_time[self->num_parameter_sets] =
1272
4.03k
        self->inv_smoothing_time[self->num_parameter_sets - 1];
1273
41.1k
    for (pb = 0; pb < self->bs_param_bands; pb++) {
1274
37.0k
      self->smoothing_data[self->num_parameter_sets][pb] =
1275
37.0k
          self->smoothing_data[self->num_parameter_sets - 1][pb];
1276
37.0k
    }
1277
4.03k
  }
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
113k
    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
4.04k
    self->ext_frame_flag = 1;
1288
4.04k
  }
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
4.03k
    self->num_parameter_sets++;
1296
4.03k
    self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
1297
4.03k
  }
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
147k
  for (i = 1; i < self->num_parameter_sets; i++) {
1310
29.8k
    self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
1311
29.8k
    if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) ||
1312
29.8k
        (self->param_slot_diff[i] == 0)) {
1313
3
      if (self->ec_flag == 0) {
1314
3
        return -1;
1315
3
      } else {
1316
0
        self->param_slot_diff[i] = 1;
1317
0
        self->inv_param_slot_diff[i] = 1;
1318
0
      }
1319
3
    }
1320
29.8k
    self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
1321
29.8k
    self->inv_param_slot_diff_Q30[i] =
1322
29.8k
        (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
1323
29.8k
  }
1324
117k
  return IA_NO_ERROR;
1325
117k
}
1326
1327
3.97k
WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
1328
3.97k
  WORD32 samp_freq;
1329
3.97k
  WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
1330
3.97k
                                24000, 22050, 16000, 12000, 11025, 8000,
1331
3.97k
                                7350,  0,     0,     0};
1332
1333
3.97k
  if (self->ldmps_config.ldmps_present_flag == 1)
1334
1.71k
    self->time_slots = self->frame_length + 1;
1335
2.25k
  else
1336
2.25k
    self->time_slots = self->frame_length;
1337
1338
3.97k
  self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
1339
1340
3.97k
  if (self->ldmps_config.ldmps_present_flag == 1) {
1341
1.71k
    if (self->ldmps_config.bs_sampling_freq_index == 15) {
1342
7
      samp_freq = self->ldmps_config.bs_fampling_frequency;
1343
1.71k
    } else {
1344
1.71k
      samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
1345
1.71k
    }
1346
1347
1.71k
    if (samp_freq < 27713.0) {
1348
952
      self->qmf_band_count = 32;
1349
952
    } else if (samp_freq >= 55426.0) {
1350
20
      self->qmf_band_count = 128;
1351
746
    } else {
1352
746
      self->qmf_band_count = 64;
1353
746
    }
1354
1.71k
  }
1355
1356
3.97k
  if (self->object_type == AOT_ER_AAC_ELD ||
1357
2.25k
      self->object_type == AOT_ER_AAC_LD) {
1358
1.71k
    self->bs_param_bands =
1359
1.71k
        ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
1360
1.71k
    self->hyb_band_count_max = self->qmf_band_count;
1361
1.71k
  } else
1362
2.25k
    self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
1363
1364
3.97k
  if (self->object_type == AOT_ER_AAC_ELD ||
1365
2.25k
      self->object_type == AOT_ER_AAC_LD) {
1366
1.71k
    switch (self->bs_param_bands) {
1367
101
      case 4:
1368
1369
101
        self->hyb_band_to_processing_band_table =
1370
101
            ixheaacd_hybrid_band_64_to_processing_band_4_map;
1371
101
        break;
1372
34
      case 5:
1373
1374
34
        self->hyb_band_to_processing_band_table =
1375
34
            ixheaacd_hybrid_band_64_to_processing_band_5_map;
1376
34
        break;
1377
158
      case 7:
1378
1379
158
        self->hyb_band_to_processing_band_table =
1380
158
            ixheaacd_hybrid_band_64_to_processing_band_7_map;
1381
158
        break;
1382
287
      case 9:
1383
1384
287
        self->hyb_band_to_processing_band_table =
1385
287
            ixheaacd_hybrid_band_64_to_processing_band_9_map;
1386
287
        break;
1387
148
      case 12:
1388
1389
148
        self->hyb_band_to_processing_band_table =
1390
148
            ixheaacd_hybrid_band_64_to_processing_band_12_map;
1391
148
        break;
1392
216
      case 15:
1393
1394
216
        self->hyb_band_to_processing_band_table =
1395
216
            ixheaacd_hybrid_band_64_to_processing_band_15_map;
1396
216
        break;
1397
760
      case 23:
1398
1399
760
        self->hyb_band_to_processing_band_table =
1400
760
            ixheaacd_hybrid_band_64_to_processing_band_23_map;
1401
760
        break;
1402
14
      default:
1403
14
        self->hyb_band_to_processing_band_table = NULL;
1404
14
        return -1;
1405
0
        break;
1406
1.71k
    }
1407
2.25k
  } else {
1408
2.25k
    switch (self->bs_param_bands) {
1409
667
      case 4:
1410
667
        self->hyb_band_to_processing_band_table =
1411
667
            ixheaacd_hybrid_band_71_to_processing_band_4_map;
1412
667
        break;
1413
189
      case 5:
1414
189
        self->hyb_band_to_processing_band_table =
1415
189
            ixheaacd_hybrid_band_71_to_processing_band_5_map;
1416
189
        break;
1417
327
      case 7:
1418
327
        self->hyb_band_to_processing_band_table =
1419
327
            ixheaacd_hybrid_band_71_to_processing_band_7_map;
1420
327
        break;
1421
368
      case 10:
1422
368
        self->hyb_band_to_processing_band_table =
1423
368
            ixheaacd_hybrid_band_71_to_processing_band_10_map;
1424
368
        break;
1425
220
      case 14:
1426
220
        self->hyb_band_to_processing_band_table =
1427
220
            ixheaacd_hybrid_band_71_to_processing_band_14_map;
1428
220
        break;
1429
121
      case 20:
1430
121
        self->hyb_band_to_processing_band_table =
1431
121
            ixheaacd_hybrid_band_71_to_processing_band_20_map;
1432
121
        break;
1433
365
      case 28:
1434
365
        self->hyb_band_to_processing_band_table =
1435
365
            ixheaacd_hybrid_band_71_to_processing_band_28_map;
1436
365
        break;
1437
2
      default:
1438
2
        self->hyb_band_to_processing_band_table = NULL;
1439
2
        return -1;
1440
0
        break;
1441
2.25k
    }
1442
2.25k
  }
1443
3.96k
  self->in_ch_count = 1;
1444
3.96k
  self->out_ch_count = 2;
1445
1446
3.96k
  self->input_gain =
1447
3.96k
      ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx];
1448
1449
3.96k
  if (self->config->bs_ott_bands_phase_present) {
1450
885
    self->num_bands_ipd = self->config->bs_ott_bands_phase;
1451
3.07k
  } else {
1452
3.07k
    if (!(self->object_type == AOT_ER_AAC_ELD ||
1453
1.37k
          self->object_type == AOT_ER_AAC_LD)) {
1454
1.37k
      switch (self->bs_param_bands) {
1455
583
        case 4:
1456
707
        case 5:
1457
707
          self->num_bands_ipd = 2;
1458
707
          break;
1459
241
        case 7:
1460
241
          self->num_bands_ipd = 3;
1461
241
          break;
1462
49
        case 10:
1463
49
          self->num_bands_ipd = 5;
1464
49
          break;
1465
137
        case 14:
1466
137
          self->num_bands_ipd = 7;
1467
137
          break;
1468
33
        case 20:
1469
238
        case 28:
1470
238
          self->num_bands_ipd = 10;
1471
238
          break;
1472
0
        default:
1473
0
          return -1;
1474
0
          break;
1475
1.37k
      }
1476
1.37k
    }
1477
3.07k
  }
1478
1479
3.96k
  if (self->residual_coding) {
1480
1.23k
    self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd);
1481
1.23k
    self->max_res_bands = 0;
1482
1.23k
    if (self->bs_residual_present) {
1483
1.23k
      self->res_bands = self->bs_residual_bands;
1484
1.23k
      if (self->res_bands > self->max_res_bands) {
1485
929
        self->max_res_bands = self->res_bands;
1486
929
      }
1487
1.23k
    } else {
1488
0
      self->res_bands = 0;
1489
0
    }
1490
1.23k
  }
1491
1492
3.96k
  if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1;
1493
1494
3.96k
  self->dir_sig_count = 1;
1495
3.96k
  self->decor_sig_count = 1;
1496
1497
3.96k
  self->bs_high_rate_mode = self->config->bs_high_rate_mode;
1498
3.96k
  self->pre_mix_req = 1;
1499
1500
3.96k
  return 0;
1501
3.96k
}