Coverage Report

Created: 2026-02-26 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_sbrdecoder.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
#include "ixheaacd_error_codes.h"
31
32
#include "ixheaacd_intrinsics.h"
33
#include "ixheaac_sbr_const.h"
34
#include "ixheaac_basic_op.h"
35
#include "ixheaacd_defines.h"
36
#include "ixheaacd_bitbuffer.h"
37
#include "ixheaacd_pns.h"
38
39
#include "ixheaacd_aac_rom.h"
40
#include "ixheaacd_pulsedata.h"
41
42
#include "ixheaacd_drc_data_struct.h"
43
#include "ixheaacd_lt_predict.h"
44
#include "ixheaacd_cnst.h"
45
#include "ixheaacd_ec_defines.h"
46
#include "ixheaacd_ec_struct_def.h"
47
#include "ixheaacd_channelinfo.h"
48
#include "ixheaacd_drc_dec.h"
49
50
#include "ixheaacd_sbrdecoder.h"
51
52
#include "ixheaacd_sbrdecsettings.h"
53
#include "ixheaacd_sbr_scale.h"
54
#include "ixheaacd_lpp_tran.h"
55
#include "ixheaacd_env_extr_part.h"
56
#include "ixheaacd_sbr_rom.h"
57
#include "ixheaacd_hybrid.h"
58
#include "ixheaacd_ps_dec.h"
59
#include "ixheaacd_ps_bitdec.h"
60
#include "ixheaacd_env_extr.h"
61
#include "ixheaacd_common_rom.h"
62
#include "ixheaacd_freq_sca.h"
63
64
#include "ixheaacd_qmf_dec.h"
65
66
#include "ixheaacd_env_calc.h"
67
68
#include "ixheaacd_pvc_dec.h"
69
#include "ixheaacd_sbr_dec.h"
70
#include "ixheaacd_env_dec.h"
71
#include "ixheaacd_basic_funcs.h"
72
#include "ixheaacd_sbr_crc.h"
73
74
#include "ixheaacd_audioobjtypes.h"
75
76
static VOID ixheaacd_ec_set_frame_error_flag(ia_sbr_element_stream_struct *pstr_sbr_element,
77
0
                                             WORD32 value) {
78
0
  if (pstr_sbr_element != NULL) {
79
0
    switch (value) {
80
0
      case FRAME_ERROR_ALLSLOTS:
81
0
        pstr_sbr_element->frame_error_flag[0] = FRAME_ERROR;
82
0
        pstr_sbr_element->frame_error_flag[1] = FRAME_ERROR;
83
0
        break;
84
0
      default:
85
0
        pstr_sbr_element->frame_error_flag[pstr_sbr_element->use_frame_slot] = value;
86
0
    }
87
0
  }
88
0
}
89
90
0
VOID ixheaacd_downmix_to_monosbr(WORD16 *core_sample_buf, WORD32 ch_fac) {
91
0
  WORD32 i;
92
0
  WORD16 *ptr1 = &core_sample_buf[0];
93
0
  WORD16 *ptr2 = &core_sample_buf[1];
94
95
0
  for (i = MAX_FRAME_SIZE - 1; i >= 0; i--) {
96
0
    *ptr1 = ((*ptr1 >> 1) + (*ptr2 >> 1));
97
98
0
    ptr1 += ch_fac;
99
0
    ptr2 += ch_fac;
100
0
  }
101
0
}
102
103
static WORD32 ixheaacd_sbr_dec_reset(ia_sbr_dec_struct *ptr_sbr_dec,
104
                                     ia_sbr_header_data_struct *ptr_header_data,
105
                                     FLAG low_pow_flag,
106
                                     ixheaacd_misc_tables *pstr_common_tables,
107
                                     WORD32 pitch_in_bins,
108
                                     WORD32 audio_object_type,
109
44.8k
                                     WORD32 *ptr_work_buf_core) {
110
44.8k
  WORD32 old_lsb, new_lsb;
111
44.8k
  WORD32 l;
112
44.8k
  WORD32 err = 0;
113
44.8k
  WORD32 num_time_slots = ptr_sbr_dec->str_codec_qmf_bank.num_time_slots;
114
44.8k
  WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
115
44.8k
  WORD32 op_delay = 6 + SBR_HF_ADJ_OFFSET;
116
44.8k
  WORD32 hbe_flag = ptr_header_data->hbe_flag;
117
44.8k
  WORD32 usac_flag = ptr_header_data->usac_flag;
118
119
44.8k
  if (ptr_header_data->is_usf_4) {
120
2.99k
    op_delay = op_delay + 6;
121
2.99k
  }
122
123
44.8k
  ixheaacd_reset_sbrenvelope_calc(&ptr_sbr_dec->str_sbr_calc_env);
124
125
44.8k
  new_lsb = ptr_header_data->pstr_freq_band_data->sub_band_start;
126
44.8k
  ptr_sbr_dec->str_synthesis_qmf_bank.lsb = new_lsb;
127
44.8k
  ptr_sbr_dec->str_synthesis_qmf_bank.usb =
128
44.8k
      ptr_header_data->pstr_freq_band_data->sub_band_end;
129
130
44.8k
  old_lsb = ptr_sbr_dec->str_synthesis_qmf_bank.lsb;
131
44.8k
  ptr_sbr_dec->str_codec_qmf_bank.lsb = 0;
132
44.8k
  ptr_sbr_dec->str_codec_qmf_bank.usb = old_lsb;
133
134
44.8k
  {
135
44.8k
    WORD32 *plpc_filt_states_real =
136
44.8k
        &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[0][old_lsb];
137
44.8k
    WORD32 *plpc_filt_states_real_1 =
138
44.8k
        &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[1][old_lsb];
139
140
44.8k
    WORD32 *plpc_filt_states_imag =
141
44.8k
        &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[0][old_lsb];
142
44.8k
    WORD32 *plpc_filt_states_imag_1 =
143
44.8k
        &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[1][old_lsb];
144
145
44.8k
    for (l = new_lsb - old_lsb - 1; l >= 0; l--) {
146
0
      *plpc_filt_states_real++ = *plpc_filt_states_real_1++ = 0L;
147
148
0
      if (!low_pow_flag) {
149
0
        *plpc_filt_states_imag++ = *plpc_filt_states_imag_1++ = 0L;
150
0
      }
151
0
    }
152
44.8k
  }
153
44.8k
  if (1) {
154
44.8k
    WORD32 start_band;
155
44.8k
    WORD32 stop_band;
156
44.8k
    WORD32 start_slot = SBR_HF_ADJ_OFFSET;
157
44.8k
    WORD32 k;
158
159
44.8k
    start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
160
44.8k
    stop_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
161
44.8k
    if (usac_flag && !hbe_flag) {
162
40.1k
      for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) {
163
77.7k
        for (k = start_band; k < stop_band; k++) {
164
50.9k
          ptr_sbr_dec->qmf_buf_real[l][k] = 0.0;
165
50.9k
          ptr_sbr_dec->qmf_buf_imag[l][k] = 0.0;
166
50.9k
        }
167
26.7k
      }
168
94.0k
      for (l = start_slot; l < op_delay; l++) {
169
234k
        for (k = start_band; k < stop_band; k++) {
170
153k
          ptr_sbr_dec->qmf_buf_real[l][k] = 0.0;
171
153k
          ptr_sbr_dec->qmf_buf_imag[l][k] = 0.0;
172
153k
        }
173
80.6k
      }
174
13.3k
    }
175
44.8k
    if (ptr_sbr_dec->p_hbe_txposer != NULL && (usac_flag || hbe_flag)) {
176
32.5k
      WORD32 k, i;
177
32.5k
      WORD32 dft_hbe_flag = ptr_header_data->esbr_hq;
178
32.5k
      if (dft_hbe_flag == 1) {
179
0
        err = ixheaacd_dft_hbe_data_reinit(
180
0
            ptr_sbr_dec->p_hbe_txposer,
181
0
            ptr_header_data->pstr_freq_band_data->freq_band_table,
182
0
            ptr_header_data->pstr_freq_band_data->num_sf_bands);
183
32.5k
      } else {
184
32.5k
        err = ixheaacd_qmf_hbe_data_reinit(
185
32.5k
            ptr_sbr_dec->p_hbe_txposer,
186
32.5k
            ptr_header_data->pstr_freq_band_data->freq_band_table,
187
32.5k
            ptr_header_data->pstr_freq_band_data->num_sf_bands,
188
32.5k
            ptr_header_data->is_usf_4);
189
32.5k
      }
190
32.5k
      if (err) return err;
191
192
97.5k
      for (k = 0; k < 2; k++) {
193
65.0k
        if (!((upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) && (k == 0))) {
194
62.0k
          WORD32 xpos_delay = num_time_slots * k;
195
62.0k
          if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
196
2.99k
            xpos_delay = num_time_slots * k - 32;
197
2.99k
          }
198
199
558k
          for (i = 0; i < 8; i++) {
200
496k
            memmove(ptr_sbr_dec->ph_vocod_qmf_real[i],
201
496k
                    ptr_sbr_dec->ph_vocod_qmf_real[num_time_slots + i],
202
496k
                    64 * sizeof(FLOAT32));
203
496k
            memmove(ptr_sbr_dec->ph_vocod_qmf_imag[i],
204
496k
                    ptr_sbr_dec->ph_vocod_qmf_imag[num_time_slots + i],
205
496k
                    64 * sizeof(FLOAT32));
206
496k
          }
207
62.0k
          if (dft_hbe_flag == 1) {
208
0
            err = ixheaacd_dft_hbe_apply(
209
0
                ptr_sbr_dec->p_hbe_txposer,
210
0
                ptr_sbr_dec->qmf_buf_real + op_delay + xpos_delay,
211
0
                ptr_sbr_dec->qmf_buf_imag + op_delay + xpos_delay, num_time_slots,
212
0
                ptr_sbr_dec->ph_vocod_qmf_real + op_delay,
213
0
                ptr_sbr_dec->ph_vocod_qmf_imag + op_delay, pitch_in_bins,
214
0
                (FLOAT32 *)ptr_work_buf_core);
215
0
            if (err)
216
0
                return err;
217
62.0k
          } else {
218
62.0k
            err = ixheaacd_qmf_hbe_apply(
219
62.0k
                ptr_sbr_dec->p_hbe_txposer,
220
62.0k
                ptr_sbr_dec->qmf_buf_real + op_delay + xpos_delay,
221
62.0k
                ptr_sbr_dec->qmf_buf_imag + op_delay + xpos_delay, num_time_slots,
222
62.0k
                ptr_sbr_dec->ph_vocod_qmf_real + op_delay,
223
62.0k
                ptr_sbr_dec->ph_vocod_qmf_imag + op_delay, pitch_in_bins,
224
62.0k
                ptr_header_data);
225
62.0k
          if (err) return err;
226
62.0k
          }
227
228
62.0k
          if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
229
2.99k
            ixheaacd_hbe_repl_spec(&ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
230
2.99k
                                   ptr_sbr_dec->ph_vocod_qmf_real + op_delay,
231
2.99k
                                   ptr_sbr_dec->ph_vocod_qmf_imag + op_delay,
232
2.99k
                                   num_time_slots,
233
2.99k
                                   ptr_sbr_dec->p_hbe_txposer->max_stretch);
234
2.99k
          }
235
62.0k
        }
236
65.0k
      }
