Coverage Report

Created: 2025-12-10 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_mps_bitdec.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2023 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 <string.h>
21
#include "ixheaac_type_def.h"
22
#include "ixheaacd_mps_struct_def.h"
23
#include "ixheaacd_error_codes.h"
24
#include "ixheaacd_bitbuffer.h"
25
#include "ixheaacd_mps_res_rom.h"
26
#include "ixheaacd_mps_aac_struct.h"
27
#include "ixheaacd_mps_res_channel.h"
28
#include "ixheaac_constants.h"
29
#include "ixheaacd_cnst.h"
30
#include "ixheaacd_common_rom.h"
31
#include "ixheaacd_sbrdecsettings.h"
32
#include "ixheaacd_sbr_scale.h"
33
#include "ixheaacd_env_extr_part.h"
34
#include "ixheaacd_sbr_rom.h"
35
#include "ixheaacd_hybrid.h"
36
#include "ixheaacd_ps_dec.h"
37
#include "ixheaacd_mps_polyphase.h"
38
#include "ixheaac_error_standards.h"
39
#include "ixheaacd_config.h"
40
#include "ixheaacd_qmf_dec.h"
41
#include "ixheaacd_mps_dec.h"
42
#include "ixheaacd_mps_interface.h"
43
#include "ixheaacd_mps_macro_def.h"
44
#include "ixheaacd_mps_nlc_dec.h"
45
#include "ixheaacd_mps_bitdec.h"
46
#include "ixheaacd_mps_res_tns.h"
47
#include "ixheaacd_mps_mdct_2_qmf.h"
48
#include "ixheaac_sbr_const.h"
49
50
static const WORD32 ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4};
51
52
2.56M
static WORD32 ixheaacd_bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
53
2.56M
  var = min(var, upper_bound);
54
2.56M
  var = max(var, lower_bound);
55
2.56M
  return var;
56
2.56M
}
57
58
static VOID ixheaacd_mps_check_index_bounds(
59
    WORD32 output_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
60
    WORD32 num_parameter_sets, WORD32 start_band, WORD32 stop_band,
61
90.0k
    WORD32 param_type, WORD32 xtt_idx) {
62
90.0k
  WORD32 i, band;
63
264k
  for (i = 0; i < num_parameter_sets; i++) {
64
2.83M
    for (band = start_band; band < stop_band; band++) {
65
2.66M
      if (param_type == CLD) {
66
1.43M
        output_idx_data[xtt_idx][i][band] =
67
1.43M
          ixheaacd_bound_check(output_idx_data[xtt_idx][i][band], -15, 15);
68
1.43M
      } else if (param_type == ICC) {
69
1.12M
        output_idx_data[xtt_idx][i][band] =
70
1.12M
        ixheaacd_bound_check(output_idx_data[xtt_idx][i][band], 0, 7);
71
1.12M
      }
72
2.66M
    }
73
174k
  }
74
90.0k
}
75
76
static IA_ERRORCODE ixheaacd_parse_extension_config(
77
    ia_mps_spatial_bs_config_struct *config, WORD32 num_ott_boxes, WORD32 num_ttt_boxes,
78
    WORD32 num_out_chan, WORD32 bits_available, ia_bit_buf_struct *it_bit_buff,
79
5.33k
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
80
5.33k
  WORD32 i, ch, idx, tmp, tmp_open, sac_ext_len, bits_read, n_fill_bits, temp;
81
5.33k
  WORD32 ba = bits_available;
82
83
5.33k
  config->sac_ext_cnt = 0;
84
85
6.63k
  while (ba >= 8) {
86
1.34k
    ba -= 8;
87
1.34k
    temp = ixheaacd_read_bits_buf(it_bit_buff, 8);
88
1.34k
    config->bs_sac_ext_type[config->sac_ext_cnt] = (temp >> 4) & FOUR_BIT_MASK;
89
1.34k
    sac_ext_len = temp & FOUR_BIT_MASK;
90
1.34k
    if (sac_ext_len == 15) {
91
11
      sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 8);
92
11
      ba -= 8;
93
11
      if (sac_ext_len == 15 + 255) {
94
4
        sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 16);
95
4
        ba -= 16;
96
4
      }
97
11
    }
98
99
1.34k
    tmp = (WORD32)(((it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base + 1) << 3) -
100
1.34k
                   (it_bit_buff->bit_pos + 1));
