Coverage Report

Created: 2026-06-10 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_env_extr.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 <math.h>
22
#include "ixheaacd_sbr_common.h"
23
#include "ixheaac_type_def.h"
24
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops16.h"
28
#include "ixheaac_basic_ops40.h"
29
#include "ixheaac_basic_ops.h"
30
31
#include "ixheaac_basic_op.h"
32
#include "ixheaacd_intrinsics.h"
33
#include "ixheaacd_common_rom.h"
34
#include "ixheaacd_basic_funcs.h"
35
#include "ixheaacd_bitbuffer.h"
36
#include "ixheaacd_sbr_common.h"
37
#include "ixheaacd_drc_data_struct.h"
38
#include "ixheaacd_drc_dec.h"
39
#include "ixheaacd_sbrdecoder.h"
40
#include "ixheaacd_sbrdecsettings.h"
41
#include "ixheaacd_sbr_scale.h"
42
#include "ixheaacd_lpp_tran.h"
43
#include "ixheaacd_env_extr_part.h"
44
#include "ixheaacd_sbr_rom.h"
45
#include "ixheaacd_hybrid.h"
46
#include "ixheaacd_ps_dec.h"
47
#include "ixheaacd_env_extr.h"
48
49
#include "ixheaac_sbr_const.h"
50
#include "ixheaacd_intrinsics.h"
51
52
#include "ixheaacd_pvc_dec.h"
53
54
#include "ixheaacd_ps_bitdec.h"
55
56
#include "ixheaacd_audioobjtypes.h"
57
58
59
static const int ixheaacd_ld_env_table_512[LD_ENV_TBL_512][LD_ENV_TBL_SIZE] = {
60
    {2, 4, -1, 0},  {2, 5, -1, 0},  {3, 2, 6, 1},   {3, 3, 7, 1},
61
    {3, 4, 8, 1},   {3, 5, 9, 1},   {3, 6, 10, 1},  {3, 7, 11, 1},
62
    {3, 8, 12, 1},  {3, 9, 13, 1},  {3, 10, 14, 1}, {2, 11, -1, 1},
63
    {2, 12, -1, 1}, {2, 13, -1, 1}, {2, 14, -1, 1}, {2, 15, -1, 1},
64
};
65
66
static const int ixheaacd_ld_env_table_480[LD_ENV_TBL_480][LD_ENV_TBL_SIZE] = {
67
    {2, 4, -1, 0},  {2, 5, -1, 0},  {3, 2, 6, 1},   {3, 3, 7, 1},
68
    {3, 4, 8, 1},   {3, 5, 9, 1},   {3, 6, 10, 1},  {3, 7, 11, 1},
69
    {3, 8, 12, 1},  {3, 9, 13, 1},  {2, 10, -1, 1}, {2, 11, -1, 1},
70
    {2, 12, -1, 1}, {2, 13, -1, 1}, {2, 14, -1, 1},
71
};
72
73
static const int ixheaacd_ld_env_table_time_slot[LD_ENV_TIME_SLOT] = {
74
    8, 5, 0, 0, 0, 0, 0};
75
76
18.2M
WORD32 ixheaacd_cnt_leading_ones(WORD32 a) {
77
18.2M
  WORD32 count = 0;
78
79
37.7M
  while (a) {
80
35.1M
    if (a & 0x80000000)
81
19.5M
      count++;
82
15.6M
    else
83
15.6M
      break;
84
19.5M
    a = a << 1;
85
19.5M
  }
86
18.2M
  return count;
87
18.2M
}
88
VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len,
89
                             const UWORD16 *input_table,
90
14.9M
                             const UWORD32 *idx_table) {
91
14.9M
  UWORD32 temp = 0;
92
14.9M
  UWORD32 temp1 = 0;
93
14.9M
  WORD32 found = 0;
94
14.9M
  UWORD32 mask = 0x80000000;
95
96
14.9M
  WORD32 clo;
97
14.9M
  WORD32 MAX_LEN;
98
14.9M
  WORD32 ixheaacd_drc_offset = 0;
99
14.9M
  WORD32 length;
100
14.9M
  UWORD32 cwrd;
101
14.9M
  WORD32 len_end;
102
103
14.9M
  MAX_LEN = input_table[0];
104
14.9M
  mask = mask - (1 << (31 - MAX_LEN));
105
14.9M
  mask = mask << 1;
106
14.9M
  temp = (UWORD32)(it_bit_buff & mask);
107
108
14.9M
  len_end = input_table[0];
109
14.9M
  clo = ixheaacd_cnt_leading_ones(temp);
110
16.2M
  do {
111
16.2M
    ixheaacd_drc_offset = (idx_table[clo] >> 20) & 0xff;
112
16.2M
    length = input_table[ixheaacd_drc_offset + 1] & 0x1f;
113
16.2M
    cwrd = idx_table[clo] & 0xfffff;
114
16.2M
    temp1 = temp >> (32 - length);
115
16.2M
    if (temp1 <= cwrd) {
116
14.9M
      ixheaacd_drc_offset = ixheaacd_drc_offset - (cwrd - temp1);
117
14.9M
      found = 1;
118
14.9M
    } else {
119
1.31M
      len_end = len_end + ((idx_table[clo] >> 28) & 0xf);
120
1.31M
      clo = len_end;
121
1.31M
    }
122
16.2M
  } while (!found);
123
14.9M
  *h_index = input_table[ixheaacd_drc_offset + 1] >> 5;
124
14.9M
  *len = length;
125
14.9M
}
126
127
static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data,
128
                                              ia_bit_buf_struct *it_bit_buff,
129
65.5k
                                              WORD32 indepFlag) {
130
65.5k
  WORD32 i, j, k;
131
65.5k
  WORD32 fixed_length = 0, num_grid_info = 0, grid_info;
132
65.5k
  UWORD8 div_mode, ns_mode;
133
65.5k
  UWORD16 pvc_id[PVC_NUM_TIME_SLOTS + 1];
134
65.5k
  UWORD8 num_length;
135
65.5k
  UWORD8 length;
136
65.5k
  UWORD8 reuse_pvc_id;
137
65.5k
  WORD32 sum_length = 0;
138
65.5k
  WORD32 length_bits = 4;
139
65.5k
  UWORD8 pvc_id_bits = PVC_ID_BITS;
140
65.5k
  IA_ERRORCODE err = IA_NO_ERROR;
141
142
65.5k
  div_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_DIV_MODE_BITS);
143
65.5k
  ns_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_NS_MODE_BITS);
144
145
65.5k
  if (ptr_pvc_data->pvc_mode == 3) {
146
772
    pvc_id_bits = 0;
147
772
  }
148
149
65.5k
  if (div_mode <= 3) {
150
44.3k
    num_length = div_mode;
151
44.3k
    if (indepFlag) {
152
435
      reuse_pvc_id = 0;
153
43.9k
    } else {
154
43.9k
      reuse_pvc_id =
155
43.9k
          (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_REUSE_PVC_ID_BITS);
156
43.9k
    }
157
44.3k
    if (reuse_pvc_id == 1) {
158
6.26k
      pvc_id[0] = ptr_pvc_data->prev_pvc_id;
159
38.1k
    } else {
160
38.1k
      pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
161
38.1k
    }
162
163
44.3k
    k = 1;
164
44.3k
    if (num_length) {
165
13.4k
      sum_length = 0;
166
36.2k
      for (i = 0; i < num_length; i++) {
167
22.7k
        if (sum_length >= 13) {
168
909
          length_bits = 1;
169
21.8k
        } else if (sum_length >= 11) {
170
53
          length_bits = 2;
171
21.8k
        } else if (sum_length >= 7) {
172
383
          length_bits = 3;
173
21.4k
        } else {
174
21.4k
          length_bits = 4;
175
21.4k
        }
176
22.7k
        length = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, length_bits);
177
22.7k
        length += 1;
178
22.7k
        sum_length += length;
179
22.7k
        if ((k + length - 1) > PVC_NUM_TIME_SLOTS) {
180
30
          return -1;
181
30
        }
182
98.9k
        for (j = 1; j < length; j++, k++) {
183
76.2k
          pvc_id[k] = pvc_id[k - 1];
184
76.2k
        }
185
22.7k
        pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
186
22.7k
      }
187
13.4k
    }
188
189
611k
    for (; k < 16; k++) {
190
567k
      pvc_id[k] = pvc_id[k - 1];
191
567k
    }
192
193
44.3k
  } else {
194
21.1k
    switch (div_mode) {
195
10.2k
      case 4:
196
10.2k
        num_grid_info = 2;
197
10.2k
        fixed_length = 8;
198
10.2k
        break;
199
9.92k
      case 5:
200
9.92k
        num_grid_info = 4;
201
9.92k
        fixed_length = 4;
202
9.92k
        break;
203
253
      case 6:
204
253
        num_grid_info = 8;
205
253
        fixed_length = 2;
206
253
        break;
207
693
      case 7:
208
693
        num_grid_info = 16;
209
693
        fixed_length = 1;
210
693
        break;
211
0
      default:;
212
21.1k
    }
213
21.1k
    if (indepFlag) {
214
330
      grid_info = 1;
215
20.8k
    } else {
216
20.8k
      grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS);
217
20.8k
    }
218
21.1k
    if (grid_info) {
219
5.58k
      pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
220
15.5k
    } else {
221
15.5k
      pvc_id[0] = ptr_pvc_data->prev_pvc_id;
222
15.5k
    }
223
123k
    for (j = 1, k = 1; j < fixed_length; j++, k++) {
224
102k
      pvc_id[k] = pvc_id[k - 1];
225
102k
    }
226
227
73.3k
    for (i = 1; i < num_grid_info; i++) {
228
52.1k
      grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS);
229
52.1k
      if (grid_info == 1) {
230
33.2k
        pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
231
33.2k
      } else {
232
18.9k
        pvc_id[k] = pvc_id[k - 1];
233
18.9k
        k++;
234
18.9k
      }
235
215k
      for (j = 1; j < fixed_length; j++, k++) {
236
163k
        pvc_id[k] = pvc_id[k - 1];
237
163k
      }
238
52.1k
    }
239
21.1k
  }
240
65.5k
  ptr_pvc_data->div_mode = div_mode;
241
65.5k
  ptr_pvc_data->ns_mode = ns_mode;
242
1.11M
  for (i = 0; i < PVC_NUM_TIME_SLOTS; i++) {
243
1.04M
    ptr_pvc_data->pvc_id[i] = pvc_id[i];
244
1.04M
  }
245
65.5k
  return err;
246
65.5k
}
247
248
static VOID ixheaacd_pvc_env_dtdf_data(
249
    ia_sbr_frame_info_data_struct *ptr_frame_data,
250
65.5k
    ia_bit_buf_struct *it_bit_buff) {
251
65.5k
  WORD32 i;
252
65.5k
  WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
253
65.5k
  WORD32 bs_num_noise = ptr_frame_data->str_frame_info_details.num_noise_env;
254
255
65.5k
  if (usac_independency_flag) {
256
768
    ptr_frame_data->del_cod_dir_noise_arr[0] = 0;
257
64.8k
  } else {
258
64.8k
    ptr_frame_data->del_cod_dir_noise_arr[0] =
259
64.8k
        ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS);
260
64.8k
  }
261
262
107k
  for (i = 1; i < bs_num_noise; i++) {
263
41.7k
    ptr_frame_data->del_cod_dir_noise_arr[i] =
264
41.7k
        ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS);
265
41.7k
  }