237
32.5k
    }
238
44.8k
  }
239
240
44.8k
  if (!usac_flag) {
241
12.7k
    err |= ixheaacd_reset_hf_generator(&ptr_sbr_dec->str_hf_generator,
242
12.7k
                                       ptr_header_data, audio_object_type);
243
244
12.7k
    ixheaacd_derive_lim_band_tbl(
245
12.7k
        ptr_header_data,
246
12.7k
        ptr_sbr_dec->str_hf_generator.pstr_settings->str_patch_param,
247
12.7k
        ptr_sbr_dec->str_hf_generator.pstr_settings->num_patches,
248
12.7k
        pstr_common_tables);
249
12.7k
  }
250
251
44.8k
  return err;
252
44.8k
}
253
254
VOID ixheaacd_prepare_upsamp(ia_sbr_header_data_struct **ptr_header_data,
255
                             ia_sbr_channel_struct *pstr_sbr_channel[2],
256
2.30k
                             WORD32 num_channels) {
257
2.30k
  WORD32 lr;
258
2.30k
  ia_sbr_qmf_filter_bank_struct *sbr_qmf_bank;
259
260
6.76k
  for (lr = 0; lr < num_channels; lr++) {
261
4.46k
    ptr_header_data[lr]->pstr_freq_band_data->sub_band_start =
262
4.46k
        NO_ANALYSIS_CHANNELS;
263
4.46k
    ptr_header_data[lr]->pstr_freq_band_data->sub_band_end =
264
4.46k
        NO_SYNTHESIS_CHANNELS;
265
266
4.46k
    sbr_qmf_bank = &pstr_sbr_channel[lr]->str_sbr_dec.str_synthesis_qmf_bank;
267
4.46k
    sbr_qmf_bank->lsb = NO_ANALYSIS_CHANNELS;
268
4.46k
    sbr_qmf_bank->usb = NO_SYNTHESIS_CHANNELS;
269
270
4.46k
    sbr_qmf_bank = &pstr_sbr_channel[lr]->str_sbr_dec.str_codec_qmf_bank;
271
4.46k
    sbr_qmf_bank->lsb = 0;
272
4.46k
    sbr_qmf_bank->usb = NO_ANALYSIS_CHANNELS;
273
4.46k
    ptr_header_data[lr]->sync_state = UPSAMPLING;
274
4.46k
  }
275
2.30k
  return;
276
2.30k
}
277
278
static VOID ixheaacd_copy_prev_ps_params(ia_ps_dec_struct *ps_config_curr,
279
                                         ia_ps_dec_config_struct *ps_config_prev,
280
0
                                         WORD32 frame_status) {
281
0
  if (frame_status == 0) {
282
0
    ps_config_curr->enable_iid = ps_config_prev->enable_iid;
283
0
    ps_config_curr->iid_mode = ps_config_prev->iid_mode;
284
0
    ps_config_curr->enable_icc = ps_config_prev->enable_icc;
285
0
    ps_config_curr->icc_mode = ps_config_prev->icc_mode;
286
0
    ps_config_curr->frame_class = ps_config_prev->frame_class;
287
0
    ps_config_curr->freq_res_ipd = ps_config_prev->freq_res_ipd;
288
0
    memcpy(ps_config_curr->border_position, ps_config_prev->border_position,
289
0
           sizeof(ps_config_curr->border_position));
290
0
    memcpy(ps_config_curr->iid_dt, ps_config_prev->iid_dt, sizeof(ps_config_curr->iid_dt));
291
0
    memcpy(ps_config_curr->iid_par_table, ps_config_prev->iid_par_table,
292
0
           sizeof(ps_config_curr->iid_par_table));
293
0
    memcpy(ps_config_curr->icc_dt, ps_config_prev->icc_dt, sizeof(ps_config_curr->icc_dt));
294
0
    memcpy(ps_config_curr->icc_par_table, ps_config_prev->icc_par_table,
295
0
           sizeof(ps_config_curr->icc_par_table));
296
0
  } else {
297
0
    ps_config_prev->enable_iid = ps_config_curr->enable_iid;
298
0
    ps_config_prev->iid_mode = ps_config_curr->iid_mode;
299
0
    ps_config_prev->enable_icc = ps_config_curr->enable_icc;
300
0
    ps_config_prev->icc_mode = ps_config_curr->icc_mode;
301
0
    ps_config_prev->frame_class = ps_config_curr->frame_class;
302
0
    ps_config_prev->freq_res_ipd = ps_config_curr->freq_res_ipd;
303
0
    memcpy(ps_config_prev->border_position, ps_config_curr->border_position,
304
0
           sizeof(ps_config_prev->border_position));
305
0
    memcpy(ps_config_prev->iid_dt, ps_config_curr->iid_dt, sizeof(ps_config_prev->iid_dt));
306
0
    memcpy(ps_config_prev->iid_par_table, ps_config_curr->iid_par_table,
307
0
           sizeof(ps_config_prev->iid_par_table));
308
0
    memcpy(ps_config_prev->icc_dt, ps_config_curr->icc_dt, sizeof(ps_config_prev->icc_dt));
309
0
    memcpy(ps_config_prev->icc_par_table, ps_config_curr->icc_par_table,
310
0
           sizeof(ps_config_prev->icc_par_table));
311
0
  }
312
0
}
313
IA_ERRORCODE ixheaacd_applysbr(
314
    ia_handle_sbr_dec_inst_struct self, ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream,
315
    WORD16 *core_sample_buf, WORD16 *codec_num_channels, FLAG frame_status, FLAG down_samp_flag,
316
    FLAG down_mix_flag, ia_sbr_scr_struct *sbr_scratch_struct, WORD32 ps_enable, WORD32 ch_fac,
317
    WORD32 slot_element, ia_bit_buf_struct *it_bit_buff, ia_drc_dec_struct *pstr_drc_dec,
318
    WORD eld_sbr_flag, WORD32 audio_object_type, WORD32 init_flag, WORD32 ldmps_present,
319
147k
    WORD32 frame_size, WORD32 heaac_mps_present, WORD32 ec_flag, FLAG first_frame) {
320
147k
  WORD32 k;
321
147k
  FLAG prev_ps_flag = 0;
322
147k
  FLAG ps_flag = 0;
323
147k
  FLAG stereo = 0;
324
147k
  FLAG low_pow_flag = 0;
325
147k
  FLAG header_flag = 1;
326
147k
  FLAG dual_mono = 0;
327
147k
  WORD32 err = 0;
328
147k
  WORD32 num_channels = *codec_num_channels;
329
147k
  FLAG prev_stereo;
330
147k
  WORD32 ele_channels = 0;
331
147k
  WORD32 num_elements = p_sbr_bit_stream->no_elements;
332
147k
  WORD32 usac_flag = self->aot_usac_flag;
333
147k
  WORD32 total_bits_left = 0;
334
335
147k
  ia_sbr_channel_struct *pstr_sbr_channel[2];
336
147k
  ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
337
338
147k
  WORD32 initial_sync_state;
339
340
147k
  ia_sbr_header_data_struct *ptr_sbr_dflt_header =
341
147k
      (ia_sbr_header_data_struct *)(&self->str_sbr_dflt_header);
342
343
147k
  ia_sbr_frame_info_data_struct *ptr_frame_data[2];
344
147k
  self->num_delay_frames = 1;
345
147k
  self->ptr_mps_data = NULL;
346
347
147k
  if (!ec_flag || !usac_flag) {
348
442k
    for (k = 0; k < 2; k++) {
349
295k
      ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
350
351
295k
      pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
352
353
295k
      ptr_header_data[k] = self->pstr_sbr_header[k];
354
355
295k
      if (audio_object_type == AOT_ER_AAC_ELD) {
356
38.1k
        ptr_frame_data[k]->eld_sbr_flag = eld_sbr_flag;
357
38.1k
        ptr_frame_data[k]->num_time_slots = ptr_header_data[0]->num_time_slots;
358
38.1k
      }
359
360
295k
      ptr_frame_data[k]->usac_independency_flag = self->usac_independency_flag;
361
295k
      ptr_frame_data[k]->mps_sbr_flag = (self->stereo_config_idx == 3) ? 1 : 0;
362
295k
      ptr_frame_data[k]->stereo_config_idx = self->stereo_config_idx;
363
295k
      ptr_frame_data[k]->inter_tes_flag = self->inter_tes_flag;
364
295k
      ptr_frame_data[k]->sbr_mode = self->sbr_mode;
365
366
295k
      if (!usac_flag) {
367
60.3k
        ptr_frame_data[k]->usac_independency_flag = 0;
368
60.3k
        ptr_frame_data[k]->mps_sbr_flag = 0;
369
60.3k
        ptr_frame_data[k]->stereo_config_idx = -1;
370
60.3k
        ptr_frame_data[k]->inter_tes_flag = 0;
371
60.3k
        ptr_frame_data[k]->sbr_mode = ORIG_SBR;
372
60.3k
      }
373
295k
    }
374
375
147k
    if (init_flag) {
376
1.45k
      ptr_frame_data[1]->reset_flag = 1;
377
1.45k
      ptr_frame_data[0]->reset_flag = 1;
378
1.45k
    }
379
380
364k
    for (k = 0; k < *codec_num_channels; k++) {
381
217k
      ptr_header_data[k]->usac_flag = self->aot_usac_flag;
382
217k
      ptr_header_data[k]->enh_sbr = self->enh_sbr;
383
217k
      ptr_header_data[k]->enh_sbr_ps =
384
217k
          ((self->enh_sbr_ps) | (ptr_header_data[k]->channel_mode == PS_STEREO));
385
386
217k
      ptr_header_data[k]->usac_independency_flag = self->usac_independency_flag;
387
217k
      ptr_header_data[k]->hbe_flag = self->hbe_flag;
388
217k
      ptr_header_data[k]->pvc_flag = self->pvc_flag;
389
390
217k
      if (!usac_flag) {
391
45.3k
        ptr_header_data[k]->usac_independency_flag = 0;
392
45.3k
        ptr_header_data[k]->hbe_flag = 0;
393
45.3k
        ptr_header_data[k]->pvc_flag = 0;
394
45.3k
      }
395
217k
      if (self->enh_sbr)
396
217k
      {
397
217k
        ptr_header_data[k]->esbr_hq = self->esbr_hq;
398
217k
      }
399
400
217k
      if (!usac_flag && (!(audio_object_type == AOT_ER_AAC_ELD ||
401
11.2k
          audio_object_type == AOT_ER_AAC_LD)) && self->enh_sbr) {
402
11.2k
        ptr_header_data[k]->hbe_flag = 1;
403
11.2k
      }
404
217k
    }
405
406
147k
    initial_sync_state = ptr_header_data[0]->sync_state;
407
408
147k
    low_pow_flag = !usac_flag;
409
147k
    self->pstr_sbr_tables->sbr_rand_ph = self->pstr_sbr_tables->env_calc_tables_ptr->sbr_rand_ph;
410
411
147k
    if (ps_enable) {
412
30.0k
      if (num_channels == 1) {
413
14.8k
        low_pow_flag = 0;
414
14.8k
      }
415
30.0k
    }
416
417
147k
    if (audio_object_type == AOT_ER_AAC_ELD || (ps_enable && heaac_mps_present)) {
418
19.5k
      low_pow_flag = 0;
419
19.5k
    }
420
421
147k
    prev_stereo = (ptr_header_data[0]->channel_mode == SBR_STEREO);
422
423
147k
    if (ps_enable) prev_ps_flag = (ptr_header_data[0]->channel_mode == PS_STEREO);
424
425
147k
    ptr_header_data[0]->err_flag_prev = ptr_header_data[0]->err_flag;
426
427
147k
    if (p_sbr_bit_stream->no_elements == 0) {
428
68
      frame_status = 0;
429
68
      ptr_header_data[0]->sync_state = UPSAMPLING;
430
68
      if (num_channels == 2) ptr_header_data[1]->sync_state = UPSAMPLING;
431
68
    }
432
433
147k
    if ((usac_flag)) {
434
117k
      if ((p_sbr_bit_stream->no_elements) && (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
435
116k
        num_elements = p_sbr_bit_stream->no_elements;
436
116k
      } else {
437
1.00k
        num_elements = 0;
438
1.00k
      }
439
117k
    }
440
441
293k
    for (k = 0; k < num_elements; k++) {
442
146k
      struct ia_bit_buf_struct local_bit_buf = {0};
443
146k
      ia_sbr_element_stream_struct *ptr_bit_str_ele = &p_sbr_bit_stream->str_sbr_ele[k];
444
146k
      ele_channels = (p_sbr_bit_stream->str_sbr_ele[0].sbr_ele_id == SBR_ID_CPE) ? 2 : 1;
445
146k
      if (!frame_status && ptr_header_data[k]->sync_state == SBR_ACTIVE && ec_flag) {
446
0
        ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_ERROR_ALLSLOTS);
447
0
      }
448
449
146k
      switch (ptr_bit_str_ele->sbr_ele_id) {
450
90.5k
        case SBR_ID_SCE:
451
94.5k
        case SBR_ID_CCE:
452
94.5k
          if (num_channels == 2) {
453
17.9k
            dual_mono = 1;
454
17.9k
          }
455
94.5k
          stereo = 0;
456
94.5k
          break;
457
51.8k
        case SBR_ID_CPE:
458
51.8k
          stereo = 1;
459
51.8k
          ptr_header_data[1] = ptr_header_data[0];
460
461
51.8k
          memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
462
51.8k
                 sizeof(ia_sbr_header_data_struct));
463
51.8k
          break;
464
0
        default:
465
0
          frame_status = 0;
466
146k
      }
467
468
146k
      if (frame_status) {
469
146k
        if (!usac_flag) {
470
30.1k
          if (!(audio_object_type == AOT_ER_AAC_LD || audio_object_type == AOT_ER_AAC_ELD)
471
11.0k
              && self->enh_sbr) {
472
11.0k
            WORD8 tmp[1024];
473
11.0k
            WORD32 tmp_payload;
474
11.0k
            memcpy(&tmp[0], ptr_bit_str_ele->ptr_sbr_data, ptr_bit_str_ele->size_payload);
475
11.0k
            memcpy(ptr_bit_str_ele->ptr_sbr_data, ptr_bit_str_ele->ptr_prev_sbr_data,
476
11.0k
                   ptr_bit_str_ele->prev_size_payload);
477
11.0k
            memcpy(ptr_bit_str_ele->ptr_prev_sbr_data, &tmp[0], ptr_bit_str_ele->size_payload);
478
11.0k
            tmp_payload = ptr_bit_str_ele->size_payload;
479
11.0k
            ptr_bit_str_ele->size_payload = ptr_bit_str_ele->prev_size_payload;
480
11.0k
            ptr_bit_str_ele->prev_size_payload = tmp_payload;
481
11.0k
          }
482
30.1k
          if (!ptr_bit_str_ele->size_payload) {
483
722
            continue;
484
722
          }
485
486
29.3k
          ixheaacd_create_init_bit_buf(&local_bit_buf, (UWORD8 *)ptr_bit_str_ele->ptr_sbr_data,
487
29.3k
                                       ptr_bit_str_ele->size_payload);
488
29.3k
          it_bit_buff = &local_bit_buf;
489
29.3k
          it_bit_buff->xaac_jmp_buf = self->xaac_jmp_buf;
490
29.3k
          total_bits_left = it_bit_buff->cnt_bits;
491
492
29.3k
          if (audio_object_type == AOT_ER_AAC_ELD) {
493
19.0k
            if (eld_sbr_flag != 1) {
494
0
              ixheaacd_read_bits_buf(&local_bit_buf, LEN_NIBBLE);
495
0
            }
496
19.0k
          } else {
497
10.3k
            ixheaacd_read_bits_buf(&local_bit_buf, LEN_NIBBLE);
498
10.3k
          }
499
29.3k
        }
500
145k
        if (ptr_bit_str_ele->extension_type == SBR_EXTENSION_CRC) {
501
6.57k
          WORD32 crc_bits = 0;
502
6.57k
          WORD32 crc_check_flag = 0;
503
6.57k
          crc_check_flag = 1;
504
6.57k
          crc_bits = (((ptr_bit_str_ele->size_payload - 1) << 3) + (4 - SBR_CYC_REDCY_CHK_BITS));
505
506
6.57k
          if (crc_bits < 0) {
507
13
            crc_check_flag = 0;
508
13
            frame_status = 0;
509
13
          }
510
6.57k
          if (crc_check_flag) frame_status = ixheaacd_sbr_crccheck(it_bit_buff, crc_bits);
511
6.57k
        }
512
513
145k
        if (!usac_flag) header_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
514
515
145k
        if (audio_object_type != AOT_ER_AAC_ELD) {
516
126k
          if (header_flag) {
517
116k
            header_flag = ixheaacd_sbr_read_header_data(ptr_header_data[k], it_bit_buff, stereo,
518
116k
                                                        ptr_sbr_dflt_header);
519
116k
            if (usac_flag) {
520
116k
              if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
521
57.4k
                  (ptr_header_data[k]->pvc_mode != 0)) {
522
1.68k
                self->ptr_pvc_data_str->prev_pvc_id = 0;
523
1.68k
              }
524
116k
              self->ptr_pvc_data_str->prev_pvc_mode = ptr_header_data[k]->pvc_mode;
525
116k
              if (ptr_header_data[k]->pvc_mode == 0) {
526
56.6k
                ptr_frame_data[k]->sbr_mode = ORIG_SBR;
527
59.6k
              } else {
528
59.6k
                ptr_frame_data[k]->sbr_mode = PVC_SBR;
529
59.6k
              }
530
116k
            }
531
116k
            if (header_flag == SBR_RESET) {
532
22.8k
              err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
533
534
22.8k
                                               self->pstr_common_tables);
535
22.8k
              if (!err) {
536
22.7k
                WORD32 lr;
537
22.7k
                WORD32 lr1 = ps_enable ? 2 : num_channels;
538
55.2k
                for (lr = 0; lr < lr1; lr++) {
539
32.5k
                  if (ldmps_present != 1) ptr_frame_data[lr]->reset_flag = 1;
540
32.5k
                  if ((SBR_NOT_INITIALIZED == ptr_header_data[lr]->sync_state) && !usac_flag) {
541
214
                    ptr_frame_data[lr]->sbr_patching_mode = 1;
542
214
                    ptr_frame_data[lr]->over_sampling_flag = 0;
543
214
                    ptr_frame_data[lr]->pitch_in_bins = 0;
544
214
                    ptr_header_data[lr]->pre_proc_flag = 0;
545
214
                  }
546
32.5k
                  err |= ixheaacd_sbr_dec_reset(
547
32.5k
                      &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag,
548
32.5k
                      self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins,
549
32.5k
                      audio_object_type, sbr_scratch_struct->ptr_work_buf_core);
550
32.5k
                  if (err < 0) return err;
551
32.5k
                }
552
22.7k
              }
553
554
22.8k
              if (err == 0) {
555
22.7k
                ptr_header_data[k]->sync_state = SBR_ACTIVE;
556
22.7k
              }
557
22.8k
            }
558
116k
          }
559
126k
        } else {
560
19.0k
          if (header_flag) {
561
5.51k
            header_flag = ixheaacd_sbr_read_header_data(ptr_header_data[k], it_bit_buff, stereo,
562
5.51k
                                                        ptr_sbr_dflt_header);
563
5.51k
            if (usac_flag) {
564
0
              if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
565
0
                  (ptr_header_data[k]->pvc_mode != 0)) {
566
0
                self->ptr_pvc_data_str->prev_pvc_id = 0;
567
0
              }
568
0
              self->ptr_pvc_data_str->prev_pvc_mode = ptr_header_data[k]->pvc_mode;
569
0
              if (ptr_header_data[k]->pvc_mode == 0) {
570
0
                ptr_frame_data[k]->sbr_mode = ORIG_SBR;
571
0
              } else {
572
0
                ptr_frame_data[k]->sbr_mode = PVC_SBR;
573
0
              }
574
0
            }
575
576
5.51k
            if (header_flag == SBR_RESET) {
577
4.72k
              err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
578
579
4.72k
                                               self->pstr_common_tables);
580
4.72k
              if (err) {
581
92
                return err;
582
92
              }
583
4.72k
            }
584
5.51k
          }
