Coverage Report

Created: 2026-07-16 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_mps_dec.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <math.h>
21
#include <string.h>
22
#include "ixheaac_type_def.h"
23
#include "ixheaac_constants.h"
24
#include "ixheaac_basic_ops32.h"
25
#include "ixheaac_basic_ops40.h"
26
#include "ixheaacd_bitbuffer.h"
27
#include "ixheaacd_defines.h"
28
#include "ixheaac_sbr_const.h"
29
#include "ixheaacd_memory_standards.h"
30
#include "ixheaacd_sbrdecsettings.h"
31
#include "ixheaacd_env_extr_part.h"
32
#include "ixheaacd_aac_rom.h"
33
#include "ixheaacd_common_rom.h"
34
#include "ixheaacd_sbr_rom.h"
35
#include "ixheaacd_pulsedata.h"
36
#include "ixheaacd_pns.h"
37
#include "ixheaacd_sbr_common.h"
38
#include "ixheaacd_drc_data_struct.h"
39
#include "ixheaacd_cnst.h"
40
#include "ixheaacd_ec_defines.h"
41
#include "ixheaacd_ec_struct_def.h"
42
#include "ixheaacd_error_codes.h"
43
#include "ixheaacd_channelinfo.h"
44
#include "ixheaacd_sbrdecoder.h"
45
#include "ixheaacd_audioobjtypes.h"
46
#include "ixheaacd_latmdemux.h"
47
#include "ixheaacd_aacdec.h"
48
#include "ixheaacd_hybrid.h"
49
#include "ixheaacd_sbr_scale.h"
50
#include "ixheaacd_ps_dec.h"
51
#include "ixheaacd_lpp_tran.h"
52
#include "ixheaacd_env_extr.h"
53
#include "ixheaacd_qmf_dec.h"
54
#include "ixheaacd_env_calc.h"
55
#include "ixheaacd_pvc_dec.h"
56
#include "ixheaacd_sbr_dec.h"
57
#include "ixheaacd_mps_polyphase.h"
58
#include "ixheaacd_config.h"
59
#include "ixheaacd_mps_macro_def.h"
60
#include "ixheaacd_mps_struct_def.h"
61
#include "ixheaacd_mps_res_rom.h"
62
#include "ixheaacd_mps_aac_struct.h"
63
#include "ixheaacd_mps_dec.h"
64
#include "ixheaacd_mps_interface.h"
65
#include "ixheaacd_struct_def.h"
66
#include "ixheaacd_mps_process.h"
67
#include "ixheaacd_mps_bitdec.h"
68
#include "ixheaacd_mps_smoothing.h"
69
#include "ixheaacd_mps_tp_process.h"
70
#include "ixheaacd_mps_reshape_bb_env.h"
71
#include "ixheaacd_mps_blind.h"
72
#include "ixheaacd_mps_m1m2.h"
73
#include "ixheaacd_mps_basic_op.h"
74
#include "ixheaacd_mps_decor.h"
75
#include "ixheaacd_mps_hybfilter.h"
76
#include "ixheaacd_mps_nlc_dec.h"
77
#include "ixheaacd_mps_huff_tab.h"
78
79
extern const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes;
80
extern const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes;
81
extern const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes;
82
extern const ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes;
83
extern const ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes;
84
extern const ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes;
85
extern const ia_huff_cpc_nodes_struct ixheaacd_huff_cpc_nodes;
86
extern const ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes;
87
88
WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len,
89
                           WORD32 residual_coding,
90
3.12k
                           ia_usac_dec_mps_config_struct* mps212_config) {
91
3.12k
  WORD32 num_ch;
92
3.12k
  WORD32 err_code = 0;
93
94
3.12k
  ia_mps_bs_frame bs_frame;
95
96
3.12k
  self->num_parameter_sets = 1;
97
3.12k
  self->qmf_band_count = 64;
98
99
3.12k
  self->res_ch_count = 0;
100
101
3.12k
  if (mps212_config) {
102
3.12k
    self->config = mps212_config;
103
3.12k
    self->frame_length = bs_frame_len;
104
3.12k
    self->in_ch_count = 1;
105
3.12k
    self->out_ch_count = 2;
106
3.12k
    self->residual_coding = residual_coding;
107
3.12k
    if (self->residual_coding) {
108
1.13k
      self->bs_residual_present = 1;
109
1.13k
      self->bs_residual_bands = mps212_config->bs_residual_bands;
110
1.13k
      if (self->config->bs_phase_coding) {
111
729
        self->config->bs_phase_coding = 2;
112
729
      }
113
1.13k
    }
114
3.12k
  }
115
116
3.12k
  err_code = ixheaacd_mps_header_decode(self);
117
118
3.12k
  if (err_code != IA_NO_ERROR) {
119
13
    self->mps_init_done = 0;
120
13
    return err_code;
121
13
  }
122
123
3.11k
  if ((self->residual_coding) && (self->res_bands > 0)) self->res_ch_count++;
124
125
3.11k
  ixheaacd_mps_env_init(self);
126
127
3.11k
  self->resolution = self->qmf_band_count;
128
129
9.34k
  for (num_ch = 0; num_ch < self->out_ch_count; num_ch++) {
130
6.22k
    ixheaacd_mps_synt_init(self->qmf_filt_state[num_ch]);
131
6.22k
  }
132
133
3.11k
  ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[0]);
134
135
3.11k
  if ((self->residual_coding) && (self->res_bands > 0))
136
846
    ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[1]);
137
138
3.11k
  err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count_max,
139
3.11k
                                     self->config->bs_decorr_config,
140
3.11k
                                     self->object_type);
141
142
3.11k
  if (err_code != IA_NO_ERROR) {
143
13
    self->mps_init_done = 0;
144
13
    return err_code;
145
13
  }
146
147
3.10k
  ixheaacd_mps_init_pre_and_post_matrix(self);
148
149
3.10k
  self->parse_nxt_frame = 1;
150
151
3.10k
  bs_frame = self->bs_frame;
152
3.10k
  memset(bs_frame.cld_idx_pre, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
153
3.10k
  memset(bs_frame.icc_idx_pre, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
154
3.10k
  memset(bs_frame.cmp_cld_idx_prev, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
155
3.10k
  memset(bs_frame.cmp_icc_idx_prev, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
156
157
3.10k
  self->subband_var.init_flag = 0;
158
3.10k
  self->subband_var.update_old_ener = 0;
159
3.10k
  self->subband_var.nrg_dir = 0;
160
3.10k
  memset(self->subband_var.nrg_diff, 0, 2 * sizeof(FLOAT32));
161
162
3.10k
  memset(self->opd_smooth.smooth_l_phase, 0,
163
3.10k
         MAX_PARAMETER_BANDS * sizeof(WORD32));
164
3.10k
  memset(self->opd_smooth.smooth_r_phase, 0,
165
3.10k
         MAX_PARAMETER_BANDS * sizeof(WORD32));
166
3.10k
  self->mps_init_done = 1;
167
168
3.10k
  return 0;
169
3.11k
}
170
171
static const FLOAT32 ixheaacd_tsd_mul_re[] = {
172
    1.0f,  0.707106781186548f,  0.0f, -0.707106781186548f,
173
    -1.0f, -0.707106781186548f, 0.0f, 0.707106781186548f};
174
175
static const FLOAT32 ixheaacd_tsd_mul_im[] = {
176
    0.0f, 0.707106781186548f,  1.0f,  0.707106781186548f,
177
    0.0f, -0.707106781186548f, -1.0f, -0.707106781186548f};
178
179
20.0k
VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self) {
180
20.0k
  if (self->object_type == AOT_ER_AAC_ELD ||
181
17.3k
      self->object_type == AOT_ER_AAC_LD) {
182
2.72k
    WORD32 k, n;
183
184
54.8k
    for (n = 0; n < self->time_slots; n++) {
185
2.89M
      for (k = 0; k < self->qmf_band_count; k++) {
186
2.83M
        self->hyb_in[0][k][n].re = self->qmf_in[0][n][k].re;
187
2.83M
        self->hyb_in[0][k][n].im = self->qmf_in[0][n][k].im;
188
2.83M
      }
189
52.1k
    }
190
17.3k
  } else {
191
17.3k
      ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[0], self->qmf_in[0],
192
17.3k
                                   self->qmf_band_count, self->time_slots,
193
17.3k
                                   self->hyb_in[0]);
194
17.3k
  }
195
196
20.0k
  if ((self->residual_coding) && (self->res_bands > 0)) {
197
11.1k
    ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[self->in_ch_count],
198
11.1k
                                     self->qmf_in[1], self->band_count[1],
199
11.1k
                                     self->time_slots, self->hyb_res);
200
11.1k
  }
201
20.0k
}
202
203
110k
VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self) {
204
110k
  WORD32 ch;
205
206
110k
  if (self->object_type == AOT_ER_AAC_ELD ||
207
107k
      self->object_type == AOT_ER_AAC_LD) {
208
2.72k
    WORD32 k, n;
209
8.18k
    for (ch = 0; ch < self->out_ch_count; ch++) {
210
109k
      for (n = 0; n < self->time_slots; n++) {
211
5.78M
        for (k = 0; k < self->qmf_band_count; k++) {
212
5.67M
          self->qmf_out_dir[ch][n][k].re = self->hyb_dir_out[ch][n][k].re;
213
5.67M
          self->qmf_out_dir[ch][n][k].im = self->hyb_dir_out[ch][n][k].im;
214
5.67M
        }
215
104k
      }
216
5.45k
    }
217
107k
  } else {
218
323k
      for (ch = 0; ch < self->out_ch_count; ch++) {
219
215k
          ixheaacd_mps_qmf_hybrid_synthesis(self->hyb_dir_out[ch],
220
215k
                                      self->qmf_band_count, self->time_slots,
221
215k
                                      self->qmf_out_dir[ch]);
222
215k
      }
223
107k
  }
224
110k
}
225
226
20.0k
VOID ixheaacd_mps_decor(ia_mps_dec_state_struct* self) {
227
20.0k
  WORD32 k, sb_sample, idx;
228
229
20.0k
  ia_cmplx_flt_struct(*scratch)[MAX_HYBRID_BANDS_MPS];
230
231
20.0k
  ia_cmplx_flt_struct coeff;
232
20.0k
  WORD32 band_start = 7;
233
234
20.0k
  scratch = self->scratch;
235
236
40.1k
  for (k = self->dir_sig_count; k < self->dir_sig_count + self->decor_sig_count;
237
20.0k
       k++) {
238
20.0k
    if (self->bs_tsd_enable) {
239
485k
      for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) {
240
474k
        if (self->bs_tsd_sep_data[sb_sample]) {
241
2.10M
          for (idx = band_start; idx < self->mps_decor.num_bins; idx++) {
242
2.03M
            scratch[sb_sample][idx].re = self->v[k][sb_sample][idx].re;
243
2.03M
            scratch[sb_sample][idx].im = self->v[k][sb_sample][idx].im;
244
2.03M
            self->v[k][sb_sample][idx].re = 0.0f;
245
2.03M
            self->v[k][sb_sample][idx].im = 0.0f;
246
2.03M
          }
247
74.7k
        }
248
474k
      }
249
10.4k
    }
250
251
20.0k
    ixheaacd_mps_decor_apply(&self->mps_decor, self->v[k], self->w_diff[k],
252
20.0k
                             self->time_slots, NO_RES_BANDS,
253
20.0k
                             self->ldmps_config.ldmps_present_flag);
254
255
20.0k
    if (self->bs_tsd_enable) {
256
485k
      for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) {
257
474k
        if (self->bs_tsd_sep_data[sb_sample]) {
258
74.7k
          coeff.re = ixheaacd_tsd_mul_re[self->bs_tsd_tr_phase_data[sb_sample]];
259
74.7k
          coeff.im = ixheaacd_tsd_mul_im[self->bs_tsd_tr_phase_data[sb_sample]];
260
261
2.10M
          for (idx = band_start; idx < self->mps_decor.num_bins; idx++) {
262
2.03M
            self->w_diff[k][sb_sample][idx].re +=
263
2.03M
                coeff.re * scratch[sb_sample][idx].re -
264
2.03M
                coeff.im * scratch[sb_sample][idx].im;
265
2.03M
            self->w_diff[k][sb_sample][idx].im +=
266
2.03M
                coeff.im * scratch[sb_sample][idx].re +
267
2.03M
                coeff.re * scratch[sb_sample][idx].im;
268
2.03M
          }
269
74.7k
        }
270
474k
      }
271
10.4k
    }
272
20.0k
  }
