Coverage Report

Created: 2025-10-10 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_longblock.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 "ixheaacd_sbr_common.h"
21
#include "ixheaac_type_def.h"
22
#include "ixheaac_constants.h"
23
#include "ixheaac_basic_ops32.h"
24
#include "ixheaac_basic_ops16.h"
25
#include "ixheaac_basic_ops40.h"
26
#include "ixheaac_basic_ops.h"
27
28
#include "ixheaacd_defines.h"
29
#include "ixheaacd_aac_rom.h"
30
#include "ixheaacd_aac_imdct.h"
31
#include "ixheaacd_bitbuffer.h"
32
#include "ixheaac_basic_op.h"
33
#include "ixheaacd_intrinsics.h"
34
35
#include "ixheaacd_pulsedata.h"
36
37
#include "ixheaacd_pns.h"
38
#include "ixheaacd_common_rom.h"
39
#include "ixheaacd_drc_data_struct.h"
40
41
#include "ixheaacd_lt_predict.h"
42
#include "ixheaacd_cnst.h"
43
#include "ixheaacd_ec_defines.h"
44
#include "ixheaacd_ec_struct_def.h"
45
#include "ixheaacd_channelinfo.h"
46
#include "ixheaacd_drc_dec.h"
47
48
#include "ixheaacd_block.h"
49
#include "ixheaacd_channel.h"
50
51
#include "ixheaacd_pulsedata.h"
52
#include "ixheaacd_pns.h"
53
#include "ixheaacd_sbrdecoder.h"
54
#include "ixheaacd_error_codes.h"
55
#include "ixheaacd_audioobjtypes.h"
56
#include "ixheaacd_latmdemux.h"
57
#include "ixheaacd_aacdec.h"
58
59
294k
#define LONG_BLOCK_SECT_LEN 5
60
53.0k
#define SHORT_BLOCK_SECT_LEN 3
61
62
IA_ERRORCODE ixheaacd_read_section_data(
63
    ia_bit_buf_struct *it_bit_buff,
64
    ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
65
    WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag,
66
294k
    ia_aac_dec_tables_struct *ptr_aac_tables) {
67
294k
  WORD sfb;
68
294k
  WORD sect_cb;
69
294k
  WORD sect_len;
70
294k
  WORD sect_len_incr;
71
294k
  WORD sect_esc_val;
72
294k
  ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
73
294k
  WORD max_sfb = ptr_ics_info->max_sfb;
74
294k
  WORD num_win_group;
75
76
294k
  WORD8 *ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
77
294k
  WORD8 *ptr_code_book_temp = ptr_code_book;
78
294k
  WORD32 sect_bitlen = LONG_BLOCK_SECT_LEN;
79
294k
  int num_lines_sec_idx = 0, top;
80
294k
  short *ptr_num_sect_lines =
81
294k
      ptr_aac_dec_channel_info->num_line_in_sec4_hcr_arr;
82
294k
  UWORD8 *ptr_hcr_code_book = ptr_aac_dec_channel_info->cb4_hcr_arr;
83
294k
  const short *band_offsets = (WORD16 *)ixheaacd_getscalefactorbandoffsets(
84
294k
      &(ptr_aac_dec_channel_info->str_ics_info), ptr_aac_tables);
85
294k
  ptr_aac_dec_channel_info->number_sect = 0;
86
87
294k
  if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
88
294k
      EIGHT_SHORT_SEQUENCE) {
89
53.0k
    sect_bitlen = SHORT_BLOCK_SECT_LEN;
90
53.0k
  }
91
92
294k
  sect_esc_val = (1 << sect_bitlen) - 1;
