Coverage Report

Created: 2025-12-10 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_sbrdec_initfuncs.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 <string.h>
21
#include "ixheaacd_sbr_common.h"
22
#include "ixheaac_type_def.h"
23
24
#include "ixheaac_constants.h"
25
#include "ixheaac_basic_ops32.h"
26
#include "ixheaac_basic_ops16.h"
27
#include "ixheaac_basic_ops40.h"
28
#include "ixheaac_basic_ops.h"
29
#include "ixheaacd_defines.h"
30
31
#include "ixheaacd_intrinsics.h"
32
#include "ixheaac_sbr_const.h"
33
#include "ixheaac_basic_op.h"
34
#include "ixheaacd_defines.h"
35
#include "ixheaacd_bitbuffer.h"
36
#include "ixheaacd_pns.h"
37
38
#include "ixheaacd_aac_rom.h"
39
#include "ixheaacd_pulsedata.h"
40
41
#include "ixheaacd_drc_data_struct.h"
42
#include "ixheaacd_lt_predict.h"
43
#include "ixheaacd_cnst.h"
44
#include "ixheaacd_ec_defines.h"
45
#include "ixheaacd_ec_struct_def.h"
46
#include "ixheaacd_channelinfo.h"
47
#include "ixheaacd_drc_dec.h"
48
49
#include "ixheaacd_sbrdecoder.h"
50
51
#include "ixheaacd_sbrdecsettings.h"
52
#include "ixheaacd_sbr_scale.h"
53
#include "ixheaacd_lpp_tran.h"
54
#include "ixheaacd_env_extr_part.h"
55
#include "ixheaacd_sbr_rom.h"
56
#include "ixheaacd_hybrid.h"
57
#include "ixheaacd_ps_dec.h"
58
#include "ixheaacd_ps_bitdec.h"
59
#include "ixheaacd_env_extr.h"
60
#include "ixheaacd_common_rom.h"
61
#include "ixheaacd_freq_sca.h"
62
63
#include "ixheaacd_qmf_dec.h"
64
65
#include "ixheaacd_env_calc.h"
66
67
#include "ixheaacd_pvc_dec.h"
68
#include "ixheaacd_sbr_dec.h"
69
#include "ixheaacd_env_dec.h"
70
#include "ixheaacd_basic_funcs.h"
71
#include "ixheaacd_sbr_crc.h"
72
73
#include "ixheaacd_sbrqmftrans.h"
74
75
#include "ixheaacd_audioobjtypes.h"
76
77
extern const WORD32 ixheaacd_ldmps_polyphase_filter_coeff_fix[1280];
78
79
#define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
80
81
32.2k
#define FD_OVERSAMPLING_FAC (1.5f)
82
83
64.8k
WORD32 ixheaacd_getsize_sbr_persistent() {
84
64.8k
  return (IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_pers_struct), BYTE_ALIGN_8));
85
64.8k
}
86
87
VOID ixheaacd_esbr_hbe_data_init(
88
    ia_esbr_hbe_txposer_struct *pstr_esbr_hbe_txposer,
89
    const WORD32 num_aac_samples, WORD32 samp_fac_4_flag,
90
    const WORD32 num_out_samples, VOID *persistent_hbe_mem,
91
32.2k
    WORD32 *total_persistant) {
92
32.2k
  WORD32 i;
93
32.2k
  WORD32 used_persistent = 0;
94
95
32.2k
  if (pstr_esbr_hbe_txposer) {
96
32.2k
    memset(pstr_esbr_hbe_txposer, 0,
97
32.2k
           IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_esbr_hbe_txposer_struct), BYTE_ALIGN_8));
98
99
32.2k
    pstr_esbr_hbe_txposer->core_frame_length = num_aac_samples;
100
101
32.2k
    pstr_esbr_hbe_txposer->no_bins = num_out_samples / NO_QMF_SYNTH_CHANNELS;
102
32.2k
    pstr_esbr_hbe_txposer->hbe_qmf_in_len =
103
32.2k
        pstr_esbr_hbe_txposer->no_bins;
104
32.2k
    pstr_esbr_hbe_txposer->hbe_qmf_out_len =
105
32.2k
        2 * pstr_esbr_hbe_txposer->hbe_qmf_in_len;
106
107
32.2k
    pstr_esbr_hbe_txposer->ptr_input_buf =
108
32.2k
        (FLOAT32 *)((WORD8 *)persistent_hbe_mem);
109
32.2k
    used_persistent +=
110
32.2k
        (num_aac_samples + NO_QMF_SYNTH_CHANNELS) * sizeof(FLOAT32);
111
112
32.2k
    pstr_esbr_hbe_txposer->qmf_in_buf =
113
32.2k
        (FLOAT32 **)((WORD8 *)persistent_hbe_mem + used_persistent);
114
32.2k
    used_persistent +=
115
32.2k
        pstr_esbr_hbe_txposer->hbe_qmf_in_len * sizeof(FLOAT32 *);
