Coverage Report

Created: 2025-10-10 06:12

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