101
102
1.34k
    switch (config->bs_sac_ext_type[config->sac_ext_cnt]) {
103
913
      case EXT_TYPE_0:
104
913
        config->bs_residual_coding = 1;
105
913
        temp = ixheaacd_read_bits_buf(it_bit_buff, 6);
106
913
        config->bs_residual_sampling_freq_index = (temp >> 2) & FOUR_BIT_MASK;
107
913
        if (config->bs_residual_sampling_freq_index > MAX_RES_SAMP_FREQ_IDX) {
108
3
          return IA_FATAL_ERROR;
109
3
        }
110
910
        config->bs_residual_frames_per_spatial_frame = temp & TWO_BIT_MASK;
111
112
4.72k
        for (i = 0; i < num_ott_boxes + num_ttt_boxes; i++) {
113
3.82k
          config->bs_residual_present[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
114
3.82k
          if (config->bs_residual_present[i]) {
115
1.17k
            config->bs_residual_bands[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
116
1.17k
            if (config->bs_residual_bands[i] > MAX_PARAMETER_BANDS)
117
5
            {
118
5
              return IA_FATAL_ERROR;
119
5
            }
120
1.17k
          }
121
3.82k
        }
122
905
        break;
123
124
905
      case EXT_TYPE_1:
125
353
        config->bs_arbitrary_downmix = 2;
126
127
353
        temp = ixheaacd_read_bits_buf(it_bit_buff, 11);
128
353
        config->bs_arbitrary_downmix_residual_sampling_freq_index = (temp >> 7) & FOUR_BIT_MASK;
129
353
        if (config->bs_arbitrary_downmix_residual_sampling_freq_index > MAX_RES_SAMP_FREQ_IDX) {
130
2
          return IA_FATAL_ERROR;
131
2
        }
132
351
        config->bs_arbitrary_downmix_residual_frames_per_spatial_frame =
133
351
            (temp >> 5) & TWO_BIT_MASK;
134
351
        config->bs_arbitrary_downmix_residual_bands = temp & FIVE_BIT_MASK;
135
351
        if (config->bs_arbitrary_downmix_residual_bands >=
136
351
            ixheaacd_freq_res_table[config->bs_freq_res]) {
137
3
          return IA_FATAL_ERROR;
138
3
        }
139
140
348
        break;
141
142
348
      case EXT_TYPE_2:
143
71
        config->arbitrary_tree = 1;
144
71
        config->num_out_chan_at = 0;
145
71
        config->num_ott_boxes_at = 0;
146
471
        for (ch = 0; ch < num_out_chan; ch++) {
147
415
          tmp_open = 1;
148
415
          idx = 0;
149
1.09k
          while (tmp_open > 0) {
150
690
            config->bs_ott_box_present_at[ch][idx] = ixheaacd_read_bits_buf(it_bit_buff, 1);
151
690
            if (config->bs_ott_box_present_at[ch][idx]) {
152
156
              config->num_ott_boxes_at++;
153
156
              tmp_open++;
154
534
            } else {
155
534
              config->num_out_chan_at++;
156
534
              tmp_open--;
157
534
            }
158
690
            if (config->num_ott_boxes_at >= 56) return IA_FATAL_ERROR;
159
690
            if (config->num_out_chan_at > MAX_OUTPUT_CHANNELS_AT_MPS) return IA_FATAL_ERROR;
160
683
            idx++;
161
683
            if (idx >= MAX_ARBITRARY_TREE_INDEX) return IA_FATAL_ERROR;
162
683
          }
163
415
        }
164
165
132
        for (i = 0; i < config->num_ott_boxes_at; i++) {
166
77
          temp = ixheaacd_read_bits_buf(it_bit_buff, 2);
167
77
          config->bs_ott_default_cld_at[i] = (temp >> 1) & ONE_BIT_MASK;
168
77
          config->bs_ott_mode_lfe_at[i] = temp & ONE_BIT_MASK;
169
77
          if (config->bs_ott_mode_lfe_at[i]) {
170
18
            config->bs_ott_bands_at[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
171
18
            if (config->bs_ott_bands_at[i] > MAX_PARAMETER_BANDS) return IA_FATAL_ERROR;
172
59
          } else {
173
59
            config->bs_ott_bands_at[i] =
174
59
                ixheaacd_mps_dec_bitdec_tables->freq_res_table[config->bs_freq_res];
175
59
          }
176
77
        }
177
178
464
        for (i = 0; i < config->num_out_chan_at; i++) {
179
409
          config->bs_output_channel_pos_at[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
180
409
        }
181
182
55
        break;
183
184
4
      default:
185
4
        return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_EXTENSION_TYPE;
186
1.34k
    }
187
188
1.30k
    bits_read = (WORD32)(((it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base + 1) << 3) -
189
1.30k
                         (it_bit_buff->bit_pos + 1) - tmp);
190
1.30k
    n_fill_bits = 8 * sac_ext_len - bits_read;
191
192
4.45k
    while (n_fill_bits > 7) {
193
3.15k
      ixheaacd_read_bits_buf(it_bit_buff, 8);
194
3.15k
      n_fill_bits -= 8;
195
3.15k
    }
196
1.30k
    if (n_fill_bits > 0) {
197
551
      ixheaacd_read_bits_buf(it_bit_buff, n_fill_bits);
198
551
    }
199
200
1.30k
    ba -= 8 * sac_ext_len;
201
1.30k
    config->sac_ext_cnt++;
202
1.30k
    if (config->sac_ext_cnt >= MAX_NUM_EXT_TYPES) {
203
2
      return IA_FATAL_ERROR;
204
2
    }
205
1.30k
  }
206
207
5.28k
  return IA_NO_ERROR;
208
5.33k
}
209
210
IA_ERRORCODE ixheaacd_parse_specific_config(ia_heaac_mps_state_struct *pstr_mps_state,
211
5.37k
                                            WORD32 sac_header_len) {
212
5.37k
  IA_ERRORCODE err_code = IA_NO_ERROR;
213
5.37k
  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
214
5.37k
  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
215
5.37k
  const ia_mps_dec_tree_properties_struct *p_tree_property_table =
216
5.37k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->tree_property_table;
217
5.37k
  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
218
219
5.37k
  WORD32 i, hc, hb, num_header_bits, ott_mode_lfe[MAX_NUM_OTT];
220
221
5.37k
  WORD32 tmp = (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
222
5.37k
                        (mps_bit_buf->bit_pos + 1));
223
5.37k
  WORD32 bits_available = (sac_header_len << 3);
224
5.37k
  WORD32 temp, alignment_bits = 0;
225
226
5.37k
  config->bs_sampling_freq_index = ixheaacd_read_bits_buf(mps_bit_buf, 4);
227
5.37k
  if (config->bs_sampling_freq_index == 15) {
228
23
    config->bs_sampling_frequency = ixheaacd_read_bits_buf(mps_bit_buf, 24);
229
23
  }
230
5.37k
  temp = ixheaacd_read_bits_buf(mps_bit_buf, 14);
231
5.37k
  config->bs_frame_length = (temp >> 7) & SEVEN_BIT_MASK;
232
5.37k
  if (config->bs_frame_length >= (MAX_QMF_BUF_LEN - 1)) {
233
1
    return IA_FATAL_ERROR;
234
1
  }
235
5.37k
  config->bs_freq_res = (temp >> 4) & THREE_BIT_MASK;
236
5.37k
  if (config->bs_freq_res == 0) {
237
2
    return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_BANDS;
238
2
  }
239
5.36k
  config->bs_tree_config = (temp)&FOUR_BIT_MASK;
240
241
5.36k
  if (config->bs_tree_config >= 7) {
242
1
    return IA_FATAL_ERROR;
243
1
  }
244
245
5.36k
  if (config->bs_tree_config != 15) {
246
5.36k
    curr_state->num_ott_boxes = p_tree_property_table[config->bs_tree_config].num_ott_boxes;
247
5.36k
    curr_state->num_ttt_boxes = p_tree_property_table[config->bs_tree_config].num_ttt_boxes;
248
5.36k
    curr_state->num_input_channels =
249
5.36k
        p_tree_property_table[config->bs_tree_config].num_input_channels;
250
5.36k
    curr_state->num_output_channels =
251
5.36k
        p_tree_property_table[config->bs_tree_config].num_output_channels;
252
32.1k
    for (i = 0; i < MAX_NUM_OTT; i++) {
253
26.8k
      ott_mode_lfe[i] = p_tree_property_table[config->bs_tree_config].ott_mode_lfe[i];
254
26.8k
    }
255
5.36k
  }
256
5.36k
  temp = ixheaacd_read_bits_buf(mps_bit_buf, 19);
257
5.36k
  config->bs_quant_mode = (temp >> 17) & TWO_BIT_MASK;
258
5.36k
  config->bs_one_icc = (temp >> 16) & ONE_BIT_MASK;
259
5.36k
  config->bs_arbitrary_downmix = (temp >> 15) & ONE_BIT_MASK;
260
5.36k
  config->bs_fixed_gain_sur = (temp >> 12) & THREE_BIT_MASK;
261
5.36k
  if (config->bs_fixed_gain_sur >= 5) {
262
1
    return IA_FATAL_ERROR;
263
1
  }
264
5.36k
  config->bs_fixed_gain_lfe = (temp >> 9) & THREE_BIT_MASK;
265
266
5.36k
  if (config->bs_fixed_gain_lfe >= 5) return IA_FATAL_ERROR;
267
5.36k
  config->bs_fixed_gain_dmx = (temp >> 6) & THREE_BIT_MASK;
268
5.36k
  config->bs_matrix_mode = (temp >> 5) & ONE_BIT_MASK;
269
5.36k
  config->bs_temp_shape_config = (temp >> 3) & TWO_BIT_MASK;
270
5.36k
  if (config->bs_temp_shape_config == 3)
271
1
    return IA_FATAL_ERROR;
272
273
5.36k
  config->bs_decorr_config = (temp >> 1) & TWO_BIT_MASK;
274
5.36k
  config->bs_3d_audio_mode = (temp)&ONE_BIT_MASK;
275
276
23.0k
  for (i = 0; i < curr_state->num_ott_boxes; i++) {
277
17.6k
    if (ott_mode_lfe[i]) {
278
3.40k
      config->bs_ott_bands[i] = ixheaacd_read_bits_buf(mps_bit_buf, 5);
279
3.40k
      if (config->bs_ott_bands[i] > MAX_PARAMETER_BANDS) return IA_FATAL_ERROR;
280
3.40k
    }
281
17.6k
  }
282
283
7.70k
  for (i = 0; i < curr_state->num_ttt_boxes; i++) {
284
2.34k
    temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
285
2.34k
    config->bs_ttt_dual_mode[i] = (temp >> 3) & ONE_BIT_MASK;
286
2.34k
    config->bs_ttt_mode_low[i] = (temp)&THREE_BIT_MASK;
287
2.34k
    if (config->bs_ttt_dual_mode[i]) {
288
1.67k
      temp = ixheaacd_read_bits_buf(mps_bit_buf, 8);
289
1.67k
      config->bs_ttt_mode_high[i] = (temp >> 5) & THREE_BIT_MASK;
290
1.67k
      config->bs_ttt_bands_low[i] = (temp)&FIVE_BIT_MASK;
291
1.67k
      if (config->bs_ttt_bands_low[i] > MAX_PARAMETER_BANDS) return IA_FATAL_ERROR;
292
1.67k
    }
293
2.34k
  }
294
295
5.36k
  if (config->bs_temp_shape_config == 2) {
296
1.79k
    config->bs_env_quant_mode = ixheaacd_read_bits_buf(mps_bit_buf, 1);
297
1.79k
  }
298
299
5.36k
  if (config->bs_3d_audio_mode) {
300
37
    config->bs_3d_audio_hrtf_set = ixheaacd_read_bits_buf(mps_bit_buf, 2);
301
37
    if (config->bs_3d_audio_hrtf_set == 0) {
302
31
      temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
303
31
      config->bs_hrtf_freq_res = (temp >> 1) & THREE_BIT_MASK;
304
31
      config->bs_hrtf_num_chan = 5;
305
31
      config->bs_hrtf_asymmetric = (temp)&ONE_BIT_MASK;
306
307
31
      config->hrtf_num_band = pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr
308
31
                                  ->freq_res_table[config->bs_hrtf_freq_res];
309
310
115
      for (hc = 0; hc < config->bs_hrtf_num_chan; hc++) {
311
687
        for (hb = 0; hb < config->hrtf_num_band; hb++) {
312
603
          config->bs_hrtf_level_left[hc][hb] = ixheaacd_read_bits_buf(mps_bit_buf, 6);
313
603
        }
314
586
        for (hb = 0; hb < config->hrtf_num_band; hb++) {
315
502
          config->bs_hrtf_level_right[hc][hb] = config->bs_hrtf_asymmetric
316
502
                                                    ? ixheaacd_read_bits_buf(mps_bit_buf, 6)
317
502
                                                    : config->bs_hrtf_level_left[hc][hb];
318
502
        }
319
84
        config->bs_hrtf_phase[hc] = ixheaacd_read_bits_buf(mps_bit_buf, 1);
320
484
        for (hb = 0; hb < config->hrtf_num_band; hb++) {
321
400
          config->bs_hrtf_phase_lr[hc][hb] =
322
400
              config->bs_hrtf_phase[hc] ? ixheaacd_read_bits_buf(mps_bit_buf, 6) : 0;
323
400
        }
324
84
      }
325
31
    }
326
37
  }
327
328
5.36k
  ixheaacd_byte_align(mps_bit_buf, &alignment_bits);
329
330
5.36k
  num_header_bits =
331
5.36k
      (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
332
5.36k
               (mps_bit_buf->bit_pos + 1) - tmp);
333
5.36k
  bits_available -= num_header_bits;
334
335
5.36k
  err_code = ixheaacd_parse_extension_config(
336
5.36k
      config, curr_state->num_ott_boxes, curr_state->num_ttt_boxes,
337
5.36k
      curr_state->num_output_channels, bits_available, mps_bit_buf,
338
5.36k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
339
5.36k
  if (err_code != IA_NO_ERROR) return err_code;
340
341
5.32k
  return IA_NO_ERROR;
342
5.36k
}
343
344
IA_ERRORCODE ixheaacd_default_specific_config(ia_heaac_mps_state_struct *pstr_mps_state,
345
0
                                              WORD32 sampling_freq) {
346
0
  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
347
0
  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
348
0
  const ia_mps_dec_tree_properties_struct *p_tree_property_table =
349
0
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->tree_property_table;
350
0
  WORD32 i, ott_mode_lfe[MAX_NUM_OTT];
351
352
0
  config->bs_sampling_freq_index = 15;
353
0
  for (i = 0; i < 15; i++) {
354
0
    if (sampling_freq ==
355
0
        pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->sampling_freq_table[i]) {
356
0
      config->bs_sampling_freq_index = i;
357
0
    }
358
0
  }
359
0
  if (config->bs_sampling_freq_index == 15) {
360
0
    config->bs_sampling_frequency = sampling_freq;
361
0
  }
362
0
  config->bs_frame_length = 31;
363
0
  config->bs_freq_res = 1;
364
0
  config->bs_tree_config = 2;
365
0
  if (config->bs_tree_config > 5) return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
366
0
  if (config->bs_tree_config != 15) {
367
0
    curr_state->num_ott_boxes = p_tree_property_table[config->bs_tree_config].num_ott_boxes;
368
0
    curr_state->num_ttt_boxes = p_tree_property_table[config->bs_tree_config].num_ttt_boxes;
369
0
    curr_state->num_input_channels =
370
0
        p_tree_property_table[config->bs_tree_config].num_input_channels;
371
0
    curr_state->num_output_channels =
372
0
        p_tree_property_table[config->bs_tree_config].num_output_channels;
373
0
    memcpy(ott_mode_lfe, p_tree_property_table[config->bs_tree_config].ott_mode_lfe,
374
0
           MAX_NUM_OTT * sizeof(ott_mode_lfe[0]));
375
0
  }
376
0
  config->bs_quant_mode = 0;
377
0
  config->bs_one_icc = 0;
378
0
  config->bs_arbitrary_downmix = 0;
379
0
  config->bs_residual_coding = 0;
380
0
  config->bs_smooth_config = 0;
381
0
  config->bs_fixed_gain_sur = 2;
382
0
  config->bs_fixed_gain_lfe = 1;
383
0
  config->bs_fixed_gain_dmx = 0;
384
0
  config->bs_matrix_mode = 1;
385
0
  config->bs_temp_shape_config = 0;
386
0
  config->bs_decorr_config = 0;
387
0
  if (config->bs_tree_config == 15) {
388
0
    return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
389
0
  }
390
0
  for (i = 0; i < curr_state->num_ott_boxes; i++) {
391
0
    if (ott_mode_lfe[i]) {
392
0
      config->bs_ott_bands[i] = 28;
393
0
    }
394
0
  }
395
0
  for (i = 0; i < curr_state->num_ttt_boxes; i++) {
396
0
    config->bs_ttt_dual_mode[i] = 0;
397
0
    config->bs_ttt_mode_low[i] = 1;
398
0
    if (config->bs_ttt_dual_mode[i]) {
399
0
      config->bs_ttt_mode_high[i] = 1;
400
0
      config->bs_ttt_bands_low[i] = 28;
401
0
    }
402
0
  }
403
0
  return IA_NO_ERROR;
404
0
}
405
406
static VOID ixheaacd_coarse_2_fine(WORD32 *data, WORD32 data_type, WORD32 start_band,
407
11.1k
                                   WORD32 num_bands) {
408
11.1k
  WORD32 i;
409
410
135k
  for (i = start_band; i < start_band + num_bands; i++) {
411
124k
    data[i] <<= 1;
412
124k
  }
413
414
11.1k
  if (data_type == CLD) {
415
76.7k
    for (i = start_band; i < start_band + num_bands; i++) {
416
69.6k
      if (data[i] == -14)
417
10.7k
        data[i] = -15;
418
58.9k
      else if (data[i] == 14)
419
13.2k
        data[i] = 15;
420
69.6k
    }
421
7.04k
  }
422
11.1k
}
423
424
8.44k
static VOID ixheaacd_fine_2_coarse(WORD32 *data, WORD32 start_band, WORD32 num_bands) {
425
8.44k
  WORD32 i;
426
427
119k
  for (i = start_band; i < start_band + num_bands; i++) {
428
111k
    data[i] >>= 1;
429
111k
  }
430
8.44k
}
431
432
static WORD32 ixheaacd_get_stride_map(
433
    WORD32 freq_res_stride, WORD32 start_band, WORD32 stop_band, WORD32 *a_strides,
434
27.6k
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
435
27.6k
  WORD32 i, pb, pb_stride, data_bands, str_offset;
436
437
27.6k
  pb_stride = ixheaacd_mps_dec_bitdec_tables->pb_stride_table[freq_res_stride];
438
27.6k
  data_bands = (stop_band - start_band - 1) / pb_stride + 1;
439
440
27.6k
  a_strides[0] = start_band;
441
176k
  for (pb = 1; pb <= data_bands; pb++) {
442
148k
    a_strides[pb] = a_strides[pb - 1] + pb_stride;
443
148k
  }
444
27.6k
  str_offset = 0;
445
176k
  while (a_strides[data_bands] > stop_band) {
446
148k
    if (str_offset < data_bands) str_offset++;
447
306k
    for (i = str_offset; i <= data_bands; i++) {
448
157k
      a_strides[i]--;
449
157k
    }
450
148k
  }
451
452
27.6k
  return data_bands;
453
27.6k
}
454
455
static IA_ERRORCODE ixheaacd_ec_data_dec(ia_heaac_mps_state_struct *pstr_mps_state,
456
                                         ia_mps_dec_lossless_data_struct *ll_data,
457
                                         WORD32 data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
458
                                         WORD32 lastdata[][MAX_PARAMETER_BANDS], WORD32 datatype,
459
                                         WORD32 box_idx, WORD32 param_idx, WORD32 start_band,
460
92.6k
                                         WORD32 stop_band) {
461
92.6k
  IA_ERRORCODE error_code = IA_NO_ERROR;
462
92.6k
  WORD32 i, pb, data_sets, set_idx, bs_data_pair, data_bands, old_quant_coarse_xxx, temp;
463
92.6k
  WORD32 a_strides[MAX_PARAMETER_BANDS + 1] = {0};
464
465
92.6k
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
466
92.6k
  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
467
468
92.6k
  data_sets = 0;
469
275k
  for (i = 0; i < pstr_mps_state->num_parameter_sets; i++) {
470
182k
    ll_data->bs_xxx_data_mode[param_idx][i] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
471
182k
    if (ll_data->bs_xxx_data_mode[param_idx][i] == 3) {
472
34.3k
      data_sets++;
473
34.3k
    }
474
182k
  }
475
92.6k
  set_idx = 0;
476
92.6k
  old_quant_coarse_xxx = ll_data->bs_quant_coarse_xxx_prev[param_idx];
477
478
120k
  while (set_idx < data_sets) {
479
27.6k
    temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
480
27.6k
    bs_data_pair = (temp >> 3) & ONE_BIT_MASK;
481
27.6k
    ll_data->bs_quant_coarse_xxx[param_idx][set_idx] = (temp >> 2) & ONE_BIT_MASK;
482
27.6k
    ll_data->bs_freq_res_stride_xxx[param_idx][set_idx] = temp & TWO_BIT_MASK;
483
484
27.6k
    if (set_idx == 7 && bs_data_pair == 1) {
485
7
      if (pstr_mps_state->ec_flag) {
486
0
        bs_data_pair = 0;
487
7
      } else {
488
7
        return IA_FATAL_ERROR;
489
7
      }
490
7
    }
491
492
27.6k
    if (ll_data->bs_quant_coarse_xxx[param_idx][set_idx] != old_quant_coarse_xxx) {
493
9.96k
      if (old_quant_coarse_xxx) {
494
1.52k
        ixheaacd_coarse_2_fine(lastdata[box_idx], datatype, start_band, stop_band - start_band);
495
8.44k
      } else {
496
8.44k
        ixheaacd_fine_2_coarse(lastdata[box_idx], start_band, stop_band - start_band);
497
8.44k
      }
498
9.96k
    }
499
500
27.6k
    data_bands = ixheaacd_get_stride_map(ll_data->bs_freq_res_stride_xxx[param_idx][set_idx],
501
27.6k
                                         start_band, stop_band, a_strides,
502
27.6k
                                         pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
503
504
176k
    for (pb = 0; pb < data_bands; pb++) {
505
148k
      lastdata[box_idx][start_band + pb] = lastdata[box_idx][a_strides[pb]];
506
148k
    }
507
508
27.6k
    error_code = ixheaacd_mps_ecdatapairdec(
509
27.6k
        mps_bit_buf, data[box_idx], lastdata[box_idx], datatype, set_idx, start_band, data_bands,
510
27.6k
        bs_data_pair, ll_data->bs_quant_coarse_xxx[param_idx][set_idx],
511
27.6k
        (!frame->bs_independency_flag || (set_idx > 0)), 0, 1, pstr_mps_state->ec_flag);
512
27.6k
    if (error_code != IA_NO_ERROR) return error_code;
513
514
27.6k
    if (datatype == CLD) {
515
20.2k
      WORD32 band;
516
96.2k
      for (i = 0; i < pstr_mps_state->num_parameter_sets; i++) {
517
1.13M
        for (band = start_band; band < stop_band; band++) {
518
1.05M
          if (data[box_idx][i][band] > 15 || data[box_idx][i][band] < -15) {
519
109
            return IA_FATAL_ERROR;
520
109
          }
521
1.05M
        }
522
76.0k
      }
523
20.2k
    } else if (datatype == ICC) {
524
5.11k
      WORD32 band;
525
29.2k
      for (i = 0; i < pstr_mps_state->num_parameter_sets; i++) {
526
356k
        for (band = start_band; band < stop_band; band++) {
527
332k
          if (data[box_idx][i][band] > 7 || data[box_idx][i][band] < 0) {
528
74
            return IA_FATAL_ERROR;
529
74
          }
530
332k
        }
531
24.2k
      }
532
5.11k
    }
533
534
172k
    for (pb = 0; pb < data_bands; pb++) {
535
562k
      for (i = a_strides[pb]; i < a_strides[pb + 1]; i++) {
536
417k
        lastdata[box_idx][i] = data[box_idx][set_idx + bs_data_pair][start_band + pb];
537
417k
      }
538
144k
    }
539
540
27.4k
    old_quant_coarse_xxx = ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
541
542
27.4k
    if (bs_data_pair) {
543
15.7k
      ll_data->bs_quant_coarse_xxx[param_idx][set_idx + 1] =
544
15.7k
          ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
545
15.7k
      ll_data->bs_freq_res_stride_xxx[param_idx][set_idx + 1] =
546
15.7k
          ll_data->bs_freq_res_stride_xxx[param_idx][set_idx];
547
15.7k
    }
548
27.4k
    set_idx += bs_data_pair + 1;
549
27.4k
  }
550
92.4k
  return error_code;
551
92.6k
}
552
553
static IA_ERRORCODE ixheaacd_parse_arbitrary_downmix_data(
554
1.77k
    ia_heaac_mps_state_struct *pstr_mps_state) {
555
1.77k
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
556
1.77k
  IA_ERRORCODE error_code = IA_NO_ERROR;
557
1.77k
  WORD32 offset = pstr_mps_state->num_ott_boxes + 4 * pstr_mps_state->num_ttt_boxes;
558
1.77k
  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
559
1.77k
  WORD32 bitstream_parameter_bands = pstr_mps_state->bitstream_parameter_bands;
560
1.77k
  WORD32 ch;
561
562
4.40k
  for (ch = 0; ch < num_input_channels; ch++) {
563
2.68k
    error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
564
2.68k
                                      frame->cmp_arbdmx_gain_idx, frame->cmp_arbdmx_gain_idx_prev,
565
2.68k
                                      CLD, ch, offset + ch, 0, bitstream_parameter_bands);
566
2.68k
    if (error_code != IA_NO_ERROR) return error_code;
567
2.68k
  }
568
1.71k
  return error_code;
569
1.77k
}
570
571
6.66k
static WORD32 ixheaacd_decode_icc_diff_code(ia_bit_buf_struct *it_bit_buff) {
572
6.66k
  WORD32 value = 0;
573
6.66k
  WORD32 count = 0;
574
15.4k
  while ((ixheaacd_read_bits_buf(it_bit_buff, 1) == 0) && (count++ < 7)) {
575
8.79k
    value++;
576
8.79k
  }
577
578
6.66k
  return value;
579
6.66k
}
580
581
833
static IA_ERRORCODE ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_state) {
582
833
  WORD32 ich, ch;
583
833
  WORD32 rfpsf;
584
833
  WORD32 ps;
585
833
  WORD32 pb;
586
587
833
  ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr =
588
833
      pstr_mps_state->ia_mps_dec_mps_table.aac_tab;
589
833
  WORD32 i;
590
591
833
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
592
833
  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
593
594
833
  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
595
833
  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
596
833
  WORD32 residual_frames_per_spatial_frame = pstr_mps_state->residual_frames_per_spatial_frame;
597
833
  WORD32 upd_qmf = pstr_mps_state->upd_qmf;
598
599
833
  WORD32 loop_counter = num_ott_boxes + pstr_mps_state->num_ttt_boxes;
600
833
  WORD32 *p_mdct_res;
601
602
833
  WORD32 *p_res_mdct = pstr_mps_state->array_struct->res_mdct;
603
833
  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
604
833
  WORD16 error_code = IA_NO_ERROR;
605
606
3.92k
  for (ich = 0; ich < loop_counter; ich++) {
607
3.18k
    ch = ich;
608
609
3.18k
    p_mdct_res = p_res_mdct;
610
3.18k
    if (config->bs_residual_bands[ch] > 0) {
611
948
      if (ch < num_ott_boxes) {
612
3.32k
        for (ps = 0; ps < num_parameter_sets; ps++) {
613
2.44k
          frame->res_data.bs_icc_diff_present[ch][ps] = ixheaacd_read_bits_buf(mps_bit_buf, 1);
614
2.44k
          if (frame->res_data.bs_icc_diff_present[ch][ps]) {
615
7.14k
            for (pb = 0; pb < config->bs_residual_bands[ch]; pb++) {
616
6.66k
              frame->res_data.bs_icc_diff[ch][ps][pb] =
617
6.66k
                  ixheaacd_decode_icc_diff_code(mps_bit_buf);
618
6.66k
              frame->ott_icc_diff_idx[ch][ps][pb] = frame->res_data.bs_icc_diff[ch][ps][pb];
619
6.66k
            }
620
477
          }
621
2.44k
        }
622
884
      }
623
948
      p_mdct_res = p_res_mdct;
624
1.83k
      for (rfpsf = 0; rfpsf < residual_frames_per_spatial_frame; rfpsf++) {
625
972
        error_code =
626
972
            ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
627
972
                                  aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
628
972
        if (error_code) {
629
76
          if (pstr_mps_state->ec_flag) {
630
0
            pstr_mps_state->frame_ok = 0;
631
0
          } else
632
76
            return error_code;
633
76
        }
634
896
        if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
635
173
          ixheaacd_res_ctns_apply(
636
173
              pstr_mps_state->p_aac_decoder_channel_info[0],
637
173
              pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
638
173
              aac_tables_ptr);
639
896
        pstr_mps_state->res_block_type[ch][rfpsf] =
640
896
            pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
641
899k
        for (i = 0; i < AAC_FRAME_LENGTH; i++) {
642
899k
          *p_mdct_res++ =
643
899k
              (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
644
899k
        }
645
646
896
        if ((pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence ==
647
896
             EIGHT_SHORT_SEQUENCE) &&
648
345
            ((upd_qmf == UPD_QMF_18) || (upd_qmf == UPD_QMF_24) || (upd_qmf == UPD_QMF_30))) {
649
51
          error_code =
650
51
              ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
651
51
                                    aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
652
51
          if (error_code) {
653
9
            if (pstr_mps_state->ec_flag) {
654
0
              pstr_mps_state->frame_ok = 0;
655
0
            } else
656
9
              return error_code;
657
9
          }
658
42
          if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
659
5
            ixheaacd_res_ctns_apply(
660
5
                pstr_mps_state->p_aac_decoder_channel_info[0],
661
5
                pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
662
5
                aac_tables_ptr);
663
25.6k
          for (i = 0; i < AAC_FRAME_LENGTH; i++) {
664
25.6k
            *p_mdct_res++ =
665
25.6k
                (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
666
25.6k
          }
667
42
        }
668
896
      }
669
948
    }
670
671
3.09k
    p_res_mdct += RFX2XMDCTCOEF;
672
3.09k
  }
673
748
  return IA_NO_ERROR;
674
833
}
675
676
17.3k
static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
677
17.3k
  WORD32 i, fr, gr, offset, ch;
678
17.3k
  WORD32 ext_num, sac_ext_type, sac_ext_len, tmp, bits_read, n_fill_bits, temp;
679
17.3k
  WORD32 channel_grouping[MAX_INPUT_CHANNELS_MPS];
680
681
17.3k
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
682
17.3k
  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
683
684
17.3k
  ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr =
685
17.3k
      pstr_mps_state->ia_mps_dec_mps_table.aac_tab;
686
687
17.3k
  WORD32 arbdmx_upd_qmf = pstr_mps_state->arbdmx_upd_qmf;
688
17.3k
  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
689
17.3k
  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
690
17.3k
  WORD32 num_ttt_boxes = pstr_mps_state->num_ttt_boxes;
691
17.3k
  WORD32 arbdmx_frames_per_spatial_frame = pstr_mps_state->arbdmx_frames_per_spatial_frame;
692
17.3k
  WORD32 *p_res_mdct, *p_mdct_res;
693
694
17.3k
  WORD32 sfidx;
695
17.3k
  VOID *free_scratch = pstr_mps_state->mps_scratch_mem_v;
696
17.3k
  ia_mps_dec_residual_sfband_info_struct *p_sfband_info_tab = &pstr_mps_state->sfband_info_tab;
697
17.3k
  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
698
17.3k
  IA_ERRORCODE error_code = IA_NO_ERROR;
699
700
52.0k
  for (ch = 0; ch < 2; ch++) {
701
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch] = free_scratch;
702
34.6k
    free_scratch =
703
34.6k
        (WORD8 *)free_scratch +
704
34.6k
        IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_mps_dec_residual_channel_info_struct), BYTE_ALIGN_8);
705
34.6k
    pstr_mps_state->p_aac_decoder_dynamic_data_init[ch] = free_scratch;
706
34.6k
    free_scratch =
707
34.6k
        (WORD8 *)free_scratch +
708
34.6k
        IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_mps_dec_residual_dynamic_data_struct), BYTE_ALIGN_8);
