Coverage Report

Created: 2025-07-12 07:02

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