266
65.5k
}
267
268
static VOID ixheaacd_read_sbr_addi_data(
269
    ia_sbr_frame_info_data_struct *ptr_frame_data,
270
    ia_sbr_header_data_struct *ptr_header_data,
271
65.4k
    ia_bit_buf_struct *it_bit_buff) {
272
65.4k
  WORD32 i;
273
274
65.4k
  WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
275
276
65.4k
  ptr_frame_data->sin_start_for_cur_top =
277
65.4k
      ptr_frame_data->sin_start_for_next_top;
278
65.4k
  ptr_frame_data->sin_len_for_cur_top = ptr_frame_data->sin_len_for_next_top;
279
65.4k
  ptr_frame_data->sin_start_for_next_top = 0;
280
65.4k
  ptr_frame_data->sin_len_for_next_top = 0;
281
282
65.4k
  if (flag) {
283
283k
    for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
284
265k
         i++) {
285
265k
      ptr_frame_data->add_harmonics[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
286
265k
    }
287
17.3k
    if (ptr_frame_data->pvc_mode != 0) {
288
17.3k
      ptr_frame_data->sine_position = ESC_SIN_POS;
289
290
17.3k
      ptr_frame_data->bs_sin_pos_present =
291
17.3k
          ixheaacd_read_bits_buf(it_bit_buff, 1);
292
293
17.3k
      if (ptr_frame_data->bs_sin_pos_present == 1) {
294
5.30k
        ptr_frame_data->sine_position = ixheaacd_read_bits_buf(it_bit_buff, 5);
295
5.30k
      }
296
17.3k
      if (ptr_frame_data->var_len > 0) {
297
4.21k
        if (ptr_frame_data->sine_position > 16) {
298
1.23k
          if (ptr_frame_data->sine_position == 31) {
299
1.05k
            ptr_frame_data->sin_start_for_next_top = 0;
300
1.05k
            ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
301
1.05k
          } else {
302
180
            if ((ptr_frame_data->var_len + 16) ==
303
180
                ptr_frame_data->sine_position) {
304
2
              ptr_frame_data->sin_start_for_next_top = 0;
305
2
              ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
306
178
            } else {
307
178
              ptr_frame_data->sin_start_for_next_top =
308
178
                  ptr_frame_data->sine_position - 16;
309
178
              ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
310
178
            }
311
180
          }
312
2.98k
        } else {
313
2.98k
          ptr_frame_data->sin_start_for_next_top = 0;
314
2.98k
          ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
315
2.98k
        }
316
13.1k
      } else {
317
13.1k
        ptr_frame_data->sin_start_for_next_top = 0;
318
13.1k
        ptr_frame_data->sin_len_for_next_top = 0;
319
13.1k
      }
320
17.3k
    }
321
17.3k
  }
322
65.4k
  return;
323
65.4k
}
324
325
WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type t_huff,
326
51.1k
                             ia_bit_buf_struct *it_bit_buff) {
327
51.1k
  WORD32 index;
328
51.1k
  WORD32 value, bit;
329
51.1k
  WORD16 cw;
330
51.1k
  index = 0;
331
332
155k
  while (index >= 0) {
333
103k
    cw = t_huff[index];
334
335
103k
    bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
336
337
103k
    if (bit) {
338
38.2k
      WORD sign = (cw & 0x0080);
339
38.2k
      if (sign) {
340
18.3k
        index = (cw | 0xffffff80);
341
19.9k
      } else {
342
19.9k
        index = (cw & 0x007f);
343
19.9k
      }
344
65.6k
    } else {
345
65.6k
      index = (cw >> 8);
346
65.6k
    }
347
103k
  }
348
349
51.1k
  value = (index + 64);
350
351
51.1k
  return (value);
352
51.1k
}
353
354
WORD32 ixheaacd_sbr_read_header_data(
355
    ia_sbr_header_data_struct *pstr_sbr_header, ia_bit_buf_struct *it_bit_buff,
356
169k
    FLAG stereo_flag, ia_sbr_header_data_struct *pstr_sbr_dflt_header) {
357
169k
  ia_sbr_header_data_struct prev_header_info;
358
169k
  prev_header_info.start_freq = 0;
359
169k
  prev_header_info.noise_bands = 0;
360
169k
  FLAG header_extra_1 = 0, header_extra_2 = 0;
361
169k
  WORD32 tmp;
362
169k
  WORD32 usac_independency_flag = pstr_sbr_header->usac_independency_flag;
363
169k
  WORD32 use_dflt_hdr = 0;
364
169k
  WORD32 header_present = 1;
365
169k
  WORD32 usac_flag = pstr_sbr_header->usac_flag;
366
367
169k
  if (!usac_flag) {
368
8.58k
    memcpy(&prev_header_info, pstr_sbr_header,
369
8.58k
           sizeof(ia_sbr_header_data_struct));
370
371
8.58k
    tmp = ixheaacd_read_bits_buf(
372
8.58k
        it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS + SBR_BEGIN_SAMP_FREQ_BITS +
373
8.58k
                         SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS);
374
375
8.58k
    pstr_sbr_header->amp_res = (WORD16)(
376
8.58k
        (tmp & 0x0800) >> (SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS +
377
8.58k
                           SBR_CROSS_OVER_BND_BITS));
378
379
8.58k
    pstr_sbr_header->start_freq = (WORD16)(
380
8.58k
        (tmp & 0x0780) >> (SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS));
381
382
8.58k
    pstr_sbr_header->stop_freq =
383
8.58k
        (WORD16)((tmp & 0x078) >> (SBR_CROSS_OVER_BND_BITS));
384
385
8.58k
    pstr_sbr_header->xover_band = (WORD16)((tmp & 0x07));
386
387
8.58k
    tmp = ixheaacd_read_bits_buf(
388
8.58k
        it_bit_buff,
389
8.58k
        SBR_HDR_RESERV_BITS + SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
390
8.58k
    header_extra_1 = (FLAG)((tmp & 0x02) >> (SBR_HDR_EXTR_2_BITS));
391
8.58k
    header_extra_2 = (FLAG)((tmp & 0x01));
392
8.58k
    if (stereo_flag) {
393
5.76k
      pstr_sbr_header->channel_mode = SBR_STEREO;
394
5.76k
    } else {
395
2.82k
      pstr_sbr_header->channel_mode = SBR_MONO;
396
2.82k
    }
397
160k
  } else {
398
160k
    WORD32 info_present = 0;
399
160k
    if (pstr_sbr_header->sync_state == SBR_ACTIVE) {
400
153k
      memcpy(&prev_header_info, pstr_sbr_header,
401
153k
             sizeof(ia_sbr_header_data_struct));
402
153k
    }
403
160k
    if (usac_independency_flag) {
404
3.82k
      header_present = 1;
405
3.82k
      info_present = 1;
406
156k
    } else {
407
156k
      info_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
408
156k
      if (info_present) {
409
50.7k
        header_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
410
106k
      } else {
411
106k
        header_present = 0;
412
106k
      }
413
156k
    }
414
415
160k
    if (info_present) {
416
54.6k
      tmp = ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS +
417
54.6k
                                                    ESBR_CROSS_OVER_BND_BITS +
418
54.6k
                                                    ESBR_PRE_FLAT_BITS);
419
54.6k
      pstr_sbr_header->amp_res = (WORD16)(
420
54.6k
          (tmp & 0x0020) >> (ESBR_CROSS_OVER_BND_BITS + ESBR_PRE_FLAT_BITS));
421
54.6k
      pstr_sbr_header->xover_band =
422
54.6k
          (WORD16)((tmp & 0x001E) >> (ESBR_PRE_FLAT_BITS));
423
54.6k
      pstr_sbr_header->pre_proc_flag = (WORD16)((tmp & 0x001));
424
54.6k
      if (pstr_sbr_header->pvc_flag) {
425
30.7k
        pstr_sbr_header->pvc_mode =
426
30.7k
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_PVC_MODE_BITS);
427
30.7k
      } else {
428
23.8k
        pstr_sbr_header->pvc_mode = 0;
429
23.8k
      }
430
54.6k
    }
431
432
160k
    if (header_present) {
433
15.9k
      use_dflt_hdr = ixheaacd_read_bits_buf(it_bit_buff, 1);
434
15.9k
      if (use_dflt_hdr) {
435
11.8k
        pstr_sbr_header->start_freq = pstr_sbr_dflt_header->start_freq;
436
11.8k
        pstr_sbr_header->stop_freq = pstr_sbr_dflt_header->stop_freq;
437
11.8k
        pstr_sbr_header->header_extra_1 = pstr_sbr_dflt_header->header_extra_1;
438
11.8k
        pstr_sbr_header->header_extra_2 = pstr_sbr_dflt_header->header_extra_2;
439
11.8k
        pstr_sbr_header->freq_scale = pstr_sbr_dflt_header->freq_scale;
440
11.8k
        pstr_sbr_header->alter_scale = pstr_sbr_dflt_header->alter_scale;
441
11.8k
        pstr_sbr_header->noise_bands = pstr_sbr_dflt_header->noise_bands;
442
11.8k
        pstr_sbr_header->limiter_bands = pstr_sbr_dflt_header->limiter_bands;
443
11.8k
        pstr_sbr_header->limiter_gains = pstr_sbr_dflt_header->limiter_gains;
444
11.8k
        pstr_sbr_header->interpol_freq = pstr_sbr_dflt_header->interpol_freq;
445
11.8k
        pstr_sbr_header->smoothing_mode = pstr_sbr_dflt_header->smoothing_mode;
446
11.8k
      } else {
447
4.07k
        tmp = ixheaacd_read_bits_buf(
448
4.07k
            it_bit_buff, SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS +
449
4.07k
                             SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
450
4.07k
        pstr_sbr_header->start_freq =
451
4.07k
            (tmp & 0x03C0) >> (SBR_END_SAMP_FREQ_BITS + SBR_HDR_EXTR_1_BITS +
452
4.07k
                               SBR_HDR_EXTR_2_BITS);
453
4.07k
        pstr_sbr_header->stop_freq =
454
4.07k
            (tmp & 0x003C) >> (SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
455
4.07k
        pstr_sbr_header->header_extra_1 =
456
4.07k
            (tmp & 0x0002) >> (SBR_HDR_EXTR_2_BITS);
457
4.07k
        pstr_sbr_header->header_extra_2 = (tmp & 0x0001);
458
4.07k
        header_extra_1 = pstr_sbr_header->header_extra_1;
459
4.07k
        header_extra_2 = pstr_sbr_header->header_extra_2;
460
4.07k
      }
461
15.9k
    }
462
160k
  }
463
464
169k
  if (!use_dflt_hdr && header_present) {
465
12.6k
    if (header_extra_1) {
466
4.47k
      tmp = ixheaacd_read_bits_buf(
467
4.47k
          it_bit_buff,
468
4.47k
          SBR_SAMP_FREQ_LVL_BITS + SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS);
469
4.47k
      pstr_sbr_header->freq_scale =
470
4.47k
          (WORD16)((tmp & 0x018) >> (SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS));
471
4.47k
      pstr_sbr_header->alter_scale =
472
4.47k
          (WORD16)((tmp & 0x04) >> (SBR_NOISE_BND_BITS));
473
4.47k
      pstr_sbr_header->noise_bands = (WORD16)((tmp & 0x03));
474
8.17k
    } else {
475
8.17k
      pstr_sbr_header->freq_scale = SBR_SAMP_FEQ_LVL_DEF;
476
8.17k
      pstr_sbr_header->alter_scale = SBR_CHANGE_LVL_DEF;
477
8.17k
      pstr_sbr_header->noise_bands = SBR_NOISE_BND_DEF;
478
8.17k
    }
479
480
12.6k
    if (header_extra_2) {
481
5.07k
      tmp = ixheaacd_read_bits_buf(
482
5.07k
          it_bit_buff, SBR_BND_LIMIT_BITS + SBR_GAIN_LIMIT_BITS +
483
5.07k
                           SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS);
484
5.07k
      pstr_sbr_header->limiter_bands = (WORD16)(
485
5.07k
          (tmp & 0x030) >> (SBR_GAIN_LIMIT_BITS + SBR_INTERPOL_SAMP_FREQ_BITS +
486
5.07k
                            SBR_SMOOTH_LEN_BITS));
487
5.07k
      pstr_sbr_header->limiter_gains = (WORD16)(
488
5.07k
          (tmp & 0x0c) >> (SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS));
489
5.07k
      pstr_sbr_header->interpol_freq =
490
5.07k
          (WORD16)((tmp & 0x02) >> (SBR_SMOOTH_LEN_BITS));
491
5.07k
      pstr_sbr_header->smoothing_mode = (WORD16)((tmp & 0x01));
492
7.57k
    } else {
493
7.57k
      pstr_sbr_header->limiter_bands = SBR_BND_LIMIT_DEF;
494
7.57k
      pstr_sbr_header->limiter_gains = SBR_GAIN_LIMIT_DEF;
495
7.57k
      pstr_sbr_header->interpol_freq = SBR_INTERPOL_SAMP_FEQ_DEF;
496
7.57k
      pstr_sbr_header->smoothing_mode = SBR_SMOOTH_LEN_DEF;
497
7.57k
    }
498
12.6k
  }
499
500
169k
  if ((pstr_sbr_header->sync_state != SBR_ACTIVE) ||
501
160k
      (prev_header_info.start_freq != pstr_sbr_header->start_freq) ||
502
155k
      (prev_header_info.stop_freq != pstr_sbr_header->stop_freq) ||
503
153k
      (prev_header_info.xover_band != pstr_sbr_header->xover_band) ||
504
130k
      (prev_header_info.freq_scale != pstr_sbr_header->freq_scale) ||
505
130k
      (prev_header_info.alter_scale != pstr_sbr_header->alter_scale) ||
506
130k
      (prev_header_info.noise_bands != pstr_sbr_header->noise_bands)) {
507
39.0k
    return SBR_RESET;
508
39.0k
  }
509
510
130k
  return 0;
511
169k
}
512
513
static VOID ixheaacd_sbr_sin_coding_data(
514
    ia_sbr_header_data_struct *ptr_header_data,
515
    ia_sbr_frame_info_data_struct *ptr_frame_data,
516
55.8k
    ia_bit_buf_struct *it_bit_buff) {
517
55.8k
  FLAG *p_add_harmonic = ptr_frame_data->add_harmonics;
518
55.8k
  WORD32 i;
519
520
55.8k
  i = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
521
698k
  do {
522
698k
    *p_add_harmonic++ =
523
698k
        (FLAG)ixheaacd_read_bits_buf(it_bit_buff, SBR_ADD_SINE_FLAG_BITS);
524
698k
    i--;
525
698k
  } while (i != 0);
526
527
55.8k
  return;
528
55.8k
}
529
530
static WORD16 ixheaacd_validate_frame_info(
531
    ia_frame_info_struct *pstr_frame_info, WORD16 num_time_slots,
532
170k
    WORD audio_object_type) {
533
170k
  WORD32 i, j;
534
535
170k
  WORD32 start_pos, end_pos, transient_env, start_pos_noise, end_pos_noise,
536
170k
      num_env_sf, num_noise_env;
537
538
170k
  num_env_sf = pstr_frame_info->num_env;
539
170k
  num_noise_env = pstr_frame_info->num_noise_env;
540
541
170k
  if ((num_env_sf < 1) || (num_env_sf > MAX_ENVELOPES)) return 0;
542
543
170k
  if (num_noise_env > MAX_NOISE_ENVELOPES) return 0;
544
545
170k
  start_pos = pstr_frame_info->border_vec[0];
546
170k
  end_pos = pstr_frame_info->border_vec[num_env_sf];
547
170k
  transient_env = pstr_frame_info->transient_env;
548
549
170k
  if (transient_env > num_env_sf) return 0;
550
551
170k
  start_pos_noise = pstr_frame_info->noise_border_vec[0];
552
170k
  end_pos_noise = pstr_frame_info->noise_border_vec[num_noise_env];
553
554
170k
  if ((start_pos < 0) || (start_pos >= end_pos)) return 0;
555
556
170k
  if (start_pos > SBR_OV_SLOTS) return 0;
557
170k
  if (audio_object_type != AOT_ER_AAC_ELD &&
558
130k
      audio_object_type != AOT_ER_AAC_LD) {
559
130k
    if (num_time_slots != 15) {
560
130k
      if (end_pos < SBR_TIME_SLOTS) return 0;
561
130k
    } else {
562
0
      if (end_pos < num_time_slots) return 0;
563
0
    }
564
130k
  } else {
565
39.9k
    if (end_pos < num_time_slots) return 0;
566
39.9k
  }
567
568
170k
  if (num_time_slots != 15) {
569
156k
    if (end_pos > add_d(SBR_TIME_SLOTS, SBR_OV_SLOTS)) return 0;
570
156k
  } else {
571
14.1k
    if (end_pos > add_d(num_time_slots, SBR_OV_SLOTS)) return 0;
572
14.1k
  }
573
574
513k
  for (i = 0; i < num_env_sf; i++) {
575
342k
    if (pstr_frame_info->border_vec[i] > pstr_frame_info->border_vec[i + 1])
576
92
      return 0;
577
342k
  }
578
579
170k
  if ((num_env_sf == 1) && (num_noise_env > 1)) return 0;
580
581
170k
  if ((start_pos != start_pos_noise) || (end_pos != end_pos_noise)) return 0;
582
583
417k
  for (i = 0; i < num_noise_env; i++) {
584
247k
    start_pos_noise = pstr_frame_info->noise_border_vec[i];
585
586
357k
    for (j = 0; j < num_env_sf; j++) {
587
357k
      if (pstr_frame_info->border_vec[j] == start_pos_noise) break;
588
357k
    }
589
247k
    if (j == num_env_sf) return 0;
590
247k
  }
591
592
170k
  return 1;
593
170k
}
594
595
static WORD16 ixheaacd_read_enh_sbr_data(
596
    ia_sbr_header_data_struct *ptr_header_data,
597
    ia_bit_buf_struct *it_bit_buff,
598
    VOID *p_frame_data,
599
6.04k
    WORD32 ele_id) {
600
6.04k
  WORD32 tmp = 0;
601
6.04k
  WORD16 num_bits_read = 0;
602
6.04k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PRE_FLAT_BITS);
603
6.04k
  ptr_header_data->pre_proc_flag = tmp;
604
6.04k
  num_bits_read += ESBR_PRE_FLAT_BITS;
605
606
6.04k
  if (ele_id == SBR_ID_SCE) {
607
2.70k
    ia_sbr_frame_info_data_struct *ptr_frame_data =
608
2.70k
        (ia_sbr_frame_info_data_struct *)p_frame_data;
609
610
2.70k
    tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
611
2.70k
    ptr_frame_data->sbr_patching_mode = tmp;
612
2.70k
    num_bits_read += ESBR_PATCHING_MODE_BITS;
613
614
2.70k
    if (tmp == 0) {
615
1.49k
      tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
616
1.49k
      ptr_frame_data->over_sampling_flag = tmp;
617
1.49k
      num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
618
619
1.49k
      tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS);
620
1.49k
      num_bits_read += ESBR_PITCHIN_FLAG_BITS;
621
622
1.49k
      if (tmp) {
623
142
        tmp =
624
142
           ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
625
142
        ptr_frame_data->pitch_in_bins = tmp;
626
142
        num_bits_read += ESBR_PITCHIN_BINS_BITS;
627
1.35k
      } else {
628
1.35k
        ptr_frame_data->pitch_in_bins = 0;
629
1.35k
      }
630
1.49k
    } else {
631
1.21k
      ptr_frame_data->over_sampling_flag = 0;
632
1.21k
      ptr_frame_data->pitch_in_bins = 0;
633
1.21k
    }
634
3.33k
  } else if (ele_id == SBR_ID_CPE) {
635
3.33k
    ia_sbr_frame_info_data_struct **ptr_frame_data =
636
3.33k
        (ia_sbr_frame_info_data_struct **)p_frame_data;
637
3.33k
    if (ptr_frame_data[0]->coupling_mode) {
638
1.28k
      ptr_frame_data[0]->sbr_patching_mode =
639
1.28k
          ptr_frame_data[1]->sbr_patching_mode =
640
1.28k
          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
641
1.28k
      num_bits_read += ESBR_PATCHING_MODE_BITS;
642
643
1.28k
      if (ptr_frame_data[0]->sbr_patching_mode == 0) {
644
441
        ptr_frame_data[0]->over_sampling_flag =
645
441
            ptr_frame_data[1]->over_sampling_flag =
646
441
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
647
441
        num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
648
441
        num_bits_read += ESBR_PITCHIN_FLAG_BITS;
649
441
        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
650
30
          ptr_frame_data[0]->pitch_in_bins =
651
30
          ptr_frame_data[1]->pitch_in_bins =
652
30
              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
653
30
          num_bits_read += ESBR_PITCHIN_BINS_BITS;
654
411
        } else {
655
411
          ptr_frame_data[0]->pitch_in_bins = 0;
656
411
          ptr_frame_data[1]->pitch_in_bins = 0;
657
411
        }
658
843
      } else {
659
843
        ptr_frame_data[0]->over_sampling_flag = 0;
660
843
        ptr_frame_data[0]->pitch_in_bins = 0;
661
662
843
        ptr_frame_data[1]->over_sampling_flag = 0;
663
843
        ptr_frame_data[1]->pitch_in_bins = 0;
664
843
      }
665
2.05k
    } else {
666
2.05k
      ptr_frame_data[0]->sbr_patching_mode =
667
2.05k
          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
668
2.05k
      num_bits_read += ESBR_PATCHING_MODE_BITS;
669
670
2.05k
      if (ptr_frame_data[0]->sbr_patching_mode == 0) {
671
637
        ptr_frame_data[0]->over_sampling_flag =
672
637
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
673
637
        num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
674
637
        num_bits_read += ESBR_PITCHIN_FLAG_BITS;
675
637
        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
676
49
          ptr_frame_data[0]->pitch_in_bins =
677
49
              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
678
49
          num_bits_read += ESBR_PITCHIN_BINS_BITS;
679
588
        } else {
680
588
          ptr_frame_data[0]->pitch_in_bins = 0;
681
588
        }
682
1.41k
      } else {
683
1.41k
        ptr_frame_data[0]->over_sampling_flag = 0;
684
1.41k
        ptr_frame_data[0]->pitch_in_bins = 0;
685
1.41k
      }
