xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_longblock.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
27*15dc779aSAndroid Build Coastguard Worker 
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_imdct.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
34*15dc779aSAndroid Build Coastguard Worker 
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
36*15dc779aSAndroid Build Coastguard Worker 
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
40*15dc779aSAndroid Build Coastguard Worker 
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
47*15dc779aSAndroid Build Coastguard Worker 
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
50*15dc779aSAndroid Build Coastguard Worker 
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker #define LONG_BLOCK_SECT_LEN 5
60*15dc779aSAndroid Build Coastguard Worker #define SHORT_BLOCK_SECT_LEN 3
61*15dc779aSAndroid Build Coastguard Worker 
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*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_read_section_data(
63*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
64*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
65*15dc779aSAndroid Build Coastguard Worker     WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag,
66*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_tables_struct *ptr_aac_tables) {
67*15dc779aSAndroid Build Coastguard Worker   WORD sfb;
68*15dc779aSAndroid Build Coastguard Worker   WORD sect_cb;
69*15dc779aSAndroid Build Coastguard Worker   WORD sect_len;
70*15dc779aSAndroid Build Coastguard Worker   WORD sect_len_incr;
71*15dc779aSAndroid Build Coastguard Worker   WORD sect_esc_val;
72*15dc779aSAndroid Build Coastguard Worker   ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
73*15dc779aSAndroid Build Coastguard Worker   WORD max_sfb = ptr_ics_info->max_sfb;
74*15dc779aSAndroid Build Coastguard Worker   WORD num_win_group;
75*15dc779aSAndroid Build Coastguard Worker 
76*15dc779aSAndroid Build Coastguard Worker   WORD8 *ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
77*15dc779aSAndroid Build Coastguard Worker   WORD8 *ptr_code_book_temp = ptr_code_book;
78*15dc779aSAndroid Build Coastguard Worker   WORD32 sect_bitlen = LONG_BLOCK_SECT_LEN;
79*15dc779aSAndroid Build Coastguard Worker   int num_lines_sec_idx = 0, top;
80*15dc779aSAndroid Build Coastguard Worker   short *ptr_num_sect_lines =
81*15dc779aSAndroid Build Coastguard Worker       ptr_aac_dec_channel_info->num_line_in_sec4_hcr_arr;
82*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_hcr_code_book = ptr_aac_dec_channel_info->cb4_hcr_arr;
83*15dc779aSAndroid Build Coastguard Worker   const short *band_offsets = (WORD16 *)ixheaacd_getscalefactorbandoffsets(
84*15dc779aSAndroid Build Coastguard Worker       &(ptr_aac_dec_channel_info->str_ics_info), ptr_aac_tables);
85*15dc779aSAndroid Build Coastguard Worker   ptr_aac_dec_channel_info->number_sect = 0;
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
88*15dc779aSAndroid Build Coastguard Worker       EIGHT_SHORT_SEQUENCE) {
89*15dc779aSAndroid Build Coastguard Worker     sect_bitlen = SHORT_BLOCK_SECT_LEN;
90*15dc779aSAndroid Build Coastguard Worker   }
91*15dc779aSAndroid Build Coastguard Worker 
92*15dc779aSAndroid Build Coastguard Worker   sect_esc_val = (1 << sect_bitlen) - 1;
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker   for (num_win_group = 0; num_win_group < ptr_ics_info->num_window_groups;
95*15dc779aSAndroid Build Coastguard Worker        num_win_group++) {
96*15dc779aSAndroid Build Coastguard Worker     sfb = 0;
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker     while (sfb < max_sfb) {
99*15dc779aSAndroid Build Coastguard Worker       sect_len = 0;
100*15dc779aSAndroid Build Coastguard Worker       if (aac_sect_data_resil_flag) {
101*15dc779aSAndroid Build Coastguard Worker         sect_cb = ixheaacd_read_bits_buf(it_bit_buff, 5);
102*15dc779aSAndroid Build Coastguard Worker       } else {
103*15dc779aSAndroid Build Coastguard Worker         sect_cb = ixheaacd_read_bits_buf(it_bit_buff, 4);
104*15dc779aSAndroid Build Coastguard Worker       }
105*15dc779aSAndroid Build Coastguard Worker 
106*15dc779aSAndroid Build Coastguard Worker       if ((aac_sect_data_resil_flag == 0) ||
107*15dc779aSAndroid Build Coastguard Worker           ((sect_cb < 11) || ((sect_cb > 11) && (sect_cb < 16)))) {
108*15dc779aSAndroid Build Coastguard Worker         sect_len_incr = ixheaacd_read_bits_buf(it_bit_buff, sect_bitlen);
109*15dc779aSAndroid Build Coastguard Worker         while (sect_len_incr == sect_esc_val) {
110*15dc779aSAndroid Build Coastguard Worker           sect_len = (sect_len + sect_esc_val);
111*15dc779aSAndroid Build Coastguard Worker           sect_len_incr = ixheaacd_read_bits_buf(it_bit_buff, sect_bitlen);
112*15dc779aSAndroid Build Coastguard Worker         }
113*15dc779aSAndroid Build Coastguard Worker       } else
114*15dc779aSAndroid Build Coastguard Worker         sect_len_incr = 1;
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker       sect_len = (sect_len + sect_len_incr);
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker       if (aac_spect_data_resil_flag) {
119*15dc779aSAndroid Build Coastguard Worker         top = (sfb + sect_len);
120*15dc779aSAndroid Build Coastguard Worker         if ((num_lines_sec_idx >= MAX_SFB_HCR) ||
121*15dc779aSAndroid Build Coastguard Worker             (top >= MAX_SCALE_FACTOR_BANDS_LONG)) {
122*15dc779aSAndroid Build Coastguard Worker           return -1;
123*15dc779aSAndroid Build Coastguard Worker         }
124*15dc779aSAndroid Build Coastguard Worker         ptr_num_sect_lines[num_lines_sec_idx] =
125*15dc779aSAndroid Build Coastguard Worker             band_offsets[top] - band_offsets[sfb];
126*15dc779aSAndroid Build Coastguard Worker         num_lines_sec_idx++;
127*15dc779aSAndroid Build Coastguard Worker         if (sect_cb == (ESC_HCB + 1)) {
128*15dc779aSAndroid Build Coastguard Worker           return IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK;
129*15dc779aSAndroid Build Coastguard Worker         } else {
130*15dc779aSAndroid Build Coastguard Worker           *ptr_hcr_code_book++ = sect_cb;
131*15dc779aSAndroid Build Coastguard Worker         }
132*15dc779aSAndroid Build Coastguard Worker         ptr_aac_dec_channel_info->number_sect++;
133*15dc779aSAndroid Build Coastguard Worker       }
134*15dc779aSAndroid Build Coastguard Worker 
135*15dc779aSAndroid Build Coastguard Worker       sfb = (sfb + sect_len);
136*15dc779aSAndroid Build Coastguard Worker       if (sfb > max_sfb) {
137*15dc779aSAndroid Build Coastguard Worker         return (WORD16)(
138*15dc779aSAndroid Build Coastguard Worker             (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED);
139*15dc779aSAndroid Build Coastguard Worker       }
140*15dc779aSAndroid Build Coastguard Worker       if (sect_cb == (ESC_HCB + 1)) {
141*15dc779aSAndroid Build Coastguard Worker         return (WORD16)(
142*15dc779aSAndroid Build Coastguard Worker             (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK);
143*15dc779aSAndroid Build Coastguard Worker       }
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker       while (sect_len--) {
146*15dc779aSAndroid Build Coastguard Worker         *ptr_code_book_temp++ = sect_cb;
147*15dc779aSAndroid Build Coastguard Worker       }
148*15dc779aSAndroid Build Coastguard Worker     }
149*15dc779aSAndroid Build Coastguard Worker     ptr_code_book += MAX_SCALE_FACTOR_BANDS_SHORT;
150*15dc779aSAndroid Build Coastguard Worker     ptr_code_book_temp = ptr_code_book;
151*15dc779aSAndroid Build Coastguard Worker   }
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker   return AAC_DEC_OK;
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker 
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*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_read_scale_factor_data(
157*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buff,
158*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
159*15dc779aSAndroid Build Coastguard Worker     ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 object_type) {
160*15dc779aSAndroid Build Coastguard Worker   WORD sfb;
161*15dc779aSAndroid Build Coastguard Worker   WORD16 position = 0;
162*15dc779aSAndroid Build Coastguard Worker   WORD num_win_group;
163*15dc779aSAndroid Build Coastguard Worker   WORD16 factor = ptr_aac_dec_channel_info->global_gain;
164*15dc779aSAndroid Build Coastguard Worker   WORD8 *ptr_code_book, *ptr_code_book_short;
165*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_scale_fact, *ptr_scale_fact_short;
166*15dc779aSAndroid Build Coastguard Worker   WORD16 norm_value;
167*15dc779aSAndroid Build Coastguard Worker   WORD16 index, length;
168*15dc779aSAndroid Build Coastguard Worker   const UWORD16 *hcod_sf =
169*15dc779aSAndroid Build Coastguard Worker       ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl;
170*15dc779aSAndroid Build Coastguard Worker   const UWORD32 *table_idx =
171*15dc779aSAndroid Build Coastguard Worker       ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl_index;
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker   WORD start_bit_pos = it_bit_buff->bit_pos;
174*15dc779aSAndroid Build Coastguard Worker   UWORD8 *start_read_pos = it_bit_buff->ptr_read_next;
175*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next;
176*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = 7 - it_bit_buff->bit_pos;
177*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word;
178*15dc779aSAndroid Build Coastguard Worker   WORD32 increment;
179*15dc779aSAndroid Build Coastguard Worker   read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits,
180*15dc779aSAndroid Build Coastguard Worker                                        &increment);
181*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += increment;
182*15dc779aSAndroid Build Coastguard Worker 
183*15dc779aSAndroid Build Coastguard Worker   ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
184*15dc779aSAndroid Build Coastguard Worker 
185*15dc779aSAndroid Build Coastguard Worker   ptr_scale_fact = ptr_aac_dec_channel_info->ptr_scale_factor;
186*15dc779aSAndroid Build Coastguard Worker 
187*15dc779aSAndroid Build Coastguard Worker   for (num_win_group = 0;
188*15dc779aSAndroid Build Coastguard Worker        num_win_group < ptr_aac_dec_channel_info->str_ics_info.num_window_groups;
189*15dc779aSAndroid Build Coastguard Worker        num_win_group++) {
190*15dc779aSAndroid Build Coastguard Worker     ptr_code_book_short =
191*15dc779aSAndroid Build Coastguard Worker         &ptr_code_book[num_win_group * MAX_SCALE_FACTOR_BANDS_SHORT];
192*15dc779aSAndroid Build Coastguard Worker     ptr_scale_fact_short =
193*15dc779aSAndroid Build Coastguard Worker         &ptr_scale_fact[num_win_group * MAX_SCALE_FACTOR_BANDS_SHORT];
194*15dc779aSAndroid Build Coastguard Worker     for (sfb = ptr_aac_dec_channel_info->str_ics_info.max_sfb - 1; sfb >= 0;
195*15dc779aSAndroid Build Coastguard Worker          sfb--) {
196*15dc779aSAndroid Build Coastguard Worker       WORD32 sfb_cb = *ptr_code_book_short++;
197*15dc779aSAndroid Build Coastguard Worker       if (sfb_cb == ZERO_HCB)
198*15dc779aSAndroid Build Coastguard Worker         *ptr_scale_fact_short++ = 0;
199*15dc779aSAndroid Build Coastguard Worker       else {
200*15dc779aSAndroid Build Coastguard Worker         {
201*15dc779aSAndroid Build Coastguard Worker           WORD32 pns_present = 0;
202*15dc779aSAndroid Build Coastguard Worker           WORD pns_band;
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker           ia_pns_info_struct *ptr_pns_info =
205*15dc779aSAndroid Build Coastguard Worker               &ptr_aac_dec_channel_info->str_pns_info;
206*15dc779aSAndroid Build Coastguard Worker 
207*15dc779aSAndroid Build Coastguard Worker           if (sfb_cb == NOISE_HCB && (ptr_pns_info->pns_active != 1)) {
208*15dc779aSAndroid Build Coastguard Worker             pns_present = 1;
209*15dc779aSAndroid Build Coastguard Worker           }
210*15dc779aSAndroid Build Coastguard Worker 
211*15dc779aSAndroid Build Coastguard Worker           if (!pns_present) {
212*15dc779aSAndroid Build Coastguard Worker             UWORD32 read_word1;
213*15dc779aSAndroid Build Coastguard Worker 
214*15dc779aSAndroid Build Coastguard Worker             read_word1 = read_word << bit_pos;
215*15dc779aSAndroid Build Coastguard Worker 
216*15dc779aSAndroid Build Coastguard Worker             ixheaacd_huffman_decode(read_word1, &index, &length, hcod_sf,
217*15dc779aSAndroid Build Coastguard Worker                                     table_idx);
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker             bit_pos += length;
220*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
221*15dc779aSAndroid Build Coastguard Worker                                         it_bit_buff->ptr_bit_buf_end);
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
224*15dc779aSAndroid Build Coastguard Worker                                          it_bit_buff->ptr_bit_buf_end);
225*15dc779aSAndroid Build Coastguard Worker 
226*15dc779aSAndroid Build Coastguard Worker             norm_value = index - 60;
227*15dc779aSAndroid Build Coastguard Worker           }
228*15dc779aSAndroid Build Coastguard Worker 
229*15dc779aSAndroid Build Coastguard Worker           else {
230*15dc779aSAndroid Build Coastguard Worker             WORD32 noise_start_value;
231*15dc779aSAndroid Build Coastguard Worker             UWORD32 temp;
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker             temp = (read_word << bit_pos);
234*15dc779aSAndroid Build Coastguard Worker             temp = ((UWORD32)temp >> (32 - 9));
235*15dc779aSAndroid Build Coastguard Worker             noise_start_value = temp;
236*15dc779aSAndroid Build Coastguard Worker             bit_pos += 9;
237*15dc779aSAndroid Build Coastguard Worker 
238*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word,
239*15dc779aSAndroid Build Coastguard Worker                                          it_bit_buff->ptr_bit_buf_end);
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker             norm_value = noise_start_value - 256;
242*15dc779aSAndroid Build Coastguard Worker             ptr_pns_info->pns_active = 1;
243*15dc779aSAndroid Build Coastguard Worker 
244*15dc779aSAndroid Build Coastguard Worker             ptr_pns_info->noise_energy =
245*15dc779aSAndroid Build Coastguard Worker                 ptr_aac_dec_channel_info->global_gain - NOISE_OFFSET;
246*15dc779aSAndroid Build Coastguard Worker           }
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker           if ((object_type != AOT_ER_AAC_ELD) &&
249*15dc779aSAndroid Build Coastguard Worker               (object_type != AOT_ER_AAC_LD) && (object_type != AOT_ER_AAC_LC)) {
250*15dc779aSAndroid Build Coastguard Worker             if (sfb_cb > NOISE_HCB) {
251*15dc779aSAndroid Build Coastguard Worker               position = position + norm_value;
252*15dc779aSAndroid Build Coastguard Worker               *ptr_scale_fact_short++ = -position;
253*15dc779aSAndroid Build Coastguard Worker             } else if (sfb_cb < NOISE_HCB) {
254*15dc779aSAndroid Build Coastguard Worker               factor = factor + norm_value;
255*15dc779aSAndroid Build Coastguard Worker               *ptr_scale_fact_short++ = factor;
256*15dc779aSAndroid Build Coastguard Worker             } else {
257*15dc779aSAndroid Build Coastguard Worker               ptr_pns_info->noise_energy =
258*15dc779aSAndroid Build Coastguard Worker                   ixheaac_add16_sat(ptr_pns_info->noise_energy, norm_value);
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker               pns_band = (num_win_group << 4) +
261*15dc779aSAndroid Build Coastguard Worker                          ptr_aac_dec_channel_info->str_ics_info.max_sfb - sfb -
262*15dc779aSAndroid Build Coastguard Worker                          1;
263*15dc779aSAndroid Build Coastguard Worker               ptr_aac_dec_channel_info->ptr_scale_factor[pns_band] =
264*15dc779aSAndroid Build Coastguard Worker                   ptr_pns_info->noise_energy;
265*15dc779aSAndroid Build Coastguard Worker 
266*15dc779aSAndroid Build Coastguard Worker               ptr_pns_info->pns_used[pns_band] = 1;
267*15dc779aSAndroid Build Coastguard Worker               ptr_scale_fact_short++;
268*15dc779aSAndroid Build Coastguard Worker             }
269*15dc779aSAndroid Build Coastguard Worker           } else {
270*15dc779aSAndroid Build Coastguard Worker             if ((sfb_cb == INTENSITY_HCB) || (sfb_cb == INTENSITY_HCB2)) {
271*15dc779aSAndroid Build Coastguard Worker               position = position + norm_value;
272*15dc779aSAndroid Build Coastguard Worker               *ptr_scale_fact_short++ = -position;
273*15dc779aSAndroid Build Coastguard Worker             } else if (sfb_cb == NOISE_HCB) {
274*15dc779aSAndroid Build Coastguard Worker               ptr_pns_info->noise_energy =
275*15dc779aSAndroid Build Coastguard Worker                   ixheaac_add16_sat(ptr_pns_info->noise_energy, norm_value);
276*15dc779aSAndroid Build Coastguard Worker 
277*15dc779aSAndroid Build Coastguard Worker               pns_band = (num_win_group << 4) +
278*15dc779aSAndroid Build Coastguard Worker                          ptr_aac_dec_channel_info->str_ics_info.max_sfb - sfb -
279*15dc779aSAndroid Build Coastguard Worker                          1;
280*15dc779aSAndroid Build Coastguard Worker               ptr_aac_dec_channel_info->ptr_scale_factor[pns_band] =
281*15dc779aSAndroid Build Coastguard Worker                   ptr_pns_info->noise_energy;
282*15dc779aSAndroid Build Coastguard Worker 
283*15dc779aSAndroid Build Coastguard Worker               ptr_pns_info->pns_used[pns_band] = 1;
284*15dc779aSAndroid Build Coastguard Worker               ptr_scale_fact_short++;
285*15dc779aSAndroid Build Coastguard Worker 
286*15dc779aSAndroid Build Coastguard Worker             } else {
287*15dc779aSAndroid Build Coastguard Worker               factor = factor + norm_value;
288*15dc779aSAndroid Build Coastguard Worker               *ptr_scale_fact_short++ = factor;
289*15dc779aSAndroid Build Coastguard Worker             }
290*15dc779aSAndroid Build Coastguard Worker           }
291*15dc779aSAndroid Build Coastguard Worker         }
292*15dc779aSAndroid Build Coastguard Worker       }
293*15dc779aSAndroid Build Coastguard Worker     }
294*15dc779aSAndroid Build Coastguard Worker   }
295*15dc779aSAndroid Build Coastguard Worker 
296*15dc779aSAndroid Build Coastguard Worker   it_bit_buff->ptr_read_next = ptr_read_next - increment;
297*15dc779aSAndroid Build Coastguard Worker 
298*15dc779aSAndroid Build Coastguard Worker   it_bit_buff->bit_pos = 7 - bit_pos;
299*15dc779aSAndroid Build Coastguard Worker   {
300*15dc779aSAndroid Build Coastguard Worker     WORD bits_consumed;
301*15dc779aSAndroid Build Coastguard Worker     bits_consumed =
302*15dc779aSAndroid Build Coastguard Worker         (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
303*15dc779aSAndroid Build Coastguard Worker                (start_bit_pos - it_bit_buff->bit_pos));
304*15dc779aSAndroid Build Coastguard Worker     it_bit_buff->cnt_bits -= bits_consumed;
305*15dc779aSAndroid Build Coastguard Worker   }
306*15dc779aSAndroid Build Coastguard Worker }
307