Coverage Report

Created: 2026-02-07 06:17

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