686
687
2.05k
      ptr_frame_data[1]->sbr_patching_mode =
688
2.05k
          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
689
2.05k
      num_bits_read += ESBR_PATCHING_MODE_BITS;
690
691
2.05k
      if (ptr_frame_data[1]->sbr_patching_mode == 0) {
692
1.14k
        ptr_frame_data[1]->over_sampling_flag =
693
1.14k
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
694
1.14k
        num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
695
1.14k
        num_bits_read += ESBR_PITCHIN_FLAG_BITS;
696
1.14k
        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
697
223
          ptr_frame_data[1]->pitch_in_bins =
698
223
              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
699
223
          num_bits_read += ESBR_PITCHIN_BINS_BITS;
700
917
        } else {
701
917
          ptr_frame_data[1]->pitch_in_bins = 0;
702
917
        }
703
1.14k
      } else {
704
914
        ptr_frame_data[1]->over_sampling_flag =
705
914
            ptr_frame_data[1]->pitch_in_bins = 0;
706
914
      }
707
2.05k
    }
708
3.33k
  }
709
6.04k
  if (num_bits_read < 6) {
710
5.18k
    ixheaacd_read_bits_buf(it_bit_buff, 6 - num_bits_read);
711
5.18k
    num_bits_read = 6;
712
5.18k
  }
713
6.04k
  return num_bits_read;
714
6.04k
}
715
716
static IA_ERRORCODE ixheaacd_read_extn_data(ia_sbr_header_data_struct *ptr_header_data,
717
                                            ia_ps_dec_struct *ptr_ps_dec,
718
                                            ia_bit_buf_struct *it_bit_buff,
719
                                            ia_ps_tables_struct *ps_tables_ptr,
720
30.9k
                                            VOID *p_frame_data, WORD32 ele_id) {
721
30.9k
  WORD i;
722
30.9k
  WORD extended_data;
723
30.9k
  WORD no_bits_left;
724
725
30.9k
  extended_data = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENLARGED_DATA_BITS);
726
727
30.9k
  if (extended_data) {
728
8.85k
    WORD cnt;
729
8.85k
    FLAG ps_read;
730
731
8.85k
    ps_read = 0;
732
733
8.85k
    cnt = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_SIZE_BITS);
734
735
8.85k
    if (cnt == ((1 << SBR_CONT_SIZE_BITS) - 1)) {
736
778
      cnt = (cnt + ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ESC_CNT_BITS));
737
778
    }
738
739
8.85k
    no_bits_left = (cnt << 3);
740
741
8.85k
    ptr_header_data->hbe_flag = !ptr_header_data->usac_flag;
742
8.85k
    ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1;
743
744
22.3k
    while (no_bits_left > 7) {
745
15.6k
      WORD extension_id = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ID_BITS);
746
747
15.6k
      if (extension_id == EXTENSION_ID_ENHSBR_CODING && !ptr_header_data->enh_sbr)
