Coverage Report

Created: 2025-12-14 07:13

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