Coverage Report

Created: 2025-10-10 06: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.18M
static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
174
3.18M
  var = min(var, upper_bound);
175
3.18M
  var = max(var, lower_bound);
176
3.18M
  return var;
177
3.18M
}
178
179
static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b,
180
1.08M
                               UWORD16 d[], WORD32 len) {
181
1.08M
  WORD32 k;
182
1.08M
  UWORD32 tmp;
183
1.08M
  UWORD32 b0 = (UWORD32)b;
184
185
1.08M
  tmp = ((UWORD32)a[0]) * b0;
186
1.08M
  d[0] = (UWORD16)tmp;
187
188
5.43M
  for (k = 1; k < len; k++) {
189
4.34M
    tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0;
190
4.34M
    d[k] = (UWORD16)tmp;
191
4.34M
  }
192
1.08M
}
193
194
static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a,
195
1.08M
                             UWORD16 d[], UWORD16 *pr, WORD32 len) {
196
1.08M
  UWORD32 r;
197
1.08M
  UWORD32 tmp;
198
1.08M
  UWORD32 temp;
199
1.08M
  WORD32 k;
200
201
1.08M
  if (a == 0)
202
0
    return;
203
204
1.08M
  r = 0;
205
206
6.52M
  for (k = len - 1; k >= 0; k--) {
207
5.43M
    tmp = ((UWORD32)b[k]) + (r << 16);
208
209
5.43M
    if (tmp) {
210
1.70M
      d[k] = (UWORD16)(tmp / a);
211
1.70M
      temp = d[k] * a;
212
1.70M
      r = tmp - temp;
213
3.72M
    } else {
214
3.72M
      d[k] = 0;
215
3.72M
    }
216
5.43M
  }
217
1.08M
  *pr = (UWORD16)r;
218
1.08M
}
219
220
static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena,
221
66.9k
                             WORD32 lenb) {
222
66.9k
  WORD32 h;
223
66.9k
  WORD32 carry = 0;
224
225
66.9k
  if (lenb > lena)
226
0
    return;
227
228
334k
  for (h = 0; h < lenb; h++) {
229
267k
    carry = carry + (WORD32)(a[h] - b[h]);
230
267k
    a[h] = (UWORD16)carry;
231
267k
    carry = carry >> 16;
232
267k
  }
233
234
66.9k
  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
66.9k
  if (carry != 0)
241
0
    return;
242
66.9k
  return;
243
66.9k
}
244
245
static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[],
246
346k
                                WORD32 len) {
247
346k
  WORD32 i;
248
249
1.27M
  for (i = len - 1; i > 0; i--) {
250
1.02M
    if (a[i] != b[i]) break;
251
1.02M
  }
252
346k
  return (a[i] >= b[i]) ? 1 : 0;
253
346k
}
254
255
static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type,
256
42.4k
                                     WORD32 band_start, WORD32 ixheaacd_num_bands) {
257
42.4k
  WORD32 i;
258
259
622k
  for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
260
579k
    data[i] <<= 1;
261
579k
  }
262
263
42.4k
  if (data_type == CLD) {
264
132k
    for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
265
123k
      if (data[i] == -14)
266
19.3k
        data[i] = -15;
267
104k
      else if (data[i] == 14)
268
5.06k
        data[i] = 15;
269
123k
    }
270
9.28k
  }
271
42.4k
}
272
273
10.9k
static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) {
274
10.9k
  WORD32 i;
275
276
124k
  for (i = 0; i < ixheaacd_num_bands; i++) {
277
113k
    data[i] /= 2;
278
113k
  }
279
10.9k
}
280
281
static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start,
282
32.5k
                                     WORD32 band_stop, WORD32 *strides) {
283
32.5k
  WORD32 i, pb, ch_fac, data_bands, start_offset;
284
285
32.5k
  ch_fac = ixheaacd_mps_stride_table[freq_res_stride];
286
32.5k
  data_bands = (band_stop - band_start - 1) / ch_fac + 1;
287
288
32.5k
  strides[0] = band_start;
289
267k
  for (pb = 1; pb <= data_bands; pb++) {
290
234k
    strides[pb] = strides[pb - 1] + ch_fac;
291
234k
  }
292
32.5k
  start_offset = 0;
293
181k
  while (strides[data_bands] > band_stop) {
294
148k
    if (start_offset < data_bands)
295
12.6k
      start_offset++;
296
135k
    else
297
135k
      start_offset = 1;
298
299
310k
    for (i = start_offset; i <= data_bands; i++) {
300
162k
      strides[i]--;
301
162k
    }
302
148k
  }
303
304
32.5k
  return data_bands;
305
32.5k
}
306
307
static IA_ERRORCODE ixheaacd_mps_ecdata_decoding(
308
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream,
309
232k
    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) {
310
232k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
311
232k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
312
232k
  WORD32 band_stop = 0;
313
314
232k
  WORD32 *lastdata = NULL;
315
232k
  ia_mps_data_struct *frame_xxx_data = NULL;
316
232k
  WORD32 default_val = 0;
317
232k
  IA_ERRORCODE err = IA_NO_ERROR;
318
319
232k
  ia_mps_bs_frame *frame = &(self->bs_frame);
320
321
232k
  if (datatype == 0) {
322
108k
    frame_xxx_data = &frame->cld_data;
323
108k
    lastdata = frame->cmp_cld_idx_prev;
324
108k
    band_stop = self->bs_param_bands;
325
123k
  } else if (datatype == 1) {
326
108k
    frame_xxx_data = &frame->icc_data;
327
108k
    lastdata = frame->cmp_icc_idx_prev;
328
108k
    band_stop = self->bs_param_bands;
329
108k
  } else if (datatype == 2) {
330
15.1k
    frame_xxx_data = &frame->ipd_data;
331
15.1k
    lastdata = frame->ipd_idx_data_prev;
332
15.1k
    band_stop = self->num_bands_ipd;
333
15.1k
  } else {
334
0
    frame_xxx_data = &frame->cld_data;
335
0
    lastdata = frame->cmp_cld_idx_prev;
336
0
    band_stop = self->bs_param_bands;
337
0
  }
338
339
508k
  for (i = 0; i < self->num_parameter_sets; i++) {
340
275k
    frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2);
341
275k
  }
342
343
232k
  set_index = 0;
344
232k
  bs_data_pair = 0;
345
232k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
346
347
508k
  for (i = 0; i < self->num_parameter_sets; i++) {
348
275k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
349
2.20M
      for (pb = 0; pb < band_stop; pb++) {
350
2.02M
        lastdata[pb] = default_val;
351
2.02M
      }
352
353
179k
      old_quant_coarse_xxx = 0;
354
179k
    }