748
0
      {
749
0
        extension_id = -1;
750
0
      }
751
15.6k
      no_bits_left = (no_bits_left - SBR_CONT_ID_BITS);
752
753
15.6k
      switch (extension_id) {
754
5.72k
        case EXTENSION_ID_PS_CODING:
755
756
5.72k
          if (ptr_ps_dec == NULL) {
757
1.63k
            return 0;
758
1.63k
          }
759
760
4.09k
          if (!(ptr_ps_dec->force_mono || ps_read)) {
761
2.70k
            IA_ERRORCODE ret_val = ixheaacd_read_ps_data(ptr_ps_dec, it_bit_buff,
762
2.70k
                                                         (WORD16)no_bits_left, ps_tables_ptr);
763
2.70k
            if (ret_val == IA_FATAL_ERROR) {
764
2
              return ret_val;
765
2.70k
            } else {
766
2.70k
              no_bits_left = no_bits_left - ret_val;
767
2.70k
            }
768
769
2.70k
            if (no_bits_left < 0) return 0;
770
2.29k
            ptr_header_data->channel_mode = PS_STEREO;
771
2.29k
            ps_read = 1;
772
2.29k
            break;
773
2.70k
          }
774
6.04k
        case EXTENSION_ID_ENHSBR_CODING: {
775
6.04k
          no_bits_left =
776
6.04k
              (no_bits_left - ixheaacd_read_enh_sbr_data(ptr_header_data, it_bit_buff,
777
6.04k
                  p_frame_data, ele_id));
778
779
6.04k
          ptr_header_data->hbe_flag = 1;
780
6.04k
          ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1;
781
6.04k
          break;
782
4.09k
        }
783
5.27k
        default:
784
5.27k
          cnt = (no_bits_left >> 3);
785
131k
          for (i = cnt - 1; i >= 0; i--) ixheaacd_read_bits_buf(it_bit_buff, 8);
786
5.27k
          no_bits_left = (no_bits_left - (cnt << 3));
787
5.27k
          break;
788
15.6k
      }
789
15.6k
    }
790
791
6.69k
    if (no_bits_left < 0) return 0;
792
6.63k
    ixheaacd_read_bits_buf(it_bit_buff, no_bits_left);
793
6.63k
  }
794
28.6k
  return 0;
795
30.9k
}
796
797
WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data,
798
                                 ia_bit_buf_struct *it_bit_buff,
799
                                 WORD32 hbe_flag,
800
                                 ia_pvc_data_struct *ptr_pvc_data,
801
                                 ia_sbr_tables_struct *ptr_sbr_tables,
802
65.5k
                                 ia_sbr_header_data_struct *ptr_header_data) {
803
65.5k
  WORD32 i;
804
65.5k
  WORD32 err_code = 0;
805
65.5k
  ia_env_extr_tables_struct *env_extr_tables_ptr =
806
65.5k
      ptr_sbr_tables->env_extr_tables_ptr;
807
65.5k
  WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
808
809
65.5k
  if (hbe_flag) {
810
43.1k
    ptr_frame_data->sbr_patching_mode =
811
43.1k
        ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
812
813
43.1k
    if (ptr_frame_data->sbr_patching_mode == 0) {
814
29.3k
      ptr_frame_data->over_sampling_flag =
815
29.3k
          ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
816
29.3k
      if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
817
4.99k
        ptr_frame_data->pitch_in_bins =
818
4.99k
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
819
24.3k
      else
820
24.3k
        ptr_frame_data->pitch_in_bins = 0;
821
29.3k
    } else {
822
13.7k
      ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0;
823
13.7k
    }
824
43.1k
  }
825
826
65.5k
  err_code = ixheaacd_pvc_time_freq_grid_info(it_bit_buff, ptr_frame_data);
827
65.5k
  if (err_code) return err_code;
828
829
65.5k
  ptr_pvc_data->prev_sbr_mode = PVC_SBR;
830
831
65.5k
  ixheaacd_pvc_env_dtdf_data(ptr_frame_data, it_bit_buff);
832
833
288k
  for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_nf_bands; i++) {
834
222k
    ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
835
222k
    ptr_frame_data->sbr_invf_mode[i] =
836
222k
        ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
837
222k
  }
838
839
65.5k
  ptr_pvc_data->pvc_mode = ptr_header_data->pvc_mode;
840
841
65.5k
  err_code = ixheaacd_read_esbr_pvc_envelope(ptr_pvc_data, it_bit_buff,
842
65.5k
                                             usac_independency_flag);
843
65.5k
  if (err_code) return err_code;
844
845
65.5k
  ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data,
846
65.5k
                                     it_bit_buff, env_extr_tables_ptr);
847
848
65.5k
  memset(ptr_frame_data->add_harmonics, 0,
849
65.5k
         ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH] *
850
65.5k
             sizeof(WORD32));
851
65.5k
  ptr_frame_data->pvc_mode = ptr_header_data->pvc_mode;
852
853
65.5k
  ixheaacd_read_sbr_addi_data(ptr_frame_data, ptr_header_data, it_bit_buff);
854
855
65.5k
  ptr_frame_data->coupling_mode = COUPLING_OFF;
856
857
65.5k
  return err_code;
858
65.5k
}
859
860
IA_ERRORCODE ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data,
861
                                   ia_sbr_frame_info_data_struct *ptr_frame_data,
862
                                   ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
863
                                   ia_sbr_tables_struct *ptr_sbr_tables, WORD audio_object_type,
864
55.6k
                                   WORD32 ec_flag) {
865
55.6k
  WORD32 bit;
866
55.6k
  WORD32 i;
867
55.6k
  WORD32 hbe_flag = ptr_header_data->hbe_flag;
868
55.6k
  WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands;
869
55.6k
  WORD32 usac_flag = ptr_header_data->usac_flag;
870
55.6k
  ia_env_extr_tables_struct *env_extr_tables_ptr =
871
55.6k
      ptr_sbr_tables->env_extr_tables_ptr;
872
55.6k
  IA_ERRORCODE err = IA_NO_ERROR;
873
874
55.6k
  ptr_frame_data->coupling_mode = COUPLING_OFF;
875
876
55.6k
  if (!usac_flag) {
877
10.4k
    bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
878
879
10.4k
    if (bit) ixheaacd_read_bits_buf(it_bit_buff, SBR_SCE_RESERV_BITS);
880
10.4k
    if (audio_object_type == AOT_ER_AAC_ELD ||
881
5.62k
        audio_object_type == AOT_ER_AAC_LD) {
882
4.81k
      if (ptr_frame_data->eld_sbr_flag == 1) {
883
4.81k
        err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data);
884
4.81k
        if (err) return err;
885
4.81k
      }
886
5.62k
    } else {
887
5.62k
      if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
888
5.62k
                                            env_extr_tables_ptr,
889
5.62k
                                            ptr_header_data->num_time_slots))
890
891
153
        return 0;
892
5.62k
    }
893
10.2k
    if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
894
10.2k
                                      ptr_header_data->num_time_slots,
895
10.2k
                                      audio_object_type))
896
39
      return 0;
897
898
45.1k
  } else {
899
45.1k
    if (hbe_flag) {
900
31.9k
      ptr_frame_data->sbr_patching_mode =
901
31.9k
          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
902
31.9k
      if (ptr_frame_data->sbr_patching_mode == 0) {
903
16.3k
        ptr_frame_data->over_sampling_flag =
904
16.3k
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
905
16.3k
        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
906
2.10k
          ptr_frame_data->pitch_in_bins =
907
2.10k
              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
908
14.2k
        else
909
14.2k
          ptr_frame_data->pitch_in_bins = 0;
910
16.3k
      } else {
911
15.6k
        ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0;
912
15.6k
      }
913
31.9k
    }
914
45.1k
    ptr_frame_data->num_time_slots = ptr_header_data->num_time_slots;
915
45.1k
    if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
916
45.1k
                                          env_extr_tables_ptr,
917
45.1k
                                          ptr_header_data->num_time_slots))
918
30
      return 0;
919
920
45.1k
    if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
921
45.1k
                                      ptr_header_data->num_time_slots,
922
45.1k
                                      audio_object_type))
923
24
      return 0;
924
925
45.1k
    ptr_frame_data->prev_sbr_mode = ORIG_SBR;
926
45.1k
  }
927
928
55.3k
  ixheaacd_sbr_env_dtdf_data(ptr_frame_data, it_bit_buff,
929
55.3k
                             ptr_header_data->usac_flag);
930
931
55.3k
  if (ptr_frame_data->del_cod_dir_arr[0] == DTDF_DIR_FREQ) {
932
38.9k
    ptr_header_data->err_flag = 0;
933
38.9k
  }
934
935
184k
  for (i = 0; i < num_if_bands; i++) {
936
129k
    ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
937
129k
    ptr_frame_data->sbr_invf_mode[i] =
938
129k
        ixheaacd_read_bits_buf(it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
939
129k
  }
940
941
55.3k
  if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data, it_bit_buff,
942
55.3k
                                  env_extr_tables_ptr, audio_object_type))
943
0
    return 0;
944
945
55.3k
  ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data,
946
55.3k
                                     it_bit_buff, env_extr_tables_ptr);