273
20.0k
}
274
275
20.0k
VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct* self) {
276
20.0k
  WORD32 ts, qs, row, indx;
277
278
824k
  for (ts = 0; ts < self->time_slots; ts++) {
279
32.1M
    for (qs = 0; qs < self->hyb_band_count_max; qs++) {
280
31.3M
      indx = self->hyb_band_to_processing_band_table[qs];
281
282
62.6M
      for (row = 0; row < self->dir_sig_count; row++) {
283
31.3M
        self->w_dir[row][ts][qs].re = self->v[row][ts][qs].re;
284
31.3M
        self->w_dir[row][ts][qs].im = self->v[row][ts][qs].im;
285
31.3M
      }
286
287
31.3M
      for (row = self->dir_sig_count;
288
62.6M
           row < (self->dir_sig_count + self->decor_sig_count); row++) {
289
31.3M
        if (indx < self->res_bands) {
290
13.0M
          self->w_dir[row][ts][qs].re = self->hyb_res[qs][ts].re;
291
13.0M
          self->w_dir[row][ts][qs].im = self->hyb_res[qs][ts].im;
292
18.2M
        } else {
293
18.2M
          self->w_dir[row][ts][qs].re = 0.0f;
294
18.2M
          self->w_dir[row][ts][qs].im = 0.0f;
295
18.2M
        }
296
31.3M
      }
297
298
62.6M
      for (row = 0; row < self->dir_sig_count; row++) {
299
31.3M
        self->w_diff[row][ts][qs].re = 0.0f;
300
31.3M
        self->w_diff[row][ts][qs].im = 0.0f;
301
31.3M
      }
302
303
31.3M
      for (row = self->dir_sig_count;
304
62.6M
           row < (self->dir_sig_count + self->decor_sig_count); row++) {
305
31.3M
        if (indx < self->res_bands) {
306
13.0M
          self->w_diff[row][ts][qs].re = 0.0f;
307
13.0M
          self->w_diff[row][ts][qs].im = 0.0f;
308
13.0M
        }
309
31.3M
      }
310
31.3M
    }
311
804k
  }
312
20.0k
}
313
314
39.9k
VOID ixheaacd_mps_mix_res_decor_residual_band(ia_mps_dec_state_struct* self) {
315
39.9k
  WORD32 ts, qs, indx;
316
2.23M
  for (qs = 0; qs < self->hyb_band_count_max; qs++) {
317
2.19M
    indx = self->hyb_band_to_processing_band_table[qs];
318
2.19M
    if (indx >= self->res_bands) {
319
1.52M
      if (qs < self->hyb_band_count[1]) {
320
26.5M
        for (ts = 0; ts < self->time_slots; ts++) {
321
25.7M
          self->w_dir[1][ts][qs].re = 0.0f;
322
25.7M
          self->w_dir[1][ts][qs].im = 0.0f;
323
25.7M
        }
324
795k
      }
325
1.52M
    } else {
326
29.8M
      for (ts = 0; ts < self->time_slots; ts++) {
327
29.2M
        self->w_diff[1][ts][qs].re = 0.0f;
328
29.2M
        self->w_diff[1][ts][qs].im = 0.0f;
329
29.2M
      }
330
672k
    }
331
2.19M
  }
332
39.9k
}
333
334
20.0k
VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self) {
335
20.0k
  ixheaacd_mps_decor(self);
336
20.0k
  ixheaacd_mps_mix_res_decor(self);
337
20.0k
}
338
339
90.3k
VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct* self) {
340
90.3k
  ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
341
90.3k
      &self->hyb_filt_state[0], self->qmf_in[0], self->band_count[0],
342
90.3k
      self->time_slots, self->w_dir[0]);
343
344
90.3k
  if (self->res_bands) {
345
55.3k
    ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
346
55.3k
        &self->hyb_filt_state[1], self->qmf_in[1], self->band_count[1],
347
55.3k
        self->time_slots, self->w_dir[1]);
348
349
55.3k
    if (self->res_bands != 28) {
350
39.9k
      ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0],
351
39.9k
                               self->w_diff[1], self->time_slots,
352
39.9k
                               self->res_bands,
353
39.9k
                               self->ldmps_config.ldmps_present_flag);
354
355
39.9k
      ixheaacd_mps_mix_res_decor_residual_band(self);
356
39.9k
    }
357
55.3k
  } else {
358
35.0k
    ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0], self->w_diff[1],
359
35.0k
                             self->time_slots, NO_RES_BANDS,
360
35.0k
                             self->ldmps_config.ldmps_present_flag);
361
35.0k
  }
362
90.3k
}
363
364
WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self,
365
                          FLOAT32** input_buffer[4],
366
107k
                          FLOAT32 (*output_buffer)[4096]) {
367
107k
  WORD32 ch, ts, qs;
368
107k
  WORD32 time_slots = self->time_slots;
369
107k
  WORD32 in_ch_count = self->in_ch_count + self->res_ch_count;
370
107k
  WORD32 err = 0;
371
107k
  self->hyb_band_count[0] = self->band_count[0] - QMF_BANDS_TO_HYBRID + 10;
372
107k
  self->hyb_band_count[1] = self->band_count[1] - QMF_BANDS_TO_HYBRID + 10;
373
107k
  self->hyb_band_count_max =
374
107k
      max(self->hyb_band_count[0], self->hyb_band_count[1]);
375
107k
  self->mps_decor.decor_nrg_smooth.num_bins = self->hyb_band_count_max;
376
107k
  self->mps_decor.num_bins = self->hyb_band_count_max;
377
107k
  self->output_buffer = output_buffer;
378
379
107k
  err = ixheaacd_mps_frame_decode(self);
380
381
107k
  if (err != IA_NO_ERROR) return err;
382
383
107k
  ixheaacd_pre_and_mix_matrix_calculation(self);
384
385
107k
  ixheaacd_mps_pre_matrix_mix_matrix_smoothing(self);
386
387
281k
  for (ch = 0; ch < in_ch_count; ch++) {
388
6.72M
    for (ts = 0; ts < time_slots; ts++) {
389
225M
      for (qs = 0; qs < self->band_count[ch]; qs++) {
390
218M
        self->qmf_in[ch][qs][ts].re =
391
218M
            self->input_gain * input_buffer[2 * ch][ts][qs];
392
218M
        self->qmf_in[ch][qs][ts].im =
393
218M
            self->input_gain * input_buffer[2 * ch + 1][ts][qs];
394
218M
      }
395
6.54M
    }
396
174k
  }
397
398
107k
  if (!(self->pre_mix_req | self->bs_tsd_enable)) {
399
90.3k
    ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(self);
400
90.3k
  } else {
401
17.3k
    ixheaacd_mps_qmf_hyb_analysis(self);
402
403
17.3k
    ixheaacd_mps_apply_pre_matrix(self);
404
405
17.3k
    ixheaacd_mps_create_w(self);
406
17.3k
  }
407
408
107k
  if ((!(self->res_bands | self->pre_mix_req)) &&
409
36.6k
      (self->config->bs_phase_coding == 0)) {
410
11.7k
    ixheaacd_mps_apply_mix_matrix_type1(self);
411
412
95.9k
  } else if (self->pre_mix_req) {
413
7.87k
    ixheaacd_mps_apply_mix_matrix_type2(self);
414
415
88.0k
  } else {
416
88.0k
    ixheaacd_mps_apply_mix_matrix_type3(self);
417
88.0k
  }
418
419
107k
  if (self->config->bs_temp_shape_config == 2) {
420
5.74k
    ixheaacd_mps_time_env_shaping(self);
421
5.74k
  }
422
423
107k
  err = ixheaacd_mps_temp_process(self);
424
107k
  if (err) return err;
425
426
107k
  self->parse_nxt_frame = 1;
427
107k
  self->pre_mix_req = 0;
428
107k
  return 0;
429
107k
}
430
431
static VOID ixheaacd_mps_pcm_decode(ia_bit_buf_struct *it_bit_buff,
432
                                    WORD32* out_data_1, WORD32* out_data_2,
433
                                    WORD32 ixheaacd_drc_offset, WORD32 num_val,
434
24.6k
                                    WORD32 num_levels) {
435
24.6k
  WORD32 i = 0, j = 0, idx = 0;
436
24.6k
  WORD32 max_grp_len = 0, grp_len = 0, next_val = 0, grp_val = 0;
437
24.6k
  UWORD32 data = 0;
438
439
24.6k
  FLOAT32 ld_nlev = 0.f;
440
441
24.6k
  WORD32 pcm_chunk_size[7] = {0};
442
443
24.6k
  switch (num_levels) {
444
53
    case 3:
445
53
      max_grp_len = 5;
446
53
      break;
447
28
    case 7:
448
28
      max_grp_len = 6;
449
28
      break;
450
22
    case 11:
451
22
      max_grp_len = 2;
452
22
      break;
453
0
    case 13:
454
0
      max_grp_len = 4;
455
0
      break;
456
1
    case 19:
457
1
      max_grp_len = 4;
458
1
      break;
459
0
    case 25:
460
0
      max_grp_len = 3;
461
0
      break;
462
109
    case 51:
463
109
      max_grp_len = 4;
464
109
      break;
465
5.36k
    case 4:
466
10.1k
    case 8:
467
19.1k
    case 15:
468
20.2k
    case 16:
469
21.0k
    case 26:
470
24.4k
    case 31:
471
24.4k
      max_grp_len = 1;
472
24.4k
      break;
473
0
    default:
474
0
      return;
475
24.6k
  }
476
477
24.6k
  ld_nlev = (FLOAT32)(log((FLOAT32)num_levels) / log(2.f));
478
479
49.9k
  for (i = 1; i <= max_grp_len; i++) {
480
25.3k
    pcm_chunk_size[i] = (WORD32)ceil((FLOAT32)(i)*ld_nlev);
481
25.3k
  }
482
483
188k
  for (i = 0; i < num_val; i += max_grp_len) {
484
164k
    grp_len = min(max_grp_len, num_val - i);
485
164k
    data = ixheaacd_read_bits_buf(it_bit_buff, pcm_chunk_size[grp_len]);
486
487
164k
    grp_val = data;
488
489
329k
    for (j = 0; j < grp_len; j++) {
490
164k
      idx = i + (grp_len - j - 1);
491
164k
      next_val = grp_val % num_levels;
492
493
164k
      if (out_data_2 == NULL) {
494
107k
        out_data_1[idx] = next_val - ixheaacd_drc_offset;
495
107k
      } else if (out_data_1 == NULL) {
496
0
        out_data_2[idx] = next_val - ixheaacd_drc_offset;
497
57.5k
      } else {
498
57.5k
        if (idx % 2) {
499
28.7k
          out_data_2[idx / 2] = next_val - ixheaacd_drc_offset;
500
28.7k
        } else {
501
28.7k
          out_data_1[idx / 2] = next_val - ixheaacd_drc_offset;
502
28.7k
        }
503
57.5k
      }
504
505
164k
      grp_val = (grp_val - next_val) / num_levels;
506
164k
    }
507
164k
  }
508
509
24.6k
  return;
510
24.6k
}
511
512
static VOID ixheaacd_mps_huff_read(ia_bit_buf_struct *it_bit_buff,
513
                                   const WORD32 (*node_tab)[][2],
514
342k
                                   WORD32* out_data) {
515
342k
  WORD32 node = 0;
516
342k
  UWORD32 next_bit = 0;
517
518
791k
  do {
519
791k
    next_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
520
791k
    node = (*node_tab)[node][next_bit];
521
791k
  } while (node > 0);
522
523
342k
  *out_data = node;
524
525
342k
  return;
526
342k
}
527
528
static VOID ixheaacd_mps_huff_read_2d(ia_bit_buf_struct *it_bit_buff,
529
                                      const WORD32 (*node_tab)[][2],
530
                                      WORD32 out_data[2], WORD32* escape)
531
532
153k
{
533
153k
  WORD32 huff_2d_8bit = 0;
534
153k
  WORD32 node = 0;
535
536
153k
  ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node);
537
153k
  *escape = (node == 0);
538
539
153k
  if (*escape) {
540
334
    out_data[0] = 0;
541
334
    out_data[1] = 1;
542
152k
  } else {
543
152k
    huff_2d_8bit = -(node + 1);
544
152k
    out_data[0] = huff_2d_8bit >> 4;
545
152k
    out_data[1] = huff_2d_8bit & 0xf;
546
152k
  }
547
548
153k
  return;