355
356
275k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
357
25.5k
      if (bs_data_pair) {
358
945
        bs_data_pair = 0;
359
24.5k
      } else {
360
24.5k
        bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1);
361
24.5k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
362
24.5k
            ixheaacd_read_bits_buf(bitstream, 1);
363
24.5k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
364
24.5k
            ixheaacd_read_bits_buf(bitstream, 2);
365
366
24.5k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
367
24.5k
            old_quant_coarse_xxx) {
368
6.78k
          if (old_quant_coarse_xxx) {
369
876
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
370
5.91k
          } else {
371
5.91k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
372
5.91k
          }
373
6.78k
        }
374
375
24.5k
        data_bands = ixheaacd_mps_getstridemap(
376
24.5k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop,
377
24.5k
            strides);
378
379
225k
        for (pb = 0; pb < data_bands; pb++) {
380
200k
          lastdata[pb] = lastdata[strides[pb]];
381
200k
        }
382
383
24.5k
        err = ixheaacd_mps_ecdatapairdec(
384
24.5k
            bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
385
24.5k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
386
24.5k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag);
387
24.5k
        if (err) return err;
388
389
224k
        for (pb = 0; pb < data_bands; pb++) {
390
513k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
391
313k
            if (datatype == IPD) {
392
68.4k
              if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
393
32.9k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
394
35.4k
              } else {
395
35.4k
                lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
396
35.4k
              }
397
244k
            } else {
398
244k
              lastdata[j] = data[set_index + bs_data_pair][pb];
399
244k
            }
400
313k
          }
401
200k
        }
402
403
24.5k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
404
405
24.5k
        if (bs_data_pair) {
406
9.63k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
407
9.63k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
408
9.63k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
409
9.63k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
410
9.63k
        }
411
24.5k
        set_index += bs_data_pair + 1;
412
24.5k
      }
413
25.5k
    }
414
275k
  }
415
232k
  return err;
416
232k
}
417
418
IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self,
419
                                        WORD32 usac_independency_flag,
420
108k
                                        ia_bit_buf_struct *bitstream) {
421
108k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
422
108k
  WORD32 ps, pg, ts, pb;
423
108k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
424
425
108k
  WORD32 bits_param_slot = 0;
426
427
108k
  ia_mps_bs_frame *frame = &(self->bs_frame);
428
108k
  IA_ERRORCODE err = IA_NO_ERROR;
429
430
108k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
431
432
108k
  self->num_parameter_sets_prev = self->num_parameter_sets;
433
434
108k
  if (self->bs_high_rate_mode) {
435
28.8k
    bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1);
436
28.8k
    self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1;
437
80.0k
  } else {
438
80.0k
    bs_frame_type = 0;
439
80.0k
    self->num_parameter_sets = 1;
440
80.0k
  }
441
442
108k
  if (self->time_slots == 32)
443
93.4k
    bits_param_slot = 5;
444
15.4k
  else if (self->time_slots == 64)
445
15.4k
    bits_param_slot = 6;
446
447
108k
  if (bs_frame_type) {
448
3.01k
    WORD32 prev_param_slot = -1;
449
6.18k
    for (i = 0; i < self->num_parameter_sets; i++) {
450
3.24k
      self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot);
451
452
3.24k
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
453
75
        return IA_FATAL_ERROR;
454
75
      }
455
3.17k
      prev_param_slot = self->param_slots[i];
456
3.17k
    }
457
105k
  } else {
458
231k
    for (i = 0; i < self->num_parameter_sets; i++) {
459
125k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
460
125k
                              self->num_parameter_sets) -
461
125k
                             1;
462
125k
    }
463
105k
  }
464
465
108k
  if (!usac_independency_flag) {
466
106k
    frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1);
467
106k
  } else {
468
2.53k
    frame->independency_flag = 1;
469
2.53k
  }
470
471
108k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD);
472
108k
  if (err) return err;
473
474
108k
  err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC);
475
108k
  if (err) return err;
476
477
108k
  if (self->config->bs_phase_coding) {
478
82.9k
    self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1);
479
480
82.9k
    if (!self->bs_phase_mode) {
481
1.02M
      for (pb = 0; pb < self->num_bands_ipd; pb++) {
482
954k
        frame->ipd_idx_data_prev[pb] = 0;
483
2.13M
        for (i = 0; i < self->num_parameter_sets; i++) {
484
1.17M
          frame->ipd_idx_data[i][pb] = 0;
485
1.17M
          self->bs_frame.ipd_idx[i][pb] = 0;
486
1.17M
        }
487
954k
        self->bs_frame.ipd_idx_prev[pb] = 0;
488
954k
      }
489
67.7k
      self->opd_smoothing_mode = 0;
490
67.7k
    } else {
491
15.1k
      self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1);
492
15.1k
      err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data,
493
15.1k
                                         IPD);
494
15.1k
      if (err) return err;
495
15.1k
    }
496
82.9k
  }
497
498
25.9k
  else {
499
25.9k
    self->bs_phase_mode = 0;
500
186k
    for (pb = 0; pb < self->num_bands_ipd; pb++) {
501
160k
      frame->ipd_idx_data_prev[pb] = 0;
502
372k
      for (i = 0; i < self->num_parameter_sets; i++) {
503
212k
        frame->ipd_idx_data[i][pb] = 0;
504
212k
        self->bs_frame.ipd_idx[i][pb] = 0;
505
212k
      }
506
160k
      self->bs_frame.ipd_idx_prev[pb] = 0;
507
160k
    }
508
25.9k
    self->opd_smoothing_mode = 0;
509
25.9k
  }
510
511
108k
  if (self->bs_high_rate_mode) {
512
76.8k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
513
48.1k
      frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2);
514
48.1k
      if (frame->bs_smooth_mode[ps] >= 2) {
515
9.68k
        frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2);
516
9.68k
      }
517
48.1k
      if (frame->bs_smooth_mode[ps] == 3) {
518
1.46k
        frame->bs_freq_res_stride_smg[ps] =
519
1.46k
            ixheaacd_read_bits_buf(bitstream, 2);
520
1.46k
        data_bands =
521
1.46k
            (self->bs_param_bands - 1) /
522
1.46k
                ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
523
1.46k
            1;
524
13.2k
        for (pg = 0; pg < data_bands; pg++) {
525
11.7k
          frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1);
526
11.7k
        }
527
1.46k
      }
528
48.1k
    }