947
948
55.3k
  if (usac_flag) {
949
45.0k
    memset(
950
45.0k
        ptr_frame_data->add_harmonics, 0,
951
45.0k
        ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
952
45.0k
    ptr_frame_data->coupling_mode = COUPLING_OFF;
953
45.0k
  }
954
955
55.3k
  bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
956
55.3k
  if (bit) {
957
15.0k
    ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data, it_bit_buff);
958
40.2k
  } else {
959
40.2k
    memset(ptr_frame_data->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
960
40.2k
  }
961
962
55.3k
  if (!usac_flag) {
963
10.2k
    IA_ERRORCODE err =
964
10.2k
        ixheaacd_read_extn_data(ptr_header_data, ptr_ps_dec, it_bit_buff,
965
10.2k
                                ptr_sbr_tables->ps_tables_ptr, ptr_frame_data, SBR_ID_SCE);
966
10.2k
    if (err == IA_FATAL_ERROR) {
967
2
      if (ec_flag)
968
0
        return 0;
969
2
      else
970
2
        return err;
971
2
    }
972
10.2k
  }
973
974
55.3k
  return 1;
975
55.3k
}
976
977
IA_ERRORCODE ixheaacd_sbr_read_cpe(
978
    ia_sbr_header_data_struct *ptr_header_data,
979
    ia_sbr_frame_info_data_struct **ptr_frame_data,
980
    ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables,
981
70.7k
    WORD audio_object_type) {
982
70.7k
  WORD32 i, k, bit, num_ch = 2;
983
70.7k
  WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands;
984
70.7k
  WORD32 hbe_flag = ptr_header_data->hbe_flag;
985
70.7k
  WORD32 usac_flag = ptr_header_data->usac_flag;
986
70.7k
  IA_ERRORCODE err = IA_NO_ERROR;
987
70.7k
  ia_env_extr_tables_struct *env_extr_tables_ptr =
988
70.7k
      ptr_sbr_tables->env_extr_tables_ptr;
989
70.7k
  bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
990
991
70.7k
  if (usac_flag) {
992
49.8k
    if (bit) {
993
19.9k
      if (hbe_flag) {
994
9.74k
        ptr_frame_data[0]->sbr_patching_mode =
995
9.74k
            ptr_frame_data[1]->sbr_patching_mode =
996
9.74k
                ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
997
9.74k
        if (ptr_frame_data[0]->sbr_patching_mode == 0) {
998
6.14k
          ptr_frame_data[0]->over_sampling_flag =
999
6.14k
              ptr_frame_data[1]->over_sampling_flag = ixheaacd_read_bits_buf(
1000
6.14k
                  it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
1001
6.14k
          if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
1002
417
            ptr_frame_data[0]->pitch_in_bins =
1003
417
                ptr_frame_data[1]->pitch_in_bins =
1004
417
                    ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
1005
5.73k
          else
1006
5.73k
            ptr_frame_data[0]->pitch_in_bins =
1007
5.73k
                ptr_frame_data[1]->pitch_in_bins = 0;
1008
6.14k
        } else {
1009
3.59k
          ptr_frame_data[0]->over_sampling_flag = 0;
1010
3.59k
          ptr_frame_data[1]->over_sampling_flag = 0;
1011
3.59k
          ptr_frame_data[0]->pitch_in_bins = 0;
1012
3.59k
          ptr_frame_data[1]->pitch_in_bins = 0;
1013
3.59k
        }
1014
9.74k
      }
1015
19.9k
      ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL;
1016
19.9k
      ptr_frame_data[1]->coupling_mode = COUPLING_BAL;
1017
29.9k
    } else {
1018
29.9k
      if (hbe_flag) {
1019
19.4k
        ptr_frame_data[0]->sbr_patching_mode =
1020
19.4k
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
1021
19.4k
        if (ptr_frame_data[0]->sbr_patching_mode == 0) {
1022
14.2k
          ptr_frame_data[0]->over_sampling_flag =
1023
14.2k
              ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
1024
14.2k
          if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
1025
3.94k
            ptr_frame_data[0]->pitch_in_bins =
1026
3.94k
                ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
1027
10.3k
          else
1028
10.3k
            ptr_frame_data[0]->pitch_in_bins = 0;
1029
14.2k
        } else {
1030
5.19k
          ptr_frame_data[0]->over_sampling_flag = 0;
1031
5.19k
          ptr_frame_data[0]->pitch_in_bins = 0;
1032
5.19k
        }
1033
19.4k
        ptr_frame_data[1]->sbr_patching_mode =
1034
19.4k
            ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
1035
19.4k
        if (ptr_frame_data[1]->sbr_patching_mode == 0) {
1036
10.8k
          ptr_frame_data[1]->over_sampling_flag =
1037
10.8k
              ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
1038
10.8k
          if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
1039
4.27k
            ptr_frame_data[1]->pitch_in_bins =
1040
4.27k
                ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
1041
6.56k
          else
1042
6.56k
            ptr_frame_data[1]->pitch_in_bins = 0;
1043
10.8k
        } else {
1044
8.64k
          ptr_frame_data[1]->over_sampling_flag =
1045
8.64k
              ptr_frame_data[1]->pitch_in_bins = 0;
1046
8.64k
        }
1047
19.4k
      }
1048
1049
29.9k
      ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
1050
29.9k
      ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
1051
29.9k
    }
1052
49.8k
  } else {
1053
20.8k
    if (bit) {
1054
6.09k
      ixheaacd_read_bits_buf(it_bit_buff,
1055
6.09k
                             SBR_SCE_RESERV_BITS + SBR_SCE_RESERV_BITS);
1056
6.09k
    }
1057
20.8k
    if ((audio_object_type != AOT_ER_AAC_ELD) &&
1058
37
        (ptr_header_data->channel_mode != SBR_STEREO)) {
1059
0
      ptr_header_data->sync_state = UPSAMPLING;
1060
0
      return 0;
1061
0
    }
1062
1063
20.8k
    bit = ixheaacd_read_bits_buf(it_bit_buff, SBR_COUPLNG_MODE_BITS);
1064
1065
20.8k
    if (bit) {
1066
6.60k
      ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL;
1067
6.60k
      ptr_frame_data[1]->coupling_mode = COUPLING_BAL;
1068
14.2k
    } else {
1069
14.2k
      ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
1070
14.2k
      ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
1071
14.2k
    }
1072
20.8k
  }
1073
1074
185k
  for (i = 0; i < num_ch; i++) {
1075
114k
    ptr_frame_data[i]->num_time_slots = ptr_header_data->num_time_slots;
1076
114k
    if (audio_object_type == AOT_ER_AAC_ELD ||
1077
79.8k
        audio_object_type == AOT_ER_AAC_LD) {
1078
35.1k
      if (ptr_frame_data[i]->eld_sbr_flag == 1) {
1079
35.1k
        err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data[i]);
1080
35.1k
        if (err) return err;
1081
35.1k
      }
1082
79.8k
    } else {
1083
79.8k
      if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data[i],
1084
79.8k
                                            env_extr_tables_ptr,
1085
79.8k
                                            ptr_header_data->num_time_slots))
1086
33
        return 0;
1087
79.8k
    }
1088
1089
114k
    if (!ixheaacd_validate_frame_info(
1090
114k
            &ptr_frame_data[i]->str_frame_info_details,
1091
114k
            ptr_header_data->num_time_slots, audio_object_type))
1092
29
      return 0;
1093
1094
114k
    if (ptr_frame_data[0]->coupling_mode) {
1095
26.5k
      memcpy(&ptr_frame_data[1]->str_frame_info_details,
1096
26.5k
             &ptr_frame_data[0]->str_frame_info_details,
1097
26.5k
             sizeof(ia_frame_info_struct));
1098
26.5k
      if (audio_object_type == AOT_ER_AAC_ELD ||
1099
19.9k
          audio_object_type == AOT_ER_AAC_LD) {
1100
6.59k
        ptr_frame_data[1]->amp_res = ptr_frame_data[0]->amp_res;
1101
6.59k
      }
1102
26.5k
      num_ch = 1;
1103
26.5k
    }
1104
114k
  }
1105
1106
70.7k
  if (ptr_frame_data[0]->coupling_mode && usac_flag) {
1107
19.9k
    ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff,
1108
19.9k
                               ptr_header_data->usac_flag);
1109
19.9k
    ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff,
1110
19.9k
                               ptr_header_data->usac_flag);
1111
1112
64.2k
    for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_if_bands; i++) {
1113
44.2k
      ptr_frame_data[0]->sbr_invf_mode_prev[i] =
1114
44.2k
          ptr_frame_data[0]->sbr_invf_mode[i];
1115
44.2k
      ptr_frame_data[1]->sbr_invf_mode_prev[i] =
1116
44.2k
          ptr_frame_data[1]->sbr_invf_mode[i];
1117
1118
44.2k
      ptr_frame_data[0]->sbr_invf_mode[i] =
1119
44.2k
          ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
1120
44.2k
      ptr_frame_data[1]->sbr_invf_mode[i] = ptr_frame_data[0]->sbr_invf_mode[i];
1121
44.2k
    }
1122
1123
19.9k
    if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
1124
19.9k
                                    it_bit_buff, env_extr_tables_ptr,
1125
19.9k
                                    audio_object_type)) {
1126
0
      return 0;
1127
0
    }
1128
19.9k
    ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
1129
19.9k
                                       it_bit_buff, env_extr_tables_ptr);
1130
1131
19.9k
    if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
1132
19.9k
                                    it_bit_buff, env_extr_tables_ptr,
1133
19.9k
                                    audio_object_type)) {
1134
0
      return 0;
1135
0
    }
1136
19.9k
    ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1],
1137
19.9k
                                       it_bit_buff, env_extr_tables_ptr);
1138
1139
19.9k
    memset(
1140
19.9k
        ptr_frame_data[0]->add_harmonics, 0,
1141
19.9k
        ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
1142
19.9k
    memset(
1143
19.9k
        ptr_frame_data[1]->add_harmonics, 0,
1144
19.9k
        ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
1145
1146
50.7k
  } else {
1147
50.7k
    ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff,
1148
50.7k
                               ptr_header_data->usac_flag);
1149
50.7k
    ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff,
1150
50.7k
                               ptr_header_data->usac_flag);
1151
1152
50.7k
    if ((ptr_frame_data[0]->del_cod_dir_arr[0] == DTDF_DIR_FREQ) &&
1153
31.5k
        (ptr_frame_data[1]->del_cod_dir_arr[0] == DTDF_DIR_FREQ)) {
1154
22.9k
      ptr_header_data->err_flag = 0;
1155
22.9k
    }
1156
1157
145k
    for (k = 0; k < num_ch; k++) {
1158
320k
      for (i = 0; i < num_if_bands; i++) {
1159
225k
        ptr_frame_data[k]->sbr_invf_mode_prev[i] =
1160
225k
            ptr_frame_data[k]->sbr_invf_mode[i];
1161
225k
        ptr_frame_data[k]->sbr_invf_mode[i] = ixheaacd_read_bits_buf(
1162
225k
            it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
1163
225k
      }
1164
94.9k
    }
1165
1166
50.7k
    if (ptr_frame_data[0]->coupling_mode) {
1167
6.60k
      memcpy(ptr_frame_data[1]->sbr_invf_mode_prev, ptr_frame_data[1]->sbr_invf_mode,
1168
6.60k
             sizeof(ptr_frame_data[1]->sbr_invf_mode_prev[0]) * num_if_bands);
1169
6.60k
      memcpy(ptr_frame_data[1]->sbr_invf_mode, ptr_frame_data[0]->sbr_invf_mode,
1170
6.60k
             sizeof(WORD32) * num_if_bands);
1171
1172
6.60k
      if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
1173
6.60k
                                      it_bit_buff, env_extr_tables_ptr,
1174
6.60k
                                      audio_object_type)) {
1175
0
        return 0;
1176
0
      }
1177
1178
6.60k
      ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
1179
6.60k
                                         it_bit_buff, env_extr_tables_ptr);
1180
1181
6.60k
      if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
1182
6.60k
                                      it_bit_buff, env_extr_tables_ptr,
1183
6.60k
                                      audio_object_type)) {
1184
0
        return 0;
1185
0
      }
1186
44.1k
    } else {
1187
44.1k
      if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
1188
44.1k
                                      it_bit_buff, env_extr_tables_ptr,
1189
44.1k
                                      audio_object_type))
1190
0
        return 0;
1191
1192
44.1k
      if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
1193
44.1k
                                      it_bit_buff, env_extr_tables_ptr,
1194
44.1k
                                      audio_object_type))
1195
0
        return 0;
1196
1197
44.1k
      ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
1198
44.1k
                                         it_bit_buff, env_extr_tables_ptr);
1199
44.1k
    }
1200
50.7k
    ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1],
1201
50.7k
                                       it_bit_buff, env_extr_tables_ptr);
1202
50.7k
  }
1203
1204
70.7k
  bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
1205
70.7k
  if (bit) {
1206
20.2k
    ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[0],
1207
20.2k
                                 it_bit_buff);
1208
50.4k
  } else {
1209
50.4k
    memset(ptr_frame_data[0]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
1210
50.4k
  }
1211
1212
70.7k
  bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
1213
70.7k
  if (bit) {
1214
20.5k
    ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[1],
1215
20.5k
                                 it_bit_buff);
1216
50.1k
  } else {
1217
50.1k
    memset(ptr_frame_data[1]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
1218
50.1k
  }
1219
1220
70.7k
  if (!usac_flag) {
1221
20.6k
    IA_ERRORCODE err =
1222
20.6k
        ixheaacd_read_extn_data(ptr_header_data, NULL, it_bit_buff, ptr_sbr_tables->ps_tables_ptr,
1223
20.6k
                                (VOID *)ptr_frame_data, SBR_ID_CPE);
1224
20.6k
    if (err == IA_FATAL_ERROR) {
1225
0
      return err;
1226
0
    }
1227
20.6k
  }
1228
70.7k
  return 1;
1229
70.7k
}
1230
1231
VOID ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
1232
                                ia_bit_buf_struct *it_bit_buff,