116
117
1.08M
    for (i = 0; i < pstr_esbr_hbe_txposer->hbe_qmf_in_len; i++) {
118
1.05M
      pstr_esbr_hbe_txposer->qmf_in_buf[i] =
119
1.05M
          (FLOAT32 *)((WORD8 *)persistent_hbe_mem + used_persistent);
120
121
1.05M
      used_persistent += (TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
122
1.05M
    }
123
124
32.2k
    pstr_esbr_hbe_txposer->qmf_out_buf =
125
32.2k
        (FLOAT32 **)((WORD8 *)persistent_hbe_mem + used_persistent);
126
32.2k
    used_persistent +=
127
32.2k
        (pstr_esbr_hbe_txposer->hbe_qmf_out_len * sizeof(FLOAT32 *));
128
129
2.13M
    for (i = 0; i < pstr_esbr_hbe_txposer->hbe_qmf_out_len; i++) {
130
2.10M
      pstr_esbr_hbe_txposer->qmf_out_buf[i] =
131
2.10M
          (FLOAT32 *)((WORD8 *)persistent_hbe_mem + used_persistent);
132
2.10M
      used_persistent += (TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
133
2.10M
    }
134
32.2k
    pstr_esbr_hbe_txposer->upsamp_4_flag = samp_fac_4_flag;
135
32.2k
    if (pstr_esbr_hbe_txposer) {
136
32.2k
      pstr_esbr_hbe_txposer->fft_size[0] = num_aac_samples;
137
32.2k
      pstr_esbr_hbe_txposer->fft_size[1] = (WORD32)(FD_OVERSAMPLING_FAC * num_aac_samples);
138
139
32.2k
      pstr_esbr_hbe_txposer->ptr_spectrum = &pstr_esbr_hbe_txposer->spectrum_buf[0];
140
32.2k
      pstr_esbr_hbe_txposer->ptr_spectrum_tx =
141
32.2k
          &pstr_esbr_hbe_txposer->spectrum_transposed_buf[0];
142
32.2k
      pstr_esbr_hbe_txposer->mag = &pstr_esbr_hbe_txposer->mag_buf[0];
143
32.2k
      pstr_esbr_hbe_txposer->phase = &pstr_esbr_hbe_txposer->phase_buf[0];
144
32.2k
      pstr_esbr_hbe_txposer->ptr_output_buf = &pstr_esbr_hbe_txposer->output_buf[0];
145
32.2k
    }
146
32.2k
  }
147
32.2k
  *total_persistant = used_persistent;
148
32.2k
  return;
149
32.2k
}
150
151
VOID ixheaacd_set_sbr_persistent_table_pointer(
152
    VOID *sbr_persistent_mem_v, ia_sbr_tables_struct *sbr_tables_ptr,
153
39.6k
    ixheaacd_misc_tables *pstr_common_tables) {
154
39.6k
  ia_sbr_pers_struct *sbr_persistent_mem =
155
39.6k
      (ia_sbr_pers_struct *)sbr_persistent_mem_v;
156
39.6k
  sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables = sbr_tables_ptr;
157
39.6k
  sbr_persistent_mem->str_sbr_dec_inst.pstr_common_tables = pstr_common_tables;
158
39.6k
}
159
160
VOID ixheaacd_set_sbr_persistent_buffers(VOID *sbr_persistent_mem_v,
161
                                         WORD32 *persistent_used,
162
39.6k
                                         WORD32 num_channel, WORD ps_enable) {
163
39.6k
  WORD32 i = 0;
164
39.6k
  WORD32 used_persistent = *persistent_used;
165
39.6k
  WORD32 temp, temp1, temp2, temp3;
166
39.6k
  struct ia_sbr_pers_struct *sbr_persistent_mem =
167
39.6k
      (struct ia_sbr_pers_struct *)sbr_persistent_mem_v;
168
169
39.6k
  struct ia_sbr_dec_inst_struct *p_str_sbr_dec_inst =
170
39.6k
      &sbr_persistent_mem->str_sbr_dec_inst;
171
172
39.6k
  num_channel = max(2, num_channel);
173
39.6k
  memset(sbr_persistent_mem, 0,
174
39.6k
         IXHEAAC_GET_SIZE_ALIGNED(sizeof(struct ia_sbr_pers_struct), BYTE_ALIGN_8));
175
176
39.6k
  sbr_persistent_mem->sbr_qmf_analy_states =
177
39.6k
      (WORD16 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
178
39.6k
  temp = num_channel *
179
39.6k
         IXHEAAC_GET_SIZE_ALIGNED((QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
180
39.6k
                                      sizeof(sbr_persistent_mem->sbr_qmf_analy_states[0]),
181
39.6k
                                  BYTE_ALIGN_8);
182
39.6k
  used_persistent += temp;
183
184
39.6k
  sbr_persistent_mem->sbr_qmf_analy_states_32 =
185
39.6k
      (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
186
39.6k
  temp1 = num_channel *
187
39.6k
          IXHEAAC_GET_SIZE_ALIGNED((QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
188
39.6k
                                       sizeof(sbr_persistent_mem->sbr_qmf_analy_states_32[0]),
189
39.6k
                                   BYTE_ALIGN_8);
190
39.6k
  used_persistent += temp1;
191
192
39.6k
  sbr_persistent_mem->sbr_qmf_synth_states =
193
39.6k
      (WORD16 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
194
195
39.6k
  temp2 = (num_channel *
196
39.6k
           IXHEAAC_GET_SIZE_ALIGNED((QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
197
39.6k
                                        sizeof(sbr_persistent_mem->sbr_qmf_synth_states[0]),
198
39.6k
                                    BYTE_ALIGN_8));
199
39.6k
  used_persistent += temp2;
200
201
39.6k
  sbr_persistent_mem->sbr_qmf_synth_states_32 =
202
39.6k
      (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
203
204
39.6k
  temp3 = (num_channel *
205
39.6k
           IXHEAAC_GET_SIZE_ALIGNED((QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
206
39.6k
                                        sizeof(sbr_persistent_mem->sbr_qmf_synth_states_32[0]),
207
39.6k
                                    BYTE_ALIGN_8));
208
39.6k
  used_persistent += temp3;
209
210
39.6k
  memset(sbr_persistent_mem->sbr_qmf_analy_states, 0,
211
39.6k
         (temp + temp1 + temp2 + temp3));
212
213
118k
  for (i = 0; i < num_channel; i++) {
214
79.3k
    sbr_persistent_mem->ptr_sbr_overlap_buf[i] =
215
79.3k
        (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
216
217
79.3k
    if (ps_enable) {
218
74.8k
      memset(
219
74.8k
          sbr_persistent_mem->ptr_sbr_overlap_buf[i], 0,
220
74.8k
          2 * IXHEAAC_GET_SIZE_ALIGNED(MAX_OV_COLS * NO_SYNTHESIS_CHANNELS *
221
74.8k
                                           sizeof(sbr_persistent_mem->ptr_sbr_overlap_buf[i][0]),
222
74.8k
                                       BYTE_ALIGN_8));
223
74.8k
      used_persistent +=
224
74.8k
          2 * IXHEAAC_GET_SIZE_ALIGNED(MAX_OV_COLS * NO_SYNTHESIS_CHANNELS *
225
74.8k
                                           sizeof(sbr_persistent_mem->ptr_sbr_overlap_buf[i][0]),
226
74.8k
                                       BYTE_ALIGN_8);
227
74.8k
    } else {
228
4.45k
      memset(sbr_persistent_mem->ptr_sbr_overlap_buf[i], 0,
229
4.45k
             IXHEAAC_GET_SIZE_ALIGNED(MAX_OV_COLS * NO_SYNTHESIS_CHANNELS *
230
4.45k
                                          sizeof(sbr_persistent_mem->ptr_sbr_overlap_buf[i][0]),
231
4.45k
                                      BYTE_ALIGN_8));
232
4.45k
      used_persistent +=
233
4.45k
          IXHEAAC_GET_SIZE_ALIGNED(MAX_OV_COLS * NO_SYNTHESIS_CHANNELS *
234
4.45k
                                       sizeof(sbr_persistent_mem->ptr_sbr_overlap_buf[i][0]),
235
4.45k
                                   BYTE_ALIGN_8);
236
4.45k
    }
237
79.3k
  }
238
239
118k
  for (i = 0; i < num_channel; i++) {
240
79.3k
    WORD32 j;
241
79.3k
    sbr_persistent_mem->sbr_lpc_filter_states_real[i] =
242
79.3k
        (WORD32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
243
79.3k
    used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
244
79.3k
        LPC_ORDER * sizeof(sbr_persistent_mem->sbr_lpc_filter_states_real[i][0]), BYTE_ALIGN_8);
245
237k
    for (j = 0; j < LPC_ORDER; j++) {
246
158k
      sbr_persistent_mem->sbr_lpc_filter_states_real[i][j] =
247
158k
          (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
248
249
158k
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
250
158k
          NO_ANALYSIS_CHANNELS * sizeof(sbr_persistent_mem->sbr_lpc_filter_states_real[i][j][0]),
251
158k
          BYTE_ALIGN_8);
252
253
158k
      memset(sbr_persistent_mem->sbr_lpc_filter_states_real[i][j], 0,
254
158k
             IXHEAAC_GET_SIZE_ALIGNED(
255
158k
                 NO_ANALYSIS_CHANNELS *
256
158k
                     sizeof(sbr_persistent_mem->sbr_lpc_filter_states_real[i][j][0]),
257
158k
                 BYTE_ALIGN_8));
258
158k
    }
259
79.3k
  }
260
261
39.6k
  if (ps_enable) {
262
112k
    for (i = 0; i < num_channel; i++) {
263
74.8k
      WORD32 j;
264
265
74.8k
      sbr_persistent_mem->sbr_lpc_filter_states_imag[i] =
266
74.8k
          (WORD32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
267
74.8k
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
268
74.8k
          LPC_ORDER * sizeof(sbr_persistent_mem->sbr_lpc_filter_states_imag[i][0]), BYTE_ALIGN_8);
269
224k
      for (j = 0; j < LPC_ORDER; j++) {
270
149k
        sbr_persistent_mem->sbr_lpc_filter_states_imag[i][j] =
271
149k
            (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
272
273
149k
        used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
274
149k
            NO_ANALYSIS_CHANNELS *
275
149k
                sizeof(sbr_persistent_mem->sbr_lpc_filter_states_imag[i][j][0]),
276
149k
            BYTE_ALIGN_8);
277
278
149k
        memset(sbr_persistent_mem->sbr_lpc_filter_states_imag[i][j], 0,
279
149k
               IXHEAAC_GET_SIZE_ALIGNED(
280
149k
                   NO_ANALYSIS_CHANNELS *
281
149k
                       sizeof(sbr_persistent_mem->sbr_lpc_filter_states_imag[i][j][0]),
282
149k
                   BYTE_ALIGN_8));
283
149k
      }
284
74.8k
    }
285
37.4k
  }
286
118k
  for (i = 0; i < num_channel; i++) {
287
79.3k
    WORD32 initial_used = used_persistent;
288
79.3k
    WORD32 temp_used = used_persistent;
289
290
79.3k
    sbr_persistent_mem->sbr_smooth_gain_buf[i] =
291
79.3k
        (WORD16 *)((WORD8 *)sbr_persistent_mem_v + temp_used);
292
79.3k
    temp_used += 2 * IXHEAAC_GET_SIZE_ALIGNED(
293
79.3k
                         MAX_FREQ_COEFFS * sizeof(sbr_persistent_mem->sbr_smooth_gain_buf[i][0]),
294
79.3k
                         BYTE_ALIGN_8);
295
296
79.3k
    sbr_persistent_mem->sbr_smooth_noise_buf[i] =
297
79.3k
        (WORD16 *)((WORD8 *)sbr_persistent_mem_v + temp_used);
298
299
79.3k
    temp_used += IXHEAAC_GET_SIZE_ALIGNED(
300
79.3k
        MAX_FREQ_COEFFS * sizeof(sbr_persistent_mem->sbr_smooth_noise_buf[i][0]), BYTE_ALIGN_8);
301
302
79.3k
    p_str_sbr_dec_inst->pstr_freq_band_data[i] =
303
79.3k
        (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
304
305
79.3k
    temp_used += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_freq_band_data_struct), BYTE_ALIGN_8);
306
307
79.3k
    sbr_persistent_mem->pstr_prev_frame_data[i] =
308
79.3k
        (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
309
310
79.3k
    temp_used += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_prev_frame_data_struct), BYTE_ALIGN_8);
311
312
79.3k
    p_str_sbr_dec_inst->pstr_sbr_channel[i] =
313
79.3k
        (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
314
315
79.3k
    temp_used += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_channel_struct), BYTE_ALIGN_8);
316
317
79.3k
    p_str_sbr_dec_inst->pstr_sbr_header[i] =
318
79.3k
        (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
319
320
79.3k
    temp_used += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_header_data_struct), BYTE_ALIGN_8);
321
322
79.3k
    memset(sbr_persistent_mem->sbr_smooth_gain_buf[i], 0,
323
79.3k
           temp_used - initial_used);
324
325
79.3k
    used_persistent = temp_used;
326
79.3k
  }
327
328
39.6k
  if (ps_enable) {
329
37.4k
    p_str_sbr_dec_inst->pstr_ps_stereo_dec =
330
37.4k
        (ia_ps_dec_struct *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
331
332
37.4k
    memset(p_str_sbr_dec_inst->pstr_ps_stereo_dec, 0,
333
37.4k
           IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_ps_dec_struct), BYTE_ALIGN_8));
334
335
37.4k
    used_persistent += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_ps_dec_struct), BYTE_ALIGN_8);
336
37.4k
  }
337
338
39.6k
  p_str_sbr_dec_inst->frame_buffer[0] =
339
39.6k
      (VOID *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
340
39.6k
  memset(p_str_sbr_dec_inst->frame_buffer[0], 0,
341
39.6k
         IXHEAAC_GET_SIZE_ALIGNED(
342
39.6k
             sizeof(ia_sbr_frame_info_data_struct) + MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8,
343
39.6k
             BYTE_ALIGN_8));
344
39.6k
  used_persistent =
345
39.6k
      used_persistent + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_frame_info_data_struct) +
346
39.6k
                                                     MAX_FREQ_COEFFS * sizeof(WORD32) + 8,
347
39.6k
                                                 BYTE_ALIGN_8);
348
349
39.6k
  p_str_sbr_dec_inst->frame_buffer[1] =
350
39.6k
      (VOID *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
351
39.6k
  memset(p_str_sbr_dec_inst->frame_buffer[1], 0,
352
39.6k
         IXHEAAC_GET_SIZE_ALIGNED(
353
39.6k
             sizeof(ia_sbr_frame_info_data_struct) + MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8,
354
39.6k
             BYTE_ALIGN_8));
355
39.6k
  used_persistent =
356
39.6k
      used_persistent + IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_sbr_frame_info_data_struct) +
357
39.6k
                                                     MAX_FREQ_COEFFS * sizeof(WORD32) + 8,
358
39.6k
                                                 BYTE_ALIGN_8);
359
360
39.6k
  {
361
39.6k
    WORD32 index = 0;
362
39.6k
    p_str_sbr_dec_inst->ptr_pvc_data_str =
363
39.6k
        (ia_pvc_data_struct *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
364
39.6k
    memset(p_str_sbr_dec_inst->ptr_pvc_data_str, 0,
365
39.6k
           IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_pvc_data_struct), BYTE_ALIGN_8));
366
39.6k
    used_persistent += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_pvc_data_struct), BYTE_ALIGN_8);