585
586
18.9k
          {
587
18.9k
            WORD32 lr;
588
18.9k
            WORD32 lr1 = ps_enable ? 2 : num_channels;
589
56.8k
            for (lr = 0; lr < lr1; lr++) {
590
37.8k
              if (ldmps_present != 1) ptr_frame_data[lr]->reset_flag = 1;
591
37.8k
              if (ptr_header_data[k]->status) {
592
12.3k
                err |= ixheaacd_sbr_dec_reset(
593
12.3k
                    &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag,
594
12.3k
                    self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins, audio_object_type,
595
12.3k
                    sbr_scratch_struct->ptr_work_buf_core);
596
12.3k
                if (err < 0) return err;
597
12.3k
              }
598
37.8k
            }
599
18.9k
            ptr_header_data[k]->status = 0;
600
18.9k
          }
601
602
18.9k
          if (err == 0) {
603
18.9k
            ptr_header_data[k]->sync_state = SBR_ACTIVE;
604
18.9k
          }
605
18.9k
        }
606
145k
      }
607
608
145k
      if (err || (ptr_header_data[k]->sync_state == SBR_NOT_INITIALIZED)) {
609
1.58k
        WORD32 lr1 = ps_enable ? 2 : num_channels;
610
1.58k
        ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
611
1.58k
        if (err) return err;
612
1.58k
      }