1233
196k
                                WORD32 usac_flag) {
1234
196k
  WORD32 i;
1235
196k
  WORD32 num_env = ptr_frame_data->str_frame_info_details.num_env;
1236
196k
  WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env;
1237
196k
  WORD16 *p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr;
1238
196k
  WORD16 *p_coding_dir_noise_vec = ptr_frame_data->del_cod_dir_noise_arr;
1239
196k
  WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
1240
1241
196k
  if (usac_flag) {
1242
144k
    if (usac_independency_flag) {
1243
3.49k
      *p_coding_dir_vec = 0;
1244
3.49k
      p_coding_dir_vec++;
1245
141k
    } else {
1246
141k
      *p_coding_dir_vec =
1247
141k
          (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1248
141k
      p_coding_dir_vec++;
1249
141k
    }
1250
262k
    for (i = num_env - 1; i >= 1; i--) {
1251
118k
      *p_coding_dir_vec++ =
1252
118k
          (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1253
118k
    }
1254
144k
    if (usac_independency_flag) {
1255
3.49k
      *p_coding_dir_noise_vec = 0;
1256
3.49k
      p_coding_dir_noise_vec++;
1257
141k
    } else {
1258
141k
      *p_coding_dir_noise_vec =
1259
141k
          (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1260
141k
      p_coding_dir_noise_vec++;
1261
141k
    }
1262
207k
    for (i = num_noise_env - 1; i >= 1; i--) {
1263
62.6k
      *p_coding_dir_noise_vec++ =
1264
62.6k
          (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1265
62.6k
    }
1266
144k
  } else {
1267
194k
    for (i = num_env - 1; i >= 0; i--) {
1268
143k
      *p_coding_dir_vec++ =
1269
143k
          (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1270
143k
    }
1271
1272
138k
    for (i = num_noise_env - 1; i >= 0; i--) {
1273
86.8k
      *p_coding_dir_noise_vec++ =
1274
86.8k
          (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1275
86.8k
    }
1276
51.9k
  }
1277
196k
}
1278
1279
VOID ixheaacd_read_env_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
1280
                            ia_bit_buf_struct *it_bit_buff,
1281
                            ia_huffman_data_type hcb_t,
1282
                            ia_huffman_data_type hcb_f, WORD32 *idx_t,
1283
                            WORD32 *idx_f, WORD16 *no_band, WORD32 num_env,
1284
                            WORD32 env_data_tbl_comp_factor, WORD32 start_bits,
1285
                            WORD32 start_bits_balance, WORD32 num_noise_env,
1286
458k
                            WORD32 lav, WORD32 usac_flag) {
1287
458k
  WORD32 j, i, ixheaacd_drc_offset = 0,
1288
458k
               coupling_mode = ptr_frame_data->coupling_mode, delta, bits,
1289
458k
               shift;
1290
458k
  WORD16 *p_coding_dir_vec, *p_sbr_sf;
1291
458k
  WORD16 index, length;
1292
458k
  WORD32 readword;
1293
458k
  FLOAT32 *p_sbr_sf_float;
1294
1295
458k
  if (num_noise_env) {
1296
261k
    p_coding_dir_vec = ptr_frame_data->del_cod_dir_noise_arr;
1297
261k
    p_sbr_sf = ptr_frame_data->int_noise_floor;
1298
261k
    p_sbr_sf_float = ptr_frame_data->flt_noise_floor;
1299
261k
  } else {
1300
196k
    p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr;
1301
196k
    p_sbr_sf = ptr_frame_data->int_env_sf_arr;
1302
196k
    p_sbr_sf_float = ptr_frame_data->flt_env_sf_arr;
1303
196k
  }
1304
1305
458k
  if (coupling_mode == COUPLING_BAL) {
1306
53.0k
    bits = start_bits_balance;
1307
53.0k
    shift = env_data_tbl_comp_factor;
1308
1309
405k
  } else {
1310
405k
    bits = start_bits;
1311
405k
    shift = 0;
1312
405k
  }
1313
1314
1.26M
  for (j = 0; j < num_env; j++) {
1315
806k
    ia_huffman_data_type h;
1316
806k
    const WORD32 *idx_tab;
1317
806k
    WORD32 dtdf_dir_flag = p_coding_dir_vec[j];
1318
1319
806k
    if (dtdf_dir_flag == DTDF_DIR_FREQ) {
1320
524k
      p_sbr_sf[ixheaacd_drc_offset] =
1321
524k
          (WORD16)(ixheaacd_read_bits_buf(it_bit_buff, bits) << shift);
1322
524k
      p_sbr_sf_float[ixheaacd_drc_offset] = p_sbr_sf[ixheaacd_drc_offset];
1323
524k
      h = hcb_f;
1324
524k
      idx_tab = idx_f;
1325
524k
    } else {
1326
281k
      h = hcb_t;
1327
281k
      idx_tab = idx_t;
1328
281k
    }
1329
1330
5.19M
    for (i = (1 - dtdf_dir_flag); i < no_band[j]; i++) {
1331
4.39M
      if (it_bit_buff->cnt_bits < 20) {
1332
2.23k
        readword = ixheaacd_show_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
1333
2.23k
        readword = readword << (32 - it_bit_buff->cnt_bits);
1334
4.38M
      } else {
1335
4.38M
        readword = ixheaacd_show_bits_buf(it_bit_buff, 20);
1336
4.38M
        readword = readword << 12;
1337
4.38M
      }
1338
4.39M
      ixheaacd_huffman_decode(readword, &index, &length, (const UWORD16 *)h,
1339
4.39M
                              (const UWORD32 *)idx_tab);
1340
4.39M
      delta = index - lav;
1341
4.39M
      ixheaacd_read_bits_buf(it_bit_buff, length);
1342
4.39M
      p_sbr_sf[ixheaacd_drc_offset + i] =
1343
4.39M
          (WORD16)(delta << env_data_tbl_comp_factor);
1344
4.39M
      p_sbr_sf_float[ixheaacd_drc_offset + i] =
1345
4.39M
          p_sbr_sf[ixheaacd_drc_offset + i];
1346
4.39M
    }
1347
806k
    if (usac_flag && (num_noise_env == 0)) {
1348
262k
      ptr_frame_data->inter_temp_shape_mode[j] = 0;
1349
262k
      if (ptr_frame_data->inter_tes_flag) {
1350
51.7k
        WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
1351
51.7k
        if (flag) {
1352
10.6k
          ptr_frame_data->inter_temp_shape_mode[j] =
1353
10.6k
              ixheaacd_read_bits_buf(it_bit_buff, 2);
1354
10.6k
        }
1355
51.7k
      }
1356
262k
    }
1357
806k
    ixheaacd_drc_offset += (no_band[j]);
1358
806k
  }
1359
458k
}
1360
1361
VOID ixheaacd_read_sbr_noise_floor_data(
1362
    ia_sbr_header_data_struct *ptr_header_data,
1363
    ia_sbr_frame_info_data_struct *ptr_frame_data,
1364
    ia_bit_buf_struct *it_bit_buff,
1365
261k
    ia_env_extr_tables_struct *env_extr_tables_ptr) {
1366
261k
  WORD32 i;
1367
261k
  WORD32 coupling_mode;
1368
261k
  WORD16 num_noise_bands[MAX_NOISE_ENVELOPES];
1369
261k
  ia_huffman_data_type hcb_noise_env;
1370
261k
  ia_huffman_data_type hcb_noise;
1371
261k
  WORD32 *idx_noise_env;
1372
261k
  WORD32 *idx_noise;
1373
261k
  WORD32 lav;
1374
261k
  WORD32 env_data_tbl_comp_factor;
1375
1376
261k
  WORD32 start_bits;
1377
261k
  WORD32 start_bits_balance;
1378
261k
  WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env;
1379
1380
662k
  for (i = 0; i < num_noise_env; i++)
1381
400k
    num_noise_bands[i] = ptr_header_data->pstr_freq_band_data->num_nf_bands;
1382
1383
261k
  start_bits = SBR_BEGIN_NOISE_BITS_AMPLITUDE_RESOLUTION_3_0;
1384
261k
  start_bits_balance = SBR_BEGIN_NOISE_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0;
1385
1386
261k
  coupling_mode = ptr_frame_data->coupling_mode;
1387
1388
261k
  if (coupling_mode == COUPLING_BAL) {
1389
26.4k
    lav = 12;
1390
26.4k
    hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr
1391
26.4k
                    ->ixheaacd_t_huffman_noise_bal_3_0db_inp_table;
1392
26.4k
    idx_noise =
1393
26.4k
        env_extr_tables_ptr->ixheaacd_t_huffman_noise_bal_3_0db_idx_table;
1394
26.4k
    hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr
1395
26.4k
                        ->ixheaacd_f_huffman_env_bal_3_0db_inp_table;
1396
26.4k
    idx_noise_env =
1397
26.4k
        env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table;
1398
26.4k
    env_data_tbl_comp_factor = 1;
1399
235k
  } else {
1400
235k
    lav = 31;
1401
235k
    hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr
1402
235k
                    ->ixheaacd_t_huffman_noise_3_0db_inp_table;
1403
235k
    idx_noise = env_extr_tables_ptr->ixheaacd_t_huffman_noise_3_0db_idx_table;
1404
235k
    hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr
1405
235k
                        ->ixheaacd_f_huffman_env_3_0db_inp_table;
1406
235k
    idx_noise_env = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table;
1407
235k
    env_data_tbl_comp_factor = 0;
1408
235k
  }
1409
1410
261k
  ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_noise, hcb_noise_env,
1411
261k
                         idx_noise, idx_noise_env, &num_noise_bands[0],
1412
261k
                         num_noise_env, env_data_tbl_comp_factor, start_bits,
1413
261k
                         start_bits_balance, 1, lav,
1414
261k
                         ptr_header_data->usac_flag);
1415
261k
}
1416
1417
WORD16 ixheaacd_read_sbr_env_data(
1418
    ia_sbr_header_data_struct *ptr_header_data,
1419
    ia_sbr_frame_info_data_struct *ptr_frame_data,
1420
    ia_bit_buf_struct *it_bit_buff,
1421
196k
    ia_env_extr_tables_struct *env_extr_tables_ptr, WORD audio_object_type) {
1422
196k
  WORD32 coupling_mode = ptr_frame_data->coupling_mode;
1423
196k
  WORD32 *idx_t, *idx_f;
1424
196k
  WORD32 lav;
1425
196k
  WORD32 i;
1426
196k
  WORD16 no_band[MAX_ENVELOPES];
1427
196k
  WORD32 amp_res, num_env, env_data_tbl_comp_factor, start_bits,
1428
196k
      start_bits_balance;
1429
196k
  WORD16 *p_freq_res = ptr_frame_data->str_frame_info_details.freq_res;
1430
196k
  WORD16 *p_num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
1431
196k
  ia_huffman_data_type hcb_t, hcb_f;
1432
1433
196k
  amp_res = ptr_header_data->amp_res;
1434
196k
  num_env = ptr_frame_data->str_frame_info_details.num_env;
1435
1436
196k
  ptr_frame_data->num_env_sfac = 0;
1437
1438
196k
  if ((ptr_frame_data->str_frame_info_details.frame_class == FIXFIX) &&
1439
125k
      (num_env == 1)) {
1440
74.0k
    if (audio_object_type != AOT_ER_AAC_ELD &&
1441
58.6k
        audio_object_type != AOT_ER_AAC_LD) {
1442
58.6k
      amp_res = SBR_AMPLITUDE_RESOLUTION_1_5;
1443
58.6k
    } else {
1444
15.3k
      amp_res = ptr_frame_data->amp_res;
1445
15.3k
    }
1446
74.0k
  }
1447
196k
  ptr_frame_data->amp_res = amp_res;
1448
1449
196k
  if (amp_res == SBR_AMPLITUDE_RESOLUTION_3_0) {
1450
53.0k
    start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_3_0;
1451
53.0k
    start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0;
1452
143k
  } else {
1453
143k
    start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_1_5;
1454
143k
    start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_1_5;
1455
143k
  }
1456
1457
602k
  for (i = 0; i < num_env; i++) {
1458
405k
    no_band[i] = p_num_sf_bands[*p_freq_res++];
1459
405k
    ptr_frame_data->num_env_sfac =
1460
405k
        ixheaac_add16(ptr_frame_data->num_env_sfac, no_band[i]);
1461
405k
  }
1462
1463
196k
  if (ptr_frame_data->num_env_sfac > MAX_NUM_ENVELOPE_VALUES) return 0;
1464
1465
196k
  if (coupling_mode == COUPLING_BAL) {
1466
26.5k
    env_data_tbl_comp_factor = 1;
1467
1468
26.5k
    if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) {
1469
17.1k
      lav = 24;
1470
17.1k
      hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1471
17.1k
                  ->ixheaacd_t_huffman_env_bal_1_5db_inp_table;
1472
17.1k
      idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_1_5db_idx_table;
1473
17.1k
      hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1474
17.1k
                  ->ixheaacd_f_huffman_env_bal_1_5db_inp_table;
1475
17.1k
      idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_1_5db_idx_table;
1476
17.1k
    } else {
1477
9.34k
      lav = 12;
1478
9.34k
      hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1479
9.34k
                  ->ixheaacd_t_huffman_env_bal_3_0db_inp_table;
1480
9.34k
      idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_3_0db_idx_table;
1481
9.34k
      hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1482
9.34k
                  ->ixheaacd_f_huffman_env_bal_3_0db_inp_table;
1483
9.34k
      idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table;
1484
9.34k
    }
1485
170k
  } else {
1486
170k
    env_data_tbl_comp_factor = 0;
1487
1488
170k
    if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) {
1489
126k
      lav = 60;
1490
126k
      hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1491
126k
                  ->ixheaacd_t_huffman_env_1_5db_inp_table;
1492
126k
      idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_1_5db_idx_table;
1493
126k
      hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1494
126k
                  ->ixheaacd_f_huffman_env_1_5db_inp_table;
1495
126k
      idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_1_5db_idx_table;
1496
126k
    } else {
1497
43.6k
      lav = 31;
1498
43.6k
      hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1499
43.6k
                  ->ixheaacd_t_huffman_env_3_0db_inp_table;
1500
43.6k
      idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_3_0db_idx_table;
1501
43.6k
      hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1502
43.6k
                  ->ixheaacd_f_huffman_env_3_0db_inp_table;
1503
43.6k
      idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table;
1504
43.6k
    }
1505
170k
  }
1506
1507
196k
  ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_t, hcb_f, idx_t,
1508
196k
                         idx_f, &no_band[0], num_env, env_data_tbl_comp_factor,
1509
196k
                         start_bits, start_bits_balance, 0, lav,
1510
196k
                         ptr_header_data->usac_flag);
1511
1512
196k
  return 1;
1513
196k
}
1514
1515
IA_ERRORCODE ixheaacd_extract_frame_info_ld(
1516
    ia_bit_buf_struct *it_bit_buff,
1517
39.9k
    ia_sbr_frame_info_data_struct *h_frame_data) {
1518
39.9k
  int abs_bord_lead = 0, num_rel_lead = 0, bs_num_env = 0,
1519
39.9k
      frame_class, temp, env, k, abs_bord_trail = 0, middle_bord = 0,
1520
39.9k
      bs_num_noise, transient_env_temp = 0, bs_transient_position = 0;
1521
1522
39.9k
  IA_ERRORCODE err = IA_NO_ERROR;
1523
39.9k
  WORD16 time_border[MAX_ENVELOPES + 1];
1524
39.9k
  WORD16 time_border_noise[2 + 1];
1525
39.9k
  WORD16 f[MAX_ENVELOPES + 1];
1526
39.9k
  int rel_bord_lead[7] = {0};
1527
1528
39.9k
  ia_frame_info_struct *v_frame_info = &h_frame_data->str_frame_info_details;
1529
1530
39.9k
  int numTimeSlots = h_frame_data->num_time_slots;
1531
1532
39.9k
  v_frame_info->frame_class = frame_class =
1533
39.9k
      ixheaacd_read_bits_buf(it_bit_buff, SBRLD_CLA_BITS);
1534
1535
39.9k
  switch (frame_class) {
1536
27.1k
    case FIXFIX:
1537
27.1k
      temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS);
1538
27.1k
      bs_num_env = 1 << temp;
1539
1540
27.1k
      if (bs_num_env == 1)
1541
14.6k
        h_frame_data->amp_res =
1542
14.6k
            ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS);
1543
1544
27.1k
      f[0] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS);