367
368
39.6k
    p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_hbe_txposer =
369
39.6k
        (ia_esbr_hbe_txposer_struct *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
370
39.6k
    memset(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_hbe_txposer, 0,
371
39.6k
           IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_esbr_hbe_txposer_struct), BYTE_ALIGN_8));
372
39.6k
    used_persistent += IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_esbr_hbe_txposer_struct), BYTE_ALIGN_8);
373
374
39.6k
    if (num_channel == 2) {
375
39.6k
      p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_hbe_txposer =
376
39.6k
          (ia_esbr_hbe_txposer_struct *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
377
39.6k
      memset(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_hbe_txposer, 0,
378
39.6k
             IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_esbr_hbe_txposer_struct), BYTE_ALIGN_8));
379
39.6k
      used_persistent +=
380
39.6k
          IXHEAAC_GET_SIZE_ALIGNED(sizeof(ia_esbr_hbe_txposer_struct), BYTE_ALIGN_8);
381
39.6k
    }
382
383
39.6k
    p_str_sbr_dec_inst->hbe_txposer_buffers =
384
39.6k
        (VOID *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
385
39.6k
    memset(p_str_sbr_dec_inst->hbe_txposer_buffers, 0,
386
39.6k
           num_channel * IXHEAAC_GET_SIZE_ALIGNED(MAX_HBE_PERSISTENT_SIZE, BYTE_ALIGN_8));
387
39.6k
    used_persistent +=
388
39.6k
        num_channel * IXHEAAC_GET_SIZE_ALIGNED(MAX_HBE_PERSISTENT_SIZE, BYTE_ALIGN_8);
389
390
39.6k
    p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real =
391
39.6k
        (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
392
39.6k
    memset(
393
39.6k
        p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real, 0,
394
39.6k
        IXHEAAC_GET_SIZE_ALIGNED(
395
39.6k
            MAX_QMF_BUF_LEN *
396
39.6k
                sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real[0]),
397
39.6k
            BYTE_ALIGN_8));
398
39.6k
    used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
399
39.6k
        MAX_QMF_BUF_LEN *
400
39.6k
            sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real[0]),
401
39.6k
        BYTE_ALIGN_8);
402
403
39.6k
    p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag =
404
39.6k
        (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
405
39.6k
    memset(
406
39.6k
        p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag, 0,
407
39.6k
        IXHEAAC_GET_SIZE_ALIGNED(
408
39.6k
            MAX_QMF_BUF_LEN *
409
39.6k
                sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag[0]),
410
39.6k
            BYTE_ALIGN_8));
411
39.6k
    used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
412
39.6k
        MAX_QMF_BUF_LEN *
413
39.6k
            sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag[0]),
414
39.6k
        BYTE_ALIGN_8);
415
416
39.6k
    if (num_channel == 2) {
417
39.6k
      p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real =
418
39.6k
          (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
419
39.6k
      memset(
420
39.6k
          p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real, 0,
421
39.6k
          IXHEAAC_GET_SIZE_ALIGNED(
422
39.6k
              MAX_QMF_BUF_LEN *
423
39.6k
                  sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real[0]),
424
39.6k
              BYTE_ALIGN_8));
425
39.6k
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
426
39.6k
          MAX_QMF_BUF_LEN *
427
39.6k
              sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real[0]),
428
39.6k
          BYTE_ALIGN_8);
429
430
39.6k
      p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag =
431
39.6k
          (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
432
39.6k
      memset(
433
39.6k
          p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag, 0,
434
39.6k
          IXHEAAC_GET_SIZE_ALIGNED(
435
39.6k
              MAX_QMF_BUF_LEN *
436
39.6k
                  sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag[0]),
437
39.6k
              BYTE_ALIGN_8));
438
39.6k
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
439
39.6k
          MAX_QMF_BUF_LEN *
440
39.6k
              sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag[0]),
441
39.6k
          BYTE_ALIGN_8);
442
39.6k
    }
443
444
3.13M
    for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
445
3.09M
      p_str_sbr_dec_inst->pstr_sbr_channel[0]
446
3.09M
          ->str_sbr_dec.pp_qmf_buf_real[index] =
447
3.09M
          (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
448
3.09M
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
449
3.09M
          MAX_QMF_BUF_LEN *
450
3.09M
              sizeof(
451
3.09M
                  p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real[index][0]),
452
3.09M
          BYTE_ALIGN_8);
453
3.09M
    }
454
455
3.13M
    for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
456
3.09M
      p_str_sbr_dec_inst->pstr_sbr_channel[0]
457
3.09M
          ->str_sbr_dec.pp_qmf_buf_imag[index] =
458
3.09M
          (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
459
3.09M
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
460
3.09M
          MAX_QMF_BUF_LEN *
461
3.09M
              sizeof(
462
3.09M
                  p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag[index][0]),
463
3.09M
          BYTE_ALIGN_8);
464
3.09M
    }
465
466
39.6k
    if (num_channel == 2) {
467
3.13M
      for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
468
3.09M
        p_str_sbr_dec_inst->pstr_sbr_channel[1]
469
3.09M
            ->str_sbr_dec.pp_qmf_buf_real[index] =
470
3.09M
            (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
471
3.09M
        used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
472
3.09M
            MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]
473
3.09M
                                         ->str_sbr_dec.pp_qmf_buf_real[index][0]),
474
3.09M
            BYTE_ALIGN_8);
475
3.09M
      }
476
477
3.13M
      for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
478
3.09M
        p_str_sbr_dec_inst->pstr_sbr_channel[1]
479
3.09M
            ->str_sbr_dec.pp_qmf_buf_imag[index] =
480
3.09M
            (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
481
3.09M
        used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
482
3.09M
            MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]
483
3.09M
                                         ->str_sbr_dec.pp_qmf_buf_imag[index][0]),
484
3.09M
            BYTE_ALIGN_8);
485
3.09M
      }
486
39.6k
    }
487
488
1.54M
    for (i = 0; i < MAX_ENV_COLS; i++) {
489
1.50M
      p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_arr_qmf_buf_real[i] =
490
1.50M
          (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
491
1.50M
      memset(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_arr_qmf_buf_real[i], 0,
492
1.50M
             IXHEAAC_GET_SIZE_ALIGNED(
493
1.50M
                 MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[0]
494
1.50M
                                              ->str_sbr_dec.p_arr_qmf_buf_real[i][0]),
495
1.50M
                 BYTE_ALIGN_8));
496
1.50M
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
497
1.50M
          MAX_QMF_BUF_LEN *
498
1.50M
              sizeof(
499
1.50M
                  p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_arr_qmf_buf_real[i][0]),
500
1.50M
          BYTE_ALIGN_8);
501
502
1.50M
      p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_arr_qmf_buf_imag[i] =
503
1.50M
          (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
504
1.50M
      memset(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_arr_qmf_buf_imag[i], 0,
505
1.50M
             IXHEAAC_GET_SIZE_ALIGNED(
506
1.50M
                 MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[0]
507
1.50M
                                              ->str_sbr_dec.p_arr_qmf_buf_imag[i][0]),
508
1.50M
                 BYTE_ALIGN_8));
509
1.50M
      used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
510
1.50M
          MAX_QMF_BUF_LEN *