613
614
145k
      if (frame_status && (ptr_header_data[k]->sync_state == SBR_ACTIVE)) {
615
138k
        if (stereo) {
616
50.7k
          frame_status = ixheaacd_sbr_read_cpe(ptr_header_data[0], ptr_frame_data, it_bit_buff,
617
50.7k
                                               self->pstr_sbr_tables, audio_object_type);
618
50.7k
          if (usac_flag && (frame_status == 0)) return -1;
619
50.7k
          if (frame_status < 0) return frame_status;
620
87.3k
        } else {
621
87.3k
          if (ps_enable) {
622
7.82k
            if (down_mix_flag) {
623
0
              self->pstr_ps_stereo_dec->force_mono = 1;
624
7.82k
            } else {
625
7.82k
              self->pstr_ps_stereo_dec->force_mono = 0;
626
7.82k
            }
627
79.5k
          } else {
628
79.5k
            self->pstr_ps_stereo_dec = 0;
629
79.5k
          }
630
87.3k
          if (ptr_frame_data[k]->sbr_mode == ORIG_SBR) {
631
38.9k
            frame_status = ixheaacd_sbr_read_sce(
632
38.9k
                ptr_header_data[k], ptr_frame_data[k], self->pstr_ps_stereo_dec, it_bit_buff,
633
38.9k
                self->pstr_sbr_tables, audio_object_type, ec_flag);
634
38.9k
            if (usac_flag && (frame_status == 0)) return -1;
635
38.9k
            if (frame_status < 0) return frame_status;
636
38.9k
            if (ec_flag && self->pstr_ps_stereo_dec != NULL) {
637
0
              ixheaacd_copy_prev_ps_params(self->pstr_ps_stereo_dec, &self->str_ps_config_prev,
638
0
                                           frame_status);
639
0
            }
640
48.3k
          } else if (ptr_frame_data[k]->sbr_mode == PVC_SBR) {
641
48.3k
            frame_status = ixheaacd_sbr_read_pvc_sce(
642
48.3k
                ptr_frame_data[k], it_bit_buff, ptr_header_data[k]->hbe_flag,
643
48.3k
                self->ptr_pvc_data_str, self->pstr_sbr_tables, ptr_header_data[k]);
644
48.3k
            if (frame_status < 0) return frame_status;
645
48.3k
          }
646
87.3k
        }
647
137k
        ptr_header_data[k]->enh_sbr_ps =
648
137k
            ((self->enh_sbr_ps) | (ptr_header_data[0]->channel_mode == PS_STEREO));
649
137k
        if ((audio_object_type != AOT_ER_AAC_ELD) && (audio_object_type != AOT_USAC)) {
650
4.85k
          WORD32 total_bits_read;
651
4.85k
          total_bits_read = ixheaacd_no_bits_read(it_bit_buff);
652
4.85k
          if (total_bits_read > (ptr_bit_str_ele->size_payload << 3) ||
653
4.85k
              total_bits_read < ((ptr_bit_str_ele->size_payload << 3) - 8)) {
654
3.84k
            frame_status = 0;
655
3.84k
          }
656
4.85k
          if (ec_flag) {
657
0
            if (!frame_status) {
658
0
              ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_ERROR);
659
0
            } else {
660
0
              ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_OK);
661
0
            }
662
0
          }