1545
1546
71.1k
      for (env = 1; env < bs_num_env; env++) f[env] = f[0];
1547
27.1k
      break;
1548
12.7k
    case LD_TRAN:
1549
12.7k
      bs_transient_position =
1550
12.7k
          ixheaacd_read_bits_buf(it_bit_buff, SBR_TRAN_BITS);
1551
12.7k
      v_frame_info->frame_class = 0;
1552
12.7k
      if ((numTimeSlots != 16) && (bs_transient_position >= LD_ENV_TBL_480)) {
1553
5
        return -1;
1554
5
      }
1555
12.7k
      bs_num_env = (numTimeSlots == 16)
1556
12.7k
                       ? ixheaacd_ld_env_table_512[bs_transient_position]
1557
8.47k
                                                  [SBR_ENVT_NUMENV]
1558
12.7k
                       : ixheaacd_ld_env_table_480[bs_transient_position]
1559
4.30k
                                                  [SBR_ENVT_NUMENV];
1560
47.0k
      for (env = 0; env < bs_num_env; env++)
1561
34.2k
        f[env] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS);
1562
12.7k
      break;
1563
39.9k
  }
1564
1565
39.9k
  switch (frame_class) {
1566
27.1k
    case FIXFIX:
1567
27.1k
      abs_bord_lead = 0;
1568
27.1k
      abs_bord_trail = numTimeSlots;
1569
27.1k
      num_rel_lead = bs_num_env - 1;
1570
1571
71.1k
      for (k = 0; k < num_rel_lead; k++) {
1572
44.0k
        rel_bord_lead[k] = ixheaacd_ld_env_table_time_slot[num_rel_lead - 1];
1573
44.0k
      }
1574
1575
27.1k
      time_border[0] = abs_bord_lead;
1576
27.1k
      time_border[bs_num_env] = abs_bord_trail;
1577
71.1k
      for (env = 1; env <= num_rel_lead; env++) {
1578
44.0k
        time_border[env] = abs_bord_lead;
1579
192k
        for (k = 0; k <= env - 1; k++) time_border[env] += rel_bord_lead[k];
1580
44.0k
      }
1581
27.1k
      break;
1582
1583
12.7k
    case LD_TRAN:
1584
12.7k
      time_border[0] = 0;
1585
12.7k
      time_border[bs_num_env] = numTimeSlots;
1586
34.2k
      for (k = 1; k < bs_num_env; k++)
1587
21.4k
        time_border[k] =
1588
21.4k
            (numTimeSlots == 16)
1589
21.4k
                ? ixheaacd_ld_env_table_512[bs_transient_position][k]
1590
21.4k
                : ixheaacd_ld_env_table_480[bs_transient_position][k];
1591
12.7k
      break;
1592
1593
0
    default:
1594
0
      time_border[0] = 0;
1595
1596
0
      break;
1597
39.9k
  };
1598
1599
39.9k
  switch (frame_class) {
1600
27.1k
    case FIXFIX:
1601
27.1k
      middle_bord = bs_num_env / 2;
1602
27.1k
      break;
1603
12.7k
    case LD_TRAN:
1604
12.7k
      middle_bord = 1;
1605
12.7k
      break;
1606
39.9k
  };
1607
1608
39.9k
  time_border_noise[0] = time_border[0];
1609
39.9k
  if (bs_num_env > 1) {
1610
25.2k
    time_border_noise[1] = time_border[middle_bord];
1611
25.2k
    time_border_noise[2] = time_border[bs_num_env];
1612
25.2k
    bs_num_noise = 2;
1613
25.2k
  } else {
1614
14.6k
    time_border_noise[1] = time_border[bs_num_env];
1615
14.6k
    bs_num_noise = 1;
1616
14.6k
  }
1617
1618
39.9k
  switch (frame_class) {
1619
27.1k
    case FIXFIX:
1620
27.1k
      transient_env_temp = -1;
1621
27.1k
      break;
1622
12.7k
    case LD_TRAN:
1623
12.7k
      transient_env_temp =
1624
12.7k
          (numTimeSlots == 16)
1625
12.7k
              ? ixheaacd_ld_env_table_512[bs_transient_position]
1626
8.47k
                                         [SBR_ENVT_TRANIDX]
1627
12.7k
              : ixheaacd_ld_env_table_480[bs_transient_position]
1628
4.30k
                                         [SBR_ENVT_TRANIDX];
1629
12.7k
      break;
1630
39.9k
  };
1631
1632
39.9k
  v_frame_info->num_env = bs_num_env;
1633
39.9k
  memcpy(v_frame_info->border_vec, time_border,
1634
39.9k
         (bs_num_env + 1) * sizeof(WORD16));
1635
39.9k
  memcpy(v_frame_info->freq_res, f, bs_num_env * sizeof(WORD16));
1636
39.9k
  v_frame_info->transient_env = transient_env_temp;
1637
39.9k
  v_frame_info->num_noise_env = bs_num_noise;
1638
39.9k
  memcpy(v_frame_info->noise_border_vec, time_border_noise,
1639
39.9k
         (bs_num_noise + 1) * sizeof(WORD16));
1640
1641
39.9k
  return err;
1642
39.9k
}
1643
1644
WORD32 ixheaacd_pvc_time_freq_grid_info(
1645
    ia_bit_buf_struct *it_bit_buff,
1646
65.5k
    ia_sbr_frame_info_data_struct *ptr_frame_data) {
1647
65.5k
  WORD32 bs_num_env = 0, bs_num_noise = 0;
1648
65.5k
  WORD32 time_border[MAX_ENVELOPES + 1];
1649
65.5k
  WORD32 time_border_noise[2 + 1];
1650
65.5k
  WORD32 pvc_time_border[MAX_ENVELOPES + 1];
1651
65.5k
  WORD32 pvc_time_border_noise[2 + 1];
1652
65.5k
  WORD32 bs_freq_res[MAX_ENVELOPES + 1];
1653
65.5k
  WORD32 var_len;
1654
65.5k
  ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1655
65.5k
  ia_frame_info_struct *pvc_frame_info = &ptr_frame_data->str_pvc_frame_info;
1656
65.5k
  WORD32 i;
1657
65.5k
  WORD32 prev_sbr_mode = ptr_frame_data->prev_sbr_mode;
1658
1659
65.5k
  WORD32 tmp;
1660
65.5k
  WORD32 bs_noise_pos;
1661
65.5k
  bs_noise_pos = ixheaacd_read_bits_buf(it_bit_buff, 4);
1662
1663
65.5k
  tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
1664
65.5k
  if (tmp == 0) {
1665
56.0k
    ptr_frame_data->var_len = 0;
1666
56.0k
  } else {
1667
9.51k
    tmp = ixheaacd_read_bits_buf(it_bit_buff, 2);
1668
9.51k
    ptr_frame_data->var_len = tmp + 1;
1669
9.51k
    if (ptr_frame_data->var_len > 3) {
1670
18
      return -1;
1671
18
    }
1672
9.51k
  }
1673
65.5k
  var_len = ptr_frame_data->var_len;
1674
1675
65.5k
  if (p_frame_info->num_env > 0) {
1676
65.2k
    time_border[0] = p_frame_info->border_vec[p_frame_info->num_env] - 16;
1677
65.2k
  } else {
1678
333
    time_border[0] = 0;
1679
333
  }
1680
65.5k
  if (time_border[0] < 0) return -1;
1681
65.5k
  pvc_time_border[0] = 0;
1682
65.5k
  bs_freq_res[0] = 0;
1683
1684
65.5k
  if (ptr_frame_data->prev_sbr_mode == 0) {
1685
332
    pvc_time_border[0] = time_border[0];
1686
332
  }
1687
1688
65.5k
  if (bs_noise_pos == 0) {
1689
23.8k
    time_border[1] = 16 + var_len;
1690
23.8k
    pvc_time_border[1] = 16;
1691
23.8k
    bs_num_noise = 1;
1692
23.8k
    bs_num_env = 1;
1693
41.7k
  } else {
1694
41.7k
    time_border[1] = bs_noise_pos;
1695
41.7k
    pvc_time_border[1] = bs_noise_pos;
1696
41.7k
    time_border[2] = 16 + var_len;
1697
41.7k
    pvc_time_border[2] = 16;
1698
41.7k
    bs_freq_res[1] = 0;
1699
41.7k
    bs_num_noise = 2;
1700
41.7k
    bs_num_env = 2;
1701
41.7k
  }
1702
1703
262k
  for (i = 0; i < 3; i++) {
1704
196k
    time_border_noise[i] = time_border[i];
1705
196k
    pvc_time_border_noise[i] = pvc_time_border[i];
1706
196k
  }
1707
1708
65.5k
  if (prev_sbr_mode == ORIG_SBR) {
1709
1.11k
    pvc_time_border[0] = time_border[0];
1710
1.11k
    pvc_time_border_noise[0] = time_border[0];
1711
1.11k
  }
1712
1713
65.5k
  pvc_frame_info->num_env = bs_num_env;
1714
238k
  for (i = 0; i < (bs_num_env + 1); i++) {
1715
172k
    pvc_frame_info->border_vec[i] = pvc_time_border[i];
1716
172k
  }
1717
172k
  for (i = 0; i < (bs_num_env); i++) {
1718
107k
    pvc_frame_info->freq_res[i] = bs_freq_res[i];
1719
107k
  }
1720
65.5k
  pvc_frame_info->transient_env = -1;
1721
65.5k
  pvc_frame_info->num_noise_env = bs_num_noise;
1722
238k
  for (i = 0; i < (bs_num_noise + 1); i++) {
1723
172k
    pvc_frame_info->noise_border_vec[i] = pvc_time_border_noise[i];
1724
172k
  }
1725
65.5k
  p_frame_info->num_env = bs_num_env;
1726
238k
  for (i = 0; i < (bs_num_env + 1); i++) {
1727
172k
    p_frame_info->border_vec[i] = time_border[i];
1728
172k
  }
1729
172k
  for (i = 0; i < (bs_num_env); i++) {
1730
107k
    p_frame_info->freq_res[i] = bs_freq_res[i];
1731
107k
  }
1732
65.5k
  p_frame_info->transient_env = -1;
1733
65.5k
  p_frame_info->num_noise_env = bs_num_noise;
1734
238k
  for (i = 0; i < (bs_num_noise + 1); i++) {
1735
172k
    p_frame_info->noise_border_vec[i] = time_border_noise[i];
1736
172k
  }
1737
65.5k
  return 0;
1738
65.5k
}
1739
1740
WORD16 ixheaacd_sbr_time_freq_grid_info(
1741
    ia_bit_buf_struct *it_bit_buff,
1742
    ia_sbr_frame_info_data_struct *ptr_frame_data,
1743
130k
    ia_env_extr_tables_struct *env_extr_tables_ptr, WORD16 number_of_time_slots) {
1744
130k
  WORD32 i, k, bs_num_rel = 0;
1745
130k
  WORD32 bs_pointer_bits = 0, bs_num_env = 0, border, bs_pointer,
1746
130k
         bs_var_bord = 0, temp = 0;
1747
130k
  WORD32 freq_res_0 = 0, frame_class;
1748
130k
  WORD32 abs_bord_lead, abs_bord_trail, num_rel_trail, num_rel_lead;
1749
130k
  static const WORD32 pointer_bits_array[7] = {1, 2, 2, 3, 3, 3, 3};
1750
130k
  ia_frame_info_struct *p_fixfix_tab;
1751
130k
  ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1752
1753
130k
  frame_class = ixheaacd_read_bits_buf(it_bit_buff, SBR_FRAME_CLASS_BITS);
1754
130k
  p_frame_info->frame_class = frame_class;
1755
1756
130k
  switch (frame_class) {
1757
69.6k
    case FIXFIX:
1758
69.6k
      temp =
1759
69.6k
          ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS + SBR_FRQ_RES_BITS);
1760
69.6k
      bs_num_env = (temp & 0x6) >> SBR_FRQ_RES_BITS;
1761
1762
69.6k
      if (number_of_time_slots != 15) {
1763
69.6k
        p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env];
1764
69.6k
      } else {
1765
3
        if (bs_num_env > 2) return 0;
1766
3
        p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env + 4];