529
80.1k
  } else {
530
160k
    for (ps = 0; ps < self->num_parameter_sets; ps++) {
531
80.0k
      frame->bs_smooth_mode[ps] = 0;
532
80.0k
    }
533
80.1k
  }
534
535
326k
  for (i = 0; i < 2; i++) {
536
217k
    self->temp_shape_enable_ch_stp[i] = 0;
537
217k
    self->temp_shape_enable_ch_ges[i] = 0;
538
217k
  }
539
540
108k
  self->bs_tsd_enable = 0;
541
108k
  if (self->config->bs_temp_shape_config == 3) {
542
49.1k
    self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1);
543
59.6k
  } else if (self->config->bs_temp_shape_config != 0) {
544
33.4k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1);
545
33.4k
    if (bs_temp_shape_enable) {
546
5.74k
      num_of_temp_shape_ch = 2;
547
5.74k
      switch (self->config->bs_temp_shape_config) {
548
2.13k
        case 1:
549
6.38k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
550
4.25k
            self->temp_shape_enable_ch_stp[i] =
551
4.25k
                ixheaacd_read_bits_buf(bitstream, 1);
552
4.25k
          }
553
2.13k
          break;
554
3.61k
        case 2:
555
10.8k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
556
7.22k
            self->temp_shape_enable_ch_ges[i] =
557
7.22k
                ixheaacd_read_bits_buf(bitstream, 1);
558
7.22k
          }
559
10.8k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
560
7.19k
            if (self->temp_shape_enable_ch_ges[i]) {
561
3.46k
              ixheaacd_mps_huff_decode(bitstream, env_shape_data,
562
3.46k
                                       self->time_slots);
563
120k
              for (ts = 0; ts < self->time_slots; ts++) {
564
117k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
565
117k
                    2, (FLOAT32)env_shape_data[ts] /
566
117k
                               (self->config->bs_env_quant_mode + 2) -
567
117k
                           1);
568
117k
              }
569
3.46k
            }
570
7.19k
          }
571
3.61k
          break;
572
0
        default:
573
0
          return -1;
574
5.74k
      }
575
5.74k
    }
576
33.4k
  }
577
578
108k
  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
6.38k
      nbits_tr_slots = 4;
597
6.38k
      tab = table_32;
598
6.38k
    } else if (self->time_slots == 64) {
599
3.50k
      nbits_tr_slots = 5;
600
3.50k
      tab = table_64;
601
3.50k
    }
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
108
      s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48);
609
108
      s_64 = s[3];
610
108
      s[2] = ixheaacd_read_bits_buf(bitstream, 16);
611
108
      s_64 = (s_64 << 16) | s[2];
612
108
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
613
108
      s_64 = (s_64 << 16) | s[1];
614
108
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
615
108
      s_64 = (s_64 << 16) | s[0];
616
9.77k
    } else if (self->tsd_codeword_len > 32) {
617
1.55k
      s[3] = 0;
618
1.55k
      s_64 = s[3];
619
1.55k
      s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32);
620
1.55k
      s_64 = (s_64 << 16) | s[2];
621
1.55k
      s[1] = ixheaacd_read_bits_buf(bitstream, 16);
622
1.55k
      s_64 = (s_64 << 16) | s[1];
623
1.55k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
624
1.55k
      s_64 = (s_64 << 16) | s[0];
625
8.22k
    } else if (self->tsd_codeword_len > 16) {
626
4.09k
      s[3] = 0;
627
4.09k
      s_64 = s[3];
628
4.09k
      s[2] = 0;
629
4.09k
      s_64 = (s_64 << 16) | s[2];
630
4.09k
      s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16);
631
4.09k
      s_64 = (s_64 << 16) | s[1];
632
4.09k
      s[0] = ixheaacd_read_bits_buf(bitstream, 16);
633
4.09k
      s_64 = (s_64 << 16) | s[0];
634
4.13k
    } else {
635
4.13k
      s[3] = 0;
636
4.13k
      s_64 = s[3];
637
4.13k
      s[2] = 0;
638
4.13k
      s_64 = (s_64 << 16) | s[2];
639
4.13k
      s[1] = 0;
640
4.13k
      s_64 = (s_64 << 16) | s[1];
641
4.13k
      s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len);
642
4.13k
      s_64 = (s_64 << 16) | s[0];
643
4.13k
    }
644
645
9.88k
    {
646
9.88k
      WORD32 p = self->tsd_num_tr_slots;
647
648
438k
      for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0;
649
650
347k
      for (k = self->time_slots - 1; k >= 0; k--) {
651
347k
        if (p > k) {
652
2.96k
          for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1;
653
919
          break;
654
919
        }
655
656
346k
        c[0] = k - p + 1;
657
346k
        c_64 = c[0];
658
1.73M
        for (i = 1; i < 5; i++) c[i] = 0;
659
660
1.43M
        for (h = 2; h <= p; h++) {
661
1.08M
          b = k - p + h;
662
1.08M
          c_64 = c_64 * (b / h);
663
1.08M
          ixheaacd_longmult1(c, b, c, 5);
664
1.08M
          b = h;
665
1.08M
          ixheaacd_longdiv(c, b, c, r, 5);
666
1.08M
        }
667
668
346k
        if (ixheaacd_longcompare(s, c, 4)) {
669
66.9k
          ixheaacd_longsub(s, c, 4, 4);
670
66.9k
          self->bs_tsd_sep_data[k] = 1;
671
66.9k
          p--;
672
66.9k
          if (p == 0) break;
673
66.9k
        }
674
346k
      }
675
9.88k
    }
676
677
437k
    for (i = 0; i < self->time_slots; i++) {
678
427k
      if (self->bs_tsd_sep_data[i])
679
68.8k
        self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3);
680
427k
    }
681
9.88k
  }
682
683
108k
  self->parse_nxt_frame = 0;
684
108k
  return err;