709
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_scale_factor =
710
34.6k
        pstr_mps_state->p_aac_decoder_dynamic_data_init[ch]->a_scale_factor;
711
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_code_book =
712
34.6k
        pstr_mps_state->p_aac_decoder_dynamic_data_init[ch]->a_code_book;
713
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_spectral_coefficient = free_scratch;
714
34.6k
    free_scratch = (WORD8 *)free_scratch + IXHEAAC_GET_SIZE_ALIGNED(4096, BYTE_ALIGN_8);
715
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_tns_scratch = free_scratch;
716
34.6k
    free_scratch = (WORD8 *)free_scratch + IXHEAAC_GET_SIZE_ALIGNED(4096, BYTE_ALIGN_8);
717
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch]->ics_info.frame_length = AAC_FRAME_LENGTH;
718
34.6k
    pstr_mps_state->p_aac_decoder_channel_info[ch]->common_window = 0;
719
34.6k
  }
720
17.3k
  if (pstr_mps_state->arbitrary_downmix == 2)
721
328
    sfidx = p_bs_config->bs_arbitrary_downmix_residual_sampling_freq_index;
722
17.0k
  else
723
17.0k
    sfidx = p_bs_config->bs_residual_sampling_freq_index;
724
17.3k
  {
725
17.3k
    WORD16 *psfb_idx[2];
726
17.3k
    const WORD8 *psfb_width[2];
727
17.3k
    WORD width_idx;
728
17.3k
    WORD32 j;
729
730
17.3k
    pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.sampling_rate_index = sfidx;
731
17.3k
    psfb_idx[0] = p_sfband_info_tab->sfb_long_idx;
732
17.3k
    psfb_idx[1] = p_sfband_info_tab->sfb_short_idx;
733
17.3k
    psfb_width[0] = aac_tables_ptr->scale_factor_bands_long[sfidx];
734
17.3k
    psfb_width[1] = aac_tables_ptr->scale_factor_bands_short[sfidx];
735
736
52.0k
    for (j = 1; j >= 0; j--) {
737
34.6k
      const WORD8 *ptr_w = psfb_width[j];
738
34.6k
      WORD16 *ptr_i = psfb_idx[j];
739
34.6k
      width_idx = 0;
740
34.6k
      *ptr_i++ = width_idx;
741
922k
      do {
742
922k
        width_idx += (*ptr_w++);
743
922k
        *ptr_i++ = width_idx;
744
922k
      } while (*ptr_w != -1);
745
746
34.6k
      pstr_mps_state->tot_sf_bands_ls[j] = (WORD8)(ptr_w - psfb_width[j]);
747
34.6k
    }
748
749
17.3k
    {
750
17.3k
      aac_tables_ptr->sfb_index_long = p_sfband_info_tab->sfb_long_idx;
751
17.3k
      aac_tables_ptr->sfb_index_short = p_sfband_info_tab->sfb_short_idx;
752
17.3k
      aac_tables_ptr->sfb_index_long_width = (WORD8 *)psfb_width[0];
753
17.3k
      aac_tables_ptr->sfb_index_short_width = (WORD8 *)psfb_width[1];
754
17.3k
    }
755
17.3k
  }
756
757
18.3k
  for (ext_num = 0; ext_num < p_bs_config->sac_ext_cnt; ext_num++) {
758
1.19k
    sac_ext_type = p_bs_config->bs_sac_ext_type[ext_num];
759
760
1.19k
    if (sac_ext_type < 12) {
761
1.19k
      sac_ext_len = ixheaacd_read_bits_buf(mps_bit_buf, 8);
762
1.19k
      if (sac_ext_len == 255) {
763
9
        sac_ext_len += ixheaacd_read_bits_buf(mps_bit_buf, 16);
764
9
      }
765
766
1.19k
      tmp = (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
767
1.19k
                     (mps_bit_buf->bit_pos + 1));
768
769
1.19k
      switch (sac_ext_type) {
770
833
        case EXT_TYPE_0:
771
833
          error_code = ixheaacd_parse_residual_data(pstr_mps_state);
772
833
          if (error_code) {
773
85
            if (pstr_mps_state->ec_flag) {
774
0
              pstr_mps_state->frame_ok = 0;
775
0
            } else
776
85
              return error_code;
777
85
          }
778
748
          break;
779
780
748
        case EXT_TYPE_1:
781
323
          switch (num_input_channels) {
782
228
            case IN_CH_1:
783
228
              channel_grouping[0] = 1;
784
228
              break;
785
86
            case IN_CH_2:
786
86
              channel_grouping[0] = 2;
787
86
              break;
788
9
            case IN_CH_6:
789
9
              channel_grouping[0] = 2;
790
9
              channel_grouping[1] = 2;
791
9
              channel_grouping[2] = 2;
792
9
              break;
793
0
            default:
794
0
              return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_INPUT_CHANNEL;
795
0
              break;
796
323
          }
797
798
323
          offset = num_ott_boxes + num_ttt_boxes;
799
800
323
          p_res_mdct = pstr_mps_state->array_struct->res_mdct + offset * RFX2XMDCTCOEF;
801
802
597
          for (ch = 0, gr = 0; ch < num_input_channels; ch += channel_grouping[gr++]) {
803
336
            p_mdct_res = p_res_mdct;
804
805
336
            temp = ixheaacd_read_bits_buf(mps_bit_buf, 2);
806
336
            frame->bs_arbitrary_downmix_residual_abs[ch] = (temp >> 1) & ONE_BIT_MASK;
807
336
            frame->bs_arbitrary_downmix_residual_alpha_update_set[ch] = temp & ONE_BIT_MASK;
808
809
336
            if (channel_grouping[gr] == 1) {
810
431
              for (fr = 0; fr < arbdmx_frames_per_spatial_frame; fr++) {
811
230
                error_code =
812
230
                    ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
813
230
                                          1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
814
230
                if (error_code) {
815
25
                  if (pstr_mps_state->ec_flag) {
816
0
                    pstr_mps_state->frame_ok = 0;
817
0
                  } else
818
25
                    return error_code;
819
25
                }
820
205
                if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
821
60
                  ixheaacd_res_ctns_apply(
822
60
                      pstr_mps_state->p_aac_decoder_channel_info[0],
823
60
                      pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
824
60
                      aac_tables_ptr);
825
826
205
                pstr_mps_state->res_block_type[offset + ch][fr] =
827
205
                    pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
828
209k
                for (i = 0; i < AAC_FRAME_LENGTH; i++) {
829
208k
                  *p_mdct_res++ =
830
208k
                      (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
831
208k
                }
832
833
205
                if ((pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence ==
834
205
                     EIGHT_SHORT_SEQUENCE) &&
835
29
                    ((arbdmx_upd_qmf == UPD_QMF_18) || (arbdmx_upd_qmf == UPD_QMF_24) ||
836
25
                     (arbdmx_upd_qmf == UPD_QMF_30))) {
837
5
                  error_code = ixheaacd_res_read_ics(
838
5
                      mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1, aac_tables_ptr,
839
5
                      pstr_mps_state->tot_sf_bands_ls);
840
5
                  if (error_code) {
841
2
                    if (pstr_mps_state->ec_flag) {
842
0
                      pstr_mps_state->frame_ok = 0;
843
0
                    } else
844
2
                      return error_code;
845
2
                  }
846
3
                  if (1 ==
847
3
                      pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
848
1
                    ixheaacd_res_ctns_apply(
849
1
                        pstr_mps_state->p_aac_decoder_channel_info[0],
850
1
                        pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
851
1
                        aac_tables_ptr);
852
3.07k
                  for (i = 0; i < AAC_FRAME_LENGTH; i++) {
853
3.07k
                    *p_mdct_res++ = (pstr_mps_state->p_aac_decoder_channel_info[0]
854
3.07k
                                         ->p_spectral_coefficient[i]);
855
3.07k
                  }
856
3
                }
857
205
              }
858
201
              p_res_mdct += RFX2XMDCTCOEF;
859
201
            } else {
860
108
              frame->bs_arbitrary_downmix_residual_abs[ch + 1] =
861
108
                  frame->bs_arbitrary_downmix_residual_abs[ch];
862
108
              frame->bs_arbitrary_downmix_residual_alpha_update_set[ch + 1] =
863
108
                  frame->bs_arbitrary_downmix_residual_alpha_update_set[ch];
864
865
202
              for (fr = 0; fr < arbdmx_frames_per_spatial_frame; fr++) {
866
129
                WORD32 *res_mdct_1 = p_mdct_res + RFX2XMDCTCOEF;
867
129
                WORD32 temp, win1, win2;
868
129
                temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
869
129
                temp = ixheaacd_read_bits_buf(mps_bit_buf, 1);
870
871
129
                if (temp != 0) {
872
3
                  return IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT;
873
3
                }
874
875
126
                error_code =
876
126
                    ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
877
126
                                          1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
878
126
                if (error_code) {
879
4
                  if (pstr_mps_state->ec_flag) {
880
0
                    pstr_mps_state->frame_ok = 0;
881
0
                  } else
882
4
                    return error_code;
883
4
                }
884
885
122
                if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
886
4
                  ixheaacd_res_ctns_apply(
887
4
                      pstr_mps_state->p_aac_decoder_channel_info[0],
888
4
                      pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
889
4
                      aac_tables_ptr);
890
122
                win1 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
891
122
                pstr_mps_state->res_block_type[offset + ch][fr] =
892
122
                    pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
893
894
124k
                for (i = 0; i < AAC_FRAME_LENGTH; i++) {
895
123k
                  *p_mdct_res++ =
896
123k
                      (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
897
123k
                }
898
899
122
                error_code =
900
122
                    ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
901
122
                                          1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
902
122
                if (error_code) {
903
10
                  if (pstr_mps_state->ec_flag) {
904
0
                    pstr_mps_state->frame_ok = 0;
905
0
                  } else
906
10
                    return error_code;
907
10
                }
908
909
112
                if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
910
11
                  ixheaacd_res_ctns_apply(
911
11
                      pstr_mps_state->p_aac_decoder_channel_info[0],
912
11
                      pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
913
11
                      aac_tables_ptr);
914
112
                win2 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
915
113k
                for (i = 0; i < AAC_FRAME_LENGTH; i++) {
916
113k
                  *res_mdct_1++ =
917
113k
                      (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
918
113k
                }
919
920
112
                if (win1 != win2) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_WINDOW_SEQUENCE;
921
922
98
                if ((win1 == EIGHT_SHORT_SEQUENCE) &&
923
5
                    ((arbdmx_upd_qmf == UPD_QMF_18) || (arbdmx_upd_qmf == UPD_QMF_24) ||
924
5
                     (arbdmx_upd_qmf == UPD_QMF_30))) {
925
5
                  temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
926
5
                  temp = ixheaacd_read_bits_buf(mps_bit_buf, 1);
927
928
5
                  if (temp != 0) {
929
1
                    return IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT;
930
1
                  }
931
932
4
                  error_code = ixheaacd_res_read_ics(
933
4
                      mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1, aac_tables_ptr,
934
4
                      pstr_mps_state->tot_sf_bands_ls);
935
4
                  if (error_code) {
936
1
                    if (pstr_mps_state->ec_flag) {
937
0
                      pstr_mps_state->frame_ok = 0;
938
0
                    } else
939
1
                      return error_code;
940
1
                  }
941
942
3
                  if (1 ==
943
3
                      pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
944
1
                    ixheaacd_res_ctns_apply(
945
1
                        pstr_mps_state->p_aac_decoder_channel_info[0],
946
1
                        pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
947
1
                        aac_tables_ptr);
948
3
                  win1 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
949
950
3.07k
                  for (i = 0; i < AAC_FRAME_LENGTH; i++) {
951
3.07k
                    *p_mdct_res++ = (pstr_mps_state->p_aac_decoder_channel_info[0]
952
3.07k
                                         ->p_spectral_coefficient[i]);
953
3.07k
                  }
954
955
3
                  error_code = ixheaacd_res_read_ics(
956
3
                      mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1, aac_tables_ptr,
957
3
                      pstr_mps_state->tot_sf_bands_ls);
958
3
                  if (error_code) {
959
1
                    if (pstr_mps_state->ec_flag) {
960
0
                      pstr_mps_state->frame_ok = 0;
961
0
                    } else
962
1
                      return error_code;
963
1
                  }
964
965
2
                  if (1 ==
966
2
                      pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
967
1
                    ixheaacd_res_ctns_apply(
968
1
                        pstr_mps_state->p_aac_decoder_channel_info[0],
969
1
                        pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
970
1
                        aac_tables_ptr);
971
2
                  win2 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
972
2.05k
                  for (i = 0; i < AAC_FRAME_LENGTH; i++) {
973
2.04k
                    *res_mdct_1++ = (pstr_mps_state->p_aac_decoder_channel_info[0]
974
2.04k
                                         ->p_spectral_coefficient[i]);
975
2.04k
                  }
976
977
2
                  if (win1 != win2) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_WINDOW_SEQUENCE;
978
2
                }
979
98
              }
980
73
              p_res_mdct += RFX2XMDCTCOEF;
981
73
            }
982
336
          }
983
984
261
          break;
985
986
261
        case EXT_TYPE_2:
987
68
          for (i = 0; i < p_bs_config->num_ott_boxes_at; i++) {
988
37
            error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
989
37
                                              frame->cmp_ott_cld_idx, frame->cmp_ott_cld_idx_prev,
990
37
                                              CLD, num_ott_boxes + i, num_ott_boxes + i, 0,
991
37
                                              p_bs_config->bs_ott_bands_at[i]);
992
37
            if (error_code != IA_NO_ERROR) return error_code;
993
37
          }
994
995
31
          break;
996
997
31
        default:
998
0
          return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_EXTENSION_TYPE;
999
1.19k
      }
1000
1001
970
      bits_read =
1002
970
          (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
1003
970
                   (mps_bit_buf->bit_pos + 1) - tmp);
1004
970
      n_fill_bits = (sac_ext_len << 3) - bits_read;
1005
1006
2.18k
      while (n_fill_bits > 7) {
1007
1.21k
        ixheaacd_read_bits_buf(mps_bit_buf, 8);
1008
1.21k
        n_fill_bits -= 8;
1009
1.21k
      }
1010
970
      if (n_fill_bits > 0) {
1011
12
        ixheaacd_read_bits_buf(mps_bit_buf, n_fill_bits);
1012
12
      }
1013
970
    }
1014
1.19k
  }
1015
17.1k
  return IA_NO_ERROR;
1016
17.3k
}
1017
1018
17.7k
IA_ERRORCODE ixheaacd_parse_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
1019
17.7k
  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
1020
1021
17.7k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
1022
17.7k
  WORD32 i, bs_framing_type, prev_param_slot, data_bands, bs_temp_shape_enable,
1023
17.7k
      num_temp_shape_chan;
1024
17.7k
  WORD32 ttt_off, ps, pg, ts, pb, temp;
1025
17.7k
  WORD32 *bs_env_shape_data = pstr_mps_state->mps_scratch_mem_v;
1026
17.7k
  WORD32 const *reciprocal_tab = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->reciprocal;
1027
17.7k
  WORD32 num_parameter_sets;
1028
1029
17.7k
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
1030
17.7k
  ia_mps_dec_bitdec_tables_struct *bitdec_table =
1031
17.7k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
1032
17.7k
  WORD32 bs_num_output_channels =
1033
17.7k
      bitdec_table->tree_property_table[pstr_mps_state->tree_config].num_output_channels;
1034
1035
17.7k
  WORD32 time_slots = pstr_mps_state->time_slots;
1036
17.7k
  WORD32 bitstream_parameter_bands = pstr_mps_state->bitstream_parameter_bands;
1037
17.7k
  WORD32 *b_ott_bands = pstr_mps_state->bitstream_ott_bands;
1038
17.7k
  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
1039
1040
17.7k
  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
1041
1042
17.7k
  WORD32 reciprocal, alignment_bits = 0;
1043
17.7k
  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
1044
17.7k
  IA_ERRORCODE error_code = IA_NO_ERROR;
1045
1046
17.7k
  if (pstr_mps_state->parse_next_bitstream_frame == 0) return IA_NO_ERROR;
1047
1048
17.7k
  temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
1049
17.7k
  bs_framing_type = (temp >> 3) & ONE_BIT_MASK;
1050
17.7k
  num_parameter_sets = (temp & THREE_BIT_MASK) + 1;
1051
17.7k
  pstr_mps_state->num_parameter_sets = num_parameter_sets;
1052
1053
17.7k
  reciprocal = reciprocal_tab[num_parameter_sets - 1];
1054
1055
17.7k
  prev_param_slot = -1;
1056
49.4k
  for (i = 0; i < num_parameter_sets; i++) {
1057
31.6k
    if (bs_framing_type) {
1058
10.1k
      WORD32 bits_param_slot = 0;
1059
42.8k
      while ((1 << bits_param_slot) < (time_slots - num_parameter_sets + i - prev_param_slot))
1060
32.6k
        bits_param_slot++;
1061
10.1k
      param_slot[i] =
1062
10.1k
          bits_param_slot
1063
10.1k
              ? prev_param_slot + 1 + ixheaacd_read_bits_buf(mps_bit_buf, bits_param_slot)
1064
10.1k
              : prev_param_slot + 1;
1065
10.1k
      prev_param_slot = param_slot[i];
1066
21.5k
    } else {
1067
21.5k
      WORD64 temp = (WORD64)(
1068
21.5k
          ((WORD64)((time_slots * (i + 1)) + num_parameter_sets - 1) * (WORD64)reciprocal) >> 28);
1069
21.5k
      param_slot[i] = (WORD32)(temp - 1);
1070
21.5k
    }
1071
31.6k
  }
1072
17.7k
  frame->bs_independency_flag = ixheaacd_read_bits_buf(mps_bit_buf, 1);
1073
1074
62.8k
  for (i = 0; i < num_ott_boxes; i++) {
1075
45.0k
    error_code =
1076
45.0k
        ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data, frame->cmp_ott_cld_idx,
1077
45.0k
                             frame->cmp_ott_cld_idx_prev, CLD, i, i, 0, b_ott_bands[i]);
1078
45.0k
    if (error_code != IA_NO_ERROR) return error_code;
1079
45.0k
  }
1080
17.7k
  if (pstr_mps_state->one_icc) {
1081
3.90k
    error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data,
1082
3.90k
                                      frame->cmp_ott_icc_idx, frame->cmp_ott_icc_idx_prev, ICC, 0,
1083
3.90k
                                      0, 0, bitstream_parameter_bands);
1084
3.90k
    if (error_code != IA_NO_ERROR) return error_code;
1085
13.8k
  } else {
1086
43.4k
    for (i = 0; i < num_ott_boxes; i++) {
1087
29.6k
      if (!pstr_mps_state->ott_mode_lfe[i]) {
1088
28.4k
        error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data,
1089
28.4k
                                          frame->cmp_ott_icc_idx, frame->cmp_ott_icc_idx_prev,
1090
28.4k
                                          ICC, i, i, 0, b_ott_bands[i]);
1091
28.4k
        if (error_code != IA_NO_ERROR) return error_code;
1092
28.4k
      }
1093
29.6k
    }
1094
13.8k
  }
1095
1096
17.6k
  ttt_off = num_ott_boxes;
1097
21.2k
  for (i = 0; i < pstr_mps_state->num_ttt_boxes; i++) {
1098
3.55k
    if (p_aux_struct->ttt_config[0][i].mode < 2) {
1099
1.62k
      error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data,
1100
1.62k
                                        frame->cmp_ttt_cpc_1_idx, frame->cmp_ttt_cpc_1_idx_prev,
1101
1.62k
                                        CPC, i, ttt_off + 4 * i,
1102
1.62k
                                        p_aux_struct->ttt_config[0][i].bitstream_start_band,
1103
1.62k
                                        p_aux_struct->ttt_config[0][i].bitstream_stop_band);
1104
1.62k
      if (error_code != IA_NO_ERROR) return error_code;
1105
1106
1.62k
      error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data,
1107
1.62k
                                        frame->cmp_ttt_cpc_2_idx, frame->cmp_ttt_cpc_2_idx_prev,
1108
1.62k
                                        CPC, i, ttt_off + 4 * i + 1,
1109
1.62k
                                        p_aux_struct->ttt_config[0][i].bitstream_start_band,
1110
1.62k
                                        p_aux_struct->ttt_config[0][i].bitstream_stop_band);
1111
1.62k
      if (error_code != IA_NO_ERROR) return error_code;
1112
1113
1.62k
      error_code =
1114
1.62k
          ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data, frame->cmp_ttt_icc_idx,
1115
1.62k
                               frame->cmp_ttt_icc_idx_prev, ICC, i, ttt_off + 4 * i,
1116
1.62k
                               p_aux_struct->ttt_config[0][i].bitstream_start_band,
1117
1.62k
                               p_aux_struct->ttt_config[0][i].bitstream_stop_band);