511
1.50M
              sizeof(
512
1.50M
                  p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_arr_qmf_buf_imag[i][0]),
513
1.50M
          BYTE_ALIGN_8);
514
1.50M
    }
515
516
39.6k
    if (num_channel == 2) {
517
1.54M
      for (i = 0; i < MAX_ENV_COLS; i++) {
518
1.50M
        p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_arr_qmf_buf_real[i] =
519
1.50M
            (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
520
1.50M
        memset(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_arr_qmf_buf_real[i], 0,
521
1.50M
               IXHEAAC_GET_SIZE_ALIGNED(
522
1.50M
                   MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]
523
1.50M
                                                ->str_sbr_dec.p_arr_qmf_buf_real[i][0]),
524
1.50M
                   BYTE_ALIGN_8));
525
1.50M
        used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
526
1.50M
            MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]
527
1.50M
                                         ->str_sbr_dec.p_arr_qmf_buf_real[i][0]),
528
1.50M
            BYTE_ALIGN_8);
529
530
1.50M
        p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_arr_qmf_buf_imag[i] =
531
1.50M
            (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
532
1.50M
        memset(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_arr_qmf_buf_imag[i], 0,
533
1.50M
               IXHEAAC_GET_SIZE_ALIGNED(
534
1.50M
                   MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]
535
1.50M
                                                ->str_sbr_dec.p_arr_qmf_buf_imag[i][0]),
536
1.50M
                   BYTE_ALIGN_8));
537
1.50M
        used_persistent += IXHEAAC_GET_SIZE_ALIGNED(
538
1.50M
            MAX_QMF_BUF_LEN * sizeof(p_str_sbr_dec_inst->pstr_sbr_channel[1]
539
1.50M
                                         ->str_sbr_dec.p_arr_qmf_buf_imag[i][0]),
540
1.50M
            BYTE_ALIGN_8);
541
1.50M
      }
542
39.6k
    }
543
39.6k
  }
544
545
39.6k
  *persistent_used = used_persistent;
546
39.6k
}
547
548
static PLATFORM_INLINE VOID ixheaacd_init_headerdata(
549
    ia_sbr_header_data_struct *ptr_header_data, WORD32 sample_rate_dec,
550
    WORD32 samp_per_frame, ia_freq_band_data_struct *freq_band_data,
551
48.8k
    ia_sbr_tables_struct *sbr_tables, WORD audio_obj_type) {
552
48.8k
  ia_freq_band_data_struct *pstr_freq_band_data = freq_band_data;
553
48.8k
  WORD32 tmp;
554
555
48.8k
  if (audio_obj_type != AOT_ER_AAC_ELD) {
556
32.5k
    memcpy(ptr_header_data,
557
32.5k
           &sbr_tables->env_extr_tables_ptr->str_sbr_default_header,
558
32.5k
           sizeof(ia_sbr_header_data_struct));
559
32.5k
  }
560
561
48.8k
  if (audio_obj_type == AOT_ER_AAC_ELD) ptr_header_data->time_step -= 1;
562
563
48.8k
  pstr_freq_band_data->freq_band_table[LOW] =
564
48.8k
      pstr_freq_band_data->freq_band_tbl_lo;
565
48.8k
  pstr_freq_band_data->freq_band_table[HIGH] =
566
48.8k
      pstr_freq_band_data->freq_band_tbl_hi;
567
48.8k
  ptr_header_data->pstr_freq_band_data = pstr_freq_band_data;
568
569
48.8k
  ptr_header_data->core_frame_size = samp_per_frame;
570
48.8k
  ptr_header_data->out_sampling_freq = sample_rate_dec << 1;
571
572
48.8k
  if (audio_obj_type != AOT_ER_AAC_ELD) {
573
32.5k
    tmp = ptr_header_data->time_step + 4;
574
575
32.5k
    if (tmp < 0)
576
0
      ptr_header_data->num_time_slots =
577
0
          ixheaac_extract16l(samp_per_frame << (-tmp));
578
32.5k
    else
579
32.5k
      ptr_header_data->num_time_slots =
580
32.5k
          ixheaac_extract16l(samp_per_frame >> tmp);
581
32.5k
  } else {
582
16.3k
    ptr_header_data->time_step = 1;
583
584
16.3k
    ptr_header_data->num_time_slots =
585
16.3k
        (samp_per_frame / 32 >> (ptr_header_data->time_step - 1));
586
16.3k
  }
587
48.8k
}
588
589
VOID ixheaacd_setesbr_flags(VOID *sbr_persistent_mem_v, FLAG pvc_flag,
590
5.29k
                            FLAG hbe_flag, FLAG inter_tes_flag) {
591
5.29k
  ia_sbr_pers_struct *sbr_persistent_mem;
592
5.29k
  sbr_persistent_mem = (ia_sbr_pers_struct *)sbr_persistent_mem_v;
593
5.29k
  sbr_persistent_mem->str_sbr_dec_inst.hbe_flag = hbe_flag;
594
5.29k
  sbr_persistent_mem->str_sbr_dec_inst.pvc_flag = pvc_flag;
595
5.29k
  sbr_persistent_mem->str_sbr_dec_inst.inter_tes_flag = inter_tes_flag;
596
5.29k
  return;
597
5.29k
}
598
599
ia_handle_sbr_dec_inst_struct ixheaacd_init_sbr(
600
    WORD32 sample_rate_dec, WORD32 samp_per_frame, FLAG *down_sample_flag,
601
    VOID *sbr_persistent_mem_v, WORD32 *ptr_overlap_buf, WORD32 channel,
602
    WORD32 ps_enable, WORD32 sbr_ratio_idx, WORD32 output_frame_size,
603
    WORD32 *use_hbe, VOID *p_usac_dflt_header,
604
    ia_sbr_header_data_struct str_sbr_config, WORD32 audio_object_type,
605
26.1k
    WORD32 ldmps_present, WORD32 ldsbr_present) {
606
26.1k
  WORD16 i;
607
26.1k
  WORD16 err;
608
26.1k
  ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
609
26.1k
  ia_sbr_dec_struct *ptr_sbr_dec[2];
610
26.1k
  ia_qmf_dec_tables_struct *qmf_dec_tables_ptr;
611
26.1k
  ia_sbr_pers_struct *sbr_persistent_mem;
612
613
26.1k
  sbr_persistent_mem = (ia_sbr_pers_struct *)sbr_persistent_mem_v;
614
26.1k
  ptr_sbr_dec[0] =
615
26.1k
      &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[0]->str_sbr_dec;
616
26.1k
  ptr_sbr_dec[1] =
617
26.1k
      &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[1]->str_sbr_dec;
618
619
26.1k
  qmf_dec_tables_ptr =
620
26.1k
      sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr;
621
622
26.1k
  if (sample_rate_dec > 48000) {
623
1.27k
    *down_sample_flag = 1;
624
1.27k
  }
625
626
74.9k
  for (i = 0; i < channel; i++) {
627
48.8k
    if (audio_object_type == AOT_ER_AAC_ELD) {
628
16.3k
      memcpy(sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[i],
629
16.3k
             &str_sbr_config, sizeof(ia_sbr_header_data_struct));
630
16.3k
    }
631
48.8k
    ptr_header_data[i] =
632
48.8k
        sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[i];
633
634
48.8k
    ixheaacd_init_headerdata(
635
48.8k
        ptr_header_data[i], sample_rate_dec, samp_per_frame,
636
48.8k
        sbr_persistent_mem->str_sbr_dec_inst.pstr_freq_band_data[i],
637
48.8k
        sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables,
638
48.8k
        audio_object_type);
639
640
48.8k
    err = ixheaacd_create_sbrdec(
641
642
48.8k
        sbr_persistent_mem->str_sbr_dec_inst.pstr_common_tables,
643
48.8k
        sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[i],
644
48.8k
        ptr_header_data[i], i, *down_sample_flag, sbr_persistent_mem, ps_enable,
645
48.8k
        audio_object_type, ldmps_present, ldsbr_present);
646
647
48.8k
    ptr_header_data[i]->status = 1;
648
48.8k
    ptr_sbr_dec[i]->band_count = 64;
649
48.8k
    ptr_header_data[i]->pstr_freq_band_data[0].qmf_sb_prev = 64;
650
48.8k
    ptr_header_data[i]->pstr_freq_band_data[1].qmf_sb_prev = 64;
651
652
48.8k
    if (err) {
653
101
      return NULL;
654
101
    }
655
48.8k
  }
656
657
26.0k
  if (channel != 1) {
658
22.7k
    if (ps_enable) {
659
18.5k
      if (audio_object_type == AOT_ER_AAC_ELD)
660
8.13k
        ixheaacd_create_psdec(
661
8.13k
            sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec,
662
8.13k
            sbr_persistent_mem, &ptr_overlap_buf[512 * 4], samp_per_frame);
663
10.4k
      else
664
10.4k
        ixheaacd_create_psdec(
665
10.4k
            sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec,
666
10.4k
            sbr_persistent_mem, ptr_overlap_buf, samp_per_frame);
667
18.5k
    }
668
22.7k
  }
669
670
26.0k
  if ((use_hbe != NULL) && !((audio_object_type == AOT_ER_AAC_ELD) ||
671
17.9k
     (audio_object_type == AOT_ER_AAC_LD))) {
672
16.1k
    ia_sbr_header_data_struct *ptr_sbr_dflt_header =
673
16.1k
        &sbr_persistent_mem->str_sbr_dec_inst.str_sbr_dflt_header;
674
16.1k
    ia_sbr_header_data_struct *ptr_usac_dflt_header =
675
16.1k
        (ia_sbr_header_data_struct *)p_usac_dflt_header;
676
16.1k
    struct ia_sbr_dec_inst_struct *p_str_sbr_dec_inst =
677
16.1k
        &sbr_persistent_mem->str_sbr_dec_inst;
678
16.1k
    VOID *hbe_txposer_buffers = p_str_sbr_dec_inst->hbe_txposer_buffers;
679
680
16.1k
    ptr_header_data[0] = p_str_sbr_dec_inst->pstr_sbr_header[0];
681
16.1k
    ptr_header_data[1] = p_str_sbr_dec_inst->pstr_sbr_header[1];
682
683
16.1k
    ptr_header_data[0]->sbr_ratio_idx = sbr_ratio_idx;
684
16.1k
    ptr_header_data[0]->output_framesize = output_frame_size;
685
16.1k
    ptr_header_data[0]->pstr_freq_band_data->sub_band_start = 64;
686
16.1k
    ptr_header_data[0]->esbr_start_up = 1;
687
16.1k
    ptr_header_data[0]->esbr_start_up_pvc = 1;
688
689
16.1k
    if (channel > 1) {
690
12.8k
      ptr_header_data[1]->sbr_ratio_idx = sbr_ratio_idx;
691
12.8k
      ptr_header_data[1]->output_framesize = output_frame_size;
692
12.8k
      ptr_header_data[1]->pstr_freq_band_data->sub_band_start = 64;
693
12.8k
      ptr_header_data[1]->esbr_start_up = 1;
694
12.8k
      ptr_header_data[1]->esbr_start_up_pvc = 1;
695
12.8k
    }
696
16.1k
    if (hbe_txposer_buffers != NULL) {
697
16.1k
      WORD32 persistant_used = 0;
698
16.1k
      ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[0]->p_hbe_txposer, samp_per_frame,
699
16.1k
                                  sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0,
700
16.1k
                                  output_frame_size, hbe_txposer_buffers, &persistant_used);
701
702
16.1k
      hbe_txposer_buffers = (WORD8 *)hbe_txposer_buffers +
703
16.1k
                            IXHEAAC_GET_SIZE_ALIGNED(MAX_HBE_PERSISTENT_SIZE, BYTE_ALIGN_8);
704
705
16.1k
      ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[1]->p_hbe_txposer, samp_per_frame,
706
16.1k
                                  sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0,
707
16.1k
                                  output_frame_size, hbe_txposer_buffers, &persistant_used);
708
16.1k
    }