685
108k
}
686
687
static VOID ixheaacd_ld_mps_ecdata_decoding(
688
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff,
689
    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype,
690
20.5k
    WORD32 start_band) {
691
20.5k
  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
692
20.5k
  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
693
20.5k
  WORD32 band_stop = 0;
694
695
20.5k
  WORD32 *lastdata = NULL;
696
20.5k
  ia_mps_data_struct *frame_xxx_data = NULL;
697
20.5k
  WORD32 default_val = 0;
698
699
20.5k
  ia_mps_bs_frame *frame = &(self->bs_frame);
700
701
20.5k
  if (datatype == CLD) {
702
15.5k
    frame_xxx_data = &frame->cld_data;
703
15.5k
    lastdata = frame->cmp_cld_idx_prev;
704
15.5k
    band_stop = self->bs_param_bands;
705
15.5k
  } else if (datatype == ICC) {
706
5.03k
    frame_xxx_data = &frame->icc_data;
707
5.03k
    lastdata = frame->cmp_icc_idx_prev;
708
5.03k
    band_stop = self->bs_param_bands;
709
5.03k
  } else if (datatype == IPD) {
710
0
    frame_xxx_data = &frame->ipd_data;
711
0
    lastdata = frame->ipd_idx_data_prev;
712
0
    band_stop = self->num_bands_ipd;
713
0
  } else {
714
0
    frame_xxx_data = &frame->cld_data;
715
0
    lastdata = frame->cmp_cld_idx_prev;
716
0
    band_stop = self->bs_param_bands;
717
0
  }
718
48.5k
  for (i = 0; i < self->num_parameter_sets; i++) {
719
27.9k
    frame_xxx_data->bs_xxx_data_mode[i] =
720
27.9k
        ixheaacd_read_bits_buf(it_bit_buff, 2);
721
27.9k
  }
722
723
20.5k
  set_index = 0;
724
20.5k
  bs_data_pair = 0;
725
20.5k
  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
726
727
48.4k
  for (i = 0; i < self->num_parameter_sets; i++) {
728
27.9k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
729
95.1k
      for (pb = 0; pb < band_stop; pb++) {
730
83.0k
        lastdata[pb] = default_val;
731
83.0k
      }
732
733
12.0k
      old_quant_coarse_xxx = 0;
734
12.0k
    }
735
736
27.9k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
737
9.86k
      if (bs_data_pair) {
738
1.92k
        bs_data_pair = 0;
739
7.93k
      } else {
740
7.93k
        bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
741
7.93k
        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
742
7.93k
            ixheaacd_read_bits_buf(it_bit_buff, 1);
743
7.93k
        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
744
7.93k
            ixheaacd_read_bits_buf(it_bit_buff, 2);
745
746
7.93k
        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
747
7.93k
            old_quant_coarse_xxx) {
748
6.10k
          if (old_quant_coarse_xxx) {
749
1.03k
            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
750
5.06k
          } else {
751
5.06k
            ixheaacd_mps_fine2coarse(lastdata, band_stop);
752
5.06k
          }
753
6.10k
        }
754
755
7.93k
        data_bands = ixheaacd_mps_getstridemap(
756
7.93k
            frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
757
7.93k
            band_stop, strides);
758
41.7k
        for (pb = 0; pb < data_bands; pb++) {
759
33.8k
          lastdata[pb] = lastdata[strides[pb]];
760
33.8k
        }
761
762
7.93k
        ixheaacd_mps_ecdatapairdec(
763
7.93k
            it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
764
7.93k
            frame_xxx_data->bs_quant_coarse_xxx[set_index],
765
7.93k
            !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
766
767
41.5k
        for (pb = 0; pb < data_bands; pb++) {
768
99.2k
          for (j = strides[pb]; j < strides[pb + 1]; j++) {
769
65.5k
            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
65.5k
            } else {
776
65.5k
              lastdata[j] = data[set_index + bs_data_pair][pb];
777
65.5k
            }
778
65.5k
          }
779
33.6k
        }
780
781
7.93k
        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
782
783
7.93k
        if (bs_data_pair) {
784
5.88k
          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
785
5.88k
              frame_xxx_data->bs_quant_coarse_xxx[set_index];
786
5.88k
          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
787
5.88k
              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
788
5.88k
        }
789
7.93k
        set_index += bs_data_pair + 1;
790
7.93k
      }
791
9.86k
    }
792
27.9k
  }
793
20.5k
}
794
795
IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
796
3.04k
    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
797
3.04k
  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
798
3.04k
      num_of_temp_shape_ch;
799
3.04k
  WORD32 ps, pg, ts, ic;
800
3.04k
  WORD32 env_shape_data[MAX_TIME_SLOTS];
801
3.04k
  WORD32 alignment;
802
3.04k
  WORD32 bits_param_slot = 0;
803
804
3.04k
  ia_mps_bs_frame *frame = &(self->bs_frame);
805
3.04k
  alignment = it_bit_buff->cnt_bits;
806
3.04k
  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
807
808
3.04k
  self->num_parameter_sets_prev = self->num_parameter_sets;
809
810
3.04k
  bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
811
3.04k
  self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
812
813
3.04k
  if (self->time_slots == 32)
814
359
    bits_param_slot = 5;
815
2.68k
  else if (self->time_slots == 64)
816
0
    bits_param_slot = 6;
817
2.68k
  else if (self->time_slots == 8)
818
40
    bits_param_slot = 3;
819
2.64k
  else if (self->time_slots == 16 || self->time_slots == 15)
820
114
    bits_param_slot = 4;
821
822
3.04k
  if (bs_frame_type) {
823
537
    WORD32 prev_param_slot = -1;
824
1.11k
    for (i = 0; i < self->num_parameter_sets; i++) {
825
588
      self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
826
827
588
      if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
828
15
        return IA_FATAL_ERROR;
829
15
      }
830
573
      prev_param_slot = self->param_slots[i];
831
573
    }
832
2.51k
  } else {
833
6.08k
    for (i = 0; i < self->num_parameter_sets; i++) {
834
3.57k
      self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
835
3.57k
                              self->num_parameter_sets) -
836
3.57k
                             1;
837
3.57k
    }
838
2.51k
  }
839
840
3.03k
  frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
841
842
12.9k
  for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
843
9.94k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
844
9.94k
                                    0);
845
9.94k
  }
846
847
3.03k
  if (self->ldmps_config.bs_one_icc) {
848
2.07k
    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
849
2.07k
                                    0);
850
2.07k
  } else {
851
4.54k
    for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
852
3.59k
      if (!self->ldmps_config.ott_mode_lfe[i])
853
2.95k
        ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
854
2.95k
                                        ICC, 0);
855
3.59k
    }
856
954
  }
857
858
7.12k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
859
4.09k
    frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
860
4.09k
    if (frame->bs_smooth_mode[ps] >= 2) {
861
1.82k
      frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
862
1.82k
    }
863
4.09k
    if (frame->bs_smooth_mode[ps] == 3) {
864
1.40k
      frame->bs_freq_res_stride_smg[ps] =
865
1.40k
          ixheaacd_read_bits_buf(it_bit_buff, 2);
866
1.40k
      data_bands =
867
1.40k
          (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
868
1.40k
              ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
869
1.40k
          1;
870
6.02k
      for (pg = 0; pg < data_bands; pg++) {
871
4.61k
        frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
872
4.61k
      }
873
1.40k
    }
874
4.09k
  }
