xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_longblock.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 #define LONG_BLOCK_SECT_LEN 5
60 #define SHORT_BLOCK_SECT_LEN 3
61 
ixheaacd_read_section_data(ia_bit_buf_struct * it_bit_buff,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,WORD32 aac_spect_data_resil_flag,WORD32 aac_sect_data_resil_flag,ia_aac_dec_tables_struct * ptr_aac_tables)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     ia_aac_dec_tables_struct *ptr_aac_tables) {
67   WORD sfb;
68   WORD sect_cb;
69   WORD sect_len;
70   WORD sect_len_incr;
71   WORD sect_esc_val;
72   ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
73   WORD max_sfb = ptr_ics_info->max_sfb;
74   WORD num_win_group;
75 
76   WORD8 *ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
77   WORD8 *ptr_code_book_temp = ptr_code_book;
78   WORD32 sect_bitlen = LONG_BLOCK_SECT_LEN;
79   int num_lines_sec_idx = 0, top;
80   short *ptr_num_sect_lines =
81       ptr_aac_dec_channel_info->num_line_in_sec4_hcr_arr;
82   UWORD8 *ptr_hcr_code_book = ptr_aac_dec_channel_info->cb4_hcr_arr;
83   const short *band_offsets = (WORD16 *)ixheaacd_getscalefactorbandoffsets(
84       &(ptr_aac_dec_channel_info->str_ics_info), ptr_aac_tables);
85   ptr_aac_dec_channel_info->number_sect = 0;
86 
87   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
88       EIGHT_SHORT_SEQUENCE) {
89     sect_bitlen = SHORT_BLOCK_SECT_LEN;
90   }
91 
92   sect_esc_val = (1 << sect_bitlen) - 1;
93 
94   for (num_win_group = 0; num_win_group < ptr_ics_info->num_window_groups;
95        num_win_group++) {
96     sfb = 0;
97 
98     while (sfb < max_sfb) {
99       sect_len = 0;
100       if (aac_sect_data_resil_flag) {
101         sect_cb = ixheaacd_read_bits_buf(it_bit_buff, 5);
102       } else {
103         sect_cb = ixheaacd_read_bits_buf(it_bit_buff, 4);
104       }
105 
106       if ((aac_sect_data_resil_flag == 0) ||
107           ((sect_cb < 11) || ((sect_cb > 11) && (sect_cb < 16)))) {
108         sect_len_incr = ixheaacd_read_bits_buf(it_bit_buff, sect_bitlen);
109         while (sect_len_incr == sect_esc_val) {
110           sect_len = (sect_len + sect_esc_val);
111           sect_len_incr = ixheaacd_read_bits_buf(it_bit_buff, sect_bitlen);
112         }
113       } else
114         sect_len_incr = 1;
115 
116       sect_len = (sect_len + sect_len_incr);
117 
118       if (aac_spect_data_resil_flag) {
119         top = (sfb + sect_len);
120         if ((num_lines_sec_idx >= MAX_SFB_HCR) ||
121             (top >= MAX_SCALE_FACTOR_BANDS_LONG)) {
122           return -1;
123         }
124         ptr_num_sect_lines[num_lines_sec_idx] =
125             band_offsets[top] - band_offsets[sfb];
126         num_lines_sec_idx++;
127         if (sect_cb == (ESC_HCB + 1)) {
128           return IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK;
129         } else {
130           *ptr_hcr_code_book++ = sect_cb;
131         }
132         ptr_aac_dec_channel_info->number_sect++;
133       }
134 
135       sfb = (sfb + sect_len);
136       if (sfb > max_sfb) {
137         return (WORD16)(
138             (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED);
139       }
140       if (sect_cb == (ESC_HCB + 1)) {
141         return (WORD16)(
142             (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK);
143       }
144 
145       while (sect_len--) {
146         *ptr_code_book_temp++ = sect_cb;
147       }
148     }
149     ptr_code_book += MAX_SCALE_FACTOR_BANDS_SHORT;
150     ptr_code_book_temp = ptr_code_book;
151   }
152 
153   return AAC_DEC_OK;
154 }
155 
ixheaacd_read_scale_factor_data(ia_bit_buf_struct * it_bit_buff,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_aac_dec_tables_struct * ptr_aac_tables,WORD32 object_type)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     ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 object_type) {
160   WORD sfb;
161   WORD16 position = 0;
162   WORD num_win_group;
163   WORD16 factor = ptr_aac_dec_channel_info->global_gain;
164   WORD8 *ptr_code_book, *ptr_code_book_short;
165   WORD16 *ptr_scale_fact, *ptr_scale_fact_short;
166   WORD16 norm_value;
167   WORD16 index, length;
168   const UWORD16 *hcod_sf =
169       ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl;
170   const UWORD32 *table_idx =
171       ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl_index;
172 
173   WORD start_bit_pos = it_bit_buff->bit_pos;
174   UWORD8 *start_read_pos = it_bit_buff->ptr_read_next;
175   UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
176   WORD32 bit_pos = 7 - it_bit_buff->bit_pos;
177   WORD32 read_word;
178   WORD32 increment;
179   read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
180                                        &increment);
181   ptr_read_next += increment;
182 
183   ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
184 
185   ptr_scale_fact = ptr_aac_dec_channel_info->ptr_scale_factor;
186 
187   for (num_win_group = 0;
188        num_win_group < ptr_aac_dec_channel_info->str_ics_info.num_window_groups;
189        num_win_group++) {
190     ptr_code_book_short =
191         &ptr_code_book[num_win_group * MAX_SCALE_FACTOR_BANDS_SHORT];
192     ptr_scale_fact_short =
193         &ptr_scale_fact[num_win_group * MAX_SCALE_FACTOR_BANDS_SHORT];
194     for (sfb = ptr_aac_dec_channel_info->str_ics_info.max_sfb - 1; sfb >= 0;
195          sfb--) {
196       WORD32 sfb_cb = *ptr_code_book_short++;
197       if (sfb_cb == ZERO_HCB)
198         *ptr_scale_fact_short++ = 0;
199       else {
200         {
201           WORD32 pns_present = 0;
202           WORD pns_band;
203 
204           ia_pns_info_struct *ptr_pns_info =
205               &ptr_aac_dec_channel_info->str_pns_info;
206 
207           if (sfb_cb == NOISE_HCB && (ptr_pns_info->pns_active != 1)) {
208             pns_present = 1;
209           }
210 
211           if (!pns_present) {
212             UWORD32 read_word1;
213 
214             read_word1 = read_word << bit_pos;
215 
216             ixheaacd_huffman_decode(read_word1, &index, &length, hcod_sf,
217                                     table_idx);
218 
219             bit_pos += length;
220             ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
221                                         it_bit_buff->ptr_bit_buf_end);
222 
223             ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
224                                          it_bit_buff->ptr_bit_buf_end);
225 
226             norm_value = index - 60;
227           }
228 
229           else {
230             WORD32 noise_start_value;
231             UWORD32 temp;
232 
233             temp = (read_word << bit_pos);
234             temp = ((UWORD32)temp >> (32 - 9));
235             noise_start_value = temp;
236             bit_pos += 9;
237 
238             ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
239                                          it_bit_buff->ptr_bit_buf_end);
240 
241             norm_value = noise_start_value - 256;
242             ptr_pns_info->pns_active = 1;
243 
244             ptr_pns_info->noise_energy =
245                 ptr_aac_dec_channel_info->global_gain - NOISE_OFFSET;
246           }
247 
248           if ((object_type != AOT_ER_AAC_ELD) &&
249               (object_type != AOT_ER_AAC_LD) && (object_type != AOT_ER_AAC_LC)) {
250             if (sfb_cb > NOISE_HCB) {
251               position = position + norm_value;
252               *ptr_scale_fact_short++ = -position;
253             } else if (sfb_cb < NOISE_HCB) {
254               factor = factor + norm_value;
255               *ptr_scale_fact_short++ = factor;
256             } else {
257               ptr_pns_info->noise_energy =
258                   ixheaac_add16_sat(ptr_pns_info->noise_energy, norm_value);
259 
260               pns_band = (num_win_group << 4) +
261                          ptr_aac_dec_channel_info->str_ics_info.max_sfb - sfb -
262                          1;
263               ptr_aac_dec_channel_info->ptr_scale_factor[pns_band] =
264                   ptr_pns_info->noise_energy;
265 
266               ptr_pns_info->pns_used[pns_band] = 1;
267               ptr_scale_fact_short++;
268             }
269           } else {
270             if ((sfb_cb == INTENSITY_HCB) || (sfb_cb == INTENSITY_HCB2)) {
271               position = position + norm_value;
272               *ptr_scale_fact_short++ = -position;
273             } else if (sfb_cb == NOISE_HCB) {
274               ptr_pns_info->noise_energy =
275                   ixheaac_add16_sat(ptr_pns_info->noise_energy, norm_value);
276 
277               pns_band = (num_win_group << 4) +
278                          ptr_aac_dec_channel_info->str_ics_info.max_sfb - sfb -
279                          1;
280               ptr_aac_dec_channel_info->ptr_scale_factor[pns_band] =
281                   ptr_pns_info->noise_energy;
282 
283               ptr_pns_info->pns_used[pns_band] = 1;
284               ptr_scale_fact_short++;
285 
286             } else {
287               factor = factor + norm_value;
288               *ptr_scale_fact_short++ = factor;
289             }
290           }
291         }
292       }
293     }
294   }
295 
296   it_bit_buff->ptr_read_next = ptr_read_next - increment;
297 
298   it_bit_buff->bit_pos = 7 - bit_pos;
299   {
300     WORD bits_consumed;
301     bits_consumed =
302         (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
303                (start_bit_pos - it_bit_buff->bit_pos));
304     it_bit_buff->cnt_bits -= bits_consumed;
305   }
306 }
307