663
4.85k
        }
664
137k
      }
665
145k
      if ((ldmps_present == 1) && (it_bit_buff)) {
666
1.97k
        WORD32 bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
667
1.97k
        self->ptr_mps_data = (WORD8 *)it_bit_buff->ptr_read_next;
668
1.97k
        self->left_mps_bits = (total_bits_left - bits_decoded);
669
1.97k
        self->mps_bits_pos = it_bit_buff->bit_pos;
670
1.97k
      }
671
145k
      if (ec_flag) {
672
0
        if (frame_status && !init_flag) {
673
0
          ptr_bit_str_ele->use_frame_slot =
674
0
              (ptr_bit_str_ele->use_frame_slot + 1) % (self->num_delay_frames + 1);
675
0
        }
676
0
        if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
677
0
          ptr_header_data[k]->err_flag =
678
0
              ptr_bit_str_ele->frame_error_flag[ptr_bit_str_ele->use_frame_slot];
679
0
        }
680
0
      }
681
145k
    }
682
683
147k
    if (!usac_flag) {
684
29.7k
      if (!frame_status || (ptr_header_data[0]->sync_state != SBR_ACTIVE) ||
685
17.9k
          ptr_header_data[0]->err_flag) {
686
17.9k
        ptr_header_data[0]->err_flag = 1;
687
17.9k
        stereo = (num_channels == 2) ? 1 : 0;
688
17.9k
        if (ptr_header_data[0]->channel_mode == 0) {
689
1.17k
          ptr_header_data[0]->channel_mode = stereo ? SBR_STEREO : SBR_MONO;
690
1.17k
        }
691
17.9k
      }
692
693
29.7k
      if (!(stereo || dual_mono)) {
694
14.8k
        ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
695
14.8k
        ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
696
14.8k
      }
697
698
29.7k
      if (ptr_header_data[0]->sync_state == SBR_NOT_INITIALIZED && (!ec_flag || init_flag)) {
699
722
        WORD32 lr1 = ps_enable ? 2 : num_channels;
700
722
        ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
701
722
      }
702
29.7k
    }
703
704
147k
    if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
705
144k
      if (ptr_frame_data[0]->sbr_mode == PVC_SBR) {
706
59.9k
        err = ixheaacd_dec_sbrdata_for_pvc(ptr_header_data[0], ptr_frame_data[0],
707
59.9k
                                           pstr_sbr_channel[0]->pstr_prev_frame_data,
708
59.9k
                                           audio_object_type);
709
59.9k
        if (err) return err;
710
84.1k
      } else if (ptr_frame_data[0]->sbr_mode == ORIG_SBR) {
711
84.1k
        err = ixheaacd_dec_sbrdata(
712
84.1k
            ptr_header_data[0], ptr_header_data[1], ptr_frame_data[0],
713
84.1k
            pstr_sbr_channel[0]->pstr_prev_frame_data,
714
84.1k
            (stereo || dual_mono) ? ptr_frame_data[1] : NULL,
715
84.1k
            (stereo || dual_mono) ? pstr_sbr_channel[1]->pstr_prev_frame_data : NULL,
716
84.1k
            self->pstr_common_tables, ldmps_present, audio_object_type, ec_flag);
717
718
84.1k
        if (err) return err;
719
84.1k
      }
720
721
144k
      if (ptr_header_data[0]->channel_mode == PS_STEREO &&
722
7.98k
          (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD)) {
723
7.04k
        ixheaacd_decode_ps_data(self->pstr_ps_stereo_dec, frame_size);
724
7.04k
        ps_flag = 1;
725
7.04k
        self->ps_present = ps_flag;
726
7.04k
      }
727
144k
      if (ptr_header_data[0]->enh_sbr_ps && self->enh_sbr) {
728
7.98k
        ps_flag = 1;
729
7.98k
        self->ps_present = ps_flag;
730
7.98k
      }
731
144k
      ptr_frame_data[0]->max_qmf_subband_aac =
732
144k
          ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
733
144k
      if (stereo) {
734
51.4k
        ptr_frame_data[1]->max_qmf_subband_aac =
735
51.4k
            ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
736
51.4k
      }
737
144k
      if (ldmps_present == 1) {
738
1.97k
        ptr_frame_data[0]->rate = 1;
739
1.97k
        if (stereo) {
740
1.41k
          ptr_frame_data[1]->rate = 1;
741
1.41k
        }
742
1.97k
      }
743
144k
    }
744
147k
    if (audio_object_type == AOT_ER_AAC_ELD && ec_flag) {
745
0
      if ((initial_sync_state == SBR_NOT_INITIALIZED) && ptr_header_data[0]->err_flag) {
746
0
        ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
747
0
      }
748
147k
    } else {
749
147k
      if (audio_object_type != AOT_ER_AAC_ELD) {
750
128k
        if ((initial_sync_state == SBR_NOT_INITIALIZED) && ptr_header_data[0]->err_flag) {
751
6.30k
          ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
752
6.30k
        }
753
128k
      } else {
754
19.1k
        ptr_header_data[0]->sync_state = SBR_ACTIVE;
755
19.1k
      }
756
147k
    }
757
758
147k
    if ((num_channels == 2) && !(stereo || dual_mono)) {
759
0
      ixheaacd_downmix_to_monosbr(&core_sample_buf[slot_element], ch_fac);
760
0
    }
761
762
147k
    if ((!prev_stereo && !prev_ps_flag) && (ps_flag)) {
763
659
      WORD32 copy_size;
764
659
      if (down_samp_flag)
765
146
        copy_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
766
513
      else
767
513
        copy_size = QMF_FILTER_STATE_SYN_SIZE;
768
769
659
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
770
659
             pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
771
659
             copy_size * sizeof(WORD16));
772
773
659
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
774
659
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
775
659
    }
776
777
147k
    if ((!prev_stereo && stereo && (num_channels == 2)) &&
778
39.3k
        (audio_object_type != AOT_ER_AAC_ELD)) {
779
36.7k
      WORD32 copy_size;
780
36.7k
      if (down_samp_flag)
781
25
        copy_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
782
36.6k
      else
783
36.6k
        copy_size = QMF_FILTER_STATE_SYN_SIZE;
784
785
36.7k
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
786
36.7k
             pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
787
36.7k
             copy_size * sizeof(WORD16));
788
789
36.7k
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
790
36.7k
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
791
792
36.7k
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
793
36.7k
             pstr_sbr_channel[0]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
794
36.7k
             QMF_FILTER_STATE_ANA_SIZE * sizeof(WORD16));
795
796
36.7k
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale =
797
36.7k
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale;
798
799
36.7k
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.ptr_sbr_overlap_buf,
800
36.7k
             pstr_sbr_channel[0]->str_sbr_dec.ptr_sbr_overlap_buf,
801
36.7k
             MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
802
803
36.7k
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale =
804
36.7k
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale;
805
36.7k
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale =
806
36.7k
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale;
807
36.7k
    }
808
147k
    pstr_sbr_channel[0]->str_sbr_dec.time_sample_buf = self->time_sample_buf[0];