1118
1.62k
      if (error_code != IA_NO_ERROR) return error_code;
1119
1.93k
    } else {
1120
1.93k
      error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
1121
1.93k
                                        frame->cmp_ttt_cld_1_idx, frame->cmp_ttt_cld_1_idx_prev,
1122
1.93k
                                        CLD, i, ttt_off + 4 * i,
1123
1.93k
                                        p_aux_struct->ttt_config[0][i].bitstream_start_band,
1124
1.93k
                                        p_aux_struct->ttt_config[0][i].bitstream_stop_band);
1125
1.93k
      if (error_code != IA_NO_ERROR) return error_code;
1126
1127
1.92k
      error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
1128
1.92k
                                        frame->cmp_ttt_cld_2_idx, frame->cmp_ttt_cld_2_idx_prev,
1129
1.92k
                                        CLD, i, ttt_off + 4 * i + 1,
1130
1.92k
                                        p_aux_struct->ttt_config[0][i].bitstream_start_band,
1131
1.92k
                                        p_aux_struct->ttt_config[0][i].bitstream_stop_band);
1132
1.92k
      if (error_code != IA_NO_ERROR) return error_code;
1133
1.92k
    }
1134
1135
3.52k
    if (p_aux_struct->ttt_config[1][i].bitstream_start_band <
1136
3.52k
        p_aux_struct->ttt_config[1][i].bitstream_stop_band) {
1137
1.71k
      if (p_aux_struct->ttt_config[1][i].mode < 2) {
1138
413
        error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data,
1139
413
                                          frame->cmp_ttt_cpc_1_idx, frame->cmp_ttt_cpc_1_idx_prev,
1140
413
                                          CPC, i, ttt_off + 4 * i + 2,
1141
413
                                          p_aux_struct->ttt_config[1][i].bitstream_start_band,
1142
413
                                          p_aux_struct->ttt_config[1][i].bitstream_stop_band);
1143
413
        if (error_code != IA_NO_ERROR) return error_code;
1144
1145
411
        error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data,
1146
411
                                          frame->cmp_ttt_cpc_2_idx, frame->cmp_ttt_cpc_2_idx_prev,
1147
411
                                          CPC, i, ttt_off + 4 * i + 3,
1148
411
                                          p_aux_struct->ttt_config[1][i].bitstream_start_band,
1149
411
                                          p_aux_struct->ttt_config[1][i].bitstream_stop_band);
1150
411
        if (error_code != IA_NO_ERROR) return error_code;
1151
1152
410
        error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data,
1153
410
                                          frame->cmp_ttt_icc_idx, frame->cmp_ttt_icc_idx_prev,
1154
410
                                          ICC, i, ttt_off + 4 * i + 2,
1155
410
                                          p_aux_struct->ttt_config[1][i].bitstream_start_band,
1156
410
                                          p_aux_struct->ttt_config[1][i].bitstream_stop_band);
1157
410
        if (error_code != IA_NO_ERROR) return error_code;
1158
1.29k
      } else {
1159
1.29k
        error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
1160
1.29k
                                          frame->cmp_ttt_cld_1_idx, frame->cmp_ttt_cld_1_idx_prev,
1161
1.29k
                                          CLD, i, ttt_off + 4 * i + 2,
1162
1.29k
                                          p_aux_struct->ttt_config[1][i].bitstream_start_band,
1163
1.29k
                                          p_aux_struct->ttt_config[1][i].bitstream_stop_band);
1164
1.29k
        if (error_code != IA_NO_ERROR) return error_code;
1165
1166
1.29k
        error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
1167
1.29k
                                          frame->cmp_ttt_cld_2_idx, frame->cmp_ttt_cld_2_idx_prev,
1168
1.29k
                                          CLD, i, ttt_off + 4 * i + 3,
1169
1.29k
                                          p_aux_struct->ttt_config[1][i].bitstream_start_band,
1170
1.29k
                                          p_aux_struct->ttt_config[1][i].bitstream_stop_band);
1171
1.29k
        if (error_code != IA_NO_ERROR) return error_code;
1172
1.29k
      }
1173
1.71k
    }
1174
3.52k
  }
1175
1176
17.6k
  frame->bs_smooth_control = 1;
1177
1178
17.6k
  if (frame->bs_smooth_control) {
1179
47.1k
    for (ps = 0; ps < num_parameter_sets; ps++) {
1180
29.7k
      frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
1181
29.7k
      if (frame->bs_smooth_mode[ps] > 3 || frame->bs_smooth_mode[ps] < 0) {
1182
0
        return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_SMOOTH_MODE;
1183
0
      }
1184
29.7k
      if (frame->bs_smooth_mode[ps] >= 2) {
1185
7.67k
        frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
1186
7.67k
      }
1187
29.7k
      if (frame->bs_smooth_mode[ps] == 3) {
1188
3.09k
        frame->bs_freq_res_stride_smg[ps] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
1189
3.09k
        data_bands = (bitstream_parameter_bands - 1) /
1190
3.09k
                         bitdec_table->pb_stride_table[frame->bs_freq_res_stride_smg[ps]] +
1191
3.09k
                     1;
1192
17.1k
        for (pg = 0; pg < data_bands; pg++) {
1193
14.0k
          frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(mps_bit_buf, 1);
1194
14.0k
        }
1195
3.09k
      }
1196
29.7k
    }
1197
17.4k
  }
1198
1199
149k
  for (i = 0; i < bs_num_output_channels; i++) {
1200
132k
    p_aux_struct->temp_shape_enable_channel_stp[i] = 0;
1201
132k
    p_aux_struct->temp_shape_enable_channel_ges[i] = 0;
1202
132k
  }
1203
1204
17.6k
  if (p_bs_config->bs_temp_shape_config != 0) {
1205
16.2k
    bs_temp_shape_enable = ixheaacd_read_bits_buf(mps_bit_buf, 1);
1206
16.2k
    if (bs_temp_shape_enable) {
1207
3.32k
      num_temp_shape_chan =
1208
3.32k
          bitdec_table->temp_shape_chan_table[p_bs_config->bs_temp_shape_config - 1]
1209
3.32k
                                             [p_bs_config->bs_tree_config];
1210
3.32k
      switch (pstr_mps_state->temp_shape_config) {
1211
1.00k
        case 1:
1212
5.67k
          for (i = 0; i < num_temp_shape_chan; i++) {
1213
4.66k
            p_aux_struct->temp_shape_enable_channel_stp[i] =
1214
4.66k
                ixheaacd_read_bits_buf(mps_bit_buf, 1);
1215
4.66k
          }
1216
1.00k
          break;
1217
2.31k
        case 2:
1218
11.9k
          for (i = 0; i < num_temp_shape_chan; i++) {
1219
9.60k
            p_aux_struct->temp_shape_enable_channel_ges[i] =
1220
9.60k
                ixheaacd_read_bits_buf(mps_bit_buf, 1);
1221
9.60k
          }
1222
11.8k
          for (i = 0; i < num_temp_shape_chan; i++) {
1223
9.52k
            if (p_aux_struct->temp_shape_enable_channel_ges[i]) {
1224
1.70k
              WORD32 const *envshape_data =
1225
1.70k
                  &bitdec_table->envshape_data[pstr_mps_state->env_quant_mode][0];
1226
1.70k
              ixheaacd_mps_huff_decode(mps_bit_buf, bs_env_shape_data, time_slots);
1227
51.7k
              for (ts = 0; ts < time_slots; ts++) {
1228
50.0k
                p_aux_struct->env_shape_data[i][ts] = envshape_data[bs_env_shape_data[ts]];
1229
50.0k
              }
1230
1.70k
            }
1231
9.52k
          }
1232
2.31k
          break;
1233
0
        default:
1234
0
          return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TEMPORAL_SHAPING_CONFIG;
1235
3.32k
      }
1236
3.32k
    }
1237
16.2k
  }
1238
1239
17.6k
  if (pstr_mps_state->up_mix_type == 2) {
1240
0
    for (i = 0; i < bs_num_output_channels; i++) {
1241
0
      p_aux_struct->temp_shape_enable_channel_stp[i] = 0;
1242
0
      p_aux_struct->temp_shape_enable_channel_ges[i] = 0;
1243
0
    }
1244
0
  }
1245
1246
17.6k
  if (pstr_mps_state->arbitrary_downmix != 0) {
1247
1.77k
    ixheaacd_parse_arbitrary_downmix_data(pstr_mps_state);
1248
1.77k
  }
1249
1250
17.6k
  ixheaacd_byte_align(mps_bit_buf, &alignment_bits);
1251
17.6k
  error_code = ixheaacd_parse_extension_frame(pstr_mps_state);
1252
17.6k
  if (error_code) {
1253
151
    if (pstr_mps_state->ec_flag) {
1254
0
      pstr_mps_state->frame_ok = 0;
1255
0
    }
1256
151
    else
1257
151
      return error_code;
1258
151
  }
1259
1260
59.6k
  for (i = 0; i < num_ott_boxes; i++) {
1261
122k
    for (ps = 0; ps < num_parameter_sets; ps++) {
1262
80.6k
      if (!frame->res_data.bs_icc_diff_present[i][ps] || (pstr_mps_state->up_mix_type == 2) ||
1263
80.3k
          (pstr_mps_state->up_mix_type == 3)) {
1264
1.33M
        for (pb = 0; pb < bitstream_parameter_bands; pb++) {
1265
1.25M
          pstr_mps_state->bs_frame->ott_icc_diff_idx[i][ps][pb] = 0;
1266
1.25M
        }
1267
80.3k
      }
1268
80.6k
    }
1269
42.2k
  }
1270
1271
17.4k
  pstr_mps_state->parse_next_bitstream_frame = 1;
1272
1273
17.4k
  return IA_NO_ERROR;
1274
17.6k
}
1275
1276
static VOID ixheaacd_create_mapping(WORD32 a_map[MAX_PARAMETER_BANDS + 1], WORD32 start_band,
1277
36.7k
                                    WORD32 stop_band, WORD32 stride, VOID *scratch) {
1278
36.7k
  WORD32 in_bands, out_bands, bands_achived, bands_diff, incr, k, i;
1279
36.7k
  WORD32 *v_dk;
1280
36.7k
  in_bands = stop_band - start_band;
1281
36.7k
  out_bands = (in_bands - 1) / stride + 1;
1282
36.7k
  v_dk = scratch;
1283
36.7k
  if (out_bands < 1) {
1284
70
    out_bands = 1;
1285
70
  }
1286
1287
36.7k
  bands_achived = out_bands * stride;
1288
36.7k
  bands_diff = in_bands - bands_achived;
1289
196k
  for (i = 0; i < out_bands; i++) {
1290
159k
    v_dk[i] = stride;
1291
159k
  }
1292
1293
36.7k
  if (bands_diff > 0) {
1294
0
    incr = -1;
1295
0
    k = out_bands - 1;
1296
36.7k
  } else {
1297
36.7k
    incr = 1;
1298
36.7k
    k = 0;
1299
36.7k
  }
1300
1301
276k
  while (bands_diff != 0) {
1302
239k
    v_dk[k] = v_dk[k] - incr;
1303
239k
    k = k + incr;
1304
239k
    bands_diff = bands_diff + incr;
1305
239k
    if (k >= out_bands) {
1306
234k
      if (bands_diff > 0) {
1307
0
        k = out_bands - 1;
1308
234k
      } else if (bands_diff < 0) {
1309
217k
        k = 0;
1310
217k
      }
1311
234k
    }
1312
239k
  }
1313
36.7k
  a_map[0] = start_band;
1314
196k
  for (i = 0; i < out_bands; i++) {
1315
159k
    a_map[i + 1] = a_map[i] + v_dk[i];
1316
159k
  }
1317
36.7k
}
1318
1319
static VOID ixheaacd_map_frequency(WORD32 *p_input, WORD32 *p_output, WORD32 *p_map,
1320
34.0k
                                   WORD32 data_bands) {
1321
34.0k
  WORD32 i, j, start_band, stop_band, value;
1322
34.0k
  WORD32 start_band_0 = p_map[0];
1323
1324
181k
  for (i = 0; i < data_bands; i++) {
1325
147k
    value = p_input[i + start_band_0];
1326
1327
147k
    start_band = p_map[i];
1328
147k
    stop_band = p_map[i + 1];
1329
652k
    for (j = start_band; j < stop_band; j++) {
1330
504k
      p_output[j] = value;
1331
504k
    }
1332
147k
  }
1333
34.0k
}
1334
1335
static IA_ERRORCODE ixheaacd_deq_coarse(
1336
    WORD32 value, WORD32 param_type, WORD32 *dequant,
1337
266k
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
1338
266k
  switch (param_type) {
1339
102k
    case CLD:
1340
102k
      if (value >= 8 || value < -7) return IA_FATAL_ERROR;
1341
102k
      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cld_coarse[value + 7];
1342
102k
      break;
1343
1344
135k
    case ICC:
1345
135k
      if (value >= 8 || value < 0) return IA_FATAL_ERROR;
1346
135k
      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_icc[value];
1347
135k
      break;
1348
1349
27.9k
    case CPC:
1350
27.9k
      if (value >= 16 || value < -10) return IA_FATAL_ERROR;
1351
27.9k
      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cpc_coarse[value + 10];
1352
27.9k
      break;
1353
0
    default:
1354
0
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_DEQUANT_PARAM;
1355
266k
  }
1356
266k
  return IA_NO_ERROR;
1357
266k
}
1358
1359
static IA_ERRORCODE ia_mps_dec_deq(
1360
    WORD32 value, WORD32 param_type, WORD32 *dequant,
1361
2.49M
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
1362
2.49M
  switch (param_type) {
1363
1.43M
    case CLD:
1364
1.43M
      if (value >= 16 || value < -15) return IA_FATAL_ERROR;
1365
1.42M
      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cld[value + 15];
1366
1.42M
      break;
1367
1368
995k
    case ICC:
1369
995k
      if (value >= 8 || value < 0) return IA_FATAL_ERROR;
1370
989k
      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_icc[value];
1371
989k
      break;
1372
1373
70.7k
    case CPC:
1374
70.7k
      if (value >= 32 || value < -20) return IA_FATAL_ERROR;
1375
70.4k
      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cpc[value + 20];
1376
70.4k
      break;
1377
1378
0
    default:
1379
0
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_DEQUANT_PARAM;
1380
2.49M
  }
1381
2.48M
  return IA_NO_ERROR;
1382
2.49M
}
1383
1384
static IA_ERRORCODE ixheaacd_factor_funct(WORD32 ott_vs_tot_db, WORD32 quant_mode,
1385
94.2k
                                          WORD32 *factor) {
1386
94.2k
  WORD32 db_diff;
1387
94.2k
  WORD32 x_linear = 0;
1388
1389
94.2k
  WORD32 maxfactor = 0;
1390
94.2k
  WORD32 constfact;
1391
1392
94.2k
  if (ott_vs_tot_db > 0) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_MPS_PARAM;
1393
93.9k
  db_diff = -ott_vs_tot_db;
1394
1395
93.9k
  switch (quant_mode) {
1396
0
    case QUANT_MODE_0:
1397
0
      return (ONE_IN_Q24);
1398
0
      break;
1399
20.3k
    case QUANT_MODE_1:
1400
20.3k
      x_linear = 1024;
1401
1402
20.3k
      maxfactor = 83886080;
1403
20.3k
      constfact = 3277;
1404
20.3k
      break;
1405
21.6k
    case QUANT_MODE_2:
1406
21.6k
      x_linear = 1024;
1407
1408
21.6k
      maxfactor = (ONE_IN_Q27);
1409
21.6k
      constfact = 4779;
1410
21.6k
      break;
1411
51.9k
    default:
1412
51.9k
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_QUANT_MODE;
1413
93.9k
  }
1414
1415
41.9k
  if (db_diff > (x_linear << 5)) {
1416
14.9k
    WORD32 db_diff_fix = db_diff >> 5;
1417
14.9k
    *factor = (db_diff_fix - (WORD32)x_linear) * constfact + ONE_IN_Q24;
1418
27.0k
  } else {
1419
27.0k
    *factor = ONE_IN_Q24;
1420
27.0k
  }
1421
1422
41.9k
  *factor = min(maxfactor, *factor);
1423
41.9k
  return IA_NO_ERROR;
1424
93.9k
}
1425
1426
static VOID ixheaacd_factor_cld(WORD32 *idx, WORD32 ott_vs_tot_db, WORD32 *ott_vs_tot_db_1,
1427
                                WORD32 *ott_vs_tot_db_2, WORD32 quant_mode,
1428
94.2k
                                ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
1429
94.2k
  WORD32 factor = 0;
1430
94.2k
  WORD32 c1;
1431
94.2k
  WORD32 c2;
1432
94.2k
  WORD32 cld_idx;
1433
1434
94.2k
  ixheaacd_factor_funct(ott_vs_tot_db, quant_mode, &factor);
1435
1436
94.2k
  cld_idx = (((*idx * factor) + THIRTYONE_BY_TWO_IN_Q24) >> 24);
1437
94.2k
  cld_idx -= 15;
1438
1439
94.2k
  cld_idx = min(cld_idx, 15);
1440
94.2k
  cld_idx = max(cld_idx, -15);
1441
1442
94.2k
  *idx = cld_idx;
1443
1444
94.2k
  c1 = ixheaacd_mps_dec_bitdec_tables->factor_cld_tab_1[*idx + 15];
1445
94.2k
  c2 = ixheaacd_mps_dec_bitdec_tables->factor_cld_tab_1[15 - *idx];
1446
1447
94.2k
  *ott_vs_tot_db_1 = c1 + ott_vs_tot_db;
1448
94.2k
  *ott_vs_tot_db_2 = c2 + ott_vs_tot_db;
1449
94.2k
}
1450
1451
static IA_ERRORCODE ixheaacd_map_index_data(
1452
    ia_mps_dec_lossless_data_struct *ll_data,
1453
    WORD32 output_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1454
    WORD32 output_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1455
    WORD32 cmp_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
1456
    WORD32 diff_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], WORD32 xtt_idx,