709
710
16.1k
    p_str_sbr_dec_inst->ptr_pvc_data_str->prev_first_bnd_idx = -1;
711
16.1k
    p_str_sbr_dec_inst->ptr_pvc_data_str->prev_pvc_rate = -1;
712
16.1k
    p_str_sbr_dec_inst->ptr_pvc_data_str->prev_sbr_mode = UNKNOWN_SBR;
713
714
16.1k
    p_str_sbr_dec_inst->pstr_sbr_channel[0]
715
16.1k
        ->str_sbr_dec.str_codec_qmf_bank.num_time_slots =
716
16.1k
        output_frame_size / 64;
717
16.1k
    p_str_sbr_dec_inst->pstr_sbr_channel[1]
718
16.1k
        ->str_sbr_dec.str_codec_qmf_bank.num_time_slots =
719
16.1k
        output_frame_size / 64;
720
721
16.1k
    ptr_header_data[0]->core_frame_size = samp_per_frame;
722
16.1k
    ptr_header_data[1]->core_frame_size = samp_per_frame;
723
724
16.1k
    switch (sbr_ratio_idx) {
725
0
      case SBR_UPSAMPLE_IDX_0_0:
726
0
        ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 32;
727
0
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
728
0
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
729
0
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
730
0
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
731
0
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
732
0
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
733
0
        ptr_header_data[0]->is_usf_4 = 0;
734
0
        ptr_header_data[0]->upsamp_fac = 1;
735
736
0
        ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 32;
737
0
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
738
0
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
739
0
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
740
0
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
741
0
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
742
0
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
743
0
        ptr_header_data[1]->is_usf_4 = 0;
744
0
        ptr_header_data[1]->upsamp_fac = 1;
745
0
        break;
746
14.9k
      case SBR_UPSAMPLE_IDX_2_1:
747
14.9k
        ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 32;
748
14.9k
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
749
14.9k
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
750
14.9k
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
751
14.9k
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
752
14.9k
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
753
14.9k
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
754
14.9k
        ptr_header_data[0]->is_usf_4 = 0;
755
14.9k
        ptr_header_data[0]->upsamp_fac = 2;
756
757
14.9k
        ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 32;
758
14.9k
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
759
14.9k
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
760
14.9k
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
761
14.9k
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
762
14.9k
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
763
14.9k
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
764
14.9k
        ptr_header_data[1]->is_usf_4 = 0;
765
14.9k
        ptr_header_data[1]->upsamp_fac = 2;
766
14.9k
        break;
767
881
      case SBR_UPSAMPLE_IDX_8_3:
768
881
        ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 24;
769
881
        ptr_sbr_dec[0]->str_codec_qmf_bank.filter_pos_32 =
770
881
            qmf_dec_tables_ptr->esbr_qmf_c_24;
771
881
        ptr_sbr_dec[0]->str_codec_qmf_bank.analy_win_coeff_32 =
772
881
            qmf_dec_tables_ptr->esbr_qmf_c_24;
773
881
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
774
881
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l24;
775
881
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
776
881
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l24;
777
881
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
778
881
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l24;
779
780
881
        ptr_header_data[0]->is_usf_4 = 0;
781
881
        ptr_header_data[0]->upsamp_fac = 2;
782
783
881
        ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 24;
784
881
        ptr_sbr_dec[1]->str_codec_qmf_bank.filter_pos_32 =
785
881
            qmf_dec_tables_ptr->esbr_qmf_c_24;
786
881
        ptr_sbr_dec[1]->str_codec_qmf_bank.analy_win_coeff_32 =
787
881
            qmf_dec_tables_ptr->esbr_qmf_c_24;
788
881
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
789
881
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l24;
790
881
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
791
881
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l24;
792
881
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
793
881
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l24;
794
795
881
        ptr_header_data[1]->is_usf_4 = 0;
796
881
        ptr_header_data[1]->upsamp_fac = 2;
797
881
        break;
798
362
      case SBR_UPSAMPLE_IDX_4_1:
799
362
        ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 16;
800
362
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
801
362
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l16;
802
362
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
803
362
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l16;
804
362
        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
805
362
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l16;
806
362
        ptr_header_data[0]->is_usf_4 = 1;
807
362
        ptr_header_data[0]->upsamp_fac = 4;
808
362
        ptr_header_data[0]->out_sampling_freq =
809
362
            ptr_header_data[0]->out_sampling_freq * 2;
810
811
362
        ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 16;
812
362
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
813
362
            (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l16;
814
362
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
815
362
            (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l16;
816
362
        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
817
362
            (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l16;
818
362
        ptr_header_data[1]->is_usf_4 = 1;
819
362
        ptr_header_data[1]->upsamp_fac = 4;
820
362
        ptr_header_data[1]->out_sampling_freq =
821
362
            ptr_header_data[1]->out_sampling_freq * 2;
822
362
        break;
823
16.1k
    }
824
825
16.1k
    if (ptr_usac_dflt_header != NULL) {
826
5.29k
      ptr_sbr_dflt_header->start_freq = ptr_usac_dflt_header->start_freq;
827
5.29k
      ptr_sbr_dflt_header->stop_freq = ptr_usac_dflt_header->stop_freq;
828
829
5.29k
      if (ptr_usac_dflt_header->header_extra_1) {
830
2.72k
        ptr_sbr_dflt_header->freq_scale = ptr_usac_dflt_header->freq_scale;
831
2.72k
        ptr_sbr_dflt_header->alter_scale = ptr_usac_dflt_header->alter_scale;
832
2.72k
        ptr_sbr_dflt_header->noise_bands = ptr_usac_dflt_header->noise_bands;
833
2.72k
      } else {
834
2.56k
        ptr_sbr_dflt_header->freq_scale = SBR_FREQ_SCALE_DEFAULT;
835
2.56k
        ptr_sbr_dflt_header->alter_scale = SBR_ALTER_SCALE_DEFAULT;
836
2.56k
        ptr_sbr_dflt_header->noise_bands = SBR_NOISE_BANDS_DEFAULT;
837
2.56k
      }
838
839
5.29k
      if (ptr_usac_dflt_header->header_extra_2) {
840
1.01k
        ptr_sbr_dflt_header->limiter_bands = ptr_usac_dflt_header->limiter_bands;
841
1.01k
        ptr_sbr_dflt_header->limiter_gains = ptr_usac_dflt_header->limiter_gains;
842
1.01k
        ptr_sbr_dflt_header->interpol_freq = ptr_usac_dflt_header->interpol_freq;
843
1.01k
        ptr_sbr_dflt_header->smoothing_mode =
844
1.01k
            ptr_usac_dflt_header->smoothing_mode;
845
4.28k
      } else {
846
4.28k
        ptr_sbr_dflt_header->limiter_bands = SBR_LIMITER_BANDS_DEFAULT;
847
4.28k
        ptr_sbr_dflt_header->limiter_gains = SBR_LIMITER_GAINS_DEFAULT;
848
4.28k
        ptr_sbr_dflt_header->interpol_freq = SBR_INTERPOL_FREQ_DEFAULT;
849
4.28k
        ptr_sbr_dflt_header->smoothing_mode = SBR_SMOOTHING_LENGTH_DEFAULT;
850
4.28k
      }
851
5.29k
    }
852
16.1k
  }
853
26.0k
  return &(sbr_persistent_mem->str_sbr_dec_inst);
854
26.0k
}
855
856
static PLATFORM_INLINE WORD16 ixheaacd_create_sbr_env_calc(
857
858
    ixheaacd_misc_tables *pstr_common_table, ia_sbr_calc_env_struct *hs,
859
    WORD16 chan, VOID *sbr_persistent_mem_v,
860
48.8k
    ia_sbr_header_data_struct *ptr_header_data, WORD audio_object_type) {
861
48.8k
  WORD16 err;
862
48.8k
  ia_sbr_pers_struct *sbr_persistent_mem =
863
48.8k
      (ia_sbr_pers_struct *)sbr_persistent_mem_v;
864
865
48.8k
  err = 0;
866
48.8k
  memset(&hs->harm_flags_prev[0], 0, sizeof(WORD8) * MAX_FREQ_COEFFS);
867
868
48.8k
  hs->harm_index = 0;
869
870
48.8k
  hs->filt_buf_me = sbr_persistent_mem->sbr_smooth_gain_buf[chan];
871
48.8k
  hs->filt_buf_noise_m = sbr_persistent_mem->sbr_smooth_noise_buf[chan];
872
48.8k
  hs->tansient_env_prev = -1;
873
874
48.8k
  ixheaacd_reset_sbrenvelope_calc(hs);
875
876
48.8k
  if ((chan == 0) && (audio_object_type == AOT_ER_AAC_ELD)) {
877
8.23k
    err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data, pstr_common_table);
878
8.23k
  }
879
880
48.8k
  return err;
881
48.8k
}
882
883
static PLATFORM_INLINE VOID ixheaacd_init_sbr_prev_framedata(
884
48.7k
    ia_sbr_prev_frame_data_struct *ptr_prev_data, WORD16 time_slots) {
885
48.7k
  WORD16 *psfb_nrg_prev = ptr_prev_data->sfb_nrg_prev;
886
48.7k
  WORD16 *psfb_noise_level = ptr_prev_data->prev_noise_level;
887
48.7k
  WORD32 *ppsbr_invf_mode = ptr_prev_data->sbr_invf_mode;
888
889
48.7k
  memset(psfb_nrg_prev, 0, sizeof(WORD16) * (MAX_FREQ_COEFFS));
890
48.7k
  memset(psfb_noise_level, 0, sizeof(WORD16) * (MAX_NOISE_COEFFS));
891
892
48.7k
  memset(ppsbr_invf_mode, 0, sizeof(WORD32) * MAX_INVF_BANDS);
893
894
48.7k
  ptr_prev_data->end_position = time_slots;
895
48.7k
  ptr_prev_data->coupling_mode = COUPLING_OFF;
896
48.7k
  ptr_prev_data->amp_res = 0;
897
48.7k
  ptr_prev_data->max_qmf_subband_aac = 0;
898
48.7k
}
899
900
static PLATFORM_INLINE VOID
901
ixheaacd_create_hyb_filterbank(ia_hybrid_struct *ptr_hybrid, WORD32 **p_ptr,
902
18.5k
                               ia_sbr_tables_struct *sbr_tables_ptr) {
903
18.5k
  WORD16 i;
904
18.5k
  WORD32 *ptr = (WORD32 *)*p_ptr;
905
906
18.5k
  ptr_hybrid->ptr_resol = sbr_tables_ptr->ps_tables_ptr->hyb_resol;
907
18.5k
  ptr_hybrid->ptr_qmf_buf = HYBRID_FILTER_LENGTH - 1;
908
909
18.5k
  ptr_hybrid->ptr_temp_re = ptr;
910
18.5k
  ptr += NO_HYBRID_CHANNELS_HIGH;
911
18.5k
  ptr_hybrid->ptr_temp_im = ptr;
912
18.5k
  ptr += NO_HYBRID_CHANNELS_HIGH;
913
914
18.5k
  memset(ptr_hybrid->ptr_temp_re, 0,
915
18.5k
         2 * NO_HYBRID_CHANNELS_HIGH * sizeof(WORD32));
916
917
18.5k
  ptr_hybrid->ptr_work_re = ptr;
918
18.5k
  ptr += 16;
919
18.5k
  ptr_hybrid->ptr_work_im = ptr;
920
18.5k
  ptr += 16;
921
922
74.1k
  for (i = 0; i < NO_QMF_CHANNELS_IN_HYBRID; i++) {
923
55.5k
    ptr_hybrid->ptr_qmf_buf_re[i] = ptr;
924
55.5k
    ptr += ptr_hybrid->ptr_qmf_buf;
925
926
55.5k
    ptr_hybrid->ptr_qmf_buf_im[i] = ptr;
927
55.5k
    ptr += ptr_hybrid->ptr_qmf_buf;
928
929
55.5k
    memset(ptr_hybrid->ptr_qmf_buf_re[i], 0,
930
55.5k
           2 * ptr_hybrid->ptr_qmf_buf * sizeof(WORD32));
931
55.5k
  }
932
933
18.5k
  *p_ptr = ptr;
934
935
18.5k
  return;
936
18.5k
}
937
938
static PLATFORM_INLINE VOID ixheaacd_create_hf_generator(
939
    ia_sbr_hf_generator_struct *ptr_hf_gen_str, WORD16 num_columns, WORD16 chan,
940
48.7k
    VOID *sbr_persistent_mem_v, WORD32 ps_enable) {
941
48.7k
  WORD16 i;
942
48.7k
  ia_sbr_pers_struct *sbr_persistent_mem =
943
48.7k
      (ia_sbr_pers_struct *)sbr_persistent_mem_v;
944
945
48.7k
  ptr_hf_gen_str->pstr_settings = &sbr_persistent_mem->str_sbr_tran_settings;
946
947
48.7k
  ptr_hf_gen_str->lpc_filt_states_real[0] =
948
48.7k
      sbr_persistent_mem->sbr_lpc_filter_states_real[chan][0];
949
48.7k
  ptr_hf_gen_str->lpc_filt_states_real[1] =
950
48.7k
      sbr_persistent_mem->sbr_lpc_filter_states_real[chan][1];
951
952
48.7k
  if (ps_enable) {
953
37.0k
    ptr_hf_gen_str->lpc_filt_states_imag[0] =
954
37.0k
        sbr_persistent_mem->sbr_lpc_filter_states_imag[chan][0];
955
37.0k
    ptr_hf_gen_str->lpc_filt_states_imag[1] =
956
37.0k
        sbr_persistent_mem->sbr_lpc_filter_states_imag[chan][1];
957
37.0k
  }
958
959
146k
  for (i = 0; i < LPC_ORDER; i++) {
960
97.5k
    if (ptr_hf_gen_str->lpc_filt_states_real[i] != NULL) {
961
97.5k
      memset(ptr_hf_gen_str->lpc_filt_states_real[i], 0,
962
97.5k
             NO_ANALYSIS_CHANNELS * sizeof(WORD32));
963
97.5k
    }
964
965
97.5k
    if (ps_enable)
966
74.1k
      memset(ptr_hf_gen_str->lpc_filt_states_imag[i], 0,
967
74.1k
             NO_ANALYSIS_CHANNELS * sizeof(WORD32));
968
97.5k
  }
969
970
48.7k
  if (chan == 0) {
971
26.0k
    ptr_hf_gen_str->pstr_settings->num_columns = num_columns;
972
26.0k
  }
973
48.7k
  return;
974
48.7k
}
975
976
VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec,
977
                           VOID *sbr_persistent_mem_v,