875
876
9.04k
  for (i = 0; i < 2; i++) {
877
6.01k
    self->temp_shape_enable_ch_stp[i] = 0;
878
6.01k
    self->temp_shape_enable_ch_ges[i] = 0;
879
6.01k
  }
880
881
3.03k
  if (self->ldmps_config.bs_temp_shape_config != 0) {
882
2.31k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
883
2.31k
    if (bs_temp_shape_enable) {
884
1.21k
      num_of_temp_shape_ch = 2;
885
1.21k
      switch (self->ldmps_config.bs_temp_shape_config) {
886
147
        case 1:
887
441
          for (i = 0; i < num_of_temp_shape_ch; i++) {
888
294
            self->temp_shape_enable_ch_stp[i] =
889
294
                ixheaacd_read_bits_buf(it_bit_buff, 1);
890
294
          }
891
147
          break;
892
1.05k
        case 2:
893
3.15k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
894
2.10k
            self->temp_shape_enable_ch_ges[i] =
895
2.10k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
896
2.10k
          }
897
3.15k
          for (i = 0; i < num_of_temp_shape_ch; i++) {
898
2.10k
            if (self->temp_shape_enable_ch_ges[i]) {
899
848
              ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
900
848
                                       self->time_slots);
901
2.60k
              for (ts = 0; ts < self->time_slots; ts++) {
902
1.75k
                self->env_shape_data[i][ts] = (FLOAT32)pow(
903
1.75k
                    2, (FLOAT32)env_shape_data[ts] /
904
1.75k
                               (self->ldmps_config.bs_env_quant_mode + 2) -
905
1.75k
                           1);
906
1.75k
              }
907
848
            }
908
2.10k
          }
909
1.05k
          break;
910
19
        default:
911
19
          if (self->ec_flag == 0) {
912
19
          return IA_FATAL_ERROR;
913
19
      }
914
0
          break;
915
1.21k
      }
916
1.21k
    }
917
2.31k
  }
918
919
3.01k
  if (self->ldmps_config.bs_arbitrary_downmix != 0) {
920
8.30k
    for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
921
5.58k
      ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
922
5.58k
                                      CLD, 0);
923
5.58k
    }
924
2.72k
  }
925
926
3.01k
  ixheaacd_byte_align(it_bit_buff, &alignment);
927
928
14.9M
  while (it_bit_buff->cnt_bits > 8) {
929
14.9M
    ixheaacd_read_bits_buf(it_bit_buff, 8);
930
14.9M
  }
931
3.01k
  ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
932
3.01k
  return IA_NO_ERROR;
933
3.03k
}
934
935
static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
936
                                       WORD32 band_start, WORD32 band_stop,
937
56.6k
                                       WORD32 ch_fac) {
938
56.6k
  WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
939
56.6k
  WORD32 vdk[MAX_PARAMETER_BANDS + 1];
940
56.6k
  input_bands = band_stop - band_start;
941
56.6k
  out_bands = (input_bands - 1) / ch_fac + 1;
942
56.6k
  if (out_bands < 1) {
943
0
    out_bands = 1;
944
0
  }
945
946
56.6k
  bands_achived = out_bands * ch_fac;
947
56.6k
  bands_diff = input_bands - bands_achived;
948
471k
  for (i = 0; i < out_bands; i++) {
949
415k
    vdk[i] = ch_fac;
950
415k
  }
951
952
56.6k
  if (bands_diff > 0) {
953
0
    incr = -1;
954
0
    k = out_bands - 1;
955
56.6k
  } else {
956
56.6k
    incr = 1;
957
56.6k
    k = 0;
958
56.6k
  }
959
960
230k
  while (bands_diff != 0) {
961
173k
    vdk[k] = vdk[k] - incr;
962
173k
    k = k + incr;
963
173k
    bands_diff = bands_diff + incr;
964
173k
    if (k >= out_bands) {
965
152k
      if (bands_diff > 0) {
966
0
        k = out_bands - 1;
967
152k
      } else if (bands_diff < 0) {
968
141k
        k = 0;
969
141k
      }
970
152k
    }
971
173k
  }
972
56.6k
  map[0] = band_start;
973
471k
  for (i = 0; i < out_bands; i++) {
974
415k
    map[i + 1] = map[i] + vdk[i];
975
415k
  }
976
56.6k
}
977
978
static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
979
54.1k
                                      WORD32 data_bands) {
980
54.1k
  WORD32 i, j, band_start, band_stop, value;
981
54.1k
  WORD32 start_band_0 = map[0];
982
983
448k
  for (i = 0; i < data_bands; i++) {
984
394k
    value = in[i + start_band_0];
985
986
394k
    band_start = map[i];
987
394k
    band_stop = map[i + 1];
988
1.10M
    for (j = band_start; j < band_stop; j++) {
989
706k
      out[j] = value;
990
706k
    }
991
394k
  }
992
54.1k
}
993
994
4.47M
static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
995
4.47M
  switch (param_type) {
996
1.59M
    case CLD:
997
1.59M
      return ixheaacd_cld_de_quant_table[(value + 15)];
998
999
1.59M
    case ICC:
1000
1.59M
      return ixheaacd_icc_de_quant_table[value];
1001
1002
1.28M
    case IPD:
1003
1.28M
      return ixheaacd_ipd_de_quant_table[(value & 15)];
1004
1005
0
    default:
1006
0
      return 0;
1007
0
      return 0;
1008
4.47M
  }
1009
4.47M
}
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
305k
    WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) {
1017
305k
  WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
1018
305k
  WORD32 map[MAX_PARAMETER_BANDS + 1];
1019
1020
305k
  WORD32 set_index, i, band, parm_slot;
1021
305k
  WORD32 data_bands, ch_fac;
1022
305k
  WORD32 ps;
1023
1024
305k
  WORD32 i1, i2, x1, xi, x2;
1025
305k
  WORD32 band_start = 0;
1026
305k
  WORD32 ext_frame_flag = self->ext_frame_flag;
1027
305k
  WORD32 *param_slots = self->param_slots;
1028
305k
  WORD32 num_parameter_sets = self->num_parameter_sets;
1029
305k
  WORD32 band_stop = self->bs_param_bands;
1030
305k
  WORD32 default_val = 0;
1031
1032
305k
  set_index = 0;
1033
1034
670k
  for (i = 0; i < num_parameter_sets; i++) {
1035
365k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
1036
225k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1037
2.88M
      for (band = band_start; band < band_stop; band++) {
1038
2.66M
        out_idx_data[i][band] = default_val;
1039
2.66M
      }
1040
2.88M
      for (band = band_start; band < band_stop; band++) {
1041
2.66M
        idx_prev[band] = out_idx_data[i][band];
1042
2.66M
      }
1043
1044
225k
      frame_xxx_data->bs_quant_coarse_xxx_prev = 0;
1045
225k
    }
1046
1047
365k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 1) {
1048
605k
      for (band = band_start; band < band_stop; band++) {
1049
562k
        out_idx_data[i][band] = idx_prev[band];
1050
562k
      }
1051
43.0k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1052
43.0k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1053
43.0k
    }