549
153k
}
550
551
static VOID ixheaacd_mps_sym_restore(ia_bit_buf_struct *it_bit_buff,
552
117k
                                     WORD32 lav, WORD32 data[2]) {
553
117k
  WORD32 tmp = 0;
554
117k
  UWORD32 sym_bit = 0;
555
556
117k
  WORD32 sum_val = data[0] + data[1];
557
117k
  WORD32 diff_val = data[0] - data[1];
558
559
117k
  if (sum_val > lav) {
560
29.2k
    data[0] = -sum_val + (2 * lav + 1);
561
29.2k
    data[1] = -diff_val;
562
88.2k
  } else {
563
88.2k
    data[0] = sum_val;
564
88.2k
    data[1] = diff_val;
565
88.2k
  }
566
567
117k
  if (data[0] + data[1] != 0) {
568
43.9k
    sym_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
569
43.9k
    if (sym_bit) {
570
13.1k
      data[0] = -data[0];
571
13.1k
      data[1] = -data[1];
572
13.1k
    }
573
43.9k
  }
574
575
117k
  if (data[0] - data[1] != 0) {
576
42.4k
    sym_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
577
42.4k
    if (sym_bit) {
578
10.5k
      tmp = data[0];
579
10.5k
      data[0] = data[1];
580
10.5k
      data[1] = tmp;
581
10.5k
    }
582
42.4k
  }
583
584
117k
  return;
585
117k
}
586
587
static VOID ixheaacd_mps_sym_restoreipd(ia_bit_buf_struct *it_bit_buff,
588
5.36k
                                        WORD32 lav, WORD32 data[2]) {
589
5.36k
  WORD32 tmp = 0;
590
5.36k
  UWORD32 sym_bit = 0;
591
592
5.36k
  WORD32 sum_val = data[0] + data[1];
593
5.36k
  WORD32 diff_val = data[0] - data[1];
594
595
5.36k
  if (sum_val > lav) {
596
1.02k
    data[0] = -sum_val + (2 * lav + 1);
597
1.02k
    data[1] = -diff_val;
598
4.34k
  } else {
599
4.34k
    data[0] = sum_val;
600
4.34k
    data[1] = diff_val;
601
4.34k
  }
602
603
5.36k
  if (data[0] - data[1] != 0) {
604
1.39k
    sym_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
605
1.39k
    if (sym_bit) {
606
795
      tmp = data[0];
607
795
      data[0] = data[1];
608
795
      data[1] = tmp;
609
795
    }
610
1.39k
  }
611
612
5.36k
  return;
613
5.36k
}
614
615
static VOID ixheaacd_mps_huff_dec_pilot(ia_bit_buf_struct *it_bit_buff,
616
                                        const WORD32 (*node_tab)[][2],
617
6.45k
                                        WORD32* pilot_data) {
618
6.45k
  WORD32 node = 0;
619
620
6.45k
  ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node);
621
6.45k
  *pilot_data = -(node + 1);
622
623
6.45k
  return;
624
6.45k
}
625
626
static VOID ixheaacd_mps_huff_dec_cld_1d(
627
    ia_bit_buf_struct *it_bit_buff,
628
    const ia_huff_cld_node_1d_struct* huff_nodes, WORD32* out_data,
629
13.8k
    WORD32 num_val, WORD32 p0_flag) {
630
13.8k
  WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
631
13.8k
  WORD32 od = 0, od_sign = 0;
632
13.8k
  UWORD32 data = 0;
633
634
13.8k
  if (p0_flag) {
635
8.04k
    ixheaacd_mps_huff_read(it_bit_buff,
636
8.04k
                           (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld,
637
8.04k
                           &node);
638
8.04k
    out_data[0] = -(node + 1);
639
8.04k
    ixheaacd_drc_offset = 1;
640
8.04k
  }
641
642
88.4k
  for (i = ixheaacd_drc_offset; i < num_val; i++) {
643
74.5k
    ixheaacd_mps_huff_read(it_bit_buff,
644
74.5k
                           (ia_huff_node_struct)&huff_nodes->node_tab, &node);
645
74.5k
    od = -(node + 1);
646
647
74.5k
    if (od != 0) {
648
17.0k
      data = ixheaacd_read_bits_buf(it_bit_buff, 1);
649
17.0k
      od_sign = data;
650
651
17.0k
      if (od_sign) od = -od;
652
17.0k
    }
653
654
74.5k
    out_data[i] = od;
655
74.5k
  }
656
657
13.8k
  return;
658
13.8k
}
659
660
static VOID ixheaacd_mps_huff_dec_ipd_1d(
661
    ia_bit_buf_struct *it_bit_buff,
662
    const ia_huff_ipd_node_1d_struct* huff_nodes, WORD32* out_data,
663
1.97k
    WORD32 num_val, WORD32 p0_flag) {
664
1.97k
  WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
665
1.97k
  WORD32 od = 0;
666
667
1.97k
  if (p0_flag) {
668
1.48k
    ixheaacd_mps_huff_read(
669
1.48k
        it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab,
670
1.48k
        &node);
671
1.48k
    out_data[0] = -(node + 1);
672
1.48k
    ixheaacd_drc_offset = 1;
673
1.48k
  }
674
675
16.9k
  for (i = ixheaacd_drc_offset; i < num_val; i++) {
676
15.0k
    ixheaacd_mps_huff_read(it_bit_buff,
677
15.0k
                           (ia_huff_node_struct)&huff_nodes->node_tab, &node);
678
15.0k
    od = -(node + 1);
679
15.0k
    out_data[i] = od;
680
15.0k
  }
681
682
1.97k
  return;
683
1.97k
}
684
685
static VOID ixheaacd_mps_huff_dec_icc_1d(
686
    ia_bit_buf_struct *it_bit_buff,
687
    const ia_huff_icc_node_1d_struct* huff_nodes, WORD32* out_data,
688
6.66k
    WORD32 num_val, WORD32 p0_flag) {
689
6.66k
  WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
690
6.66k
  WORD32 od = 0, od_sign = 0;
691
6.66k
  UWORD32 data = 0;
692
693
6.66k
  if (p0_flag) {
694
3.14k
    ixheaacd_mps_huff_read(it_bit_buff,
695
3.14k
                           (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc,
696
3.14k
                           &node);
697
3.14k
    out_data[0] = -(node + 1);
698
3.14k
    ixheaacd_drc_offset = 1;
699
3.14k
  }
700
701
38.4k
  for (i = ixheaacd_drc_offset; i < num_val; i++) {
702
31.8k
    ixheaacd_mps_huff_read(it_bit_buff,
703
31.8k
                           (ia_huff_node_struct)&huff_nodes->node_tab, &node);
704
31.8k
    od = -(node + 1);
705
706
31.8k
    if (od != 0) {
707
10.4k
      data = ixheaacd_read_bits_buf(it_bit_buff, 1);
708
10.4k
      od_sign = data;
709
710
10.4k
      if (od_sign) od = -od;
711
10.4k
    }
712
713
31.8k
    out_data[i] = od;
714
31.8k
  }
715
716
6.66k
  return;
717
6.66k
}
718
719
static VOID ia_mps_dec_huff_dec_cpc_1d(
720
    const ia_huff_cpc_node_1d_struct *huff_nodes, WORD32 *out_data,
721
448
    WORD32 num_val, WORD32 p0_flag, ia_bit_buf_struct *h_bit_buf) {
722
448
  WORD32 i = 0, node = 0, offset = 0;
723
448
  WORD32 od = 0, od_sign = 0;
724
448
  WORD32 data = 0;
725
726
448
  if (p0_flag) {
727
221
    ixheaacd_mps_huff_read(
728
221
        h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_part0_nodes.cpc),
729
221
        &node);
730
221
    out_data[0] = -(node + 1);
731
221
    offset = 1;
732
221
  }
733
734
3.24k
  for (i = offset; i < num_val; i++) {
735
2.79k
    ixheaacd_mps_huff_read(h_bit_buf,
736
2.79k
                           (ia_huff_node_struct)&huff_nodes->node_tab, &node);
737
2.79k
    od = -(node + 1);
738
739
2.79k
    if (od != 0) {
740
1.85k
      data = ixheaacd_read_bits_buf(h_bit_buf, 1);
741
1.85k
      od_sign = data;
742
743
1.85k
      if (od_sign) od = -od;
744
1.85k
    }
745
746
2.79k
    out_data[i] = od;
747
2.79k
  }
748
448
}
749
750
static VOID ixheaacd_mps_huff_dec_cld_2d(
751
    ia_bit_buf_struct *it_bit_buff,
752
    const ia_huff_cld_node_2d_struct* huff_nodes, WORD32 out_data[][2],
753
19.9k
    WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
754
19.9k
  WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
755
19.9k
  WORD32 node = 0;
756
19.9k
  UWORD32 data = 0;
757
758
19.9k
  WORD32 esc_data[MAXBANDS][2] = {{0}};
759
19.9k
  WORD32 esc_idx[MAXBANDS] = {0};
760
761
19.9k
  ixheaacd_mps_huff_read(
762
19.9k
      it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab,
763
19.9k
      &node);
764
19.9k
  data = -(node + 1);
765
766
19.9k
  lav = 2 * data + 3;
767
768
19.9k
  if (p0_data[0] != NULL) {
769
7.71k
    ixheaacd_mps_huff_read(it_bit_buff,
770
7.71k
                           (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld,
771
7.71k
                           &node);
772
7.71k
    *p0_data[0] = -(node + 1);
773
7.71k
  }
774
19.9k
  if (p0_data[1] != NULL) {
775
2.55k
    ixheaacd_mps_huff_read(it_bit_buff,
776
2.55k
                           (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld,
777
2.55k
                           &node);
778
2.55k
    *p0_data[1] = -(node + 1);
779
2.55k
  }
780
781
103k
  for (i = 0; i < num_val; i += ch_fac) {
782
84.0k
    switch (lav) {
783
49.6k
      case 3:
784
49.6k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
785
49.6k
                                  (ia_huff_node_struct)&huff_nodes->lav3,
786
49.6k
                                  out_data[i], &escape);
787
49.6k
        break;
788
10.2k
      case 5:
789
10.2k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
790
10.2k
                                  (ia_huff_node_struct)&huff_nodes->lav5,
791
10.2k
                                  out_data[i], &escape);
792
10.2k
        break;
793
21.2k
      case 7:
794
21.2k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
795
21.2k
                                  (ia_huff_node_struct)&huff_nodes->lav7,
796
21.2k
                                  out_data[i], &escape);
797
21.2k
        break;
798
2.93k
      case 9:
799
2.93k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
800
2.93k
                                  (ia_huff_node_struct)&huff_nodes->lav9,
801
2.93k
                                  out_data[i], &escape);
802
2.93k
        break;
803
0
      default:
804
0
        break;
805
84.0k
    }
806
807
84.0k
    if (escape) {
808
1
      esc_idx[esc_contrl++] = i;
809
84.0k
    } else {
810
84.0k
      ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i]);
811
84.0k
    }
812
84.0k
  }
813
814
19.9k
  if (esc_contrl > 0) {
815
1
    ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0,
816
1
                            2 * esc_contrl, (2 * lav + 1));
817
818
2
    for (i = 0; i < esc_contrl; i++) {
819
1
      out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
820
1
      out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
821
1
    }
822
1
  }
823
824
19.9k
  return;
825
19.9k
}
826
827
static VOID ixheaacd_mps_huff_dec_icc_2d(
828
    ia_bit_buf_struct *it_bit_buff,
829
    const ia_huff_icc_node_2d_struct* huff_nodes, WORD32 out_data[][2],
830
7.04k
    WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
831
7.04k
  WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
832
7.04k
  WORD32 node = 0;
833
7.04k
  UWORD32 data = 0;
834
835
7.04k
  WORD32 esc_data[2][MAXBANDS] = {{0}};
836
7.04k
  WORD32 esc_idx[MAXBANDS] = {0};
837
838
7.04k
  ixheaacd_mps_huff_read(
839
7.04k
      it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab,
840
7.04k
      &node);
841
7.04k
  data = -(node + 1);
842
843
7.04k
  lav = 2 * data + 1;
844
845
7.04k
  if (p0_data[0] != NULL) {
846
4.14k
    ixheaacd_mps_huff_read(it_bit_buff,
847
4.14k
                           (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc,
848
4.14k
                           &node);
849
4.14k
    *p0_data[0] = -(node + 1);
850
4.14k
  }
851
7.04k
  if (p0_data[1] != NULL) {
852
2.68k
    ixheaacd_mps_huff_read(it_bit_buff,
853
2.68k
                           (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc,
854
2.68k
                           &node);
855
2.68k
    *p0_data[1] = -(node + 1);
856
2.68k
  }
857
858
39.2k
  for (i = 0; i < num_val; i += ch_fac) {
859
32.1k
    switch (lav) {
860
15.9k
      case 1:
861
15.9k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
862
15.9k
                                  (ia_huff_node_struct)&huff_nodes->lav1,
863
15.9k
                                  out_data[i], &escape);
864
15.9k
        break;
865
13.2k
      case 3:
866
13.2k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
867
13.2k
                                  (ia_huff_node_struct)&huff_nodes->lav3,
868
13.2k
                                  out_data[i], &escape);
869
13.2k
        break;
870
1.25k
      case 5:
871
1.25k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
872
1.25k
                                  (ia_huff_node_struct)&huff_nodes->lav5,
873
1.25k
                                  out_data[i], &escape);
874
1.25k
        break;
875
1.77k
      case 7:
876
1.77k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
877
1.77k
                                  (ia_huff_node_struct)&huff_nodes->lav7,
878
1.77k
                                  out_data[i], &escape);
879
1.77k
        break;
880
32.1k
    }