978
18.5k
                           WORD32 *ptr_overlap_buf, WORD32 frame_size) {
979
18.5k
  ia_sbr_pers_struct *sbr_persistent_mem =
980
18.5k
      (ia_sbr_pers_struct *)sbr_persistent_mem_v;
981
982
18.5k
  WORD16 *ptr1 = (WORD16 *)&(
983
18.5k
      sbr_persistent_mem->ptr_sbr_overlap_buf[MAXNRSBRCHANNELS - 1][0]);
984
18.5k
  WORD32 *ptr2 = (WORD32 *)&ptr_overlap_buf[512];
985
18.5k
  WORD16 *initial_ptr;
986
18.5k
  WORD16 delay;
987
18.5k
  WORD32 temp;
988
989
18.5k
  ia_sbr_tables_struct *sbr_tables_ptr =
990
18.5k
      sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables;
991
992
18.5k
  memset(ptr_ps_dec, 0, sizeof(ia_ps_dec_struct));
993
994
18.5k
  ptr_ps_dec->ps_data_present = 0;
995
18.5k
  ptr_ps_dec->enable_iid = 0;
996
18.5k
  ptr_ps_dec->enable_icc = 0;
997
18.5k
  ptr_ps_dec->enable_ext = 0;
998
18.5k
  ptr_ps_dec->iid_mode = 0;
999
18.5k
  ptr_ps_dec->icc_mode = 0;
1000
1001
18.5k
  ptr_ps_dec->ptr_hyb_left_re = ptr2;
1002
18.5k
  ptr2 += 16;
1003
18.5k
  ptr_ps_dec->ptr_hyb_left_im = ptr2;
1004
18.5k
  ptr2 += 16;
1005
18.5k
  ptr_ps_dec->ptr_hyb_right_re = ptr2;
1006
18.5k
  ptr2 += 16;
1007
18.5k
  ptr_ps_dec->ptr_hyb_right_im = ptr2;
1008
18.5k
  ptr2 += 16;
1009
1010
18.5k
  memset(ptr_ps_dec->ptr_hyb_left_re, 0, sizeof(WORD32) * 16 * 4);
1011
1012
18.5k
  ixheaacd_create_hyb_filterbank(&ptr_ps_dec->str_hybrid, &ptr2,
1013
18.5k
                                 sbr_tables_ptr);
1014
1015
18.5k
  ptr_ps_dec->peak_decay_diff = ptr2;
1016
18.5k
  ptr2 += NUM_OF_BINS;
1017
18.5k
  ptr_ps_dec->energy_prev = ptr2;
1018
18.5k
  ptr2 += NUM_OF_BINS;
1019
18.5k
  ptr_ps_dec->peak_decay_diff_prev = ptr2;
1020
18.5k
  ptr2 += NUM_OF_BINS;
1021
1022
18.5k
  memset(ptr_ps_dec->peak_decay_diff, 0, 3 * sizeof(WORD32) * NUM_OF_BINS);
1023
1024
18.5k
  ptr_ps_dec->delay_buf_idx = 0;
1025
18.5k
  ptr_ps_dec->delay_buf_idx_long = 0;
1026
1027
18.5k
  memset(ptr_ps_dec->delay_buf_qmf_sub_re_im, 0,
1028
18.5k
         2 * 16 * DEL_ALL_PASS * sizeof(WORD16));
1029
18.5k
  memset(ptr_ps_dec->delay_buf_qmf_sub_ser_re_im, 0,
1030
18.5k
         2 * 16 * NUM_SER_AP_LINKS * 5 * sizeof(WORD16));
1031
1032
18.5k
  initial_ptr = ptr1;
1033
18.5k
  ptr_ps_dec->delay_buf_qmf_ser_re_im = (VOID *)ptr1;
1034
18.5k
  ptr1 += 2 * NUM_SER_AP_LINKS * 32 * 5;
1035
1036
18.5k
  delay = 2;
1037
18.5k
  ptr_ps_dec->delay_buf_qmf_ap_re_im = (VOID *)ptr1;
1038
18.5k
  ptr1 += 2 * delay * 32;
1039
1040
18.5k
  delay = HIGH_DEL;
1041
18.5k
  ptr_ps_dec->delay_buf_qmf_ld_re_im = (VOID *)ptr1;
1042
18.5k
  ptr1 += 2 * delay * SMALL_DEL_STRT;
1043
1044
18.5k
  delay = SMALL_DEL;
1045
18.5k
  ptr_ps_dec->delay_buf_qmf_sd_re_im = (VOID *)ptr1;
1046
18.5k
  ptr1 +=
1047
18.5k
      2 * delay * (NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS -
1048
18.5k
                   (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT));
1049
1050
18.5k
  temp = (WORD32)(ptr1 - initial_ptr);
1051
18.5k
  memset(ptr_ps_dec->delay_buf_qmf_ser_re_im, 0, temp * sizeof(WORD16));
1052
1053
18.5k
  memset(ptr_ps_dec->delay_buf_idx_ser, 0, NUM_SER_AP_LINKS * sizeof(WORD16));
1054
18.5k
  memcpy(ptr_ps_dec->delay_sample_ser,
1055
18.5k
         sbr_tables_ptr->ps_tables_ptr->rev_link_delay_ser,
1056
18.5k
         NUM_SER_AP_LINKS * sizeof(WORD16));
1057
1058
18.5k
  memset(ptr_ps_dec->h11_h12_vec, 0xff,
1059
18.5k
         (NO_IID_GROUPS + 2) * 2 * sizeof(WORD16));
1060
18.5k
  memset(ptr_ps_dec->h21_h22_vec, 0, sizeof(ptr_ps_dec->h21_h22_vec));
1061
1062
18.5k
  if (frame_size == 960)
1063
1.04k
    ptr_ps_dec->num_sub_samples = NUM_SUB_SAMPLES_960;
1064
17.4k
  else
1065
17.4k
    ptr_ps_dec->num_sub_samples = NUM_SUB_SAMPLES;
1066
1067
1068
18.5k
  ixheaacd_create_ps_esbr_dec(ptr_ps_dec, sbr_tables_ptr->ps_tables_ptr,
1069
18.5k
                              64, ptr_ps_dec->num_sub_samples, 0);
1070
1071
18.5k
  return;
1072
18.5k
}
1073
1074
static PLATFORM_INLINE VOID ixheaacd_create_cplx_anal_qmfbank(
1075
    ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf,
1076
    ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 no_bins, WORD16 usb,
1077
    WORD16 chan, WORD16 *sbr_qmf_analy_states, WORD32 *sbr_qmf_analy_states_32,
1078
    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 audio_object_type,
1079
48.7k
    WORD32 ldmps_present, WORD32 no_ldsbr) {
1080
48.7k
  memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct));