809
147k
    if (self->pstr_ps_stereo_dec != NULL &&
810
66.5k
        (ps_enable || self->enh_sbr_ps) && self->enh_sbr) {
811
29.6k
      self->pstr_ps_stereo_dec->pp_qmf_buf_real[0] =
812
29.6k
          pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real;
813
29.6k
      self->pstr_ps_stereo_dec->pp_qmf_buf_imag[0] =
814
29.6k
          pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag;
815
29.6k
      self->pstr_ps_stereo_dec->pp_qmf_buf_real[1] =
816
29.6k
          pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real;
817
29.6k
      self->pstr_ps_stereo_dec->pp_qmf_buf_imag[1] =
818
29.6k
          pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag;
819
29.6k
      self->pstr_ps_stereo_dec->time_sample_buf[0] = self->time_sample_buf[0];
820
29.6k
      self->pstr_ps_stereo_dec->time_sample_buf[1] = self->time_sample_buf[1];
821
29.6k
    }
822
147k
  } else {
823
0
    for (k = 0; k < 2; k++) {
824
0
      ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
825
826
0
      pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
827
828
0
      ptr_header_data[k] = self->pstr_sbr_header[k];
829
0
      ptr_header_data[k]->usac_flag = self->aot_usac_flag;
830
0
    }
831
832
0
    if ((p_sbr_bit_stream->no_elements) && (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
833
0
      num_elements = p_sbr_bit_stream->no_elements;
834
0
    } else {
835
0
      num_elements = 0;
836
0
    }
837
838
0
    for (k = 0; k < num_elements; k++) {
839
0
      ia_sbr_element_stream_struct *ptr_bit_str_ele = &p_sbr_bit_stream->str_sbr_ele[k];
840
0
      ele_channels = (p_sbr_bit_stream->str_sbr_ele[0].sbr_ele_id == SBR_ID_CPE) ? 2 : 1;
841
0
      {
842
0
        switch (ptr_bit_str_ele->sbr_ele_id) {
843
0
          case SBR_ID_SCE:
844
0
          case SBR_ID_CCE:
845
0
            if (num_channels == 2) {
846
0
              dual_mono = 1;
847
0
            }
848
0
            stereo = 0;
849
0
            break;
850
0
          case SBR_ID_CPE:
851
0
            stereo = 1;
852
0
            ptr_header_data[1] = ptr_header_data[0];
853
854
0
            memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
855
0
                   sizeof(ia_sbr_header_data_struct));
856
0
            break;
857
0
          default:
858
0
            frame_status = 0;
859
0
        }
860
0
      }
861
0
    }
862
0
  }
863
147k
  if (ec_flag) {
864
0
    for (k = 0; k < 2; k++) {
865
0
      if (pstr_sbr_channel[k]->str_sbr_dec.band_count == 0) {
866
0
        pstr_sbr_channel[k]->str_sbr_dec.band_count =
867
0
            pstr_sbr_channel[k]->str_sbr_dec.str_codec_qmf_bank.no_channels;
868
0
      }
869
0
    }
870
0
  }
871
147k
  if (ec_flag && usac_flag && !first_frame && !self->sbr_parse_complete) {
872
0
    return IA_FATAL_ERROR;
873
0
  }
874
147k
  if (!ec_flag || !first_frame || init_flag) {
875
146k
    if (pstr_drc_dec == NULL) {
876
118k
      WORD32 err_code = 0;
877
118k
      err_code = ixheaacd_sbr_dec(
878
118k
          &pstr_sbr_channel[0]->str_sbr_dec, core_sample_buf + slot_element, ptr_header_data[0],
879
118k
          ptr_frame_data[0], pstr_sbr_channel[0]->pstr_prev_frame_data, self->pstr_ps_stereo_dec,
880
118k
          &pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank,
881
118k
          &pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact,
882
118k
          (ptr_header_data[0]->sync_state == SBR_ACTIVE), low_pow_flag,
883
118k
          sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables, self->pstr_common_tables,
884
118k
          ch_fac, self->ptr_pvc_data_str, 0, NULL, audio_object_type, ldmps_present, self,
885
118k
          heaac_mps_present, ec_flag);
886
118k
      if (err_code) return err_code;
887
118k
      if (self->enh_sbr)
888
118k
      {
889
118k
        if (!self->enh_sbr_ps) {
890
118k
          if ((ptr_header_data[0]->sync_state == SBR_ACTIVE) && !ptr_frame_data[0]->mps_sbr_flag
891
88.4k
              && ch_fac != 2) {
892
88.4k
            ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
893
88.4k
                ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
894
88.4k
          }
895
118k
        } else {
896
0
          if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
897
0
            ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
898
0
                ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
899
0
          }
900
0
        }
901
118k
      }
902
118k
    } else {
903
28.3k
      WORD32 err_code = 0;
904
28.3k
      err_code = ixheaacd_sbr_dec(
905
28.3k
          &pstr_sbr_channel[0]->str_sbr_dec, core_sample_buf + slot_element, ptr_header_data[0],
906
28.3k
          ptr_frame_data[0], pstr_sbr_channel[0]->pstr_prev_frame_data, self->pstr_ps_stereo_dec,
907
28.3k
          &pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank,
908
28.3k
          &pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact,
909
28.3k
          (ptr_header_data[0]->sync_state == SBR_ACTIVE), low_pow_flag,
910
28.3k
          sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables, self->pstr_common_tables,
911
28.3k
          ch_fac, self->ptr_pvc_data_str, pstr_drc_dec->drc_on,
912
28.3k
          pstr_drc_dec->str_drc_channel_data[0].drc_factors_sbr, audio_object_type, ldmps_present,
913
28.3k
          self, heaac_mps_present, ec_flag);
914
28.3k
      if (err_code) return err_code;
915
28.3k
      if (self->enh_sbr)
916
28.3k
      {
917
28.3k
        if (!self->enh_sbr_ps) {
918
28.3k
          if ((ptr_header_data[0]->sync_state == SBR_ACTIVE) && !ptr_frame_data[0]->mps_sbr_flag
919
26.3k
              && num_channels != 2) {
920
12.4k
            ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
921
12.4k
                ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
922
12.4k
          }
923
28.3k
        } else {
924
0
          if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
925
0
            ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
926
0
                ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
927
0
          }
928
0
        }
929
28.3k
      }
930
28.3k
    }
931
932
146k
    if (!down_mix_flag && (stereo || dual_mono) && (num_channels == 2)) {
933
69.4k
      pstr_sbr_channel[1]->str_sbr_dec.time_sample_buf = self->time_sample_buf[1];
934
935
69.4k
      if (ele_channels == 1 && usac_flag) {
936
17.9k
        WORD32 err_code =
937
17.9k
            ixheaacd_esbr_dec(&pstr_sbr_channel[1]->str_sbr_dec, ptr_header_data[1],
938
17.9k
                              ptr_frame_data[1], (ptr_header_data[1]->sync_state == SBR_ACTIVE),
939
17.9k
                              low_pow_flag, self->pstr_sbr_tables, ch_fac);
940
17.9k
        if (err_code) return err_code;
941
51.5k
      } else {
942
51.5k
        if (pstr_drc_dec == NULL) {
943
37.4k
          WORD32 err_code = ixheaacd_sbr_dec(
944
37.4k
              &pstr_sbr_channel[1]->str_sbr_dec, core_sample_buf + slot_element + 1,
945
37.4k
              ptr_header_data[1], ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data,
946
37.4k
              NULL, NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE), low_pow_flag,
947
37.4k
              sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables,
948
37.4k
              self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, 0, NULL,
949
37.4k
              audio_object_type, ldmps_present, self, heaac_mps_present, ec_flag);
950
37.4k
          if (err_code) return err_code;
951
37.4k
          if (self->enh_sbr)
952
37.4k
          {
953
37.4k
            if (!self->enh_sbr_ps) {
954
37.4k
              if ((ptr_header_data[1]->sync_state == SBR_ACTIVE) &&
955
35.2k
                  !ptr_frame_data[0]->mps_sbr_flag) {
956
10.0k
                ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
957
10.0k
                    ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
958
10.0k
              }
959
37.4k
            } else {
960
0
              if (ptr_header_data[1]->sync_state == SBR_ACTIVE) {
961
0
                ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
962
0
                    ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
963
0
              }
964
0
            }
965
37.4k
          }
966
37.4k
        } else {
967
14.0k
          WORD32 err_code = ixheaacd_sbr_dec(
968
14.0k
              &pstr_sbr_channel[1]->str_sbr_dec, core_sample_buf + slot_element + 1,
969
14.0k
              ptr_header_data[1], ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data,
970
14.0k
              NULL, NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE), low_pow_flag,
971
14.0k
              sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables,
972
14.0k
              self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, pstr_drc_dec->drc_on,
973
14.0k
              pstr_drc_dec->str_drc_channel_data[1].drc_factors_sbr, audio_object_type,
974
14.0k
              ldmps_present, self, heaac_mps_present, ec_flag);
975
14.0k
          if (err_code) return err_code;
976
14.0k
          if (self->enh_sbr)
977
14.0k
          {
978
14.0k
            if (!self->enh_sbr_ps) {
979
14.0k
              if ((ptr_header_data[1]->sync_state == SBR_ACTIVE) &&
980
13.9k
                  !ptr_frame_data[0]->mps_sbr_flag) {
981
13.9k
                ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
982
13.9k
                    ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
983
13.9k
              }
984
14.0k
            } else {
985
0
              if (ptr_header_data[1]->sync_state == SBR_ACTIVE) {
986
0
                ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
987
0
                    ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
988
0
              }
989
0
            }
990
14.0k
          }
991
14.0k
        }