881
882
32.1k
    if (escape) {
883
68
      esc_idx[esc_contrl++] = i;
884
32.1k
    } else {
885
32.1k
      ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i]);
886
32.1k
    }
887
32.1k
  }
888
889
7.03k
  if (esc_contrl > 0) {
890
16
    ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0,
891
16
                            2 * esc_contrl, (2 * lav + 1));
892
893
82
    for (i = 0; i < esc_contrl; i++) {
894
66
      out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
895
66
      out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
896
66
    }
897
16
  }
898
899
7.03k
  return;
900
7.04k
}
901
902
static VOID ixheaacd_mps_huff_dec_ipd_2d(
903
    ia_bit_buf_struct *it_bit_buff,
904
    const ia_huff_ipd_node_2d_struct* huff_nodes, WORD32 out_data[][2],
905
904
    WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
906
904
  WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
907
904
  WORD32 node = 0;
908
904
  UWORD32 data = 0;
909
910
904
  WORD32 esc_data[2][MAXBANDS] = {{0}};
911
904
  WORD32 esc_idx[MAXBANDS] = {0};
912
913
904
  ixheaacd_mps_huff_read(
914
904
      it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab,
915
904
      &node);
916
917
904
  data = -(node + 1);
918
904
  if (data == 0)
919
179
    data = 3;
920
725
  else
921
725
    data--;
922
923
904
  lav = 2 * data + 1;
924
925
904
  if (p0_data[0] != NULL) {
926
235
    ixheaacd_mps_huff_read(
927
235
        it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab,
928
235
        &node);
929
235
    *p0_data[0] = -(node + 1);
930
235
  }
931
904
  if (p0_data[1] != NULL) {
932
178
    ixheaacd_mps_huff_read(
933
178
        it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab,
934
178
        &node);
935
178
    *p0_data[1] = -(node + 1);
936
178
  }
937
938
6.53k
  for (i = 0; i < num_val; i += ch_fac) {
939
5.63k
    switch (lav) {
940
2.15k
      case 1:
941
2.15k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
942
2.15k
                                  (ia_huff_node_struct)&huff_nodes->lav1,
943
2.15k
                                  out_data[i], &escape);
944
2.15k
        break;
945
866
      case 3:
946
866
        ixheaacd_mps_huff_read_2d(it_bit_buff,
947
866
                                  (ia_huff_node_struct)&huff_nodes->lav3,
948
866
                                  out_data[i], &escape);
949
866
        break;
950
973
      case 5:
951
973
        ixheaacd_mps_huff_read_2d(it_bit_buff,
952
973
                                  (ia_huff_node_struct)&huff_nodes->lav5,
953
973
                                  out_data[i], &escape);
954
973
        break;
955
1.63k
      case 7:
956
1.63k
        ixheaacd_mps_huff_read_2d(it_bit_buff,
957
1.63k
                                  (ia_huff_node_struct)&huff_nodes->lav7,
958
1.63k
                                  out_data[i], &escape);
959
1.63k
        break;
960
5.63k
    }
961
962
5.63k
    if (escape) {
963
265
      esc_idx[esc_contrl++] = i;
964
5.36k
    } else {
965
5.36k
      ixheaacd_mps_sym_restoreipd(it_bit_buff, lav, out_data[i]);
966
5.36k
    }
967
5.63k
  }
968
969
903
  if (esc_contrl > 0) {
970
102
    ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0,
971
102
                            2 * esc_contrl, (2 * lav + 1));
972
973
367
    for (i = 0; i < esc_contrl; i++) {
974
265
      out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
975
265
      out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
976
265
    }
977
102
  }
978
979
903
  return;
980
904
}
981
982
static VOID ia_mps_dec_huff_dec_cpc_2d(
983
    const ia_mps_dec_huff_cpc_nod_2d *huff_nodes, WORD32 out_data[][2],
984
    WORD32 num_val, WORD32 stride, WORD32 *p0_data[2],
985
257
    ia_bit_buf_struct *h_bit_buf) {
986
257
  WORD32 i = 0, lav = 0, escape = 0, esc_cntr = 0;
987
257
  WORD32 node = 0;
988
257
  WORD32 data = 0;
989
990
257
  WORD32 esc_data[2][MAXBANDS] = {{0}};
991
257
  WORD32 esc_idx[MAXBANDS] = {0};
992
993
257
  ixheaacd_mps_huff_read(
994
257
      h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_lav_idx_nodes.node_tab),
995
257
      &node);
996
257
  data = -(node + 1);
997
998
257
  lav = 3 * data + 3;
999
1000
257
  if (p0_data[0] != NULL) {
1001
115
    ixheaacd_mps_huff_read(
1002
115
        h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_part0_nodes.cpc),
1003
115
        &node);
1004
115
    *p0_data[0] = -(node + 1);
1005
115
  }
1006
257
  if (p0_data[1] != NULL) {
1007
89
    ixheaacd_mps_huff_read(
1008
89
        h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_part0_nodes.cpc),
1009
89
        &node);
1010
89
    *p0_data[1] = -(node + 1);
1011
89
  }
1012
1013
1.55k
  for (i = 0; i < num_val; i += stride) {
1014
1.30k
    switch (lav) {
1015
562
      case LAV_3:
1016
562
        ixheaacd_mps_huff_read_2d(h_bit_buf,
1017
562
                                  (ia_huff_node_struct)&huff_nodes->lav3,
1018
562
                                  out_data[i], &escape);
1019
562
        break;
1020
199
      case LAV_6:
1021
199
        ixheaacd_mps_huff_read_2d(h_bit_buf,
1022
199
                                  (ia_huff_node_struct)&huff_nodes->lav6,
1023
199
                                  out_data[i], &escape);
1024
199
        break;
1025
136
      case LAV_9:
1026
136
        ixheaacd_mps_huff_read_2d(h_bit_buf,
1027
136
                                  (ia_huff_node_struct)&huff_nodes->lav9,
1028
136
                                  out_data[i], &escape);
1029
136
        break;
1030
408
      case LAV_12:
1031
408
        ixheaacd_mps_huff_read_2d(h_bit_buf,
1032
408
                                  (ia_huff_node_struct)&huff_nodes->lav12,
1033
408
                                  out_data[i], &escape);
1034
408
        break;
1035
0
      default:
1036
0
        break;
1037
1.30k
    }
1038
1039
1.30k
    if (escape) {
1040
0
      esc_idx[esc_cntr++] = i;
1041
1.30k
    } else {
1042
1.30k
      ixheaacd_mps_sym_restore(h_bit_buf, lav, out_data[i]);
1043
1.30k
    }
1044
1.30k
  }
1045
1046
254
  if (esc_cntr > 0) {
1047
0
    ixheaacd_mps_pcm_decode(h_bit_buf, esc_data[0], esc_data[1], 0,
1048
0
                            (esc_cntr << 1), ((lav << 1) + 1));
1049
1050
0
    for (i = 0; i < esc_cntr; i++) {
1051
0
      out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
1052
0
      out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
1053
0
    }
1054
0
  }
1055
254
  return;
1056
257
}
1057
1058
static VOID ixheaacd_huff_decode(ia_bit_buf_struct *it_bit_buff, WORD32 *out_data_1,
1059
                                 WORD32 *out_data_2, WORD32 data_type, WORD32 diff_type_1,
1060
                                 WORD32 diff_type_2, WORD32 pilot_coding_flag, WORD32 *pilot_data,
1061
33.4k
                                 WORD32 num_val, WORD32 *cdg_scheme, WORD32 ld_mps_flag) {
1062
33.4k
  WORD32 diff_type;
1063
1064
33.4k
  WORD32 i = 0;
1065
33.4k
  UWORD32 data = 0;
1066
1067
33.4k
  WORD32 pair_vec[MAXBANDS][2];
1068
1069
33.4k
  WORD32* p0_data_1[2] = {NULL, NULL};
1070
33.4k
  WORD32* p0_data_2[2] = {NULL, NULL};
1071
1072
33.4k
  WORD32 p0_flag[2];
1073
1074
33.4k
  WORD32 num_val_1_int = num_val;
1075
33.4k
  WORD32 num_val_2_int = num_val;
1076
1077
33.4k
  WORD32* out_data_1_int = out_data_1;
1078
33.4k
  WORD32* out_data_2_int = out_data_2;
1079
1080
33.4k
  WORD32 df_rest_flag_1 = 0;
1081
33.4k
  WORD32 df_rest_flag_2 = 0;
1082
1083
33.4k
  WORD32 huff_yy_1;
1084
33.4k
  WORD32 huff_yy_2;
1085
33.4k
  WORD32 huff_yy;
1086
33.4k
  if (pilot_coding_flag) {
1087
6.45k
    switch (data_type) {
1088
5.96k
      case CLD:
1089
5.96k
        if (out_data_1 != NULL) {
1090
5.96k
          ixheaacd_mps_huff_dec_pilot(
1091
5.96k
              it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.cld,
1092
5.96k
              pilot_data);
1093
5.96k
        }
1094
5.96k
        break;
1095
1096
429
      case ICC:
1097
429
        if (out_data_1 != NULL) {
1098
429
          ixheaacd_mps_huff_dec_pilot(
1099
429
              it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.icc,
1100
429
              pilot_data);
1101
429
        }
1102
429
        break;
1103
1104
63
      case CPC:
1105
63
        if (out_data_1 != NULL) {
1106
63
          ixheaacd_mps_huff_dec_pilot(
1107
63
              it_bit_buff,
1108
63
              (ia_huff_node_struct) & (ixheaacd_huff_pilot_nodes.cpc),
1109
63
              pilot_data);
1110
63
        }
1111
63
        break;
1112
1113
0
      default:
1114
0
        break;
1115
6.45k
    }
1116
6.45k
  }
1117
1118
33.4k
  data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1119
33.4k
  *cdg_scheme = data << PAIR_SHIFT;
1120
1121
33.4k
  if (*cdg_scheme >> PAIR_SHIFT == HUFF_2D) {
1122
21.6k
    if ((out_data_1 != NULL) && (out_data_2 != NULL) && (ld_mps_flag != 1)) {
1123
11.1k
      data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1124
11.1k
      *cdg_scheme |= data;
1125
11.1k
    } else {
1126
10.4k
      *cdg_scheme |= FREQ_PAIR;
1127
10.4k
    }
1128
21.6k
  }
1129
1130
33.4k
  if (pilot_coding_flag) {
1131
6.45k
    huff_yy_1 = PCM_PLT;
1132
6.45k
    huff_yy_2 = PCM_PLT;
1133
27.0k
  } else {
1134
27.0k
    huff_yy_1 = diff_type_1;
1135
27.0k
    huff_yy_2 = diff_type_2;
1136
27.0k
  }
1137
1138
33.4k
  switch (*cdg_scheme >> PAIR_SHIFT) {
1139
11.8k
    case HUFF_1D:
1140
1141
11.8k
      p0_flag[0] = (diff_type_1 == DIFF_FREQ) && !pilot_coding_flag;
1142
11.8k
      p0_flag[1] = (diff_type_2 == DIFF_FREQ) && !pilot_coding_flag;
1143
1144
11.8k
      switch (data_type) {
1145
7.45k
        case CLD:
1146
7.45k
          if (out_data_1 != NULL) {
1147
7.45k
            ixheaacd_mps_huff_dec_cld_1d(
1148
7.45k
                it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1],
1149
7.45k
                out_data_1, num_val_1_int, p0_flag[0]);
1150
7.45k
          }
1151
7.45k
          if (out_data_2 != NULL) {
1152
3.01k
            ixheaacd_mps_huff_dec_cld_1d(
1153
3.01k
                it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2],
1154
3.01k
                out_data_2, num_val_2_int, p0_flag[1]);
1155
3.01k
          }
1156
1157
7.45k
          break;
1158
1159
2.81k
        case ICC:
1160
2.81k
          if (out_data_1 != NULL) {
1161
2.81k
            ixheaacd_mps_huff_dec_icc_1d(
1162
2.81k
                it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1],
1163
2.81k
                out_data_1, num_val_1_int, p0_flag[0]);
1164
2.81k
          }