93
94
747k
  for (num_win_group = 0; num_win_group < ptr_ics_info->num_window_groups;
95
455k
       num_win_group++) {
96
455k
    sfb = 0;
97
98
1.68M
    while (sfb < max_sfb) {
99
1.23M
      sect_len = 0;
100
1.23M
      if (aac_sect_data_resil_flag) {
101
755k
        sect_cb = ixheaacd_read_bits_buf(it_bit_buff, 5);
102
755k
      } else {
103
475k
        sect_cb = ixheaacd_read_bits_buf(it_bit_buff, 4);
104
475k
      }
105
106
1.23M
      if ((aac_sect_data_resil_flag == 0) ||
107
756k
          ((sect_cb < 11) || ((sect_cb > 11) && (sect_cb < 16)))) {
108
756k
        sect_len_incr = ixheaacd_read_bits_buf(it_bit_buff, sect_bitlen);
109
774k
        while (sect_len_incr == sect_esc_val) {
110
18.6k
          sect_len = (sect_len + sect_esc_val);
111
18.6k
          sect_len_incr = ixheaacd_read_bits_buf(it_bit_buff, sect_bitlen);
112
18.6k
        }
113
756k
      } else
114
474k
        sect_len_incr = 1;
115
116
1.23M
      sect_len = (sect_len + sect_len_incr);
117
118
1.23M
      if (aac_spect_data_resil_flag) {
119
550k
        top = (sfb + sect_len);
120
550k
        if ((num_lines_sec_idx >= MAX_SFB_HCR) ||
121
550k
            (top >= MAX_SCALE_FACTOR_BANDS_LONG)) {
122
34
          return -1;
123
34
        }
124
550k
        ptr_num_sect_lines[num_lines_sec_idx] =
125
550k
            band_offsets[top] - band_offsets[sfb];
126
550k
        num_lines_sec_idx++;
127
550k
        if (sect_cb == (ESC_HCB + 1)) {
128
76
          return IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK;
129
549k
        } else {
130
549k
          *ptr_hcr_code_book++ = sect_cb;
131
549k
        }
132
549k
        ptr_aac_dec_channel_info->number_sect++;
133
549k
      }
134
135
1.23M
      sfb = (sfb + sect_len);
136
1.23M
      if (sfb > max_sfb) {
137
1.51k
        return (WORD16)(
138
1.51k
            (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED);
139
1.51k
      }
140
1.22M
      if (sect_cb == (ESC_HCB + 1)) {
141
73
        return (WORD16)(
142
73
            (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK);
143
73
      }
144
145
5.25M
      while (sect_len--) {
146
4.02M
        *ptr_code_book_temp++ = sect_cb;
147
4.02M
      }
148
1.22M
    }
149
453k
    ptr_code_book += MAX_SCALE_FACTOR_BANDS_SHORT;
150
453k
    ptr_code_book_temp = ptr_code_book;
151
453k
  }
152
153
292k
  return AAC_DEC_OK;
154
294k
}
155
156
VOID ixheaacd_read_scale_factor_data(
157
    ia_bit_buf_struct *it_bit_buff,
158
    ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
159
216k
    ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 object_type) {
160
216k
  WORD sfb;
161
216k
  WORD16 position = 0;
162
216k
  WORD num_win_group;
163
216k
  WORD16 factor = ptr_aac_dec_channel_info->global_gain;
164
216k
  WORD8 *ptr_code_book, *ptr_code_book_short;
165
216k
  WORD16 *ptr_scale_fact, *ptr_scale_fact_short;
166
216k
  WORD16 norm_value;
167
216k
  WORD16 index, length;
168
216k
  const UWORD16 *hcod_sf =
169
216k
      ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl;
170
216k
  const UWORD32 *table_idx =
171
216k
      ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl_index;
172
173
216k
  WORD start_bit_pos = it_bit_buff->bit_pos;
174
216k
  UWORD8 *start_read_pos = it_bit_buff->ptr_read_next;
175
216k
  UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
176
216k
  WORD32 bit_pos = 7 - it_bit_buff->bit_pos;
177
216k
  WORD32 read_word;
178
216k
  WORD32 increment;
179
216k
  read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
180
216k
                                       &increment);
181
216k
  ptr_read_next += increment;
182
183
216k
  ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
184
185
216k
  ptr_scale_fact = ptr_aac_dec_channel_info->ptr_scale_factor;
186
187
216k
  for (num_win_group = 0;
188
582k
       num_win_group < ptr_aac_dec_channel_info->str_ics_info.num_window_groups;
189
366k
       num_win_group++) {
190
366k
    ptr_code_book_short =
191
366k
        &ptr_code_book[num_win_group * MAX_SCALE_FACTOR_BANDS_SHORT];
192
366k
    ptr_scale_fact_short =
193
366k
        &ptr_scale_fact[num_win_group * MAX_SCALE_FACTOR_BANDS_SHORT];
194
3.32M
    for (sfb = ptr_aac_dec_channel_info->str_ics_info.max_sfb - 1; sfb >= 0;
195
2.96M
         sfb--) {
196
2.96M
      WORD32 sfb_cb = *ptr_code_book_short++;
197
2.96M
      if (sfb_cb == ZERO_HCB)
198
651k
        *ptr_scale_fact_short++ = 0;
199
2.31M
      else {
200
2.31M
        {
201
2.31M
          WORD32 pns_present = 0;
202
2.31M
          WORD pns_band;
203
204
2.31M
          ia_pns_info_struct *ptr_pns_info =
205
2.31M
              &ptr_aac_dec_channel_info->str_pns_info;
206
207
2.31M
          if (sfb_cb == NOISE_HCB && (ptr_pns_info->pns_active != 1)) {
208
15.0k
            pns_present = 1;
209
15.0k
          }
210
211
2.31M
          if (!pns_present) {
212
2.29M
            UWORD32 read_word1;
213
214
2.29M
            read_word1 = read_word << bit_pos;
215
216
2.29M
            ixheaacd_huffman_decode(read_word1, &index, &length, hcod_sf,
217
2.29M
                                    table_idx);
218
219
2.29M
            bit_pos += length;
220
2.29M
            ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
221
2.29M
                                        it_bit_buff->ptr_bit_buf_end);
222
223
2.29M
            ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
224
2.29M
                                         it_bit_buff->ptr_bit_buf_end);
225
226
2.29M
            norm_value = index - 60;
227
2.29M
          }
228
229
15.0k
          else {
230
15.0k
            WORD32 noise_start_value;
231
15.0k
            UWORD32 temp;
232
233
15.0k
            temp = (read_word << bit_pos);
234
15.0k
            temp = ((UWORD32)temp >> (32 - 9));
235
15.0k
            noise_start_value = temp;
236
15.0k
            bit_pos += 9;
237
238
15.0k
            ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
239
15.0k
                                         it_bit_buff->ptr_bit_buf_end);
240
241
15.0k
            norm_value = noise_start_value - 256;
242
15.0k
            ptr_pns_info->pns_active = 1;
243
244
15.0k
            ptr_pns_info->noise_energy =
245
15.0k
                ptr_aac_dec_channel_info->global_gain - NOISE_OFFSET;
246
15.0k
          }
247
248
2.31M
          if ((object_type != AOT_ER_AAC_ELD) &&
249
2.19M
              (object_type != AOT_ER_AAC_LD) && (object_type != AOT_ER_AAC_LC)) {
250
123k
            if (sfb_cb > NOISE_HCB) {
251
12.4k
              position = position + norm_value;
252
12.4k
              *ptr_scale_fact_short++ = -position;
253
111k
            } else if (sfb_cb < NOISE_HCB) {
254
69.1k
              factor = factor + norm_value;
255
69.1k
              *ptr_scale_fact_short++ = factor;
256
69.1k
            } else {
257
42.0k
              ptr_pns_info->noise_energy =
258
42.0k
                  ixheaac_add16_sat(ptr_pns_info->noise_energy, norm_value);
259
260
42.0k
              pns_band = (num_win_group << 4) +
261
42.0k
                         ptr_aac_dec_channel_info->str_ics_info.max_sfb - sfb -
262
42.0k
                         1;
263
42.0k
              ptr_aac_dec_channel_info->ptr_scale_factor[pns_band] =
264
42.0k
                  ptr_pns_info->noise_energy;
265
266
42.0k
              ptr_pns_info->pns_used[pns_band] = 1;
267
42.0k
              ptr_scale_fact_short++;
268
42.0k
            }
269
2.18M
          } else {
270
2.18M
            if ((sfb_cb == INTENSITY_HCB) || (sfb_cb == INTENSITY_HCB2)) {
271
253k
              position = position + norm_value;
272
253k
              *ptr_scale_fact_short++ = -position;
273
1.93M
            } else if (sfb_cb == NOISE_HCB) {
274
51.2k
              ptr_pns_info->noise_energy =
275
51.2k
                  ixheaac_add16_sat(ptr_pns_info->noise_energy, norm_value);
276
277
51.2k
              pns_band = (num_win_group << 4) +
278
51.2k
                         ptr_aac_dec_channel_info->str_ics_info.max_sfb - sfb -
279
51.2k
                         1;
280
51.2k
              ptr_aac_dec_channel_info->ptr_scale_factor[pns_band] =
281
51.2k
                  ptr_pns_info->noise_energy;
282
283
51.2k
              ptr_pns_info->pns_used[pns_band] = 1;
284
51.2k
              ptr_scale_fact_short++;
285
286
1.88M
            } else {
287
1.88M
              factor = factor + norm_value;
288
1.88M
              *ptr_scale_fact_short++ = factor;
289
1.88M
            }
290
2.18M
          }
291
2.31M
        }
292
2.31M
      }
293
2.96M
    }
294
366k
  }
295
296
216k
  it_bit_buff->ptr_read_next = ptr_read_next - increment;
297
298
216k
  it_bit_buff->bit_pos = 7 - bit_pos;
299
216k
  {
300
216k
    WORD bits_consumed;
301
216k
    bits_consumed =
302
216k
        (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
303
216k
               (start_bit_pos - it_bit_buff->bit_pos));
304
216k
    it_bit_buff->cnt_bits -= bits_consumed;
305
216k
  }
306
216k
}