1457
    WORD32 idx_prev[MAX_NUM_OTT][MAX_PARAMETER_BANDS], WORD32 param_idx, WORD32 param_type,
1458
    WORD32 start_band, WORD32 stop_band, WORD32 default_value, WORD32 num_parameter_sets,
1459
    WORD32 *param_slot, WORD32 extend_frame, WORD32 quant_mode, WORD32 *ott_vs_tot_db_in,
1460
    WORD32 *ott_vs_tot_db_1, WORD32 *ott_vs_tot_db_2,
1461
90.3k
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables, VOID *scratch) {
1462
90.3k
  WORD32 *a_param_slots;
1463
90.3k
  WORD32 *a_interpolate;
1464
1465
90.3k
  WORD32 data_sets;
1466
90.3k
  WORD32 *a_map;
1467
90.3k
  VOID *free_scratch;
1468
1469
90.3k
  WORD32 set_idx, i, band, parm_slot;
1470
90.3k
  WORD32 data_bands, stride;
1471
90.3k
  WORD32 ps, pb;
1472
1473
90.3k
  WORD32 i1, i2, x1, xi, x2;
1474
90.3k
  WORD32 *db_in;
1475
90.3k
  WORD32 *db_1, *db_2;
1476
90.3k
  IA_ERRORCODE error_code = IA_NO_ERROR;
1477
90.3k
  db_in = ott_vs_tot_db_in;
1478
90.3k
  db_1 = ott_vs_tot_db_1;
1479
90.3k
  db_2 = ott_vs_tot_db_2;
1480
90.3k
  a_param_slots = scratch;
1481
90.3k
  a_interpolate = a_param_slots + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1482
90.3k
                                      MAX_PARAMETER_SETS, sizeof(*a_interpolate), BYTE_ALIGN_8);
1483
90.3k
  a_map = a_interpolate +
1484
90.3k
          IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_SETS, sizeof(*a_map), BYTE_ALIGN_8);
1485
90.3k
  free_scratch = a_map + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_BANDS_PLUS_1, sizeof(*a_map),
1486
90.3k
                                                       BYTE_ALIGN_8);
1487
1488
90.3k
  data_sets = 0;
1489
265k
  for (i = 0; i < num_parameter_sets; i++) {
1490
175k
    if (ll_data->bs_xxx_data_mode[param_idx][i] == 3) {
1491
34.0k
      a_param_slots[data_sets] = i;
1492
34.0k
      data_sets++;
1493
34.0k
    }
1494
175k
  }
1495
1496
90.3k
  set_idx = 0;
1497
1498
265k
  for (i = 0; i < num_parameter_sets; i++) {
1499
175k
    if (ll_data->bs_xxx_data_mode[param_idx][i] == 0) {
1500
111k
      ll_data->no_cmp_quant_coarse_xxx[param_idx][i] = 0;
1501
1.86M
      for (band = start_band; band < stop_band; band++) {
1502
1.75M
        output_idx_data[xtt_idx][i][band] = default_value;
1503
1.75M
      }
1504
1.86M
      for (band = start_band; band < stop_band; band++) {
1505
1.75M
        idx_prev[xtt_idx][band] = output_idx_data[xtt_idx][i][band];
1506
1.75M
      }
1507
111k
    }
1508
1509
175k
    if (ll_data->bs_xxx_data_mode[param_idx][i] == 1) {
1510
267k
      for (band = start_band; band < stop_band; band++) {
1511
250k
        output_idx_data[xtt_idx][i][band] = idx_prev[xtt_idx][band];
1512
250k
      }
1513
17.0k
      ll_data->no_cmp_quant_coarse_xxx[param_idx][i] =
1514
17.0k
          ll_data->bs_quant_coarse_xxx_prev[param_idx];
1515
17.0k
    }
1516
1517
175k
    if (ll_data->bs_xxx_data_mode[param_idx][i] == 2) {
1518
180k
      for (band = start_band; band < stop_band; band++) {
1519
168k
        output_idx_data[xtt_idx][i][band] = idx_prev[xtt_idx][band];
1520
168k
      }
1521
12.4k
      a_interpolate[i] = 1;
1522
162k
    } else {
1523
162k
      a_interpolate[i] = 0;
1524
162k
    }
1525
1526
175k
    if (ll_data->bs_xxx_data_mode[param_idx][i] == 3) {
1527
34.0k
      parm_slot = a_param_slots[set_idx];
1528
34.0k
      stride = ixheaacd_mps_dec_bitdec_tables
1529
34.0k
                   ->pb_stride_table[ll_data->bs_freq_res_stride_xxx[param_idx][set_idx]];
1530
34.0k
      data_bands = (stop_band - start_band - 1) / stride + 1;
1531
34.0k
      ixheaacd_create_mapping(a_map, start_band, stop_band, stride, free_scratch);
1532
34.0k
      ixheaacd_map_frequency(&cmp_idx_data[xtt_idx][set_idx][0],
1533
34.0k
                             &output_idx_data[xtt_idx][parm_slot][0], a_map, data_bands);
1534
1535
538k
      for (band = start_band; band < stop_band; band++) {
1536
504k
        idx_prev[xtt_idx][band] = output_idx_data[xtt_idx][parm_slot][band];
1537
504k
      }
1538
1539
34.0k
      ll_data->bs_quant_coarse_xxx_prev[param_idx] =
1540
34.0k
          ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
1541
34.0k
      ll_data->no_cmp_quant_coarse_xxx[param_idx][i] =
1542
34.0k
          ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
1543
1544
34.0k
      set_idx++;
1545
34.0k
    }
1546
1547
175k
    if (diff_idx_data != NULL) {
1548
1.15M
      for (band = start_band; band < stop_band; band++) {
1549
1.08M
        output_idx_data[xtt_idx][i][band] += diff_idx_data[xtt_idx][i][band];
1550
1.08M
      }
1551
67.1k
    }
1552
175k
  }
1553
1554
265k
  for (i = 0; i < num_parameter_sets; i++) {
1555
175k
    if (a_interpolate[i] != 1) {
1556
162k
      if (ll_data->no_cmp_quant_coarse_xxx[param_idx][i] == 1) {
1557
286k
        for (band = start_band; band < stop_band; band++) {
1558
266k
          error_code = ixheaacd_deq_coarse(output_idx_data[xtt_idx][i][band], param_type,
1559
266k
                                           &(output_data[xtt_idx][i][band]),
1560
266k
                                           ixheaacd_mps_dec_bitdec_tables);
1561
266k
          if (error_code) {
1562
93
            return error_code;
1563
93
          }
1564
266k
        }
1565
142k
      } else {
1566
2.38M
        for (band = start_band; band < stop_band; band++) {
1567
2.23M
          error_code =
1568
2.23M
              ia_mps_dec_deq(output_idx_data[xtt_idx][i][band], param_type,
1569
2.23M
                             &(output_data[xtt_idx][i][band]), ixheaacd_mps_dec_bitdec_tables);
1570
2.23M
          if (error_code) {
1571
17
            return error_code;
1572
17
          }
1573
2.23M
        }
1574
142k
      }
1575
162k
    }
1576
175k
  }
1577
1578
90.2k
  if (quant_mode && (param_type == CLD)) {
1579
3.35k
    if (db_in == 0 || db_1 == 0 || db_2 == 0)
1580
13
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_MPS_PARAM;
1581
1582
14.5k
    for (ps = 0; ps < num_parameter_sets; ps++) {
1583
11.2k
      if (a_interpolate[ps] != 1) {
1584
9.65k
        if (ll_data->no_cmp_quant_coarse_xxx[param_idx][ps]) {
1585
1.65k
          ixheaacd_coarse_2_fine(output_idx_data[xtt_idx][ps], param_type, start_band,
1586
1.65k
                                 stop_band - start_band);
1587
1.65k
        }
1588
103k
        for (pb = start_band; pb < stop_band; pb++) {
1589
94.2k
          ll_data->no_cmp_quant_coarse_xxx[param_idx][ps] = 1;
1590
94.2k
          ixheaacd_factor_cld(&(output_idx_data[xtt_idx][ps][pb]), *db_in++, &(*db_1++),
1591
94.2k
                              &(*db_2++), quant_mode, ixheaacd_mps_dec_bitdec_tables);
1592
94.2k
          ia_mps_dec_deq(output_idx_data[xtt_idx][ps][pb], param_type,
1593
94.2k
                         &(output_data[xtt_idx][ps][pb]), ixheaacd_mps_dec_bitdec_tables);
1594
94.2k
        }
1595
9.65k
      }
1596
11.2k
    }
1597
3.34k
  }
1598
1599
90.2k
  i1 = 0;
1600
90.2k
  x1 = 0;
1601
90.2k
  i2 = 0;
1602
264k
  for (i = 0; i < num_parameter_sets; i++) {
1603
174k
    if (a_interpolate[i] != 1) {
1604
162k
      i1 = i;
1605
162k
    }
1606
174k
    i2 = i;
1607
189k
    while (a_interpolate[i2] == 1) {
1608
15.0k
      i2++;
1609
15.0k
    }
1610
174k
    x1 = param_slot[i1];
1611
174k
    xi = param_slot[i];
1612
174k
    x2 = param_slot[i2];
1613
1614
174k
    if (a_interpolate[i] == 1) {
1615
12.3k
      if (i2 >= num_parameter_sets) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_SETS;
1616
12.1k
      if (ll_data->no_cmp_quant_coarse_xxx[param_idx][i1]) {
1617
3.72k
        ixheaacd_coarse_2_fine(output_idx_data[xtt_idx][i1], param_type, start_band,
1618
3.72k
                               stop_band - start_band);
1619
3.72k
      }
1620
12.1k
      if (ll_data->no_cmp_quant_coarse_xxx[param_idx][i2]) {
1621
4.22k
        ixheaacd_coarse_2_fine(output_idx_data[xtt_idx][i2], param_type, start_band,
1622
4.22k
                               stop_band - start_band);
1623
4.22k
      }
1624
176k
      for (band = start_band; band < stop_band; band++) {
1625
164k
        WORD32 yi = 0, y1, y2;
1626
164k
        y1 = output_idx_data[xtt_idx][i1][band];
1627
164k
        y2 = output_idx_data[xtt_idx][i2][band];
1628
1629
164k
        if (x2 != x1) {
1630
164k
          yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1631
164k
        }
1632
164k
        output_idx_data[xtt_idx][i][band] = yi;
1633
164k
        ia_mps_dec_deq(output_idx_data[xtt_idx][i][band], param_type,
1634
164k
                       &(output_data[xtt_idx][i][band]), ixheaacd_mps_dec_bitdec_tables);
1635
164k
      }
1636
12.1k
    }
1637
174k
  }
1638
1639
90.0k
  ixheaacd_mps_check_index_bounds(output_idx_data, num_parameter_sets, start_band,
1640
90.0k
                                  stop_band, param_type, xtt_idx);
1641
1642
90.0k
  if (extend_frame) {
1643
436k
    for (band = start_band; band < stop_band; band++) {
1644
413k
      output_data[xtt_idx][num_parameter_sets][band] =
1645
413k
          output_data[xtt_idx][num_parameter_sets - 1][band];
1646
413k
      output_idx_data[xtt_idx][num_parameter_sets][band] =
1647
413k
          output_idx_data[xtt_idx][num_parameter_sets - 1][band];
1648
413k
    }
1649
23.3k
  }
1650
90.0k
  return IA_NO_ERROR;
1651
90.2k
}
1652
1653
static VOID ixheaacd_get_parameters_mapping(
1654
    WORD32 bs_parameter_bands, WORD32 *mapping,
1655
0
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
1656
0
  switch (bs_parameter_bands) {
1657
0
    case PARAMETER_BANDS_4:
1658
0
      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_4_to_28;
1659
0
      break;
1660
0
    case PARAMETER_BANDS_5:
1661
0
      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_5_to_28;
1662
0
      break;
1663
0
    case PARAMETER_BANDS_7:
1664
0
      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_7_to_28;
1665
0
      break;
1666
0
    case PARAMETER_BANDS_10:
1667
0
      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_10_to_28;
1668
0
      break;
1669
0
    case PARAMETER_BANDS_14:
1670
0
      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_14_to_28;
1671
0
      break;
1672
0
    case PARAMETER_BANDS_20:
1673
0
      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_20_to_28;
1674
0
      break;
1675
0
    case PARAMETER_BANDS_28:
1676
0
      break;
1677
0
    default:
1678
0
      break;
1679
0
  }
1680
0
  return;
1681
0
}
1682
1683
static VOID ixheaacd_map_number_of_bands_to_28_bands(
1684
    WORD32 bands, WORD32 bs_parameter_bands, WORD32 *bands28,
1685
0
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
1686
0
  WORD32 *mapping = NULL;
1687
0
  WORD32 pb;
1688
1689
0
  *bands28 = bands;
1690
1691
0
  ixheaacd_get_parameters_mapping(bs_parameter_bands, mapping, ixheaacd_mps_dec_bitdec_tables);
1692
1693
0
  if (mapping != NULL) {
1694
0
    for (pb = 0; pb < MAX_PARAMETER_BANDS; pb++) {
1695
0
      if (mapping[pb] == bands) {
1696
0
        break;
1697
0
      }
1698
0
    }
1699
0
    *bands28 = pb;
1700
0
  }
1701
0
  return;
1702
0
}
1703
1704
static VOID ixheaacd_map_data_to_28_bands(
1705
    WORD32 *data, WORD32 bs_parameter_bands,
1706
0
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
1707
0
  WORD32 *mapping = NULL;
1708
0
  WORD32 pb;
1709
1710
0
  ixheaacd_get_parameters_mapping(bs_parameter_bands, mapping, ixheaacd_mps_dec_bitdec_tables);
1711
1712
0
  if (mapping != NULL) {
1713
0
    for (pb = MAX_PARAMETER_BANDS - 1; pb >= 0; pb--) {
1714
0
      data[pb] = data[mapping[pb]];
1715
0
    }
1716
0
  }
1717
0
  return;
1718
0
}
1719
1720
static IA_ERRORCODE ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mps_state)
1721
16.9k
{
1722
16.9k
  IA_ERRORCODE error_code = IA_NO_ERROR;
1723
16.9k
  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs;
1724
16.9k
  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
1725
16.9k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
1726
16.9k
  ia_mps_dec_bitdec_tables_struct *bitdec_table =
1727
16.9k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
1728
16.9k
  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
1729
1730
16.9k
  WORD32 i, num_parameter_sets, ott_idx, band;
1731
16.9k
  WORD32 num_ott_boxes;
1732
16.9k
  VOID *free_scratch;
1733
1734
16.9k
  WORD32 ps, pb;
1735
1736
16.9k
  WORD32 *tot_db;
1737
16.9k
  WORD32 *ott_vs_tot_db_fc;
1738
16.9k
  WORD32 *ott_vs_tot_db_s;
1739
16.9k
  WORD32 *ott_vs_tot_db_f;
1740
16.9k
  WORD32 *ott_vs_tot_db_c;
1741
16.9k
  WORD32 *ott_vs_tot_db_lr;
1742
16.9k
  WORD32 *ott_vs_tot_db_l;
1743
16.9k
  WORD32 *ott_vs_tot_db_r;
1744
16.9k
  WORD32 *tmp1;
1745
16.9k
  WORD32 *tmp2;
1746
1747
16.9k
  WORD32 bitstream_parameter_bands = curr_state->bitstream_parameter_bands;
1748
16.9k
  WORD32 *b_ott_bands = curr_state->bitstream_ott_bands;
1749
16.9k
  WORD32 *ott_cld_default = curr_state->ott_cld_default;
1750
16.9k
  WORD32 parameter_sets = curr_state->num_parameter_sets;
1751
16.9k
  WORD32 extend_frame = curr_state->extend_frame;
1752
16.9k
  WORD32 quant_mode = curr_state->quant_mode;
1753
1754
16.9k
  tot_db = pstr_mps_state->mps_scratch_mem_v;
1755
16.9k
  ott_vs_tot_db_fc =
1756
16.9k
      tot_db + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PSXPB, sizeof(*ott_vs_tot_db_fc), BYTE_ALIGN_8);
1757
16.9k
  ott_vs_tot_db_s = ott_vs_tot_db_fc + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1758
16.9k
                                           MAX_PSXPB, sizeof(*ott_vs_tot_db_s), BYTE_ALIGN_8);
1759
16.9k
  ott_vs_tot_db_f = ott_vs_tot_db_s + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1760