1054
1055
365k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 2) {
1056
589k
      for (band = band_start; band < band_stop; band++) {
1057
547k
        out_idx_data[i][band] = idx_prev[band];
1058
547k
      }
1059
42.2k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1060
42.2k
          frame_xxx_data->bs_quant_coarse_xxx_prev;
1061
42.2k
      interpolate_local[i] = 1;
1062
322k
    } else {
1063
322k
      interpolate_local[i] = 0;
1064
322k
    }
1065
1066
365k
    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
1067
54.1k
      parm_slot = i;
1068
54.1k
      ch_fac =
1069
54.1k
          ixheaacd_mps_stride_table[frame_xxx_data
1070
54.1k
                                        ->bs_freq_res_stride_xxx[set_index]];
1071
54.1k
      data_bands = (band_stop - band_start - 1) / ch_fac + 1;
1072
54.1k
      ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac);
1073
54.1k
      ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0],
1074
54.1k
                                &out_idx_data[parm_slot][0], map, data_bands);
1075
1076
760k
      for (band = band_start; band < band_stop; band++) {
1077
706k
        idx_prev[band] = out_idx_data[parm_slot][band];
1078
706k
      }
1079
1080
54.1k
      frame_xxx_data->bs_quant_coarse_xxx_prev =
1081
54.1k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1082
54.1k
      frame_xxx_data->quant_coarse_xxx_flag[i] =
1083
54.1k
          frame_xxx_data->bs_quant_coarse_xxx[set_index];
1084
1085
54.1k
      set_index++;
1086
54.1k
    }
1087
365k
  }
1088
1089
670k
  for (i = 0; i < num_parameter_sets; i++) {
1090
365k
    if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) {
1091
40.5k
      ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start,
1092
40.5k
                               band_stop - band_start);
1093
40.5k
      frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1094
40.5k
    }
1095
365k
  }
1096
1097
305k
  i1 = -1;
1098
305k
  x1 = 0;
1099
305k
  i2 = 0;
1100
669k
  for (i = 0; i < num_parameter_sets; i++) {
1101
364k
    if (interpolate_local[i] != 1) {
1102
322k
      i1 = i;
1103
322k
    }
1104
364k
    i2 = i;
1105
407k
    while (interpolate_local[i2] == 1) {
1106
42.6k
      i2++;
1107
42.6k
    }
1108
364k
    if (i1 == -1) {
1109
38.3k
      x1 = 0;
1110
38.3k
      i1 = 0;
1111
326k
    } else {
1112
326k
      x1 = param_slots[i1];
1113
326k
    }
1114
364k
    xi = param_slots[i];
1115
364k
    x2 = param_slots[i2];
1116
1117
364k
    if (interpolate_local[i] == 1) {
1118
42.2k
      if (i2 < num_parameter_sets) {
1119
173
        if (self->ec_flag == 0) {
1120
173
          return IA_FATAL_ERROR;
1121
173
        }
1122
173
      }
1123
1124
586k
      for (band = band_start; band < band_stop; band++) {
1125
544k
        WORD32 yi, y1, y2;
1126
544k
        yi = 0;
1127
544k
        y1 = out_idx_data[i1][band];
1128
544k
        y2 = out_idx_data[i2][band];
1129
544k
        if (param_type == IPD) {
1130
135k
          if (y2 - y1 > 8) y1 += 16;
1131
135k
          if (y1 - y2 > 8) y2 += 16;
1132
1133
135k
          if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
1134
408k
        } else {
1135
408k
          if (x2 != x1) {
1136
38.9k
            yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1137
38.9k
          }
1138
408k
        }
1139
544k
        out_idx_data[i][band] = yi;
1140
544k
      }
1141
42.0k
    }
1142
364k
  }
1143
1144
669k
  for (ps = 0; ps < num_parameter_sets; ps++) {
1145
4.83M
    for (band = band_start; band < band_stop; band++) {
1146
4.47M
      if (param_type == CLD) {
1147
1.59M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
1148
2.87M
      } else if (param_type == ICC)
1149
1.59M
      {
1150
1.59M
        out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
1151
1.59M
      }
1152
4.47M
      out_data[ps][band] =
1153
4.47M
          ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type);
1154
4.47M
    }
1155
364k
  }
1156
1157
305k
  if (ext_frame_flag) {
1158
77.0k
    for (band = band_start; band < band_stop; band++) {
1159
69.2k
      out_data[num_parameter_sets][band] =
1160
69.2k
          out_data[num_parameter_sets - 1][band];
1161
69.2k
      out_idx_data[num_parameter_sets][band] =
1162
69.2k
          out_idx_data[num_parameter_sets - 1][band];
1163
69.2k
    }
1164
7.77k
  }
1165
305k
  return IA_NO_ERROR;
1166
305k
}
1167
1168
static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott(
1169
111k
    ia_mps_dec_state_struct *self) {
1170
111k
  ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame);
1171
111k
  IA_ERRORCODE err_code = 0;
1172
1173
111k
  err_code = ixheaacd_mps_mapindexdata(
1174
111k
      self, &cur_bit_stream_ptr->cld_data, self->cld_data,
1175
111k
      cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx,
1176
111k
      cur_bit_stream_ptr->cld_idx_pre, CLD);
1177
111k
  if (err_code != IA_NO_ERROR) return err_code;
1178
111k
  err_code = ixheaacd_mps_mapindexdata(
1179
111k
      self, &cur_bit_stream_ptr->icc_data, self->icc_data,
1180
111k
      cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx,
1181
111k
      cur_bit_stream_ptr->icc_idx_pre, ICC);
1182
111k
  if (err_code != IA_NO_ERROR) return err_code;
1183
111k
  if ((self->config->bs_phase_coding)) {
1184
82.7k
    err_code = ixheaacd_mps_mapindexdata(
1185
82.7k
        self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
1186
82.7k
        cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
1187
82.7k
        cur_bit_stream_ptr->ipd_idx_prev, IPD);
1188
1189
82.7k
    if (err_code != IA_NO_ERROR) return err_code;
1190
82.7k
  }
1191
111k
  return IA_NO_ERROR;