1165
2.81k
          if (out_data_2 != NULL) {
1166
1.17k
            ixheaacd_mps_huff_dec_icc_1d(
1167
1.17k
                it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2],
1168
1.17k
                out_data_2, num_val_2_int, p0_flag[1]);
1169
1.17k
          }
1170
1171
2.81k
          break;
1172
1173
1.34k
        case IPD:
1174
1.34k
          if (out_data_1 != NULL) {
1175
1.34k
            ixheaacd_mps_huff_dec_ipd_1d(
1176
1.34k
                it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1],
1177
1.34k
                out_data_1, num_val_1_int, p0_flag[0]);
1178
1.34k
          }
1179
1.34k
          if (out_data_2 != NULL) {
1180
475
            ixheaacd_mps_huff_dec_ipd_1d(
1181
475
                it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2],
1182
475
                out_data_2, num_val_2_int, p0_flag[1]);
1183
475
          }
1184
1185
1.34k
          break;
1186
233
        case CPC:
1187
233
          if (out_data_1 != NULL) {
1188
233
            ia_mps_dec_huff_dec_cpc_1d(
1189
233
                &(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_1]), out_data_1,
1190
233
                num_val_1_int, p0_flag[0], it_bit_buff);
1191
233
          }
1192
233
          if (out_data_2 != NULL) {
1193
119
            ia_mps_dec_huff_dec_cpc_1d(
1194
119
                &(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_2]), out_data_2,
1195
119
                num_val_2_int, p0_flag[1], it_bit_buff);
1196
119
          }
1197
1198
233
          break;
1199
0
        default:
1200
0
          break;
1201
11.8k
      }
1202
1203
11.8k
      break;
1204
1205
21.6k
    case HUFF_2D:
1206
1207
21.6k
      switch (*cdg_scheme & PAIR_MASK) {
1208
16.2k
        case FREQ_PAIR:
1209
1210
16.2k
          if (out_data_1 != NULL) {
1211
16.2k
            if (!pilot_coding_flag && diff_type_1 == DIFF_FREQ) {
1212
7.46k
              p0_data_1[0] = &out_data_1[0];
1213
7.46k
              p0_data_1[1] = NULL;
1214
1215
7.46k
              num_val_1_int -= 1;
1216
7.46k
              out_data_1_int += 1;
1217
7.46k
            }
1218
16.2k
            df_rest_flag_1 = num_val_1_int % 2;
1219
16.2k
            if (df_rest_flag_1) num_val_1_int -= 1;
1220
16.2k
          }
1221
16.2k
          if (out_data_2 != NULL) {
1222
6.49k
            if (!pilot_coding_flag && diff_type_2 == DIFF_FREQ) {
1223
773
              p0_data_2[0] = NULL;
1224
773
              p0_data_2[1] = &out_data_2[0];
1225
1226
773
              num_val_2_int -= 1;
1227
773
              out_data_2_int += 1;
1228
773
            }
1229
6.49k
            df_rest_flag_2 = num_val_2_int % 2;
1230
6.49k
            if (df_rest_flag_2) num_val_2_int -= 1;
1231
6.49k
          }
1232
1233
16.2k
          switch (data_type) {
1234
11.8k
            case CLD:
1235
1236
11.8k
              if (out_data_1 != NULL) {
1237
11.8k
                ixheaacd_mps_huff_dec_cld_2d(
1238
11.8k
                    it_bit_buff,
1239
11.8k
                    &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_1][FREQ_PAIR],
1240
11.8k
                    pair_vec, num_val_1_int, 2, p0_data_1);
1241
11.8k
                if (df_rest_flag_1) {
1242
2.99k
                  ixheaacd_mps_huff_dec_cld_1d(
1243
2.99k
                      it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1],
1244
2.99k
                      out_data_1_int + num_val_1_int, 1, 0);
1245
2.99k
                }
1246
11.8k
              }
1247
11.8k
              if (out_data_2 != NULL) {
1248
5.73k
                ixheaacd_mps_huff_dec_cld_2d(
1249
5.73k
                    it_bit_buff,
1250
5.73k
                    &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_2][FREQ_PAIR],
1251
5.73k
                    pair_vec + 1, num_val_2_int, 2, p0_data_2);
1252
5.73k
                if (df_rest_flag_2) {
1253
399
                  ixheaacd_mps_huff_dec_cld_1d(
1254
399
                      it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2],
1255
399
                      out_data_2_int + num_val_2_int, 1, 0);
1256
399
                }
1257
5.73k
              }
1258
11.8k
              break;
1259
1260
3.75k
            case ICC:
1261
3.75k
              if (out_data_1 != NULL) {
1262
3.75k
                ixheaacd_mps_huff_dec_icc_2d(
1263
3.75k
                    it_bit_buff,
1264
3.75k
                    &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_1][FREQ_PAIR],
1265
3.75k
                    pair_vec, num_val_1_int, 2, p0_data_1);
1266
3.75k
                if (df_rest_flag_1) {
1267
2.29k
                  ixheaacd_mps_huff_dec_icc_1d(
1268
2.29k
                      it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1],
1269
2.29k
                      out_data_1_int + num_val_1_int, 1, 0);
1270
2.29k
                }
1271
3.75k
              }
1272
3.75k
              if (out_data_2 != NULL) {
1273
624
                ixheaacd_mps_huff_dec_icc_2d(
1274
624
                    it_bit_buff,
1275
624
                    &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_2][FREQ_PAIR],
1276
624
                    pair_vec + 1, num_val_2_int, 2, p0_data_2);
1277
624
                if (df_rest_flag_2) {
1278
366
                  ixheaacd_mps_huff_dec_icc_1d(
1279
366
                      it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2],
1280
366
                      out_data_2_int + num_val_2_int, 1, 0);
1281
366
                }
1282
624
              }
1283
3.75k
              break;
1284
1285
528
            case IPD:
1286
528
              if (out_data_1 != NULL) {
1287
528
                ixheaacd_mps_huff_dec_ipd_2d(
1288
528
                    it_bit_buff,
1289
528
                    &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_1][FREQ_PAIR],
1290
528
                    pair_vec, num_val_1_int, 2, p0_data_1);
1291
528
                if (df_rest_flag_1) {
1292
112
                  ixheaacd_mps_huff_dec_ipd_1d(
1293
112
                      it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1],
1294
112
                      out_data_1_int + num_val_1_int, 1, 0);
1295
112
                }
1296
528
              }
1297
528
              if (out_data_2 != NULL) {
1298
87
                ixheaacd_mps_huff_dec_ipd_2d(
1299
87
                    it_bit_buff,
1300
87
                    &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_2][FREQ_PAIR],
1301
87
                    pair_vec + 1, num_val_2_int, 2, p0_data_2);
1302
87
                if (df_rest_flag_2) {
1303
37
                  ixheaacd_mps_huff_dec_ipd_1d(
1304
37
                      it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2],
1305
37
                      out_data_2_int + num_val_2_int, 1, 0);
1306
37
                }
1307
87
              }
1308
528
              break;
1309
123
            case CPC:
1310
123
              if (out_data_1 != NULL) {
1311
123
                ia_mps_dec_huff_dec_cpc_2d(
1312
123
                    &(ixheaacd_huff_cpc_nodes.h_2_dim[huff_yy_1][FREQ_PAIR]), pair_vec,
1313
123
                    num_val_1_int, 2, p0_data_1, it_bit_buff);
1314
123
                if (df_rest_flag_1) {
1315
72
                  ia_mps_dec_huff_dec_cpc_1d(&(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_1]),
1316
72
                      out_data_1_int + num_val_1_int, 1, 0, it_bit_buff);
1317
72
                }
1318
123
              }
1319
123
              if (out_data_2 != NULL) {
1320
42
                ia_mps_dec_huff_dec_cpc_2d(
1321
42
                    &(ixheaacd_huff_cpc_nodes.h_2_dim[huff_yy_2][FREQ_PAIR]), pair_vec + 1,
1322
42
                    num_val_2_int, 2, p0_data_2, it_bit_buff);
1323
1324
42
                if (df_rest_flag_2) {
1325
24
                  ia_mps_dec_huff_dec_cpc_1d(
1326
24
                      &(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_2]),
1327
24
                      out_data_2_int + num_val_2_int, 1, 0, it_bit_buff);
1328
24
                }
1329
42
              }
1330
123
              break;
1331
0
            default:
1332
0
              break;
1333
16.2k
          }
1334
1335
16.2k
          if (out_data_1 != NULL) {
1336
80.9k
            for (i = 0; i < num_val_1_int - 1; i += 2) {
1337
64.6k
              out_data_1_int[i] = pair_vec[i][0];
1338
64.6k
              out_data_1_int[i + 1] = pair_vec[i][1];
1339
64.6k
            }
1340
16.2k
          }
1341
16.2k
          if (out_data_2 != NULL) {
1342
35.3k
            for (i = 0; i < num_val_2_int - 1; i += 2) {
1343
28.8k
              out_data_2_int[i] = pair_vec[i + 1][0];
1344
28.8k
              out_data_2_int[i + 1] = pair_vec[i + 1][1];
1345
28.8k
            }
1346
6.48k
          }
1347
1348
16.2k
          break;
1349
1350
5.34k
        case TIME_PAIR:
1351
1352
5.34k
          if (!pilot_coding_flag &&
1353
5.08k
              ((diff_type_1 == DIFF_FREQ) || (diff_type_2 == DIFF_FREQ))) {
1354
4.73k
            p0_data_1[0] = &out_data_1[0];
1355
4.73k
            p0_data_1[1] = &out_data_2[0];
1356
1357
4.73k
            out_data_1_int += 1;
1358
4.73k
            out_data_2_int += 1;
1359
1360
4.73k
            num_val_1_int -= 1;
1361
4.73k
          }
1362
1363
5.34k
          if ((diff_type_1 == DIFF_TIME) || (diff_type_2 == DIFF_TIME)) {
1364
4.78k
            diff_type = DIFF_TIME;
1365
4.78k
          } else {
1366
553
            diff_type = DIFF_FREQ;
1367
553
          }
1368
5.34k
          if (pilot_coding_flag) {
1369
260
            huff_yy = PCM_PLT;
1370
5.08k
          } else {
1371
5.08k
            huff_yy = diff_type;
1372
5.08k
          }
1373
1374
5.34k
          switch (data_type) {
1375
2.29k
            case CLD:
1376
2.29k
              ixheaacd_mps_huff_dec_cld_2d(
1377
2.29k
                  it_bit_buff,
1378
2.29k
                  &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy][TIME_PAIR],
1379
2.29k
                  pair_vec, num_val_1_int, 1, p0_data_1);
1380
2.29k
              break;
1381
1382
2.66k
            case ICC:
1383
2.66k
              ixheaacd_mps_huff_dec_icc_2d(
1384
2.66k
                  it_bit_buff,
1385
2.66k
                  &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy][TIME_PAIR],
1386
2.66k
                  pair_vec, num_val_1_int, 1, p0_data_1);
1387
2.66k
              break;
1388
1389
289
            case IPD:
1390
289
              ixheaacd_mps_huff_dec_ipd_2d(
1391
289
                  it_bit_buff,
1392
289
                  &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy][TIME_PAIR],
1393
289
                  pair_vec, num_val_1_int, 1, p0_data_1);
1394
289
              break;
1395
92
            case CPC:
1396
92
              ia_mps_dec_huff_dec_cpc_2d(&(ixheaacd_huff_cpc_nodes.h_2_dim[huff_yy][TIME_PAIR]),
1397
92
                  pair_vec, num_val_1_int, 1, p0_data_1, it_bit_buff);
1398
92
              break;
1399
0
            default:
1400
0
              break;
1401
5.34k
          }
1402
1403
34.8k
          for (i = 0; i < num_val_1_int; i++) {
1404
29.5k
            out_data_1_int[i] = pair_vec[i][0];
1405
29.5k
            out_data_2_int[i] = pair_vec[i][1];
1406
29.5k
          }
1407
1408
5.32k
          break;
1409
1410
0
        default:
1411
0
          break;
1412
21.6k
      }
1413
1414
21.6k
      break;
1415
1416
21.6k
    default:
1417
0
      break;
1418
33.4k
  }
1419
1420
33.4k
  return;