16.9k
                                          MAX_PSXPB, sizeof(*ott_vs_tot_db_f), BYTE_ALIGN_8);
1761
16.9k
  ott_vs_tot_db_c = ott_vs_tot_db_f + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1762
16.9k
                                          MAX_PSXPB, sizeof(*ott_vs_tot_db_c), BYTE_ALIGN_8);
1763
16.9k
  ott_vs_tot_db_lr = ott_vs_tot_db_c + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1764
16.9k
                                           MAX_PSXPB, sizeof(*ott_vs_tot_db_lr), BYTE_ALIGN_8);
1765
16.9k
  ott_vs_tot_db_l = ott_vs_tot_db_lr + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1766
16.9k
                                           MAX_PSXPB, sizeof(*ott_vs_tot_db_l), BYTE_ALIGN_8);
1767
16.9k
  ott_vs_tot_db_r = ott_vs_tot_db_l + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
1768
16.9k
                                          MAX_PSXPB, sizeof(*ott_vs_tot_db_r), BYTE_ALIGN_8);
1769
16.9k
  tmp1 = ott_vs_tot_db_r + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PSXPB, sizeof(*tmp1), BYTE_ALIGN_8);
1770
16.9k
  tmp2 = tmp1 + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PSXPB, sizeof(*tmp2), BYTE_ALIGN_8);
1771
16.9k
  free_scratch = tmp2 + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PSXPB, sizeof(*tmp2), BYTE_ALIGN_8);
1772
1773
16.9k
  p_cur_bs = pstr_mps_state->bs_frame;
1774
16.9k
  num_ott_boxes = curr_state->num_ott_boxes;
1775
1776
16.9k
  pb = MAX_PSXPB;
1777
3.80M
  for (i = 0; i < pb; i++) tot_db[i] = 0;
1778
1779
16.9k
  switch (curr_state->tree_config) {
1780
443
    case TREE_5151:
1781
443
      i = 0;
1782
443
      error_code = ixheaacd_map_index_data(
1783
443
          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
1784
443
          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
1785
443
          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1786
443
          quant_mode, tot_db, ott_vs_tot_db_fc, ott_vs_tot_db_s, bitdec_table, free_scratch);
1787
443
      if (error_code) return error_code;
1788
1789
438
      i = 1;
1790
438
      error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
1791
438
                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
1792
438
                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
1793
438
                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1794
438
                              quant_mode, ott_vs_tot_db_fc, ott_vs_tot_db_f, ott_vs_tot_db_c,
1795
438
                              bitdec_table, free_scratch);
1796
438
      if (error_code) return error_code;
1797
1798
435
      i = 2;
1799
435
      error_code = ixheaacd_map_index_data(
1800
435
          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
1801
435
          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
1802
435
          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1803
435
          quant_mode, ott_vs_tot_db_s, tmp1, tmp2, bitdec_table, free_scratch);
1804
435
      if (error_code) return error_code;
1805
1806
415
      i = 3;
1807
415
      error_code = ixheaacd_map_index_data(
1808
415
          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
1809
415
          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
1810
415
          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1811
415
          quant_mode, ott_vs_tot_db_f, tmp1, tmp2, bitdec_table, free_scratch);
1812
415
      if (error_code) return error_code;
1813
1814
414
      i = 4;
1815
414
      error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
1816
414
                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
1817
414
                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
1818
414
                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1819
414
                              quant_mode, tot_db, tmp1, tmp2, bitdec_table, free_scratch);
1820
414
      if (error_code) return error_code;
1821
1822
407
      break;
1823
1824
597
    case TREE_5152:
1825
597
      i = 0;
1826
597
      error_code = ixheaacd_map_index_data(
1827
597
          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
1828
597
          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
1829
597
          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1830
597
          quant_mode, tot_db, ott_vs_tot_db_lr, ott_vs_tot_db_c, bitdec_table, free_scratch);
1831
597
      if (error_code) return error_code;
1832
1833
588
      i = 1;
1834
588
      error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
1835
588
                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
1836
588
                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
1837
588
                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1838
588
                              quant_mode, ott_vs_tot_db_lr, ott_vs_tot_db_l, ott_vs_tot_db_r,
1839
588
                              bitdec_table, free_scratch);
1840
588
      if (error_code) return error_code;
1841
1842
582
      i = 2;
1843
582
      error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
1844
582
                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
1845
582
                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
1846
582
                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1847
582
                              quant_mode, tot_db, tmp1, tmp2, bitdec_table, free_scratch);
1848
582
      if (error_code) return error_code;
1849
1850
572
      i = 3;
1851
572
      error_code = ixheaacd_map_index_data(
1852
572
          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
1853
572
          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
1854
572
          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1855
572
          quant_mode, ott_vs_tot_db_l, tmp1, tmp2, bitdec_table, free_scratch);
1856
572
      if (error_code) return error_code;
1857
1858
566
      i = 4;
1859
566
      error_code = ixheaacd_map_index_data(
1860
566
          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
1861
566
          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
1862
566
          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1863
566
          quant_mode, ott_vs_tot_db_r, tmp1, tmp2, bitdec_table, free_scratch);
1864
566
      if (error_code) return error_code;
1865
551
      break;
1866
1867
15.8k
    default:
1868
52.6k
      for (i = 0; i < num_ott_boxes; i++) {
1869
36.8k
        error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
1870
36.8k
                                p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
1871
36.8k
                                p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
1872
36.8k
                                ott_cld_default[i], parameter_sets, param_slot, extend_frame,
1873
36.8k
                                (curr_state->tree_config == TREE_525) ? 0 : quant_mode, NULL,
1874
36.8k
                                NULL, NULL, bitdec_table, free_scratch);
1875
36.8k
        if (error_code) return error_code;
1876
36.8k
      }
1877
15.7k
      break;
1878
16.9k
  }
1879
1880
16.7k
  if (curr_state->one_icc == 1) {
1881
3.49k
    if (extend_frame == 0) {
1882
2.69k
      num_parameter_sets = parameter_sets;
1883
2.69k
    } else {
1884
803
      num_parameter_sets = parameter_sets + 1;
1885
803
    }
1886
1887
13.4k
    for (ott_idx = 1; ott_idx < num_ott_boxes; ott_idx++) {
1888
9.94k
      if (curr_state->ott_mode_lfe[ott_idx] == 0) {
1889
36.1k
        for (i = 0; i < num_parameter_sets; i++) {
1890
369k
          for (band = 0; band < bitstream_parameter_bands; band++) {
1891
342k
            p_cur_bs->cmp_ott_icc_idx[ott_idx][i][band] = p_cur_bs->cmp_ott_icc_idx[0][i][band];
1892
342k
          }
1893
27.0k
        }
1894
9.10k
      }
1895
9.94k
    }
1896
1897
16.8k
    for (ott_idx = 0; ott_idx < num_ott_boxes; ott_idx++) {
1898
13.4k
      if (curr_state->ott_mode_lfe[ott_idx] == 0) {
1899
10.2k
        error_code = ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
1900
10.2k
                                p_cur_bs->ott_icc_idx, p_cur_bs->cmp_ott_icc_idx,
1901
10.2k
                                p_cur_bs->ott_icc_diff_idx, ott_idx, p_cur_bs->ott_icc_idx_prev,
1902
10.2k
                                0, ICC, 0, b_ott_bands[ott_idx], curr_state->icc_default,
1903
10.2k
                                parameter_sets, param_slot, extend_frame, quant_mode, NULL, NULL,
1904
10.2k
                                NULL, bitdec_table, free_scratch);
1905
10.2k
        if (error_code) return error_code;
1906
10.2k
      }
1907
13.4k
    }
1908
13.2k
  } else {
1909
41.2k
    for (ott_idx = 0; ott_idx < num_ott_boxes; ott_idx++) {
1910
28.0k
      if (curr_state->ott_mode_lfe[ott_idx] == 0) {
1911
27.2k
        error_code = ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
1912
27.2k
                                p_cur_bs->ott_icc_idx, p_cur_bs->cmp_ott_icc_idx,
1913
27.2k
                                p_cur_bs->ott_icc_diff_idx, ott_idx, p_cur_bs->ott_icc_idx_prev,
1914
27.2k
                                ott_idx, ICC, 0, b_ott_bands[ott_idx], curr_state->icc_default,
1915
27.2k
                                parameter_sets, param_slot, extend_frame, quant_mode, NULL, NULL,
1916
27.2k
                                NULL, bitdec_table, free_scratch);
1917
27.2k
        if (error_code) return error_code;
1918
27.2k
      }
1919
28.0k
    }
1920
13.2k
  }
1921
1922
16.6k
  if (curr_state->up_mix_type == 2) {
1923
0
    WORD32 num_parameter_sets = parameter_sets;
1924
1925
0
    if (extend_frame) {
1926
0
      num_parameter_sets++;
1927
0
    }
1928
1929
0
    for (ott_idx = 0; ott_idx < curr_state->num_ott_boxes; ott_idx++) {
1930
0
      for (ps = 0; ps < num_parameter_sets; ps++) {
1931
0
        ixheaacd_map_data_to_28_bands(p_aux_struct->ott_cld[ott_idx][ps],
1932
0
                                      bitstream_parameter_bands, bitdec_table);
1933
0
        ixheaacd_map_data_to_28_bands(p_aux_struct->ott_icc[ott_idx][ps],
1934
0
                                      bitstream_parameter_bands, bitdec_table);
1935
0
      }
1936
0
    }
1937
0
  }
1938
16.6k
  return error_code;
1939
16.7k
}
1940
1941
static IA_ERRORCODE ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mps_state)
1942
16.6k
{
1943
16.6k
  IA_ERRORCODE error_code = IA_NO_ERROR;
1944
16.6k
  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs;
1945
16.6k
  ia_mps_dec_bitdec_tables_struct *bitdec_table =
1946
16.6k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
1947
16.6k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
1948
16.6k
  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
1949
1950
16.6k
  WORD32 num_bands;
1951
1952
16.6k
  WORD32 i, j, offset;
1953
16.6k
  WORD32 num_ttt_boxes;
1954
16.6k
  VOID *free_scratch;
1955
1956
16.6k
  p_cur_bs = pstr_mps_state->bs_frame;
1957
16.6k
  num_bands = pstr_mps_state->bitstream_parameter_bands;
1958
16.6k
  offset = pstr_mps_state->num_ott_boxes;
1959
16.6k
  num_ttt_boxes = pstr_mps_state->num_ttt_boxes;
1960
16.6k
  free_scratch = pstr_mps_state->mps_scratch_mem_v;
1961
1962
19.6k
  for (i = 0; i < num_ttt_boxes; i++) {
1963
2.99k
    for (j = 0;
1964
6.69k
         (j < 2) &&
1965
5.62k
         p_aux_struct->ttt_config[j][i].start_band < p_aux_struct->ttt_config[j][i].stop_band;
1966
3.76k
         j++) {
1967
3.76k
      if (p_aux_struct->ttt_config[j][i].mode < 2) {
1968
1.27k
        error_code = ixheaacd_map_index_data(
1969
1.27k
            &p_cur_bs->cpc_lossless_data, p_aux_struct->ttt_cpc_1, p_cur_bs->ttt_cpc_1_idx,
1970
1.27k
            p_cur_bs->cmp_ttt_cpc_1_idx, NULL, i, p_cur_bs->ttt_cpc_1_idx_prev,
1971
1.27k
            offset + 4 * i + 2 * j, CPC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
1972
1.27k
            p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->cpc_default,
1973
1.27k
            pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
1974
1.27k
            pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
1975
1.27k
        if (error_code) return error_code;
1976
1977
1.25k
        error_code = ixheaacd_map_index_data(
1978
1.25k
            &p_cur_bs->cpc_lossless_data, p_aux_struct->ttt_cpc_2, p_cur_bs->ttt_cpc_2_idx,
1979
1.25k
            p_cur_bs->cmp_ttt_cpc_2_idx, NULL, i, p_cur_bs->ttt_cpc_2_idx_prev,
1980
1.25k
            offset + 4 * i + 1 + 2 * j, CPC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
1981
1.25k
            p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->cpc_default,
1982
1.25k
            pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
1983
1.25k
            pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
1984
1.25k
        if (error_code) return error_code;
1985
1986
1.24k
        error_code = ixheaacd_map_index_data(
1987
1.24k
            &p_cur_bs->icc_lossless_data, p_aux_struct->ttt_icc, p_cur_bs->ttt_icc_idx,
1988
1.24k
            p_cur_bs->cmp_ttt_icc_idx, NULL, i, p_cur_bs->ttt_icc_idx_prev,
1989
1.24k
            offset + 4 * i + 2 * j, ICC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
1990
1.24k
            p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->icc_default,
1991
1.24k
            pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
1992
1.24k
            pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
1993
1.24k
        if (error_code) return error_code;
1994
1.24k
      }
1995
1996
2.49k
      else {
1997
2.49k
        error_code = ixheaacd_map_index_data(
1998
2.49k
            &p_cur_bs->cld_lossless_data, p_aux_struct->ttt_cld_1, p_cur_bs->ttt_cld_1_idx,
1999
2.49k
            p_cur_bs->cmp_ttt_cld_1_idx, NULL, i, p_cur_bs->ttt_cld_1_idx_prev,
2000
2.49k
            offset + 4 * i + 2 * j, CLD, p_aux_struct->ttt_config[j][i].bitstream_start_band,
2001
2.49k
            p_aux_struct->ttt_config[j][i].bitstream_stop_band,
2002
2.49k
            pstr_mps_state->ttt_cld_1_default[i], pstr_mps_state->num_parameter_sets, param_slot,
2003
2.49k
            pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL, NULL,
2004
2.49k
            bitdec_table, free_scratch);
2005
2.49k
        if (error_code) return error_code;
2006
2007
2.47k
        error_code = ixheaacd_map_index_data(
2008
2.47k
            &p_cur_bs->cld_lossless_data, p_aux_struct->ttt_cld_2, p_cur_bs->ttt_cld_2_idx,
2009
2.47k
            p_cur_bs->cmp_ttt_cld_2_idx, NULL, i, p_cur_bs->ttt_cld_2_idx_prev,
2010
2.47k
            offset + 4 * i + 1 + 2 * j, CLD, p_aux_struct->ttt_config[j][i].bitstream_start_band,
2011
2.47k
            p_aux_struct->ttt_config[j][i].bitstream_stop_band,
2012
2.47k
            pstr_mps_state->ttt_cld_2_default[i], pstr_mps_state->num_parameter_sets, param_slot,
2013
2.47k
            pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL, NULL,
2014
2.47k
            bitdec_table, free_scratch);
2015
2.47k
        if (error_code) return error_code;
2016
2.47k
      }
2017
2018
3.70k
      if (pstr_mps_state->up_mix_type == 2) {
2019
0
        WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
2020
0
        WORD32 ps;
2021
2022
0
        if (pstr_mps_state->extend_frame) {
2023
0
          num_parameter_sets++;
2024
0
        }
2025
2026
0
        for (ps = 0; ps < num_parameter_sets; ps++) {
2027
0
          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cpc_1[i][ps], num_bands, bitdec_table);
2028
0
          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cpc_2[i][ps], num_bands, bitdec_table);
2029
0
          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cld_1[i][ps], num_bands, bitdec_table);
2030
0
          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cld_2[i][ps], num_bands, bitdec_table);
2031
0
          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_icc[i][ps], num_bands, bitdec_table);
2032
0
        }
2033
0
      }
2034
3.70k
    }
2035
2.99k
  }
2036
16.6k
  return error_code;
2037
16.6k
}
2038
2039
16.6k
static VOID ixheaacd_decode_and_map_frame_smg(ia_heaac_mps_state_struct *pstr_mps_state) {
2040
16.6k
  ia_mps_dec_smoothing_state_struct *smooth_state =
2041
16.6k
      pstr_mps_state->mps_persistent_mem.smooth_state;
2042
16.6k
  ia_mps_dec_bitdec_tables_struct *bitdec_table =
2043
16.6k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
2044
16.6k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
2045
16.6k
  WORD32 *smg_time = p_aux_struct->smg_time;
2046
16.6k
  WORD32 ps, pb, pg, pb_stride, data_bands, pb_start, pb_stop;
2047
16.6k
  WORD32 *a_group_to_band;
2048
16.6k
  VOID *free_scratch;
2049
16.6k
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
2050
16.6k
  pstr_mps_state->smooth_control = frame->bs_smooth_control;
2051
16.6k
  a_group_to_band = pstr_mps_state->mps_scratch_mem_v;
2052
16.6k
  free_scratch =
2053
16.6k
      a_group_to_band + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_BANDS_PLUS_1,
2054
16.6k
                                                      sizeof(*a_group_to_band), BYTE_ALIGN_8);
2055
2056
16.6k
  if (pstr_mps_state->smooth_control) {
2057
44.2k
    for (ps = 0; ps < pstr_mps_state->num_parameter_sets; ps++) {
2058
27.6k
      switch (frame->bs_smooth_mode[ps]) {
2059
14.7k
        case SMOOTH_MODE_0:
2060
14.7k
          smg_time[ps] = 256;
2061
262k
          for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
2062
247k
            p_aux_struct->smg_data[ps][pb] = 0;
2063
247k
          }
2064
14.7k
          break;
2065
2066
6.00k
        case SMOOTH_MODE_1:
2067
6.00k
          if (ps > 0)
2068
1.06k
            smg_time[ps] = smg_time[ps - 1];
2069
4.94k
          else
2070
4.94k
            smg_time[ps] = smooth_state->prev_smg_time;
2071
2072
118k
          for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
2073
112k
            if (ps > 0)
2074
16.6k
              p_aux_struct->smg_data[ps][pb] = p_aux_struct->smg_data[ps - 1][pb];
2075
95.4k
            else
2076
95.4k
              p_aux_struct->smg_data[ps][pb] = smooth_state->prev_smg_data[pb];
2077
112k
          }
2078
6.00k
          break;
2079
2080
4.22k
        case SMOOTH_MODE_2:
2081
4.22k
          smg_time[ps] = bitdec_table->smg_time_table[frame->bs_smooth_time[ps]];
2082
80.9k
          for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
2083
76.7k
            p_aux_struct->smg_data[ps][pb] = 1;
2084
76.7k
          }
2085
4.22k
          break;
2086
2087
2.68k
        case SMOOTH_MODE_3:
2088
2.68k
          smg_time[ps] = bitdec_table->smg_time_table[frame->bs_smooth_time[ps]];
2089
2.68k
          pb_stride = bitdec_table->pb_stride_table[frame->bs_freq_res_stride_smg[ps]];