1192
111k
}
1193
1194
111k
static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) {
1195
111k
  WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
1196
111k
      group_to_band[MAX_PARAMETER_BANDS + 1];
1197
111k
  ia_mps_bs_frame *frame = &(self->bs_frame);
1198
243k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
1199
132k
    switch (frame->bs_smooth_mode[ps]) {
1200
116k
      case 0:
1201
116k
        self->smoothing_time[ps] = 256;
1202
116k
        self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
1203
1204
1.49M
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1205
1.37M
          self->smoothing_data[ps][pb] = 0;
1206
1.37M
        }
1207
116k
        break;
1208
1209
4.92k
      case 1:
1210
4.92k
        if (ps > 0) {
1211
1.77k
          self->smoothing_time[ps] = self->smoothing_time[ps - 1];
1212
1.77k
          self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1];
1213
3.14k
        } else {
1214
3.14k
          self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time;
1215
3.14k
          self->inv_smoothing_time[ps] =
1216
3.14k
              self->smoothing_filt_state.inv_prev_smg_time;
1217
3.14k
        }
1218
1219
62.1k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1220
57.2k
          if (ps > 0)
1221
25.9k
            self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb];
1222
31.2k
          else
1223
31.2k
            self->smoothing_data[ps][pb] =
1224
31.2k
                self->smoothing_filt_state.prev_smg_data[pb];
1225
57.2k
        }
1226
4.92k
        break;
1227
1228
8.46k
      case 2:
1229
8.46k
        self->smoothing_time[ps] =
1230
8.46k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1231
8.46k
        self->inv_smoothing_time[ps] =
1232
8.46k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1233
119k
        for (pb = 0; pb < self->bs_param_bands; pb++) {
1234
111k
          self->smoothing_data[ps][pb] = 1;
1235
111k
        }
1236
8.46k
        break;
1237
1238
2.56k
      case 3:
1239
2.56k
        self->smoothing_time[ps] =
1240
2.56k
            ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1241
2.56k
        self->inv_smoothing_time[ps] =
1242
2.56k
            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1243
1244
2.56k
        ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
1245
2.56k
        data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
1246
2.56k
        ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands,
1247
2.56k
                                   ch_fac);
1248
23.6k
        for (pg = 0; pg < data_bands; pg++) {
1249
21.0k
          param_band_start = group_to_band[pg];
1250
21.0k
          param_band_stop = group_to_band[pg + 1];
1251
65.3k
          for (pb = param_band_start; pb < param_band_stop; pb++) {
1252
44.2k
            self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg];
1253
44.2k
          }
1254
21.0k
        }
1255
2.56k
        break;
1256
132k
    }
1257
132k
  }
1258
1259
111k
  self->smoothing_filt_state.prev_smg_time =
1260
111k
      self->smoothing_time[self->num_parameter_sets - 1];
1261
111k
  self->smoothing_filt_state.inv_prev_smg_time =
1262
111k
      self->inv_smoothing_time[self->num_parameter_sets - 1];
1263
1.42M
  for (pb = 0; pb < self->bs_param_bands; pb++) {
1264
1.31M
    self->smoothing_filt_state.prev_smg_data[pb] =
1265
1.31M
        self->smoothing_data[self->num_parameter_sets - 1][pb];
1266
1.31M
  }
1267
1268
111k
  if (self->ext_frame_flag) {
1269
3.26k
    self->smoothing_time[self->num_parameter_sets] =
1270
3.26k
        self->smoothing_time[self->num_parameter_sets - 1];
1271
3.26k
    self->inv_smoothing_time[self->num_parameter_sets] =
1272
3.26k
        self->inv_smoothing_time[self->num_parameter_sets - 1];
1273
32.4k
    for (pb = 0; pb < self->bs_param_bands; pb++) {
1274
29.2k
      self->smoothing_data[self->num_parameter_sets][pb] =
1275
29.2k
          self->smoothing_data[self->num_parameter_sets - 1][pb];
1276
29.2k
    }
1277
3.26k
  }
1278
111k
}
1279
1280
111k
IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
1281
111k
  WORD32 i;
1282
111k
  IA_ERRORCODE err_code = 0;
1283
111k
  if (self->ldmps_config.ldmps_present_flag != 1)
1284
108k
    if (self->parse_nxt_frame == 1) return err_code;
1285
111k
  self->ext_frame_flag = 0;
1286
111k
  if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) {
1287
3.27k
    self->ext_frame_flag = 1;
1288
3.27k
  }
1289
1290
111k
  err_code = ixheaacd_mps_dec_and_mapframeott(self);
1291
111k
  if (err_code != IA_NO_ERROR) return err_code;
1292
111k
  ixheaacd_mps_dec_and_mapframesmg(self);
1293
1294
111k
  if (self->ext_frame_flag) {
1295
3.26k
    self->num_parameter_sets++;
1296
3.26k
    self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
1297
3.26k
  }
1298
111k
  self->param_slot_diff[0] = self->param_slots[0] + 1;
1299
111k
  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
111k
  self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0];
1307
111k
  self->inv_param_slot_diff_Q30[0] =
1308
111k
      (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
1309
135k
  for (i = 1; i < self->num_parameter_sets; i++) {
1310
24.4k
    self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
1311
24.4k
    if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) ||
1312
24.4k
        (self->param_slot_diff[i] == 0)) {
1313
2
      if (self->ec_flag == 0) {
1314
2
        return -1;
1315
2
      } else {
1316
0
        self->param_slot_diff[i] = 1;
1317
0
        self->inv_param_slot_diff[i] = 1;
1318
0
      }
1319
2
    }
1320
24.4k
    self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
1321
24.4k
    self->inv_param_slot_diff_Q30[i] =
1322
24.4k
        (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
1323
24.4k
  }
1324
111k
  return IA_NO_ERROR;
1325
111k
}
1326
1327
3.69k
WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
1328
3.69k
  WORD32 samp_freq;
1329
3.69k
  WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
1330
3.69k
                                24000, 22050, 16000, 12000, 11025, 8000,
1331
3.69k
                                7350,  0,     0,     0};
1332
1333
3.69k
  if (self->ldmps_config.ldmps_present_flag == 1)
1334
1.24k
    self->time_slots = self->frame_length + 1;
1335
2.45k
  else
1336
2.45k
    self->time_slots = self->frame_length;
1337
1338
3.69k
  self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