1421
33.4k
}
1422
1423
static VOID ixheaacd_diff_freq_decode(WORD32* diff_data, WORD32* out_data,
1424
42.2k
                                      WORD32 num_val) {
1425
42.2k
  WORD32 i = 0;
1426
1427
42.2k
  out_data[0] = diff_data[0];
1428
1429
330k
  for (i = 1; i < num_val; i++) {
1430
288k
    out_data[i] = out_data[i - 1] + diff_data[i];
1431
288k
  }
1432
42.2k
}
1433
1434
static VOID ixheaacd_mps_diff_time_dec_bwd(WORD32* prev_data, WORD32* diff_data,
1435
                                           WORD32* out_data,
1436
                                           WORD32 mixed_diff_type,
1437
10.6k
                                           WORD32 num_val) {
1438
10.6k
  WORD32 i = 0;
1439
1440
10.6k
  if (mixed_diff_type) {
1441
3.87k
    out_data[0] = diff_data[0];
1442
25.1k
    for (i = 1; i < num_val; i++) {
1443
21.3k
      out_data[i] = prev_data[i] + diff_data[i];
1444
21.3k
    }
1445
6.72k
  } else {
1446
55.1k
    for (i = 0; i < num_val; i++) {
1447
48.4k
      out_data[i] = prev_data[i] + diff_data[i];
1448
48.4k
    }
1449
6.72k
  }
1450
10.6k
}
1451
1452
static VOID ixheaacd_mps_diff_time_dec_fwd(WORD32* prev_data, WORD32* diff_data,
1453
                                           WORD32* out_data,
1454
                                           WORD32 mixed_diff_type,
1455
1.10k
                                           WORD32 num_val) {
1456
1.10k
  WORD32 i = 0;
1457
1458
1.10k
  if (mixed_diff_type) {
1459
557
    out_data[0] = diff_data[0];
1460
3.51k
    for (i = 1; i < num_val; i++) {
1461
2.95k
      out_data[i] = prev_data[i] - diff_data[i];
1462
2.95k
    }
1463
557
  } else {
1464
3.85k
    for (i = 0; i < num_val; i++) {
1465
3.30k
      out_data[i] = prev_data[i] - diff_data[i];
1466
3.30k
    }
1467
547
  }
1468
1.10k
}
1469
1470
static VOID ixheaacd_attach_lsb(ia_bit_buf_struct *it_bit_buff,
1471
                                WORD32* in_data_msb, WORD32 ixheaacd_drc_offset,
1472
                                WORD32 num_lsb, WORD32 num_val,
1473
49.9k
                                WORD32* out_data) {
1474
49.9k
  WORD32 i = 0, lsb = 0, msb = 0;
1475
49.9k
  UWORD32 data = 0;
1476
1477
450k
  for (i = 0; i < num_val; i++) {
1478
400k
    msb = in_data_msb[i];
1479
1480
400k
    if (num_lsb > 0) {
1481
19.7k
      data = ixheaacd_read_bits_buf(it_bit_buff, num_lsb);
1482
19.7k
      lsb = data;
1483
1484
19.7k
      out_data[i] = ((msb << num_lsb) | lsb) - ixheaacd_drc_offset;
1485
19.7k
    } else
1486
380k
      out_data[i] = msb - ixheaacd_drc_offset;
1487
400k
  }
1488
1489
49.9k
  return;
1490
49.9k
}
1491
1492
WORD32 ixheaacd_mps_ecdatapairdec(ia_bit_buf_struct *it_bit_buff, WORD32 outdata[][MAXBANDS],
1493
                                  WORD32 history[MAXBANDS], WORD32 data_type, WORD32 set_idx,
1494
                                  WORD32 start_band, WORD32 data_bands, WORD32 pair_flag,
1495
                                  WORD32 coarse_flag, WORD32 diff_time_back_flag,
1496
58.3k
                                  WORD32 ld_mps_flag, WORD32 heaac_mps_present, WORD32 ec_flag) {
1497
58.3k
  WORD32 attach_lsb_flag = 0;
1498
58.3k
  WORD32 pcm_coding_flag = 0;
1499
58.3k
  WORD32 pilot_coding_flag = 0;
1500
58.3k
  WORD32 pilot_data[2] = {0, 0};
1501
58.3k
  WORD32 mixed_time_pair = 0, pcm_val = 0;
1502
58.3k
  WORD32 quant_levels = 0, quant_offset = 0;
1503
58.3k
  UWORD32 data = 0;
1504
58.3k
  WORD32 band_start = 0;
1505
1506
58.3k
  WORD32 data_pair[2][MAXBANDS] = {{0}};
1507
58.3k
  WORD32 data_diff[2][MAXBANDS] = {{0}};
1508
1509
58.3k
  WORD32 msb_state[MAXBANDS] = {0};
1510
1511
58.3k
  WORD32* data_array[2] = {NULL, NULL};
1512
1513
58.3k
  WORD32 diff_type[2] = {DIFF_FREQ, DIFF_FREQ};
1514
58.3k
  WORD32 cdg_scheme = HUFF_1D;
1515
58.3k
  WORD32 direction = BACKWARDS;
1516
1517
58.3k
  if (heaac_mps_present == 1) {
1518
23.5k
    band_start = start_band;
1519
23.5k
  }
1520
1521
58.3k
  switch (data_type) {
1522
34.2k
    case CLD:
1523
34.2k
      if (coarse_flag) {
1524
13.0k
        attach_lsb_flag = 0;
1525
13.0k
        quant_levels = 15;
1526
13.0k
        quant_offset = 7;
1527
21.2k
      } else {
1528
21.2k
        attach_lsb_flag = 0;
1529
21.2k
        quant_levels = 31;
1530
21.2k
        quant_offset = 15;
1531
21.2k
      }
1532
1533
34.2k
      break;
1534
1535
18.0k
    case ICC:
1536
18.0k
      if (coarse_flag) {
1537
8.08k
        attach_lsb_flag = 0;
1538
8.08k
        quant_levels = 4;
1539
8.08k
        quant_offset = 0;
1540
9.92k
      } else {
1541
9.92k
        attach_lsb_flag = 0;
1542
9.92k
        quant_levels = 8;
1543
9.92k
        quant_offset = 0;
1544
9.92k
      }
1545
1546
18.0k
      break;
1547
1548
4.71k
    case IPD:
1549
4.71k
      if (coarse_flag) {
1550
2.47k
        attach_lsb_flag = 0;
1551
2.47k
        quant_levels = 8;
1552
2.47k
        quant_offset = 0;
1553
2.47k
      } else {
1554
2.23k
        attach_lsb_flag = 1;
1555
2.23k
        quant_levels = 16;
1556
2.23k
        quant_offset = 0;
1557
2.23k
      }
1558
4.71k
      break;
1559
1560
1.32k
    case CPC:
1561
1.32k
      if (coarse_flag) {
1562
989
        attach_lsb_flag = 0;
1563
989
        quant_levels = 26;
1564
989
        quant_offset = 10;
1565
989
      } else {
1566
331
        attach_lsb_flag = 1;
1567
331
        quant_levels = 51;
1568
331
        quant_offset = 20;
1569
331
      }
1570
1.32k
      break;
1571
1572
0
    default:
1573
0
      break;
1574
58.3k
  }
1575
1576
58.3k
  data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1577
58.3k
  pcm_coding_flag = data;
1578
1579
58.3k
  pilot_coding_flag = 0;
1580
1581
58.3k
  if (heaac_mps_present == 1) {
1582
23.5k
    if (pcm_coding_flag && data_bands > 4) {
1583
7.13k
      data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1584
7.13k
      pilot_coding_flag = data;
1585
7.13k
    }
1586
23.5k
  }
1587
1588
58.3k
  if (pcm_coding_flag && !pilot_coding_flag) {
1589
24.5k
    if (pair_flag) {
1590
13.7k
      data_array[0] = data_pair[0];
1591
13.7k
      data_array[1] = data_pair[1];
1592
13.7k
      pcm_val = 2 * data_bands;
1593
13.7k
    } else {
1594
10.7k
      data_array[0] = data_pair[0];
1595
10.7k
      data_array[1] = NULL;
1596
10.7k
      pcm_val = data_bands;
1597
10.7k
    }
1598
1599
24.5k
    ixheaacd_mps_pcm_decode(it_bit_buff, data_array[0], data_array[1],
1600
24.5k
                            quant_offset, pcm_val, quant_levels);
1601
1602
33.8k
  } else {
1603
33.8k
    if (pair_flag) {
1604
16.9k
      data_array[0] = data_diff[0];
1605
16.9k
      data_array[1] = data_diff[1];
1606
16.9k
    } else {
1607
16.8k
      data_array[0] = data_diff[0];
1608
16.8k
      data_array[1] = NULL;
1609
16.8k
    }
1610
1611
33.8k
    diff_type[0] = DIFF_FREQ;
1612
33.8k
    diff_type[1] = DIFF_FREQ;
1613
1614
33.8k
    direction = BACKWARDS;
1615
1616
33.8k
    if (!pilot_coding_flag) {
1617
27.3k
      if (pair_flag || diff_time_back_flag) {
1618
20.6k
        data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1619
20.6k
        diff_type[0] = data;
1620
20.6k
      }
1621
1622
27.3k
      if (pair_flag && ((diff_type[0] == DIFF_FREQ) || diff_time_back_flag)) {
1623
10.4k
        data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1624
10.4k
        diff_type[1] = data;
1625
10.4k
      }
1626
27.3k
    }
1627
1628
33.8k
    if (data_bands <= 0) {
1629
333
      if (!ec_flag)
1630
333
        return -1;
1631
0
      else
1632
0
        longjmp(*(it_bit_buff->xaac_jmp_buf), IA_FATAL_ERROR);
1633
333
    }
1634
1635
33.5k
    ixheaacd_huff_decode(it_bit_buff, data_array[0], data_array[1], data_type, diff_type[0],
1636
33.5k
                         diff_type[1], pilot_coding_flag, pilot_data, data_bands, &cdg_scheme,
1637
33.5k
                         ld_mps_flag);
1638
1639
33.5k
    if (pilot_coding_flag && heaac_mps_present == 1) {
1640
6.44k
      WORD32 i;
1641
72.6k
      for (i = 0; i < data_bands; i++) {
1642
66.2k
        data_pair[0][i] = data_diff[0][i] + pilot_data[0];
1643
66.2k
      }
1644
1645
6.44k
      if (pair_flag) {
1646
63.5k
        for (i = 0; i < data_bands; i++) {
1647
57.7k
          data_pair[1][i] = data_diff[1][i] + pilot_data[0];
1648
57.7k
        }
1649
5.75k
      }
1650
27.0k
    } else {
1651
27.0k
      if ((diff_type[0] == DIFF_TIME) || (diff_type[1] == DIFF_TIME)) {
1652
10.8k
        if (pair_flag) {
1653
7.39k
          if ((diff_type[0] == DIFF_TIME) && !diff_time_back_flag) {
1654
741
            direction = FORWARDS;
1655
6.65k
          } else if (diff_type[1] == DIFF_TIME) {
1656
5.68k
            direction = BACKWARDS;
1657
5.68k
          } else {
1658
974
            data = ixheaacd_read_bits_buf(it_bit_buff, 1);
1659
974
            direction = data;
1660
974
          }
1661
7.39k
        } else {
1662
3.41k
          direction = BACKWARDS;
1663
3.41k
        }
1664
10.8k
      }
1665
1666
27.0k
      mixed_time_pair = (diff_type[0] != diff_type[1]) &&
1667
9.91k
                        ((cdg_scheme & PAIR_MASK) == TIME_PAIR);
1668
1669
27.0k
      if (direction == BACKWARDS) {
1670
25.8k
        if (diff_type[0] == DIFF_FREQ) {
1671
20.9k
          ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
1672
20.9k
        } else {
1673
4.91k
          WORD32 i;
1674
39.8k
          for (i = 0; i < data_bands; i++) {
1675
34.9k
            msb_state[i] = history[i + band_start] + quant_offset;
1676
34.9k
            if (attach_lsb_flag) {
1677
5.66k
              msb_state[i] >>= 1;
1678
5.66k
            }
1679
34.9k
          }
1680
4.91k
          ixheaacd_mps_diff_time_dec_bwd(msb_state, data_diff[0], data_pair[0],
1681
4.91k
                                         mixed_time_pair, data_bands);
1682
4.91k
        }
1683
25.8k
        if (diff_type[1] == DIFF_FREQ) {
1684
20.1k
          ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
1685
20.1k
        } else {
1686
5.68k
          ixheaacd_mps_diff_time_dec_bwd(data_pair[0], data_diff[1], data_pair[1],
1687
5.68k
                                         mixed_time_pair, data_bands);
1688
5.68k
        }
1689
25.8k
      } else {
1690
1.19k
        ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
1691
1692
1.19k
        if (diff_type[0] == DIFF_FREQ) {
1693
0
          ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
1694
1.19k
        } else {
1695
1.19k
          ixheaacd_mps_diff_time_dec_fwd(data_pair[1], data_diff[0], data_pair[0],
1696
1.19k
                                         mixed_time_pair, data_bands);
1697
1.19k
        }
1698
1.19k
      }
1699
27.0k
    }
1700
33.5k
    ixheaacd_attach_lsb(it_bit_buff, data_pair[0], quant_offset,
1701
33.5k
                        attach_lsb_flag ? 1 : 0, data_bands, data_pair[0]);
1702
33.5k
    if (pair_flag) {
1703
16.5k
      ixheaacd_attach_lsb(it_bit_buff, data_pair[1], quant_offset,
1704
16.5k
                          attach_lsb_flag ? 1 : 0, data_bands, data_pair[1]);
1705
16.5k
    }
1706
33.5k
  }
1707
1708
58.0k
  memcpy(outdata[set_idx] + band_start, data_pair[0],
1709
58.0k
         sizeof(WORD32) * data_bands);
1710
58.0k
  if (pair_flag) {
1711
30.3k
    memcpy(outdata[set_idx + 1] + band_start, data_pair[1],
1712
30.3k
           sizeof(WORD32) * data_bands);
1713
30.3k
  }
1714
1715
58.0k
  return IA_NO_ERROR;
1716
58.3k
}
1717
1718
VOID ixheaacd_mps_huff_decode(ia_bit_buf_struct *it_bit_buff,
1719
2.88k
                              WORD32* out_data, WORD32 num_val) {
1720
2.88k
  WORD32 val_rcvd = 0, dummy = 0, i = 0, val = 0, len = 0;
1721
2.88k
  WORD32 rl_data[2] = {0};
1722
1723
32.7k
  while (val_rcvd < num_val) {
1724
29.8k
    ixheaacd_mps_huff_read_2d(it_bit_buff,
1725
29.8k
                              (ia_huff_node_struct)&ixheaacd_huff_reshape_nodes,
1726
29.8k
                              rl_data, &dummy);
1727
29.8k
    val = rl_data[0];
1728
29.8k
    len = rl_data[1] + 1;
1729
103k
    for (i = val_rcvd; i < val_rcvd + len; i++) {
1730
73.5k
      out_data[i] = val;
1731
73.5k
    }
1732
29.8k
    val_rcvd += len;
1733
29.8k
  }
1734
1735
2.88k
  return;
1736
2.88k
}
1737
1738
VOID ixheaacd_update_out_buffer(ia_heaac_mps_state_struct *pstr_mps_state,
1739
16.0k
                                WORD16 *out_buf) {
1740
16.0k
  WORD32 ch, sam;
1741
16.0k
  WORD32 num_output_channels_at = pstr_mps_state->num_output_channels_at;
1742
16.0k
  WORD32 frame_length = pstr_mps_state->frame_length;
1743
1744
16.0k
  WORD32 *p_time_out = pstr_mps_state->array_struct->time_out;
1745
1746
141k
  for (ch = 0; ch < num_output_channels_at; ch++) {
1747
125k
    WORD32 *time_out = p_time_out;
1748
176M
    for (sam = 0; sam < frame_length; sam++) {
1749
176M
      out_buf[sam * num_output_channels_at + ch] = (*time_out++) >> 16;
1750
176M
    }
1751
125k
    p_time_out += QBXTS;
1752
125k
  }
1753
1754
16.0k
  return;
1755
16.0k
}
1756
1757
16.0k
VOID ixheaacd_update_time_out_buffer(ia_heaac_mps_state_struct *pstr_mps_state) {
1758
16.0k
  WORD32 n;
1759
16.0k
  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
1760
16.0k
  WORD32 tree_config = pstr_mps_state->tree_config;
1761
16.0k
  WORD32 lfe_gain = pstr_mps_state->lfe_gain;
1762
16.0k
  WORD32 surround_gain = pstr_mps_state->surround_gain;
1763
1764
16.0k
  if (!pstr_mps_state->bs_config.arbitrary_tree && up_mix_type != 2 && up_mix_type != 3) {
1765
16.0k
    WORD32 frame_length = pstr_mps_state->frame_length;
1766
1767
16.0k
    WORD32 *time_out_3 = pstr_mps_state->array_struct->time_out + QBXTSX3;
1768
16.0k
    WORD32 *time_out_4 = time_out_3 + QBXTS;
1769
16.0k
    WORD32 *time_out_5 = time_out_4 + QBXTS;
1770
16.0k
    WORD32 *time_out_6 = time_out_5 + QBXTS;
1771
16.0k
    WORD32 *time_out_7 = time_out_6 + QBXTS;
1772
1773
22.4M
    for (n = 0; n < frame_length; n++) {
1774
22.4M
      *time_out_3 = ixheaacd_mps_mult32_shr_15(*time_out_3, lfe_gain);
1775
22.4M
      time_out_3++;
1776
22.4M
      *time_out_4 = ixheaacd_mps_mult32_shr_15(*time_out_4, surround_gain);
1777
22.4M
      time_out_4++;
1778
22.4M
      *time_out_5 = ixheaacd_mps_mult32_shr_15(*time_out_5, surround_gain);
1779
22.4M
      time_out_5++;
1780
22.4M
    }
1781
1782
16.0k
    if (tree_config == 4 || tree_config == 6) {
1783
19.7M
      for (n = 0; n < frame_length; n++) {
1784
19.7M
        *time_out_6 = ixheaacd_mps_mult32_shr_15(*time_out_6, surround_gain);
1785
19.7M
        time_out_6++;
1786
19.7M
        *time_out_7 = ixheaacd_mps_mult32_shr_15(*time_out_7, surround_gain);
1787
19.7M
        time_out_7++;
1788
19.7M
      }
1789
12.6k
    }
1790
16.0k
  }
1791
16.0k
}
1792
1793
static IA_ERRORCODE ixheaacd_apply_frame(ia_heaac_mps_state_struct *pstr_mps_state,
1794
                                         WORD32 in_time_slots,
1795
                                         WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
1796
16.2k
                                         WORD16 *out_buf) {
1797
16.2k
  IA_ERRORCODE err_code = IA_NO_ERROR;
1798
16.2k
  WORD32 ch, ts, qs;
1799
16.2k
  WORD32 *pbuf_real, *pbuf_imag, *pbuf_re, *pbuf_im;
1800
16.2k
  WORD32 *buf_real, *buf_imag;
1801
16.2k
  WORD32 *qmf_input_delay_real_2 =
1802
16.2k
      pstr_mps_state->mps_persistent_mem.qmf_input_delay_real;
1803
16.2k
  WORD32 *qmf_input_delay_imag_2 =
1804
16.2k
      pstr_mps_state->mps_persistent_mem.qmf_input_delay_imag;
1805
16.2k
  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
1806
16.2k
  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
1807
16.2k
  WORD32 cur_time_slot = pstr_mps_state->cur_time_slot;
1808
16.2k
  WORD32 time_slots = pstr_mps_state->time_slots;
1809
16.2k
  WORD32 qmf_input_delay_index = pstr_mps_state->qmf_input_delay_index;
1810
16.2k
  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
1811
16.2k
  WORD32 residual_coding = pstr_mps_state->residual_coding;
1812
16.2k
  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
1813
1814
16.2k
  WORD32 *qmf_input_delay_real_1, *qmf_input_delay_imag_1;
1815
16.2k
  WORD32 *qmf_input_delay_real, *qmf_input_delay_imag;
1816
1817
16.2k
  WORD32 *p_qmf_real = m_qmf_real;
1818
16.2k
  WORD32 *p_qmf_imag = m_qmf_imag;
1819
16.2k
  WORD32 *p_qmf_re, *p_qmf_im, *qmf_real, *qmf_imag;
1820
1821
16.2k
  if (cur_time_slot + in_time_slots > time_slots) {
1822
0
    if (pstr_mps_state->ec_flag)
1823
0
      cur_time_slot = time_slots - in_time_slots;
1824
0
    else
1825
0
      return IA_FATAL_ERROR;
1826
0
  }
1827
16.2k
  if (time_slots % HOP_SLOTS != 0) {
1828
9
    if (pstr_mps_state->ec_flag)
1829
0
      time_slots = time_slots - (time_slots % HOP_SLOTS);
1830
9
    else
1831
9
      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TIMESLOTS;
1832
9
  }
1833
1834
16.2k
  pbuf_real = pstr_mps_state->array_struct->buf_real;
1835
16.2k
  pbuf_imag = pstr_mps_state->array_struct->buf_imag;
1836
1837
16.2k
  if (up_mix_type == 1) {
1838
0
    for (ch = 0; ch < num_input_channels; ch++) {
1839
0
      pbuf_re = pbuf_real;
1840
0
      pbuf_im = pbuf_imag;
1841
1842
0
      p_qmf_re = p_qmf_real;
1843
0
      p_qmf_im = p_qmf_imag;
1844
1845
0
      for (ts = 0; ts < in_time_slots; ts++) {
1846
0
        buf_real = pbuf_re + (cur_time_slot + ts);
1847
0
        buf_imag = pbuf_im + (cur_time_slot + ts);
1848
1849
0
        qmf_real = p_qmf_re;
1850
0
        qmf_imag = p_qmf_im;
1851
1852
0
        for (qs = 0; qs < qmf_bands; qs++) {
1853
0
          *buf_real++ = *qmf_real++;
1854
0
          *buf_imag++ = *qmf_imag++;
1855
0
        }
1856
0
        pbuf_re += MAX_HYBRID_BANDS;
1857
0
        pbuf_im += MAX_HYBRID_BANDS;
1858
1859
0
        p_qmf_re += MAX_NUM_QMF_BANDS;
1860
0
        p_qmf_im += MAX_NUM_QMF_BANDS;
1861
0
      }
1862
0
      pbuf_real += TSXHB;
1863
0
      pbuf_imag += TSXHB;
1864
1865
0
      p_qmf_real += QBXTS;
1866
0
      p_qmf_imag += QBXTS;
1867
0
    }
1868
16.2k
  } else {
1869
99.7k
    for (ch = 0; ch < num_input_channels; ch++) {
1870
83.4k
      WORD32 offset = ch * PCXQB;
1871
83.4k
      qmf_input_delay_index = pstr_mps_state->qmf_input_delay_index;
1872
83.4k
      qmf_input_delay_real_1 = qmf_input_delay_real_2 + offset;
1873
83.4k
      qmf_input_delay_imag_1 = qmf_input_delay_imag_2 + offset;
1874
1875
83.4k
      pbuf_re = pbuf_real + cur_time_slot * MAX_HYBRID_BANDS;
1876
83.4k
      pbuf_im = pbuf_imag + cur_time_slot * MAX_HYBRID_BANDS;
1877
1878
83.4k
      p_qmf_re = p_qmf_real;
1879
83.4k
      p_qmf_im = p_qmf_imag;
1880
1881
2.41M
      for (ts = 0; ts < in_time_slots; ts++) {
1882
2.32M
        WORD32 off_set = qmf_input_delay_index * MAX_NUM_QMF_BANDS;
1883
2.32M
        qmf_input_delay_real = qmf_input_delay_real_1 + off_set;
1884
2.32M
        qmf_input_delay_imag = qmf_input_delay_imag_1 + off_set;
1885
1886
2.32M
        buf_real = pbuf_re;
1887
2.32M
        buf_imag = pbuf_im;
1888
1889
2.32M
        qmf_real = p_qmf_re;
1890
2.32M
        qmf_imag = p_qmf_im;
1891
1892
126M
        for (qs = 0; qs < qmf_bands; qs++) {
1893
124M
          {
1894
124M
            *buf_real++ = *qmf_input_delay_real;
1895
124M
            *buf_imag++ = *qmf_input_delay_imag;
1896
1897
124M
            *qmf_input_delay_real++ = *qmf_real++;
1898
124M
            *qmf_input_delay_imag++ = *qmf_imag++;
1899
124M
          }
1900
124M
        }
1901
1902
2.32M
        qmf_input_delay_index++;
1903
1904
2.32M
        if (qmf_input_delay_index == PC_FILTERDELAY) {
1905
460k
          qmf_input_delay_index = 0;
1906
460k
        }
1907
2.32M
        pbuf_re += MAX_HYBRID_BANDS;
1908
2.32M
        pbuf_im += MAX_HYBRID_BANDS;
1909
1910
2.32M
        p_qmf_re += MAX_NUM_QMF_BANDS;
1911
2.32M
        p_qmf_im += MAX_NUM_QMF_BANDS;
1912
2.32M
      }
1913
83.4k
      pbuf_real += TSXHB;
1914
83.4k
      pbuf_imag += TSXHB;
1915
1916
83.4k
      p_qmf_real += QBXTS;
1917
83.4k
      p_qmf_imag += QBXTS;
1918
83.4k
    }
1919
16.2k
    pstr_mps_state->qmf_input_delay_index = qmf_input_delay_index;
1920
16.2k
  }
1921
1922
16.2k
  pstr_mps_state->cur_time_slot += in_time_slots;
1923
16.2k
  cur_time_slot = pstr_mps_state->cur_time_slot;
1924
1925
16.2k
  if (pstr_mps_state->cur_time_slot < time_slots) {
1926
0
    if (pstr_mps_state->ec_flag) {
1927
0
      pstr_mps_state->cur_time_slot = time_slots;
1928
0
    } else
1929
0
      return IA_FATAL_ERROR;
1930
0
  }
1931
1932
16.2k
  pstr_mps_state->cur_time_slot = 0;
1933
1934
16.2k
  err_code = ixheaacd_decode_frame(pstr_mps_state);
1935
16.2k
  if (err_code != IA_NO_ERROR) return err_code;
1936
1937
16.0k
  ixheaacd_mdct_2_qmf(pstr_mps_state);
1938
1939
16.0k
  ixheaacd_hybrid_qmf_analysis(pstr_mps_state);
1940
1941
16.0k
  if (residual_coding || (arbitrary_downmix == 2)) {
1942
645
    ixheaacd_update_buffers(pstr_mps_state);
1943
645
  }
1944
1945
16.0k
  if (up_mix_type == 1) {
1946
0
    ixheaacd_apply_blind(pstr_mps_state);
1947
0
  }
1948
1949
16.0k
  ixheaacd_calc_m1m2(pstr_mps_state);
1950
1951
16.0k
  ixheaacd_smooth_m1m2(pstr_mps_state);
1952
1953
16.0k
  ixheaacd_mps_apply_m1(pstr_mps_state);
1954
1955
16.0k
  ixheaacd_buffer_m1(pstr_mps_state);
1956
1957
16.0k
  if (up_mix_type != 2) {
1958
16.0k
    if (pstr_mps_state->temp_shape_config == 2) {
1959
8.50k
      ixheaacd_pre_reshape_bb_env(pstr_mps_state);
1960
8.50k
    }
1961
16.0k
  }
1962
1963
16.0k
  ixheaacd_create_w(pstr_mps_state);
1964
1965
16.0k
  ixheaacd_apply_m2(pstr_mps_state);
1966
1967
16.0k
  ixheaacd_buffer_m2(pstr_mps_state);
1968
1969
16.0k
  if (up_mix_type != 2) {
1970
16.0k
    if (pstr_mps_state->temp_shape_config == 2) {
1971
8.50k
      ixheaacd_reshape_bb_env(pstr_mps_state);
1972
8.50k
    }
1973
16.0k
  }
1974
1975
16.0k
  ixheaacd_tp_process(pstr_mps_state);
1976
1977
16.0k
  ixheaacd_update_time_out_buffer(pstr_mps_state);
1978
1979
16.0k
  ixheaacd_update_out_buffer(pstr_mps_state, out_buf);
1980
1981
16.0k
  pstr_mps_state->parse_next_bitstream_frame = 1;
1982
1983
16.0k
  return IA_NO_ERROR;
1984
16.2k
}
1985
1986
IA_ERRORCODE ixheaacd_heaac_mps_apply(ia_exhaacplus_dec_api_struct *self,
1987
                                      WORD16 *output_buf, UWORD8 *mps_buffer,
1988
16.8k
                                      WORD32 mps_bytes) {
1989
16.8k
  ia_heaac_mps_state_struct *pstr_mps_state =
1990
16.8k
      &self->p_state_aac->heaac_mps_handle;
1991
16.8k
  IA_ERRORCODE error_code = IA_NO_ERROR;
1992
16.8k
  WORD32 n_channels, n_time_slots, qmf_bands, channel;
1993
16.8k
  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
1994
1995
16.8k
  WORD32 *p_qmf_real = pstr_mps_state->array_struct->m_qmf_real;
1996
16.8k
  WORD32 *p_qmf_imag = pstr_mps_state->array_struct->m_qmf_imag;
1997
16.8k
  WORD32 buffer_size = mps_bytes;
1998
1999
16.8k
  if (self->p_state_aac->heaac_mps_handle.is_first == 1) {
2000
12.8k
    self->p_state_aac->heaac_mps_handle.is_first = 1;
2001
12.8k
    if (pstr_mps_state->bytes_remaining != 0) {
2002
11.1k
      buffer_size = mps_bytes + pstr_mps_state->bytes_remaining;
2003
11.1k
      if (buffer_size > 1024) {
2004
5
        return IA_FATAL_ERROR;
2005
5
      }
2006
167k
      for (WORD32 ii = 0; ii < mps_bytes; ii++) {
2007
156k
        pstr_mps_state->temp_buf[ii + pstr_mps_state->bytes_remaining] =
2008
156k
            mps_buffer[ii];
2009
156k
      }
2010
2011
11.1k
      pstr_mps_state->ptr_mps_bit_buff = ixheaacd_create_bit_buf(
2012
11.1k
          &pstr_mps_state->mps_bit_buf, (UWORD8 *)pstr_mps_state->temp_buf,
2013
11.1k
          buffer_size);
2014
11.1k
      pstr_mps_state->ptr_mps_bit_buff->xaac_jmp_buf =
2015
11.1k
          &self->p_state_aac->xaac_jmp_buf;
2016
2017
11.1k
      pstr_mps_state->ptr_mps_bit_buff->cnt_bits += (8 * buffer_size);
2018
11.1k
    } else {
2019
1.66k
      memcpy(pstr_mps_state->temp_buf, mps_buffer, mps_bytes);
2020
1.66k
      buffer_size = mps_bytes;
2021
1.66k
      pstr_mps_state->ptr_mps_bit_buff = ixheaacd_create_bit_buf(
2022
1.66k
          &pstr_mps_state->mps_bit_buf, (UWORD8 *)mps_buffer, buffer_size);
2023
1.66k
      pstr_mps_state->ptr_mps_bit_buff->cnt_bits += (8 * buffer_size);
2024
2025
1.66k
      pstr_mps_state->ptr_mps_bit_buff->xaac_jmp_buf =
2026
1.66k
          &self->p_state_aac->xaac_jmp_buf;
2027
1.66k
    }
2028
12.8k
  }
2029
2030
16.8k
  if (curr_state->num_input_channels > 2 && pstr_mps_state->mps_with_sbr == 1) {
2031
1
    if (pstr_mps_state->ec_flag) {
2032
0
      curr_state->num_input_channels = 2;
2033
0
      pstr_mps_state->frame_ok = 0;
2034
1
    } else {
2035
1
      return IA_FATAL_ERROR;
2036
1
    }
2037
1
  }
2038
2039
16.8k
  n_channels = curr_state->num_input_channels;
2040
16.8k
  n_time_slots = curr_state->time_slots;
2041
16.8k
  qmf_bands = curr_state->qmf_bands;
2042
2043
16.8k
  if (pstr_mps_state->mps_decode == 1) {
2044
16.8k
    if (pstr_mps_state->mps_with_sbr) {
2045
2.62k
      for (channel = 0; channel < n_channels; channel++) {
2046
1.73k
        WORD32 kk = 0;
2047
1.73k
        if (self->aac_config.ui_enh_sbr)
2048
1.73k
        {
2049
31.1k
          for (WORD32 ii = 0; ii < n_time_slots; ii++) {
2050
29.3k
            FLOAT32 *qmf_re = self->p_state_aac->str_sbr_dec_info[0]
2051
29.3k
                ->pstr_sbr_channel[channel]->str_sbr_dec.pp_qmf_buf_real[ii];
2052
29.3k
            FLOAT32 *qmf_im = self->p_state_aac->str_sbr_dec_info[0]
2053
29.3k
                ->pstr_sbr_channel[channel]->str_sbr_dec.pp_qmf_buf_imag[ii];
2054
2055
970k
            for (WORD32 jj = 0; jj < qmf_bands; jj++) {
2056
941k
              p_qmf_real[kk] = ixheaacd_mps_mult32_shr_15(
2057
941k
                  curr_state->clip_protect_gain, (WORD32)(qmf_re[jj] * 1024));
2058
941k
              p_qmf_imag[kk++] = ixheaacd_mps_mult32_shr_15(
2059
941k
                  curr_state->clip_protect_gain, (WORD32)(qmf_im[jj] * 1024));
2060
941k
            }
2061
29.3k
          }
2062
1.73k
        }
2063
0
        else
2064
0
        {
2065
0
          for (WORD32 ii = 0; ii < n_time_slots; ii++) {
2066
0
            WORD32 *qmf_re = self->p_state_aac->str_sbr_dec_info[0]
2067
0
                ->pstr_sbr_channel[channel]->str_sbr_dec.p_arr_qmf_buf_real[ii];
2068
0
            WORD32 *qmf_im = self->p_state_aac->str_sbr_dec_info[0]
2069
0
                ->pstr_sbr_channel[channel]->str_sbr_dec.p_arr_qmf_buf_imag[ii];
2070
2071
0
            for (WORD32 jj = 0; jj < qmf_bands; jj++) {
2072
0
              p_qmf_real[kk] = ixheaacd_mps_mult32_shr_15(
2073
0
                  curr_state->clip_protect_gain, qmf_re[jj] * 256);
2074
0
              p_qmf_imag[kk++] = ixheaacd_mps_mult32_shr_15(
2075
0
                  curr_state->clip_protect_gain, qmf_im[jj] * 256);
2076
0
            }
2077
0
          }
2078
0
        }
2079
1.73k
        p_qmf_real += QBXTS;
2080
1.73k
        p_qmf_imag += QBXTS;
2081
1.73k
      }
2082
15.9k
    } else {
2083
98.8k
      for (channel = 0; channel < n_channels; channel++) {
2084
82.8k
        ixheaacd_calc_ana_filt_bank(pstr_mps_state, output_buf, p_qmf_real,
2085
82.8k
                                    p_qmf_imag, channel);
2086
2087
82.8k
        p_qmf_real += QBXTS;
2088
82.8k
        p_qmf_imag += QBXTS;
2089
82.8k
      }
2090
15.9k
    }
2091
16.8k
    if (!pstr_mps_state->ec_flag && pstr_mps_state->frame_ok) {
2092
16.8k
      error_code = ixheaacd_parse_frame(pstr_mps_state);
2093
16.8k
      if (error_code != IA_NO_ERROR) return error_code;
2094
16.8k
    }
2095
2096
16.6k
    if (!pstr_mps_state->first_frame || !pstr_mps_state->ec_flag) {
2097
16.2k
      error_code = ixheaacd_apply_frame(pstr_mps_state, n_time_slots,
2098
16.2k
                                        pstr_mps_state->array_struct->m_qmf_real,
2099
16.2k
                                        pstr_mps_state->array_struct->m_qmf_imag, output_buf);
2100
16.2k
      if (error_code != IA_NO_ERROR) return error_code;
2101
16.2k
    }
2102
16.4k
    if (error_code == 0 && pstr_mps_state->ec_flag && pstr_mps_state->frame_ok) {
2103
0
      error_code = ixheaacd_parse_frame(pstr_mps_state);
2104
0
      if (error_code != IA_NO_ERROR) {
2105
0
        pstr_mps_state->frame_ok = 0;
2106
0
      }
2107
0
    }
2108
2109
16.4k
    pstr_mps_state->i_bytes_consumed_mps =
2110
16.4k
        (WORD32)(pstr_mps_state->ptr_mps_bit_buff->ptr_read_next -
2111
16.4k
                 pstr_mps_state->ptr_mps_bit_buff->ptr_bit_buf_base);
2112
2113
16.4k
    pstr_mps_state->bytes_remaining =
2114
16.4k
        buffer_size - pstr_mps_state->i_bytes_consumed_mps;
2115
16.4k
    if (pstr_mps_state->bytes_remaining < 0)
2116
394
    {
2117
394
      if (pstr_mps_state->ec_flag)
2118
0
      {
2119
0
        pstr_mps_state->bytes_remaining = 0;
2120
0
        pstr_mps_state->frame_ok = 0;
2121
0
      }
2122
394
      else
2123
394
      {
2124
394
        return IA_FATAL_ERROR;
2125
394
      }
2126
394
    }
2127
2128
16.0k
    if (pstr_mps_state->bytes_remaining != 0) {
2129
783k
      for (WORD32 ii = 0; ii < pstr_mps_state->bytes_remaining; ii++) {
2130
770k
        pstr_mps_state->temp_buf[ii] =
2131
770k
            pstr_mps_state->temp_buf[ii + pstr_mps_state->i_bytes_consumed_mps];
2132
770k
      }
2133
13.6k
    }
2134
16.0k
  }
2135
16.0k
  self->p_state_aac->heaac_mps_handle.is_first = 1;
2136
16.0k
  self->p_state_aac->heaac_mps_handle.first_frame = 0;
2137
2138
16.0k
  return error_code;
2139
16.8k
}