1081
1082
48.7k
  ptr_sbr_qmf->analy_win_coeff_32 = qmf_dec_tables_ptr->esbr_qmf_c;
1083
48.7k
  if (audio_object_type != AOT_ER_AAC_ELD &&
1084
32.5k
      audio_object_type != AOT_ER_AAC_LD) {
1085
28.9k
    ptr_sbr_qmf->analy_win_coeff = qmf_dec_tables_ptr->qmf_c;
1086
28.9k
  } else {
1087
19.8k
    ptr_sbr_qmf->analy_win_coeff = qmf_dec_tables_ptr->qmf_c_eld3;
1088
19.8k
    if (ldmps_present == 1)
1089
2.15k
      ptr_sbr_qmf->analy_win_coeff_32 = qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
1090
19.8k
    if (no_ldsbr == 1)
1091
4.76k
      ptr_sbr_qmf->analy_win_coeff_32 =
1092
4.76k
          (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
1093
19.8k
  }
1094
1095
48.7k
  ptr_sbr_qmf->no_channels = NO_ANALYSIS_CHANNELS;
1096
48.7k
  if (no_ldsbr) ptr_sbr_qmf->no_channels = 64;
1097
48.7k
  ptr_sbr_qmf->num_time_slots = no_bins;
1098
1099
48.7k
  ptr_sbr_qmf->lsb = 0;
1100
48.7k
  ptr_sbr_qmf->usb = usb;
1101
1102
48.7k
  ptr_sbr_qmf->anal_filter_states =
1103
48.7k
      &(sbr_qmf_analy_states[chan ? QMF_FILTER_STATE_ANA_SIZE : 0]);
1104
1105
48.7k
  memset(ptr_sbr_qmf->anal_filter_states, 0,
1106
48.7k
         sizeof(WORD16) * QMF_FILTER_STATE_ANA_SIZE);
1107
1108
48.7k
  ptr_sbr_qmf->anal_filter_states_32 =
1109
48.7k
      &(sbr_qmf_analy_states_32[chan ? QMF_FILTER_STATE_ANA_SIZE : 0]);
1110
1111
48.7k
  memset(ptr_sbr_qmf->anal_filter_states_32, 0,
1112
48.7k
         sizeof(WORD32) * QMF_FILTER_STATE_ANA_SIZE);
1113
1114
48.7k
  ptr_sbr_qmf->core_samples_buffer = ptr_sbr_qmf->anal_filter_states;
1115
48.7k
  ptr_sbr_qmf->core_samples_buffer_32 = ptr_sbr_qmf->anal_filter_states_32;
1116
1117
48.7k
  ptr_sbr_qmf->filter_pos_32 = (WORD32 *)qmf_dec_tables_ptr->esbr_qmf_c;
1118
48.7k
  ptr_sbr_qmf->state_new_samples_pos_low_32 =
1119
48.7k
      ptr_sbr_qmf->anal_filter_states_32;
1120
48.7k
  if (audio_object_type != AOT_ER_AAC_ELD &&
1121
32.5k
      audio_object_type != AOT_ER_AAC_LD) {
1122
28.9k
    ptr_sbr_qmf->filter_pos = (WORD16 *)qmf_dec_tables_ptr->qmf_c;
1123
28.9k
  } else {
1124
19.8k
    ptr_sbr_qmf->filter_pos = (WORD16 *)qmf_dec_tables_ptr->qmf_c_eld3;
1125
19.8k
    if (ldmps_present == 1)
1126
2.15k
      ptr_sbr_qmf->filter_pos_32 =
1127
2.15k
          (WORD32 *)qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
1128
19.8k
    if (no_ldsbr == 1)
1129
4.76k
      ptr_sbr_qmf->filter_pos_32 =
1130
4.76k
          (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
1131
19.8k
  }
1132
1133
48.7k
  sbr_scale_factor->st_lb_scale = 0;
1134
1135
48.7k
  sbr_scale_factor->st_syn_scale = -6;
1136
1137
48.7k
  if (audio_object_type == AOT_ER_AAC_ELD ||
1138
32.5k
      audio_object_type == AOT_ER_AAC_LD) {
1139
19.8k
    ptr_sbr_qmf->filter_2_32 =
1140
19.8k
        ptr_sbr_qmf->filter_pos_32 + ptr_sbr_qmf->no_channels;
1141
19.8k
    ptr_sbr_qmf->fp1_anal_32 = ptr_sbr_qmf->anal_filter_states_32;
1142
19.8k
    ptr_sbr_qmf->fp2_anal_32 =
1143
19.8k
        ptr_sbr_qmf->anal_filter_states_32 + ptr_sbr_qmf->no_channels;
1144
1145
19.8k
    ptr_sbr_qmf->filter_2 = ptr_sbr_qmf->filter_pos + ptr_sbr_qmf->no_channels;
1146
19.8k
    ptr_sbr_qmf->fp1_anal = ptr_sbr_qmf->anal_filter_states;
1147
19.8k
    ptr_sbr_qmf->fp2_anal =
1148
19.8k
        ptr_sbr_qmf->anal_filter_states + ptr_sbr_qmf->no_channels;
1149
19.8k
  }
1150
1151
48.7k
  return;
1152
48.7k
}
1153
1154
static PLATFORM_INLINE VOID ixheaacd_create_cplx_synt_qmfbank(
1155
    ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf, WORD16 no_bins, WORD16 lsb,
1156
    WORD16 usb, WORD16 chan, FLAG down_sample_flag,
1157
    WORD16 *sbr_qmf_synth_states, WORD32 *sbr_qmf_synth_states_32,
1158
48.7k
    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 audio_object_type) {
1159
48.7k
  WORD32 L;
1160
1161
48.7k
  WORD32 qmf_filter_state_size;
1162
1163
48.7k
  memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct));