992
51.5k
      }
993
994
77.2k
    } else {
995
77.2k
      if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD)
996
997
73.3k
      {
998
73.3k
        if (sub_d((WORD16)ptr_header_data[0]->channel_mode, PS_STEREO) == 0) {
999
7.13k
          num_channels = 2;
1000
7.13k
        }
1001
73.3k
        if (ptr_header_data[0]->enh_sbr_ps && self->enh_sbr) {
1002
7.13k
          num_channels = 2;
1003
7.13k
        }
1004
73.3k
      }
1005
77.2k
    }
1006
146k
    *codec_num_channels = num_channels;
1007
146k
    self->sbr_mode = ptr_frame_data[0]->sbr_mode;
1008
1009
146k
    if ((audio_object_type == AOT_ER_AAC_ELD) || (audio_object_type == AOT_ER_AAC_LD) ||
1010
127k
        !self->enh_sbr) {
1011
18.6k
      if (pstr_drc_dec != NULL) {
1012
17.5k
        WORD32 i, j;
1013
49.0k
        for (i = 0; i < *codec_num_channels; i++) {
1014
1.03M
          for (j = 0; j < 32; j++) {
1015
1.00M
            memcpy(pstr_drc_dec->str_drc_channel_data[i].drc_factors_sbr[j],
1016
1.00M
                   pstr_drc_dec->str_drc_channel_data[i].drc_factors_sbr[j + 32],
1017
1.00M
                   64 * sizeof(WORD32));
1018
1.00M
          }
1019
31.4k
        }
1020
17.5k
      }
1021
18.6k
    }
1022
146k
    if (ec_flag) {
1023
0
      self->band_count[0] = pstr_sbr_channel[0]->str_sbr_dec.band_count;
1024
0
      self->band_count[1] = pstr_sbr_channel[1]->str_sbr_dec.band_count;
1025
0
    }
1026
146k
  }
1027
1028
147k
  return SBRDEC_OK;
1029
147k
}
1030
1031
IA_ERRORCODE ixheaacd_parse_sbr(ia_handle_sbr_dec_inst_struct self,
1032
                                ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream,
1033
                                WORD16 *codec_num_channels, FLAG frame_status,
1034
                                ia_sbr_scr_struct *sbr_scratch_struct,
1035
0
                                ia_bit_buf_struct *it_bit_buff, WORD32 audio_object_type) {
1036
0
  WORD32 k;
1037
0
  FLAG ps_flag = 0;
1038
0
  FLAG stereo = 0;
1039
0
  FLAG low_pow_flag = 0;
1040
0
  FLAG header_flag = 1;
1041
0
  FLAG dual_mono = 0;
1042
0
  WORD32 err = 0;
1043
0
  WORD32 num_channels = *codec_num_channels;
1044
0
  FLAG prev_stereo;
1045
0
  WORD32 num_elements = p_sbr_bit_stream->no_elements;
1046
0
  WORD32 usac_flag = self->aot_usac_flag;
1047
1048
0
  ia_sbr_channel_struct *pstr_sbr_channel[2];
1049
0
  ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
1050
1051
0
  WORD32 initial_sync_state;
1052
1053
0
  ia_sbr_header_data_struct *ptr_sbr_dflt_header =
1054
0
      (ia_sbr_header_data_struct *)(&self->str_sbr_dflt_header);
1055
1056
0
  ia_sbr_frame_info_data_struct *ptr_frame_data[2];
1057
1058
0
  self->num_delay_frames = 1;
1059
1060
0
  self->ptr_mps_data = NULL;
1061
1062
0
  if (usac_flag && self->ec_flag) {
1063
0
    for (k = 0; k < 2; k++) {
1064
0
      ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
1065
1066
0
      pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
1067
1068
0
      ptr_header_data[k] = self->pstr_sbr_header[k];
1069
1070
0
      ptr_frame_data[k]->usac_independency_flag = self->usac_independency_flag;
1071
0
      ptr_frame_data[k]->mps_sbr_flag = (self->stereo_config_idx == 3) ? 1 : 0;
1072
0
      ptr_frame_data[k]->stereo_config_idx = self->stereo_config_idx;
1073
0
      ptr_frame_data[k]->inter_tes_flag = self->inter_tes_flag;
1074
0
      ptr_frame_data[k]->sbr_mode = self->sbr_mode;
1075
0
    }
1076
1077
0
    for (k = 0; k < *codec_num_channels; k++) {
1078
0
      ptr_header_data[k]->usac_flag = self->aot_usac_flag;
1079
1080
0
      ptr_header_data[k]->enh_sbr = self->enh_sbr;
1081
0
      ptr_header_data[k]->enh_sbr_ps =
1082
0
          ((self->enh_sbr_ps) | (ptr_header_data[k]->channel_mode == PS_STEREO));
1083
0
      ptr_header_data[k]->usac_independency_flag = self->usac_independency_flag;
1084
0
      ptr_header_data[k]->hbe_flag = self->hbe_flag;
1085
0
      ptr_header_data[k]->pvc_flag = self->pvc_flag;
1086
1087
0
      ptr_header_data[k]->esbr_hq = self->esbr_hq;
1088
0
    }
1089
1090
0
    initial_sync_state = ptr_header_data[0]->sync_state;
1091
1092
0
    low_pow_flag = 0;
1093
0
    self->pstr_sbr_tables->sbr_rand_ph = self->pstr_sbr_tables->env_calc_tables_ptr->sbr_rand_ph;
1094
1095
0
    prev_stereo = (ptr_header_data[0]->channel_mode == SBR_STEREO);
1096
1097
0
    ptr_header_data[0]->err_flag_prev = ptr_header_data[0]->err_flag;
1098
1099
0
    if (p_sbr_bit_stream->no_elements == 0) {
1100
0
      frame_status = 0;
1101
0
      ptr_header_data[0]->sync_state = UPSAMPLING;
1102
0
      if (num_channels == 2) ptr_header_data[1]->sync_state = UPSAMPLING;
1103
0
    }
1104
1105
0
    if ((p_sbr_bit_stream->no_elements) && (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
1106
0
      num_elements = p_sbr_bit_stream->no_elements;
1107
0
    } else {
1108
0
      num_elements = 0;
1109
0
    }
1110
1111
0
    for (k = 0; k < num_elements; k++) {
1112
0
      ia_sbr_element_stream_struct *ptr_bit_str_ele = &p_sbr_bit_stream->str_sbr_ele[k];
1113
1114
0
      switch (ptr_bit_str_ele->sbr_ele_id) {
1115
0
        case SBR_ID_SCE:
1116
0
        case SBR_ID_CCE:
1117
0
          if (num_channels == 2) {
1118
0
            dual_mono = 1;
1119
0
          }
1120
0
          stereo = 0;
1121
0
          break;
1122
0
        case SBR_ID_CPE:
1123
0
          stereo = 1;
1124
0
          ptr_header_data[1] = ptr_header_data[0];
1125
1126
0
          memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
1127
0
                 sizeof(*(self->pstr_sbr_header[1])));
1128
0
          break;
1129
0
        default:
1130
0
          frame_status = 0;
1131
0
      }
1132
1133
0
      if (frame_status) {
1134
0
        if (ptr_bit_str_ele->extension_type == SBR_EXTENSION_CRC) {
1135
0
          WORD32 crc_bits = 0;
1136
0
          WORD32 crc_check_flag = 0;
1137
0
          crc_check_flag = 1;
1138
0
          crc_bits = (((ptr_bit_str_ele->size_payload - 1) << 3) + (4 - SBR_CYC_REDCY_CHK_BITS));
1139
1140
0
          if (crc_bits < 0) {
1141
0
            crc_check_flag = 0;
1142
0
            frame_status = 0;
1143
0
          }
1144
0
          if (crc_check_flag && frame_status == 1)
1145
0
            frame_status = ixheaacd_sbr_crccheck(it_bit_buff, crc_bits);
1146
0
        }
1147
1148
0
        if (frame_status == 1) {
1149
0
          header_flag = ixheaacd_sbr_read_header_data(ptr_header_data[k], it_bit_buff, stereo,
1150
0
                                                      ptr_sbr_dflt_header);
1151
0
        }
1152
0
        if (usac_flag) {
1153
0
          if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
1154
0
              (ptr_header_data[k]->pvc_mode != 0)) {
1155
0
            self->ptr_pvc_data_str->prev_pvc_id = 0;
1156
0
          }
1157
0
          self->ptr_pvc_data_str->prev_pvc_mode = ptr_header_data[k]->pvc_mode;
1158
0
          if (ptr_header_data[k]->pvc_mode == 0) {
1159
0
            ptr_frame_data[k]->sbr_mode = ORIG_SBR;
1160
0
          } else {
1161
0
            ptr_frame_data[k]->sbr_mode = PVC_SBR;
1162
0
          }
1163
0
        }
1164
0
        if (header_flag == SBR_RESET) {
1165
0
          err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
1166
1167
0
                                           self->pstr_common_tables);
1168
0
          if (!err) {
1169
0
            WORD32 lr;
1170
0
            WORD32 lr1 = num_channels;
1171
0
            for (lr = 0; lr < lr1; lr++) {
1172
0
              ptr_frame_data[lr]->reset_flag = 1;
1173
0
              if ((SBR_NOT_INITIALIZED == ptr_header_data[lr]->sync_state) && !usac_flag) {
1174
0
                ptr_frame_data[lr]->sbr_patching_mode = 1;
1175
0
                ptr_frame_data[lr]->over_sampling_flag = 0;
1176
0
                ptr_frame_data[lr]->pitch_in_bins = 0;
1177
0
                ptr_header_data[lr]->pre_proc_flag = 0;
1178
0
              }
1179
1180
0
              err |= ixheaacd_sbr_dec_reset(
1181
0
                  &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag,
1182
0
                  self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins, audio_object_type,
1183
0
                  sbr_scratch_struct->ptr_work_buf_core);
1184
0
              if (err < 0) {
1185
0
                if (self->ec_flag) {
1186
0
                  self->frame_ok = 0;
1187
0
                } else {
1188
0
                  return err;
1189
0
                }
1190
0
              }
1191
0
            }
1192
0
          }
1193
1194
0
          if (err == 0) {
1195
0
            ptr_header_data[k]->sync_state = SBR_ACTIVE;
1196
0
          }
1197
0
        }
1198
0
      }
1199
1200
0
      if (err || (ptr_header_data[k]->sync_state == SBR_NOT_INITIALIZED)) {
1201
0
        WORD32 lr1 = num_channels;
1202
0
        ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
1203
0
        if (err && !self->ec_flag) {
1204
0
          return err;
1205
0
        }
1206
0
      }
1207
1208
0
      if (frame_status && (ptr_header_data[k]->sync_state == SBR_ACTIVE)) {
1209
0
        if (stereo) {
1210
0
          frame_status = ixheaacd_sbr_read_cpe(ptr_header_data[0], ptr_frame_data, it_bit_buff,
1211
0
                                               self->pstr_sbr_tables, audio_object_type);
1212
0
          if (frame_status < 0) return frame_status;
1213
0
        } else {
1214
0
          self->pstr_ps_stereo_dec = 0;
1215
1216
0
          if (ptr_frame_data[k]->sbr_mode == ORIG_SBR) {
1217
0
            frame_status = ixheaacd_sbr_read_sce(ptr_header_data[k], ptr_frame_data[k],
1218
0
                                                 self->pstr_ps_stereo_dec, it_bit_buff,
1219
0
                                                 self->pstr_sbr_tables, audio_object_type, 0);
1220
0
            if (frame_status < 0) return frame_status;
1221
0
          } else if (ptr_frame_data[k]->sbr_mode == PVC_SBR) {
1222
0
            frame_status = ixheaacd_sbr_read_pvc_sce(ptr_frame_data[k], it_bit_buff, 0,
1223
0
                                                     self->ptr_pvc_data_str,
1224
0
                                                     self->pstr_sbr_tables, ptr_header_data[k]);
1225
0
            if (frame_status < 0) return frame_status;
1226
0
          }
1227
0
        }
1228
0
        ptr_header_data[k]->enh_sbr_ps =
1229
0
            ((self->enh_sbr_ps) | (ptr_header_data[0]->channel_mode == PS_STEREO));
1230
0
        {
1231
0
          WORD32 total_bits_read;
1232
0
          total_bits_read = ixheaacd_no_bits_read(it_bit_buff);
1233
0
          if (total_bits_read > (ptr_bit_str_ele->size_payload << 3) ||
1234
0
              total_bits_read < ((ptr_bit_str_ele->size_payload << 3) - 8)) {
1235
0
            frame_status = 0;
1236
0
          }
1237
0
        }
1238
0
      } else {
1239
0
        if (frame_status && self->ec_flag) {
1240
0
          err = IA_XHEAAC_DEC_EXE_NONFATAL_SBR_PARSE_ERROR;
1241
0
          self->sbr_parse_err_flag = 1;
1242
0
        }
1243
0
        if (!frame_status) {
1244
0
          ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_ERROR);
1245
0
        } else {
1246
0
          ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_OK);
1247
0
        }