1767
3
      }
1768
1769
69.6k
      memcpy(p_frame_info, p_fixfix_tab, sizeof(ia_frame_info_struct));
1770
69.6k
      bs_num_env = (1 << bs_num_env);
1771
69.6k
      freq_res_0 = temp & 0x1;
1772
1773
69.6k
      if (!freq_res_0) {
1774
55.2k
        memset(&p_frame_info->freq_res[0], 0, sizeof(WORD16) * bs_num_env);
1775
55.2k
      }
1776
69.6k
      break;
1777
28.3k
    case FIXVAR:
1778
28.3k
      bs_var_bord =
1779
28.3k
          ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS);
1780
28.3k
      bs_num_rel = bs_var_bord & 3;
1781
28.3k
      bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
1782
28.3k
      bs_num_env = bs_num_rel + 1;
1783
28.3k
      p_frame_info->border_vec[0] = 0;
1784
1785
28.3k
      if (number_of_time_slots != 15) {
1786
28.3k
        border = bs_var_bord + SBR_TIME_SLOTS;
1787
28.3k
      } else {
1788
2
        border = bs_var_bord + number_of_time_slots;
1789
2
      }
1790
1791
28.3k
      p_frame_info->border_vec[bs_num_env] = border;
1792
63.3k
      for (k = bs_num_rel; k > 0; k--) {
1793
34.9k
        temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1794
34.9k
        border = border - ((temp << 1) + 2);
1795
34.9k
        if (border < 0) border = 0;
1796
34.9k
        p_frame_info->border_vec[k] = border;
1797
34.9k
      }
1798
1799
28.3k
      bs_pointer_bits = pointer_bits_array[bs_num_rel];
1800
28.3k
      bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
1801
1802
28.3k
      if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0;
1803
1804
91.0k
      for (k = bs_num_rel; k >= 0; k--) {
1805
62.7k
        p_frame_info->freq_res[k] =
1806
62.7k
            ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
1807
62.7k
      }
1808
28.2k
      if (bs_pointer) {
1809
10.1k
        p_frame_info->transient_env = bs_num_env + 1 - bs_pointer;
1810
18.1k
      } else {
1811
18.1k
        p_frame_info->transient_env = -1;
1812
18.1k
      }
1813
28.2k
      if ((bs_pointer == 0) || (bs_pointer == 1))
1814
24.1k
        p_frame_info->noise_border_vec[1] =
1815
24.1k
            p_frame_info->border_vec[bs_num_rel];
1816
4.05k
      else
1817
4.05k
        p_frame_info->noise_border_vec[1] =
1818
4.05k
            p_frame_info->border_vec[p_frame_info->transient_env];
1819
1820
28.2k
      break;
1821
1822
26.3k
    case VARFIX:
1823
26.3k
      bs_var_bord =
1824
26.3k
          ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS);
1825
26.3k
      bs_num_rel = bs_var_bord & 3;
1826
26.3k
      bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
1827
26.3k
      bs_num_env = bs_num_rel + 1;
1828
1829
26.3k
      border = bs_var_bord;
1830
26.3k
      p_frame_info->border_vec[0] = border;
1831
43.5k
      for (k = 1; k <= bs_num_rel; k++) {
1832
17.2k
        temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1833
17.2k
        border = border + ((temp << 1) + 2);
1834
1835
17.2k
        if (number_of_time_slots != 15) {
1836
17.2k
          if (border > SBR_TIME_SLOTS) border = SBR_TIME_SLOTS;
1837
17.2k
        } else {
1838
0
          if (border > number_of_time_slots) border = number_of_time_slots;
1839
0
        }
1840
1841
17.2k
        p_frame_info->border_vec[k] = border;
1842
17.2k
      }
1843
1844
26.3k
      if (number_of_time_slots != 15) {
1845
26.3k
        p_frame_info->border_vec[k] = SBR_TIME_SLOTS;
1846
26.3k
      } else {
1847
1
        p_frame_info->border_vec[k] = number_of_time_slots;
1848
1
      }
1849
1850
26.3k
      bs_pointer_bits = pointer_bits_array[bs_num_rel];
1851
1852
26.3k
      bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
1853
1854
26.3k
      if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0;
1855
1856
26.3k
      if (bs_pointer == 0 || (bs_pointer - 1) == 0) {
1857
16.7k
        p_frame_info->transient_env = -1;
1858
16.7k
      } else {
1859
9.58k
        p_frame_info->transient_env = bs_pointer - 1;
1860
9.58k
      }
1861
1862
69.9k
      for (k = 0; k <= bs_num_rel; k++) {
1863
43.5k
        p_frame_info->freq_res[k] =
1864
43.5k
            ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
1865
43.5k
      }
1866
1867
26.3k
      switch (bs_pointer) {
1868
12.8k
        case 0:
1869
12.8k
          p_frame_info->noise_border_vec[1] = p_frame_info->border_vec[1];
1870
12.8k
          break;
1871
3.91k
        case 1:
1872
3.91k
          p_frame_info->noise_border_vec[1] =
1873
3.91k
              p_frame_info->border_vec[bs_num_rel];
1874
3.91k
          break;
1875
9.58k
        default:
1876
9.58k
          p_frame_info->noise_border_vec[1] =
1877
9.58k
              p_frame_info->border_vec[(WORD32)p_frame_info->transient_env];
1878
9.58k
          break;
1879
26.3k
      }
1880
1881
26.3k
      break;
1882
1883
26.3k
    case VARVAR:
1884
6.19k
      abs_bord_lead = ixheaacd_read_bits_buf(
1885
6.19k
          it_bit_buff, 2 * SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
1886
1887
6.19k
      if (number_of_time_slots != 15) {
1888
6.18k
        abs_bord_trail =
1889
6.18k
          (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + SBR_TIME_SLOTS);
1890
6.18k
      } else {
1891
2
        abs_bord_trail =
1892
2
          (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + number_of_time_slots);
1893
2
      }
1894
1895
6.19k
      num_rel_trail = ((abs_bord_lead & 0xc) >> SBR_NUM_BITS);
1896
6.19k
      num_rel_lead = (abs_bord_lead & 0x3);
1897
6.19k
      abs_bord_lead = abs_bord_lead >> (SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
1898
6.19k
      bs_num_env = ((num_rel_trail + num_rel_lead) + 1);
1899
6.19k
      border = abs_bord_lead;
1900
6.19k
      p_frame_info->border_vec[0] = border;
1901
1902
16.8k
      for (k = 1; k <= num_rel_trail; k++) {
1903
10.6k
        temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1904
10.6k
        border = border + ((temp << 1) + 2);
1905
10.6k
        p_frame_info->border_vec[k] = border;
1906
10.6k
      }
1907
1908
6.19k
      border = abs_bord_trail;
1909
6.19k
      i = bs_num_env;
1910
1911
6.19k
      p_frame_info->border_vec[i] = border;
1912
1913
16.7k
      for (k = 0; k < num_rel_lead; k++) {
1914
10.5k
        temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1915
10.5k
        border = border - ((temp << 1) + 2);
1916
10.5k
        i--;
1917
10.5k
        p_frame_info->border_vec[i] = border;
1918
10.5k
      }
1919
6.19k
      bs_pointer_bits = pointer_bits_array[num_rel_trail + num_rel_lead];
1920
1921
6.19k
      bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
1922
6.19k
      if ((bs_pointer - ((num_rel_trail + num_rel_lead) + 1)) > 0) return 0;
1923
1924
6.13k
      if (bs_pointer) {
1925
2.91k
        p_frame_info->transient_env = bs_num_env + 1 - bs_pointer;
1926
3.22k
      } else {
1927
3.22k
        p_frame_info->transient_env = -1;
1928
3.22k
      }
1929
1930
33.3k
      for (k = 0; k < bs_num_env; k++) {
1931
27.2k
        p_frame_info->freq_res[k] =
1932
27.2k
            ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
1933
27.2k
      }
1934
6.13k
      p_frame_info->noise_border_vec[0] = abs_bord_lead;
1935
6.13k
      if (bs_num_env == 1) {
1936
616
        p_frame_info->noise_border_vec[1] = abs_bord_trail;
1937
5.52k
      } else {
1938
5.52k
        if (bs_pointer == 0 || (bs_pointer - 1) == 0)
1939
3.04k
          p_frame_info->noise_border_vec[1] =
1940
3.04k
              p_frame_info->border_vec[bs_num_env - 1];
1941
2.48k
        else
1942
2.48k
          p_frame_info->noise_border_vec[1] =
1943
2.48k
              p_frame_info->border_vec[(WORD32)p_frame_info->transient_env];
1944
1945
5.52k
        p_frame_info->noise_border_vec[2] = abs_bord_trail;
1946
5.52k
      }
1947
6.13k
      break;
1948
130k
  }
1949
130k
  p_frame_info->num_env = bs_num_env;
1950
1951
130k
  if (bs_num_env == 1)
1952
78.3k
    p_frame_info->num_noise_env = 1;
1953
52.0k
  else
1954
52.0k
    p_frame_info->num_noise_env = 2;
1955
1956
130k
  if (frame_class == VARFIX || frame_class == FIXVAR) {
1957
54.5k
    p_frame_info->noise_border_vec[0] = p_frame_info->border_vec[0];
1958
54.5k
    p_frame_info->noise_border_vec[p_frame_info->num_noise_env] =
1959
54.5k
        p_frame_info->border_vec[bs_num_env];
1960
54.5k
  }
1961
130k
  return 1;
1962
130k
}