1164
1165
48.7k
  if (down_sample_flag) {
1166
12.5k
    L = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED;
1167
12.5k
    qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
1168
12.5k
    ptr_sbr_qmf->usb = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED;
1169
36.2k
  } else {
1170
36.2k
    L = NO_SYNTHESIS_CHANNELS;
1171
36.2k
    qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE;
1172
36.2k
    ptr_sbr_qmf->usb = usb;
1173
36.2k
  }
1174
1175
48.7k
  ptr_sbr_qmf->ixheaacd_drc_offset = 0;
1176
48.7k
  if (audio_object_type != AOT_ER_AAC_ELD &&
1177
32.5k
      audio_object_type != AOT_ER_AAC_LD) {
1178
28.9k
    ptr_sbr_qmf->filter_pos_syn = (WORD16 *)qmf_dec_tables_ptr->qmf_c;
1179
28.9k
    ptr_sbr_qmf->p_filter = qmf_dec_tables_ptr->qmf_c;
1180
28.9k
  } else {
1181
19.8k
    ptr_sbr_qmf->filter_pos_syn = (WORD16 *)qmf_dec_tables_ptr->qmf_c_eld;
1182
19.8k
    ptr_sbr_qmf->p_filter = qmf_dec_tables_ptr->qmf_c_eld;
1183
19.8k
  }
1184
1185
48.7k
  ptr_sbr_qmf->filter_pos_syn_32 = (WORD32 *)qmf_dec_tables_ptr->esbr_qmf_c;
1186
48.7k
  ptr_sbr_qmf->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
1187
1188
48.7k
  ptr_sbr_qmf->no_channels = L;
1189
48.7k
  ptr_sbr_qmf->qmf_filter_state_size = qmf_filter_state_size;
1190
48.7k
  ptr_sbr_qmf->num_time_slots = no_bins;
1191
48.7k
  ptr_sbr_qmf->lsb = lsb;
1192
1193
48.7k
  ptr_sbr_qmf->filter_states =
1194
48.7k
      &sbr_qmf_synth_states[chan ? qmf_filter_state_size : 0];
1195
1196
48.7k
  memset(ptr_sbr_qmf->filter_states, 0, sizeof(WORD16) * qmf_filter_state_size);
1197
1198
48.7k
  ptr_sbr_qmf->filter_states_32 =
1199
48.7k
      &sbr_qmf_synth_states_32[chan ? qmf_filter_state_size : 0];
1200
1201
48.7k
  memset(ptr_sbr_qmf->filter_states_32, 0,
1202
48.7k
         sizeof(WORD32) * qmf_filter_state_size);
1203
1204
48.7k
  if (audio_object_type == AOT_ER_AAC_ELD ||
1205
32.5k
      audio_object_type == AOT_ER_AAC_LD) {
1206
19.8k
    ptr_sbr_qmf->fp1_syn = ptr_sbr_qmf->filter_states;
1207
19.8k
    ptr_sbr_qmf->fp2_syn =
1208
19.8k
        ptr_sbr_qmf->filter_states + ptr_sbr_qmf->no_channels;
1209
19.8k
    ptr_sbr_qmf->sixty4 = NO_SYNTHESIS_CHANNELS;
1210
19.8k
  }
1211
1212
48.7k
  return;
1213
48.7k
}
1214
1215
WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table,
1216
                              ia_sbr_channel_struct *ptr_sbr_channel,
1217
                              ia_sbr_header_data_struct *ptr_header_data,
1218
                              WORD16 chan, FLAG down_sample_flag,
1219
                              VOID *sbr_persistent_mem_v, WORD ps_enable,
1220
                              WORD audio_object_type, WORD32 ldmps_present,
1221
                              WORD32 ldsbr_present)
1222
1223
48.8k
{
1224
48.8k
  WORD16 err;
1225
48.8k
  WORD16 time_slots;
1226
48.8k
  WORD16 no_bins;
1227
48.8k
  ia_sbr_pers_struct *sbr_persistent_mem =
1228
48.8k
      (ia_sbr_pers_struct *)sbr_persistent_mem_v;
1229
48.8k
  ia_sbr_dec_struct *hs = &(ptr_sbr_channel->str_sbr_dec);
1230
1231
48.8k
  time_slots = ptr_header_data->num_time_slots;
1232
1233
48.8k
  no_bins = (WORD16)(time_slots * ptr_header_data->time_step);
1234
1235
48.8k
  hs->str_sbr_scale_fact.ov_lb_scale = INT_BITS - 1;
1236
48.8k
  hs->str_sbr_scale_fact.hb_scale = INT_BITS - 1;
1237
48.8k
  hs->str_sbr_scale_fact.ov_hb_scale = INT_BITS - 1;
1238
48.8k
  hs->str_sbr_scale_fact.st_syn_scale = INT_BITS - 1;
1239
1240
48.8k
  ptr_sbr_channel->pstr_prev_frame_data =
1241
48.8k
      sbr_persistent_mem->pstr_prev_frame_data[chan];
1242
1243
48.8k
  err = ixheaacd_create_sbr_env_calc(pstr_common_table, &hs->str_sbr_calc_env,
1244
48.8k
                                     chan, sbr_persistent_mem, ptr_header_data,
1245
48.8k
                                     audio_object_type);
1246
1247
48.8k
  if (err) {
1248
101
    return (-1);
1249
101
  }
1250
1251
48.7k
  ixheaacd_create_cplx_anal_qmfbank(
1252
48.7k
      &hs->str_codec_qmf_bank, &hs->str_sbr_scale_fact, no_bins,
1253
48.7k
      ptr_header_data->pstr_freq_band_data->sub_band_start, chan,
1254
48.7k
      sbr_persistent_mem->sbr_qmf_analy_states,
1255
48.7k
      sbr_persistent_mem->sbr_qmf_analy_states_32,
1256
48.7k
      sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr,
1257
48.7k
      audio_object_type, ldmps_present, ldsbr_present);
1258
1259
48.7k
  ixheaacd_create_cplx_synt_qmfbank(
1260
48.7k
      &hs->str_synthesis_qmf_bank, no_bins,
1261
48.7k
      ptr_header_data->pstr_freq_band_data->sub_band_start,
1262
48.7k
      ptr_header_data->pstr_freq_band_data->sub_band_end, chan,
1263
48.7k
      down_sample_flag, sbr_persistent_mem->sbr_qmf_synth_states,
1264
48.7k
      sbr_persistent_mem->sbr_qmf_synth_states_32,
1265
48.7k
      sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr,
1266
48.7k
      audio_object_type);
1267
1268
48.7k
  ixheaacd_init_sbr_prev_framedata(ptr_sbr_channel->pstr_prev_frame_data,
1269
48.7k
                                   time_slots);
1270
1271
48.7k
  ixheaacd_create_hf_generator(&hs->str_hf_generator,
1272
48.7k
                               hs->str_codec_qmf_bank.num_time_slots, chan,
1273
48.7k
                               sbr_persistent_mem, ps_enable);
1274
1275
48.7k
  hs->ptr_sbr_overlap_buf = sbr_persistent_mem->ptr_sbr_overlap_buf[chan];
1276
1277
48.7k
  return 0;
1278
48.8k
}