1339
1340
3.69k
  if (self->ldmps_config.ldmps_present_flag == 1) {
1341
1.24k
    if (self->ldmps_config.bs_sampling_freq_index == 15) {
1342
13
      samp_freq = self->ldmps_config.bs_fampling_frequency;
1343
1.23k
    } else {
1344
1.23k
      samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
1345
1.23k
    }
1346
1347
1.24k
    if (samp_freq < 27713.0) {
1348
716
      self->qmf_band_count = 32;
1349
716
    } else if (samp_freq >= 55426.0) {
1350
25
      self->qmf_band_count = 128;
1351
502
    } else {
1352
502
      self->qmf_band_count = 64;
1353
502
    }
1354
1.24k
  }
1355
1356
3.69k
  if (self->object_type == AOT_ER_AAC_ELD ||
1357
2.45k
      self->object_type == AOT_ER_AAC_LD) {
1358
1.24k
    self->bs_param_bands =
1359
1.24k
        ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
1360
1.24k
    self->hyb_band_count_max = self->qmf_band_count;
1361
1.24k
  } else
1362
2.45k
    self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
1363
1364
3.69k
  if (self->object_type == AOT_ER_AAC_ELD ||
1365
2.45k
      self->object_type == AOT_ER_AAC_LD) {
1366
1.24k
    switch (self->bs_param_bands) {
1367
45
      case 4:
1368
1369
45
        self->hyb_band_to_processing_band_table =
1370
45
            ixheaacd_hybrid_band_64_to_processing_band_4_map;
1371
45
        break;
1372
30
      case 5:
1373
1374
30
        self->hyb_band_to_processing_band_table =
1375
30
            ixheaacd_hybrid_band_64_to_processing_band_5_map;
1376
30
        break;
1377
80
      case 7:
1378
1379
80
        self->hyb_band_to_processing_band_table =
1380
80
            ixheaacd_hybrid_band_64_to_processing_band_7_map;
1381
80
        break;
1382
139
      case 9:
1383
1384
139
        self->hyb_band_to_processing_band_table =
1385
139
            ixheaacd_hybrid_band_64_to_processing_band_9_map;
1386
139
        break;
1387
97
      case 12:
1388
1389
97
        self->hyb_band_to_processing_band_table =
1390
97
            ixheaacd_hybrid_band_64_to_processing_band_12_map;
1391
97
        break;
1392
146
      case 15:
1393
1394
146
        self->hyb_band_to_processing_band_table =
1395
146
            ixheaacd_hybrid_band_64_to_processing_band_15_map;
1396
146
        break;
1397
700
      case 23:
1398
1399
700
        self->hyb_band_to_processing_band_table =
1400
700
            ixheaacd_hybrid_band_64_to_processing_band_23_map;
1401
700
        break;
1402
6
      default:
1403
6
        self->hyb_band_to_processing_band_table = NULL;
1404
6
        return -1;
1405
0
        break;
1406
1.24k
    }
1407
2.45k
  } else {
1408
2.45k
    switch (self->bs_param_bands) {
1409
825
      case 4:
1410
825
        self->hyb_band_to_processing_band_table =
1411
825
            ixheaacd_hybrid_band_71_to_processing_band_4_map;
1412
825
        break;
1413
370
      case 5:
1414
370
        self->hyb_band_to_processing_band_table =
1415
370
            ixheaacd_hybrid_band_71_to_processing_band_5_map;
1416
370
        break;
1417
352
      case 7:
1418
352
        self->hyb_band_to_processing_band_table =
1419
352
            ixheaacd_hybrid_band_71_to_processing_band_7_map;
1420
352
        break;
1421
267
      case 10:
1422
267
        self->hyb_band_to_processing_band_table =
1423
267
            ixheaacd_hybrid_band_71_to_processing_band_10_map;
1424
267
        break;
1425
223
      case 14:
1426
223
        self->hyb_band_to_processing_band_table =
1427
223
            ixheaacd_hybrid_band_71_to_processing_band_14_map;
1428
223
        break;
1429
87
      case 20:
1430
87
        self->hyb_band_to_processing_band_table =
1431
87
            ixheaacd_hybrid_band_71_to_processing_band_20_map;
1432
87
        break;
1433
328
      case 28:
1434
328
        self->hyb_band_to_processing_band_table =
1435
328
            ixheaacd_hybrid_band_71_to_processing_band_28_map;
1436
328
        break;
1437
1
      default:
1438
1
        self->hyb_band_to_processing_band_table = NULL;
1439
1
        return -1;
1440
0
        break;
1441
2.45k
    }
1442
2.45k
  }
1443
3.68k
  self->in_ch_count = 1;
1444
3.68k
  self->out_ch_count = 2;
1445
1446
3.68k
  self->input_gain =
1447
3.68k
      ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx];
1448
1449
3.68k
  if (self->config->bs_ott_bands_phase_present) {
1450
829
    self->num_bands_ipd = self->config->bs_ott_bands_phase;
1451
2.86k
  } else {
1452
2.86k
    if (!(self->object_type == AOT_ER_AAC_ELD ||
1453
1.62k
          self->object_type == AOT_ER_AAC_LD)) {
1454
1.62k
      switch (self->bs_param_bands) {
1455
588
        case 4:
1456
870
        case 5:
1457
870
          self->num_bands_ipd = 2;
1458
870
          break;
1459
286
        case 7:
1460
286
          self->num_bands_ipd = 3;
1461
286
          break;
1462
79
        case 10:
1463
79
          self->num_bands_ipd = 5;
1464
79
          break;
1465
204
        case 14:
1466
204
          self->num_bands_ipd = 7;
1467
204
          break;
1468
31
        case 20:
1469
184
        case 28:
1470
184
          self->num_bands_ipd = 10;
1471
184
          break;
1472
0
        default:
1473
0
          return -1;
1474
0
          break;
1475
1.62k
      }
1476
1.62k
    }
1477
2.86k
  }
1478
1479
3.68k
  if (self->residual_coding) {
1480
1.60k
    self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd);
1481
1.60k
    self->max_res_bands = 0;
1482
1.60k
    if (self->bs_residual_present) {
1483
1.60k
      self->res_bands = self->bs_residual_bands;
1484
1.60k
      if (self->res_bands > self->max_res_bands) {
1485
1.02k
        self->max_res_bands = self->res_bands;
1486
1.02k
      }
1487
1.60k
    } else {
1488
0
      self->res_bands = 0;
1489
0
    }
1490
1.60k
  }
1491
1492
3.68k
  if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1;
1493
1494
3.68k
  self->dir_sig_count = 1;
1495
3.68k
  self->decor_sig_count = 1;
1496
1497
3.68k
  self->bs_high_rate_mode = self->config->bs_high_rate_mode;
1498
3.68k
  self->pre_mix_req = 1;
1499
1500
3.68k
  return 0;
1501
3.68k
}