2090
2.68k
          data_bands = (pstr_mps_state->bitstream_parameter_bands - 1) / pb_stride + 1;
2091
2.68k
          ixheaacd_create_mapping(a_group_to_band, 0, pstr_mps_state->bitstream_parameter_bands,
2092
2.68k
                                  pb_stride, free_scratch);
2093
14.3k
          for (pg = 0; pg < data_bands; pg++) {
2094
11.6k
            pb_start = a_group_to_band[pg];
2095
11.6k
            pb_stop = a_group_to_band[pg + 1];
2096
46.8k
            for (pb = pb_start; pb < pb_stop; pb++) {
2097
35.1k
              p_aux_struct->smg_data[ps][pb] = frame->bs_smg_data[ps][pg];
2098
35.1k
            }
2099
11.6k
          }
2100
2.68k
          break;
2101
2102
0
        default:
2103
0
          break;
2104
27.6k
      }
2105
27.6k
    }
2106
2107
16.6k
    smooth_state->prev_smg_time = smg_time[pstr_mps_state->num_parameter_sets - 1];
2108
316k
    for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
2109
299k
      smooth_state->prev_smg_data[pb] =
2110
299k
          p_aux_struct->smg_data[pstr_mps_state->num_parameter_sets - 1][pb];
2111
299k
    }
2112
2113
16.6k
    if (pstr_mps_state->extend_frame) {
2114
4.56k
      smg_time[pstr_mps_state->num_parameter_sets] =
2115
4.56k
          smg_time[pstr_mps_state->num_parameter_sets - 1];
2116
90.4k
      for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
2117
85.8k
        p_aux_struct->smg_data[pstr_mps_state->num_parameter_sets][pb] =
2118
85.8k
            p_aux_struct->smg_data[pstr_mps_state->num_parameter_sets - 1][pb];
2119
85.8k
      }
2120
4.56k
    }
2121
2122
16.6k
    if (pstr_mps_state->up_mix_type == 2) {
2123
0
      WORD32 *mapping = NULL;
2124
0
      ixheaacd_get_parameters_mapping(pstr_mps_state->bitstream_parameter_bands, mapping,
2125
0
                                      bitdec_table);
2126
2127
0
      if (mapping != NULL) {
2128
0
        WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
2129
2130
0
        if (pstr_mps_state->extend_frame) {
2131
0
          num_parameter_sets++;
2132
0
        }
2133
2134
0
        for (ps = 0; ps < num_parameter_sets; ps++) {
2135
0
          for (pb = MAX_PARAMETER_BANDS - 1; pb >= 0; pb--) {
2136
0
            p_aux_struct->smg_data[ps][pb] = p_aux_struct->smg_data[ps][mapping[pb]];
2137
0
          }
2138
0
        }
2139
0
      }
2140
0
    }
2141
16.6k
  }
2142
16.6k
  return;
2143
16.6k
}
2144
2145
static IA_ERRORCODE ixheaacd_decode_and_map_frame_arbdmx(
2146
1.50k
  ia_heaac_mps_state_struct *pstr_mps_state) {
2147
1.50k
  IA_ERRORCODE error_code = IA_NO_ERROR;
2148
1.50k
  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
2149
1.50k
  ia_mps_dec_bitdec_tables_struct *bitdec_table =
2150
1.50k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
2151
1.50k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
2152
1.50k
  WORD32 *param_slot = p_aux_struct->param_slot;
2153
1.50k
  WORD32 offset = pstr_mps_state->num_ott_boxes + 4 * pstr_mps_state->num_ttt_boxes;
2154
1.50k
  WORD32 ch;
2155
2156
1.50k
  VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
2157
2158
3.74k
  for (ch = 0; ch < pstr_mps_state->num_input_channels; ch++) {
2159
2.26k
    error_code = ixheaacd_map_index_data(
2160
2.26k
        &frame->cld_lossless_data, p_aux_struct->arbdmx_gain, frame->arbdmx_gain_idx,
2161
2.26k
        frame->cmp_arbdmx_gain_idx, NULL, ch, frame->arbdmx_gain_idx_prev, offset + ch, CLD, 0,
2162
2.26k
        pstr_mps_state->bitstream_parameter_bands, pstr_mps_state->arbdmx_gain_default,
2163
2.26k
        pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame, 0, NULL,
2164
2.26k
        NULL, NULL, bitdec_table, scratch);
2165
2.26k
    if (error_code) return error_code;
2166
2167
2.24k
    p_aux_struct->arbdmx_residual_abs[ch] = frame->bs_arbitrary_downmix_residual_abs[ch];
2168
2.24k
    p_aux_struct->arbdmx_alpha_upd_set[ch] =
2169
2.24k
        frame->bs_arbitrary_downmix_residual_alpha_update_set[ch];
2170
2171
2.24k
    if (pstr_mps_state->up_mix_type == 2) {
2172
0
      WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
2173
0
      WORD32 ps;
2174
2175
0
      if (pstr_mps_state->extend_frame) {
2176
0
        num_parameter_sets++;
2177
0
      }
2178
2179
0
      for (ps = 0; ps < num_parameter_sets; ps++) {
2180
0
        ixheaacd_map_data_to_28_bands(p_aux_struct->arbdmx_gain[ch][ps],
2181
0
                                      pstr_mps_state->bitstream_parameter_bands, bitdec_table);
2182
0
      }
2183
0
    }
2184
2.24k
  }
2185
1.48k
  return error_code;
2186
1.50k
}
2187
2188
static IA_ERRORCODE ixheaacd_decode_and_map_frame_arb_tree(
2189
17
  ia_heaac_mps_state_struct *pstr_mps_state) {
2190
17
  IA_ERRORCODE error_code = IA_NO_ERROR;
2191
17
  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
2192
17
  ia_mps_spatial_bs_config_struct *p_config = &(pstr_mps_state->bs_config);
2193
17
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
2194
17
  WORD32 *param_slot = p_aux_struct->param_slot;
2195
17
  WORD32 offset = pstr_mps_state->num_ott_boxes;
2196
2197
17
  VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
2198
2199
17
  WORD32 i;
2200
2201
30
  for (i = 0; i < p_config->num_ott_boxes_at; i++) {
2202
14
    error_code = ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
2203
14
                            p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, offset + i,
2204
14
                            p_cur_bs->ott_cld_idx_prev, offset + i, CLD, 0,
2205
14
                            p_config->bs_ott_bands_at[i], p_config->bs_ott_default_cld_at[i],
2206
14
                            pstr_mps_state->num_parameter_sets, param_slot,
2207
14
                            pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL,
2208
14
                            NULL, pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr, scratch);
2209
14
    if (error_code) return error_code;
2210
14
  }
2211
16
  return error_code;
2212
17
}
2213
2214
16.9k
IA_ERRORCODE ixheaacd_decode_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
2215
16.9k
  IA_ERRORCODE error_code = IA_NO_ERROR;
2216
16.9k
  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
2217
16.9k
  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
2218
2219
16.9k
  pstr_mps_state->extend_frame = 0;
2220
16.9k
  if (param_slot[pstr_mps_state->num_parameter_sets - 1] != pstr_mps_state->time_slots - 1) {
2221
4.67k
    pstr_mps_state->extend_frame = 1;
2222
4.67k
  }
2223
16.9k
  if (pstr_mps_state->extend_frame)
2224
4.67k
  {
2225
4.67k
    if (pstr_mps_state->num_parameter_sets == MAX_PARAMETER_SETS) {
2226
11
      if (pstr_mps_state->ec_flag)
2227
0
        pstr_mps_state->num_parameter_sets = 1;
2228
11
      else
2229
11
        return IA_FATAL_ERROR;
2230
11
    }
2231
4.67k
  }
2232
2233
16.9k
  error_code = ixheaacd_decode_and_map_frame_ott(pstr_mps_state);
2234
16.9k
  if (error_code)
2235
226
  {
2236
226
    if (pstr_mps_state->ec_flag)
2237
0
    {
2238
0
      pstr_mps_state->frame_ok = 0;
2239
0
      for (WORD32 idx = 0; idx < MAX_NUM_OTT; idx++)
2240
0
      {
2241
0
        ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ott_cld_idx,
2242
0
            pstr_mps_state->num_parameter_sets, 0, pstr_mps_state->bitstream_ott_bands[idx],
2243
0
            CLD, idx);
2244
0
        ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ott_icc_idx,
2245
0
            pstr_mps_state->num_parameter_sets, 0, pstr_mps_state->bitstream_ott_bands[idx],
2246
0
            ICC, idx);
2247
0
      }
2248
0
    }
2249
226
    else
2250
226
      return error_code;
2251
226
  }
2252
2253
16.6k
  error_code = ixheaacd_decode_and_map_frame_ttt(pstr_mps_state);
2254
16.6k
  if (error_code)
2255
59
  {
2256
59
    if (pstr_mps_state->ec_flag)
2257
0
    {
2258
0
      pstr_mps_state->frame_ok = 0;
2259
0
      ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ttt_icc_idx,
2260
0
          pstr_mps_state->num_parameter_sets, 0, MAX_PARAMETER_BANDS,
2261
0
          ICC, 0);
2262
0
    }
2263
59
    else
2264
59
      return error_code;
2265
59
  }
2266
2267
16.6k
  ixheaacd_decode_and_map_frame_smg(pstr_mps_state);
2268
16.6k
  if (p_bs_config->arbitrary_tree != 0) {
2269
17
    error_code = ixheaacd_decode_and_map_frame_arb_tree(pstr_mps_state);
2270
17
    if (error_code)
2271
1
    {
2272
1
      if (pstr_mps_state->ec_flag)
2273
0
      {
2274
0
        pstr_mps_state->frame_ok = 0;
2275
0
        for (WORD32 idx = 0; idx < MAX_NUM_OTT; idx++)
2276
0
        {
2277
0
          ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->ott_cld_idx,
2278
0
              pstr_mps_state->num_parameter_sets, 0, MAX_PARAMETER_BANDS,
2279
0
              CLD, idx);
2280
0
        }
2281
0
      }
2282
1
      else
2283
1
        return error_code;
2284
1
    }
2285
17
  }
2286
2287
16.6k
  if (pstr_mps_state->arbitrary_downmix != 0) {
2288
1.50k
    error_code = ixheaacd_decode_and_map_frame_arbdmx(pstr_mps_state);
2289
1.50k
    if (error_code)
2290
19
    {
2291
19
      if (pstr_mps_state->ec_flag)
2292
0
      {
2293
0
        pstr_mps_state->frame_ok = 0;
2294
0
        for (WORD32 idx = 0; idx < MAX_INPUT_CHANNELS_MPS; idx++)
2295
0
        {
2296
0
          ixheaacd_mps_check_index_bounds(pstr_mps_state->bs_frame->arbdmx_gain_idx,
2297
0
              pstr_mps_state->num_parameter_sets, 0, MAX_PARAMETER_BANDS,
2298
0
              CLD, idx);
2299
0
        }
2300
0
      }
2301
19
      else
2302
19
        return error_code;
2303
19
    }
2304
1.50k
  }
2305
2306
16.6k
  if (pstr_mps_state->extend_frame) {
2307
4.56k
    pstr_mps_state->num_parameter_sets++;
2308
4.56k
    param_slot[pstr_mps_state->num_parameter_sets - 1] = pstr_mps_state->time_slots - 1;
2309
4.56k
  }
2310
16.6k
  return IA_NO_ERROR;
2311
16.6k
}
2312
2313
5.28k
IA_ERRORCODE ixheaacd_set_current_state_parameters(ia_heaac_mps_state_struct *pstr_mps_state) {
2314
5.28k
  WORD32 i;
2315
2316
5.28k
  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
2317
5.28k
  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
2318
5.28k
  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
2319
5.28k
  ia_mps_dec_bitdec_tables_struct *bitdec_table =
2320
5.28k
      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
2321
5.28k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
2322
5.28k
  WORD32 *b_ott_bands = curr_state->bitstream_ott_bands;
2323
2324
5.28k
  if (config->bs_sampling_freq_index == 15) {
2325
19
    curr_state->sampling_freq = config->bs_sampling_frequency;
2326
5.26k
  } else {
2327
5.26k
    curr_state->sampling_freq = bitdec_table->sampling_freq_table[config->bs_sampling_freq_index];
2328
5.26k
  }
2329
5.28k
  curr_state->time_slots = config->bs_frame_length + 1;
2330
5.28k
  curr_state->frame_length = curr_state->time_slots * curr_state->qmf_bands;
2331
5.28k
  curr_state->bitstream_parameter_bands = bitdec_table->freq_res_table[config->bs_freq_res];
2332
2333
5.28k
  curr_state->hybrid_bands = curr_state->qmf_bands - QMF_BANDS_TO_HYBRID + 10;
2334
5.28k
  curr_state->tp_hyb_band_border = 12;
2335
5.28k
  if (curr_state->hybrid_bands > 71) {
2336
2
    return IA_FATAL_ERROR;
2337
2
  }
2338
5.27k
  if (curr_state->up_mix_type == 2) {
2339
0
    curr_state->num_parameter_bands = MAX_PARAMETER_BANDS;
2340
5.27k
  } else {
2341
5.27k
    curr_state->num_parameter_bands = curr_state->bitstream_parameter_bands;
2342
5.27k
  }
2343
2344
5.27k
  switch (curr_state->num_parameter_bands) {
2345
656
    case PARAMETER_BANDS_4:
2346
26.3k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2347
25.6k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_4_to_71[i];
2348
25.6k
      }
2349
656
      break;
2350
402
    case PARAMETER_BANDS_5:
2351
24.2k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2352
23.8k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_5_to_71[i];
2353
23.8k
      }
2354
402
      break;
2355
30
    case PARAMETER_BANDS_7:
2356
1.32k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2357
1.29k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_7_to_71[i];
2358
1.29k
      }
2359
30
      break;
2360
123
    case PARAMETER_BANDS_10:
2361
5.11k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2362
4.98k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_10_to_71[i];
2363
4.98k
      }
2364
123
      break;
2365
1.69k
    case PARAMETER_BANDS_14:
2366
68.0k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2367
66.3k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_14_to_71[i];
2368
66.3k
      }
2369
1.69k
      break;
2370
2.05k
    case PARAMETER_BANDS_20:
2371
115k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2372
113k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_20_to_71[i];
2373
113k
      }
2374
2.05k
      break;
2375
320
    case PARAMETER_BANDS_28:
2376
12.8k
      for (i = 0; i < curr_state->hybrid_bands; i++) {
2377
12.5k
        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_28_to_71[i];
2378
12.5k
      }
2379
320
      break;
2380
0
    default:
2381
0
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_BANDS;
2382
5.27k
  };
2383
2384
5.27k
  curr_state->tree_config = config->bs_tree_config;
2385
2386
5.27k
  switch (curr_state->tree_config) {
2387
522
    case TREE_5151:
2388
1.03k
    case TREE_5152:
2389
2.63k
    case TREE_525:
2390
2.63k
      config->ui_channel_mask = FIVE_POINT_ONE_CHANNEL_MASK;
2391
2.63k
      break;
2392
304
    case TREE_7271:
2393
517
    case TREE_7571:
2394
517
      config->ui_channel_mask = SEVEN_POINT_ONE_CHANNEL_MASK1;
2395
517
      break;
2396
396
    case TREE_7272:
2397
2.12k
    case TREE_7572:
2398
2.12k
      config->ui_channel_mask = SEVEN_POINT_ONE_CHANNEL_MASK2;
2399
2.12k
      break;
2400
0
    default:
2401
0
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
2402
5.27k
  }
2403
2404
5.27k
  curr_state->num_ott_boxes =
2405
5.27k
      bitdec_table->tree_property_table[curr_state->tree_config].num_ott_boxes;
2406
5.27k
  curr_state->num_ttt_boxes =
2407
5.27k
      bitdec_table->tree_property_table[curr_state->tree_config].num_ttt_boxes;
2408
5.27k
  curr_state->num_input_channels =
2409
5.27k
      bitdec_table->tree_property_table[curr_state->tree_config].num_input_channels;
2410
5.27k
  curr_state->num_output_channels =
2411
5.27k
      bitdec_table->tree_property_table[curr_state->tree_config].num_output_channels;
2412
5.27k
  curr_state->quant_mode = config->bs_quant_mode;
2413
5.27k
  curr_state->one_icc = config->bs_one_icc;
2414
5.27k
  curr_state->arbitrary_downmix = config->bs_arbitrary_downmix;
2415
5.27k
  curr_state->residual_coding = config->bs_residual_coding;
2416
5.27k
  curr_state->smooth_config = config->bs_smooth_config;
2417
5.27k
  curr_state->mtx_inversion = config->bs_matrix_mode;
2418
5.27k
  curr_state->temp_shape_config = config->bs_temp_shape_config;
2419
5.27k
  curr_state->decorr_config = config->bs_decorr_config;
2420
5.27k
  curr_state->env_quant_mode = config->bs_env_quant_mode;
2421
5.27k
  curr_state->lfe_gain = bitdec_table->lfe_gain_table[config->bs_fixed_gain_lfe];
2422
5.27k
  curr_state->surround_gain = bitdec_table->surround_gain_table[config->bs_fixed_gain_sur];
2423
5.27k
  curr_state->clip_protect_gain = bitdec_table->clip_gain_table[config->bs_fixed_gain_dmx];
2424
2425
5.27k
  if (curr_state->up_mix_type == 2) {
2426
0
    curr_state->num_output_channels = 2;
2427
0
    curr_state->decorr_config = 0;
2428
0
  }
2429
2430
5.27k
  if (curr_state->up_mix_type == 3) {
2431
0
    curr_state->num_output_channels = 2;
2432
0
  }
2433
2434
5.27k
  if (p_bs_config->arbitrary_tree == 1)
2435
34
    curr_state->num_output_channels_at = p_bs_config->num_out_chan_at;
2436
5.24k
  else
2437
5.24k
    curr_state->num_output_channels_at = curr_state->num_output_channels;
2438
2439
5.27k
  p_bs_config->ui_out_channels = curr_state->num_output_channels_at;
2440
2441
5.27k
  curr_state->_3d_stereo_inversion = config->bs_3d_audio_mode;
2442
2443
5.27k
  if (curr_state->mtx_inversion == 1 || curr_state->_3d_stereo_inversion == 1)
2444
2.48k
    curr_state->m1_param_imag_present = 1;