1248
0
      }
1249
0
    }
1250
0
    if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
1251
0
      if (ptr_frame_data[0]->sbr_mode == PVC_SBR) {
1252
0
        err = ixheaacd_dec_sbrdata_for_pvc(ptr_header_data[0], ptr_frame_data[0],
1253
0
                                           pstr_sbr_channel[0]->pstr_prev_frame_data,
1254
0
                                           audio_object_type);
1255
0
        if (err) {
1256
0
          if (self->ec_flag) {
1257
0
            self->frame_ok = 0;
1258
0
          } else {
1259
0
            return err;
1260
0
          }
1261
0
        }
1262
0
      } else if (ptr_frame_data[0]->sbr_mode == ORIG_SBR) {
1263
0
        err = ixheaacd_dec_sbrdata(
1264
0
            ptr_header_data[0], ptr_header_data[1], ptr_frame_data[0],
1265
0
            pstr_sbr_channel[0]->pstr_prev_frame_data,
1266
0
            (stereo || dual_mono) ? ptr_frame_data[1] : NULL,
1267
0
            (stereo || dual_mono) ? pstr_sbr_channel[1]->pstr_prev_frame_data : NULL,
1268
0
            self->pstr_common_tables, 0, audio_object_type, self->ec_flag);
1269
1270
0
        if (err) {
1271
0
          if (self->ec_flag) {
1272
0
            self->frame_ok = 0;
1273
0
          } else {
1274
0
            return err;
1275
0
          }
1276
0
        }
1277
0
      }
1278
1279
0
      if (ptr_header_data[0]->channel_mode == PS_STEREO &&
1280
0
          (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD)) {
1281
0
        ixheaacd_decode_ps_data(self->pstr_ps_stereo_dec, 1024);
1282
0
        ps_flag = 1;
1283
0
        self->ps_present = ps_flag;
1284
0
      }
1285
1286
0
      if (ptr_header_data[0]->enh_sbr_ps) {
1287
0
        ps_flag = 1;
1288
0
        self->ps_present = ps_flag;
1289
0
      }
1290
1291
0
      ptr_frame_data[0]->max_qmf_subband_aac =
1292
0
          ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
1293
0
      if (stereo) {
1294
0
        ptr_frame_data[1]->max_qmf_subband_aac =
1295
0
            ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
1296
0
      }
1297
0
    }
1298
0
    if (audio_object_type != AOT_ER_AAC_ELD) {
1299
0
      if ((initial_sync_state == SBR_NOT_INITIALIZED) && ptr_header_data[0]->err_flag) {
1300
0
        ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
1301
0
      }
1302
0
    } else {
1303
0
      ptr_header_data[0]->sync_state = SBR_ACTIVE;
1304
0
    }
1305
1306
0
    if ((!prev_stereo && stereo && (num_channels == 2)) &&
1307
0
        (audio_object_type != AOT_ER_AAC_ELD)) {
1308
0
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
1309
0
             pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
1310
0
             QMF_FILTER_STATE_SYN_SIZE * sizeof(WORD16));
1311
1312
0
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
1313
0
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
1314
1315
0
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
1316
0
             pstr_sbr_channel[0]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
1317
0
             QMF_FILTER_STATE_ANA_SIZE * sizeof(WORD16));
1318
1319
0
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale =
1320
0
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale;
1321
1322
0
      memcpy(pstr_sbr_channel[1]->str_sbr_dec.ptr_sbr_overlap_buf,
1323
0
             pstr_sbr_channel[0]->str_sbr_dec.ptr_sbr_overlap_buf,
1324
0
             MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
1325
1326
0
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale =
1327
0
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale;
1328
0
      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale =
1329
0
          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale;
1330
0
    }
1331
1332
0
    pstr_sbr_channel[0]->str_sbr_dec.time_sample_buf = self->time_sample_buf[0];
1333
0
    self->sbr_parse_complete = 1;
1334
0
  }
1335
1336
0
  return err;
1337
0
}