2445
2446
22.6k
  for (i = 0; i < curr_state->num_ott_boxes; i++) {
2447
17.3k
    if (bitdec_table->tree_property_table[curr_state->tree_config].ott_mode_lfe[i]) {
2448
3.33k
      b_ott_bands[i] = config->bs_ott_bands[i];
2449
3.33k
      curr_state->ott_mode_lfe[i] = 1;
2450
14.0k
    } else {
2451
14.0k
      b_ott_bands[i] = curr_state->bitstream_parameter_bands;
2452
14.0k
      curr_state->ott_mode_lfe[i] = 0;
2453
14.0k
    }
2454
2455
17.3k
    if (curr_state->up_mix_type == 2) {
2456
0
      ixheaacd_map_number_of_bands_to_28_bands(b_ott_bands[i],
2457
0
                                               curr_state->bitstream_parameter_bands,
2458
0
                                               &p_aux_struct->num_ott_bands[i], bitdec_table);
2459
17.3k
    } else {
2460
17.3k
      p_aux_struct->num_ott_bands[i] = b_ott_bands[i];
2461
17.3k
    }
2462
17.3k
  }
2463
7.57k
  for (i = 0; i < curr_state->num_ttt_boxes; i++) {
2464
2.29k
    p_aux_struct->ttt_config[0][i].mode = config->bs_ttt_mode_low[i];
2465
2.29k
    p_aux_struct->ttt_config[1][i].mode = config->bs_ttt_mode_high[i];
2466
2.29k
    p_aux_struct->ttt_config[0][i].bitstream_start_band = 0;
2467
2.29k
    p_aux_struct->ttt_config[1][i].bitstream_stop_band = curr_state->bitstream_parameter_bands;
2468
2469
2.29k
    if (config->bs_ttt_dual_mode[i]) {
2470
1.64k
      p_aux_struct->ttt_config[0][i].bitstream_stop_band = config->bs_ttt_bands_low[i];
2471
1.64k
      p_aux_struct->ttt_config[1][i].bitstream_start_band = config->bs_ttt_bands_low[i];
2472
1.64k
    } else {
2473
656
      p_aux_struct->ttt_config[0][i].bitstream_stop_band = curr_state->bitstream_parameter_bands;
2474
656
      p_aux_struct->ttt_config[1][i].bitstream_start_band = curr_state->bitstream_parameter_bands;
2475
656
    }
2476
2477
2.29k
    if (curr_state->up_mix_type == 2) {
2478
0
      ixheaacd_map_number_of_bands_to_28_bands(
2479
0
          p_aux_struct->ttt_config[0][i].bitstream_start_band,
2480
0
          curr_state->bitstream_parameter_bands, &p_aux_struct->ttt_config[0][i].start_band,
2481
0
          bitdec_table);
2482
2483
0
      ixheaacd_map_number_of_bands_to_28_bands(p_aux_struct->ttt_config[0][i].bitstream_stop_band,
2484
0
                                               curr_state->bitstream_parameter_bands,
2485
0
                                               &p_aux_struct->ttt_config[0][i].stop_band,
2486
0
                                               bitdec_table);
2487
2488
0
      ixheaacd_map_number_of_bands_to_28_bands(
2489
0
          p_aux_struct->ttt_config[1][i].bitstream_start_band,
2490
0
          curr_state->bitstream_parameter_bands, &p_aux_struct->ttt_config[1][i].start_band,
2491
0
          bitdec_table);
2492
2493
0
      ixheaacd_map_number_of_bands_to_28_bands(p_aux_struct->ttt_config[1][i].bitstream_stop_band,
2494
0
                                               curr_state->bitstream_parameter_bands,
2495
0
                                               &p_aux_struct->ttt_config[1][i].stop_band,
2496
0
                                               bitdec_table);
2497
2.29k
    } else {
2498
2.29k
      p_aux_struct->ttt_config[0][i].start_band =
2499
2.29k
          p_aux_struct->ttt_config[0][i].bitstream_start_band;
2500
2.29k
      p_aux_struct->ttt_config[0][i].stop_band =
2501
2.29k
          p_aux_struct->ttt_config[0][i].bitstream_stop_band;
2502
2.29k
      p_aux_struct->ttt_config[1][i].start_band =
2503
2.29k
          p_aux_struct->ttt_config[1][i].bitstream_start_band;
2504
2.29k
      p_aux_struct->ttt_config[1][i].stop_band =
2505
2.29k
          p_aux_struct->ttt_config[1][i].bitstream_stop_band;
2506
2.29k
    }
2507
2.29k
  }
2508
5.27k
  curr_state->residual_coding = config->bs_residual_coding;
2509
5.27k
  curr_state->num_residual_signals = 0;
2510
5.27k
  if (curr_state->residual_coding) {
2511
4.16k
    for (i = 0; i < curr_state->num_ttt_boxes + curr_state->num_ott_boxes; i++) {
2512
3.35k
      if (config->bs_residual_present[i]) {
2513
1.13k
        curr_state->res_bands[i] = config->bs_residual_bands[i];
2514
1.13k
        curr_state->num_residual_signals++;
2515
2.22k
      } else {
2516
2.22k
        curr_state->res_bands[i] = 0;
2517
2.22k
      }
2518
2519
3.35k
      if (curr_state->up_mix_type == 2 || curr_state->up_mix_type == 3) {
2520
0
        curr_state->res_bands[i] = 0;
2521
0
      }
2522
3.35k
    }
2523
802
  }
2524
2525
5.27k
  curr_state->residual_frames_per_spatial_frame =
2526
5.27k
      p_bs_config->bs_residual_frames_per_spatial_frame + 1;
2527
5.27k
  if (curr_state->residual_frames_per_spatial_frame > 0) {
2528
5.27k
    WORD32 const *reciprocal_tab =
2529
5.27k
        pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->reciprocal;
2530
2531
5.27k
    WORD64 temp =
2532
5.27k
        (WORD64)(((WORD64)(p_bs_config->bs_frame_length + 1) *
2533
5.27k
                  (WORD64)reciprocal_tab[p_bs_config->bs_residual_frames_per_spatial_frame]) >>
2534
5.27k
                 28);
2535
5.27k
    curr_state->upd_qmf = (WORD32)temp;
2536
5.27k
    if (curr_state->upd_qmf != UPD_QMF_15 && curr_state->upd_qmf != UPD_QMF_16 &&
2537
3.49k
        curr_state->upd_qmf != UPD_QMF_32 && curr_state->upd_qmf != UPD_QMF_18 &&
2538
621
        curr_state->upd_qmf != UPD_QMF_30 && curr_state->upd_qmf != UPD_QMF_24)
2539
3
      return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_QMF_UPDATE;
2540
5.27k
  }
2541
2542
5.27k
  curr_state->arbdmx_residual_bands = config->bs_arbitrary_downmix_residual_bands;
2543
5.27k
  curr_state->arbdmx_frames_per_spatial_frame =
2544
5.27k
      config->bs_arbitrary_downmix_residual_frames_per_spatial_frame + 1;
2545
5.27k
  if (curr_state->arbdmx_frames_per_spatial_frame > 0) {
2546
5.27k
    curr_state->arbdmx_upd_qmf =
2547
5.27k
        curr_state->time_slots / curr_state->arbdmx_frames_per_spatial_frame;
2548
5.27k
    if (curr_state->arbdmx_upd_qmf != UPD_QMF_15 && curr_state->arbdmx_upd_qmf != UPD_QMF_16 &&
2549
3.48k
        curr_state->arbdmx_upd_qmf != UPD_QMF_32 && curr_state->arbdmx_upd_qmf != UPD_QMF_18 &&
2550
619
        curr_state->arbdmx_upd_qmf != UPD_QMF_30 && curr_state->arbdmx_upd_qmf != UPD_QMF_24)
2551
1
      return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_QMF_UPDATE;
2552
2553
5.27k
    if ((curr_state->arbdmx_upd_qmf * 1.5f) > (curr_state->upd_qmf * 2))
2554
1
      return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_QMF_UPDATE;
2555
5.27k
  }
2556
2557
5.27k
  curr_state->cpc_default = 10;
2558
5.27k
  curr_state->ttt_cld_1_default[0] = 15;
2559
5.27k
  curr_state->ttt_cld_2_default[0] = 0;
2560
5.27k
  curr_state->icc_default = 0;
2561
5.27k
  curr_state->arbdmx_gain_default = 0;
2562
2563
5.27k
  if (curr_state->_3d_stereo_inversion) {
2564
4
    if (config->bs_3d_audio_hrtf_set == 0) {
2565
3
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_HRTF_SET;
2566
3
    } else {
2567
1
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_HRTF_SET;
2568
1
    }
2569
4
  }
2570
2571
5.26k
  switch (curr_state->tree_config) {
2572
522
    case TREE_5151:
2573
522
      curr_state->num_direct_signals = 1;
2574
522
      curr_state->num_decor_signals = 4;
2575
2576
522
      if (curr_state->up_mix_type == 2) {
2577
0
        curr_state->num_decor_signals = 1;
2578
0
      }
2579
2580
522
      if (curr_state->up_mix_type == 3) {
2581
0
        curr_state->num_decor_signals = 3;
2582
0
      }
2583
2584
522
      curr_state->num_x_channels = 1;
2585
522
      if (curr_state->arbitrary_downmix == 2) {
2586
219
        curr_state->num_x_channels += 1;
2587
219
      }
2588
522
      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
2589
522
      curr_state->num_w_channels = curr_state->num_v_channels;
2590
522
      curr_state->w_start_residual_idx = 0;
2591
522
      curr_state->ott_cld_default[0] = 15;
2592
522
      curr_state->ott_cld_default[1] = 15;
2593
522
      curr_state->ott_cld_default[2] = 0;
2594
522
      curr_state->ott_cld_default[3] = 0;
2595
522
      curr_state->ott_cld_default[4] = 15;
2596
522
      break;
2597
513
    case TREE_5152:
2598
513
      curr_state->num_direct_signals = 1;
2599
513
      curr_state->num_decor_signals = 4;
2600
2601
513
      if (curr_state->up_mix_type == 2) {
2602
0
        curr_state->num_decor_signals = 1;
2603
0
      }
2604
2605
513
      if (curr_state->up_mix_type == 3) {
2606
0
        curr_state->num_decor_signals = 2;
2607
0
      }
2608
2609
513
      curr_state->num_x_channels = 1;
2610
513
      if (curr_state->arbitrary_downmix == 2) {
2611
14
        curr_state->num_x_channels += 1;
2612
14
      }
2613
513
      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
2614
513
      curr_state->num_w_channels = curr_state->num_v_channels;
2615
513
      curr_state->w_start_residual_idx = 0;
2616
513
      curr_state->ott_cld_default[0] = 15;
2617
513
      curr_state->ott_cld_default[1] = 0;
2618
513
      curr_state->ott_cld_default[2] = 15;
2619
513
      curr_state->ott_cld_default[3] = 15;
2620
513
      curr_state->ott_cld_default[4] = 15;
2621
513
      break;
2622
1.59k
    case TREE_525:
2623
1.59k
      curr_state->num_direct_signals = 3;
2624
2625
4.78k
      for (i = 0; i < 2; i++) {
2626
3.18k
        switch (p_aux_struct->ttt_config[i][0].mode) {
2627
1.34k
          case TTT_MODE_0:
2628
1.34k
            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 1;
2629
1.34k
            curr_state->num_decor_signals = 3;
2630
1.34k
            break;
2631
316
          case TTT_MODE_1:
2632
507
          case TTT_MODE_2:
2633
739
          case TTT_MODE_3:
2634
1.15k
          case TTT_MODE_4:
2635
1.45k
          case TTT_MODE_5:
2636
1.45k
            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 0;
2637
1.45k
            curr_state->num_decor_signals = 2;
2638
1.45k
            break;
2639
392
          default:
2640
392
            if (p_bs_config->bs_ttt_mode_low[0] <= 1)
2641
1
              return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TTT_MODE;
2642
391
            break;
2643
3.18k
        }
2644
3.18k
      }
2645
2646
1.59k
      if (curr_state->residual_coding == 1) {
2647
676
        curr_state->num_x_channels = 3;
2648
917
      } else {
2649
917
        curr_state->num_x_channels = 2;
2650
917
      }
2651
2652
1.59k
      if (curr_state->arbitrary_downmix == 2) {
2653
48
        curr_state->num_x_channels = 5;
2654
48
      }
2655
2656
1.59k
      if (curr_state->up_mix_type == 2) {
2657
0
        curr_state->num_direct_signals = 2;
2658
0
        curr_state->num_decor_signals = 0;
2659
0
        curr_state->num_x_channels = 2;
2660
2661
0
        if (curr_state->arbitrary_downmix == 2) {
2662
0
          curr_state->num_direct_signals = 4;
2663
0
          curr_state->num_x_channels = 5;
2664
0
        }
2665
0
      }
2666
2667
1.59k
      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
2668
1.59k
      curr_state->num_w_channels = curr_state->num_v_channels;
2669
1.59k
      curr_state->w_start_residual_idx = 1;
2670
1.59k
      curr_state->ott_cld_default[0] = 15;
2671
1.59k
      curr_state->ott_cld_default[1] = 15;
2672
1.59k
      curr_state->ott_cld_default[2] = 15;
2673
1.59k
      break;
2674
303
    case TREE_7271:
2675
698
    case TREE_7272:
2676
698
      curr_state->num_direct_signals = 3;
2677
2678
2.09k
      for (i = 0; i < 2; i++) {
2679
1.39k
        switch (p_aux_struct->ttt_config[i][0].mode) {
2680
523
          case TTT_MODE_0:
2681
523
            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 1;
2682
523
            curr_state->num_decor_signals = 5;
2683
523
            break;
2684
99
          case TTT_MODE_1:
2685
247
          case TTT_MODE_2:
2686
439
          case TTT_MODE_3:
2687
627
          case TTT_MODE_4:
2688
689
          case TTT_MODE_5:
2689
689
            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 0;
2690
689
            curr_state->num_decor_signals = 5;
2691
689
            break;
2692
184
          default:
2693
184
            if (p_bs_config->bs_ttt_mode_low[0] <= 1)
2694
1
              return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TTT_MODE;
2695
183
            break;
2696
1.39k
        }
2697
1.39k
      }
2698
2699
697
      if (curr_state->residual_coding == 1) {
2700
54
        curr_state->num_x_channels = 3;
2701
643
      } else {
2702
643
        curr_state->num_x_channels = 2;
2703
643
      }
2704
2705
697
      if (curr_state->arbitrary_downmix == 2) {
2706
45
        curr_state->num_x_channels = 5;
2707
45
      }
2708
2709
697
      if (curr_state->up_mix_type == 2) {
2710
0
        curr_state->num_direct_signals = 2;
2711
0
        curr_state->num_decor_signals = 0;
2712
0
        curr_state->num_x_channels = 2;
2713
2714
0
        if (curr_state->arbitrary_downmix == 2) {
2715
0
          curr_state->num_direct_signals = 4;
2716
0
          curr_state->num_x_channels = 5;
2717
0
        }
2718
0
      }
2719
2720
697
      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
2721
697
      curr_state->num_w_channels = curr_state->num_v_channels;
2722
697
      curr_state->w_start_residual_idx = 1;
2723
697
      curr_state->ott_cld_default[0] = 15;
2724
697
      curr_state->ott_cld_default[1] = 15;
2725
697
      curr_state->ott_cld_default[2] = 15;
2726
697
      curr_state->ott_cld_default[3] = 15;
2727
697
      curr_state->ott_cld_default[4] = 15;
2728
697
      break;
2729
213
    case TREE_7571:
2730
1.94k
    case TREE_7572:
2731
1.94k
      curr_state->num_direct_signals = 6;
2732
1.94k
      curr_state->num_decor_signals = 2;
2733
1.94k
      curr_state->num_x_channels = 6;
2734
1.94k
      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
2735
1.94k
      curr_state->num_w_channels = curr_state->num_v_channels;
2736
1.94k
      curr_state->w_start_residual_idx = 0;
2737
1.94k
      curr_state->ott_cld_default[0] = 15;
2738
1.94k
      curr_state->ott_cld_default[1] = 15;
2739
1.94k
      break;
2740
0
    default:
2741
0
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
2742
0
      break;
2743
5.26k
  }
2744
5.26k
  return IA_NO_ERROR;
2745
5.26k
}
2746
2747
VOID ixheaacd_get_dequant_tables(
2748
    WORD32 **cld, WORD32 **icc, WORD32 **cpc,
2749
0
    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
2750
0
  *cld = ixheaacd_mps_dec_bitdec_tables->dequant_cld;
2751
0
  *icc = ixheaacd_mps_dec_bitdec_tables->dequant_icc;
2752
0
  *cpc = ixheaacd_mps_dec_bitdec_tables->dequant_cpc;
2753
0
}
2754
2755
WORD32 ixheaacd_quantize_cld(WORD32 v,
2756
0
                             ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
2757
0
  WORD32 i = 1;
2758
0
  WORD32 temp_1;
2759
0
  WORD32 vmin = ixheaacd_mps_dec_bitdec_tables->dequant_cld[0];
2760
0
  WORD32 dmin = abs(v - vmin);
2761
2762
0
  do {
2763
0
    temp_1 = abs(v - ixheaacd_mps_dec_bitdec_tables->dequant_cld[i]);
2764
0
    if (temp_1 < dmin) {
2765
0
      dmin = temp_1;
2766
0
      vmin = ixheaacd_mps_dec_bitdec_tables->dequant_cld[i];
2767
0
    }
2768
0
  } while (ixheaacd_mps_dec_bitdec_tables->dequant_cld[i++] < ONE_FORTYNINE_Q15);
2769
0
  return vmin;
2770
0
}
2771
2772
WORD32 ixheaacd_quantize_icc(WORD32 v,
2773
0
                             ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
2774
0
  WORD32 i = 1;
2775
0
  WORD32 temp_1;
2776
0
  WORD32 vmin = ixheaacd_mps_dec_bitdec_tables->dequant_icc[0];
2777
0
  WORD32 dmin = abs(v - vmin);
2778
2779
0
  do {
2780
0
    temp_1 = abs(v - ixheaacd_mps_dec_bitdec_tables->dequant_icc[i]);
2781
0
    if (temp_1 < dmin) {
2782
0
      dmin = temp_1;
2783
0
      vmin = ixheaacd_mps_dec_bitdec_tables->dequant_icc[i];
2784
0
    }
2785
0
  } while (ixheaacd_mps_dec_bitdec_tables->dequant_icc[i++] > MINUS_POINT_NINE_EIGHT_Q15);
2786
2787
0
  return vmin;
2788
0
}