xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_qc_main_hp.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 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 
21*15dc779aSAndroid Build Coastguard Worker #include <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker 
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_quant.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_block_switch.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_data.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_interface.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
48*15dc779aSAndroid Build Coastguard Worker 
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_dynamic_bits.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_data.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold.h"
52*15dc779aSAndroid Build Coastguard Worker 
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sf_estimation.h"
54*15dc779aSAndroid Build Coastguard Worker 
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_static_bits.h"
56*15dc779aSAndroid Build Coastguard Worker 
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bits_count.h"
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_channel_map.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_bitstream.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_configuration.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_mod.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_stereo_preproc.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_enc_main.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_util.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
68*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_qc_main(ixheaace_qc_state * pstr_qc_state,WORD32 num_channels,ixheaace_element_bits * pstr_el_bits,ixheaace_psy_out_channel ** psy_out_ch,ixheaace_psy_out_element * pstr_psy_out_element,ixheaace_qc_out_channel ** pstr_qc_out_ch,ixheaace_qc_out_element * pstr_qc_out_element,WORD32 ancillary_data_bytes,ixheaace_aac_tables * pstr_aac_tables,WORD32 adts_flag,WORD32 aot,WORD32 stat_bits_flag,WORD32 flag_last_element,WORD32 frame_len_long,WORD8 * ptr_scratch,WORD32 * is_quant_spec_zero,WORD32 * is_gain_limited)69*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_qc_main(
70*15dc779aSAndroid Build Coastguard Worker     ixheaace_qc_state *pstr_qc_state, WORD32 num_channels, ixheaace_element_bits *pstr_el_bits,
71*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_out_channel **psy_out_ch,
72*15dc779aSAndroid Build Coastguard Worker     ixheaace_psy_out_element *pstr_psy_out_element,
73*15dc779aSAndroid Build Coastguard Worker     ixheaace_qc_out_channel **pstr_qc_out_ch,
74*15dc779aSAndroid Build Coastguard Worker     ixheaace_qc_out_element *pstr_qc_out_element, WORD32 ancillary_data_bytes,
75*15dc779aSAndroid Build Coastguard Worker     ixheaace_aac_tables *pstr_aac_tables, WORD32 adts_flag, WORD32 aot, WORD32 stat_bits_flag,
76*15dc779aSAndroid Build Coastguard Worker     WORD32 flag_last_element, WORD32 frame_len_long, WORD8 *ptr_scratch,
77*15dc779aSAndroid Build Coastguard Worker     WORD32 *is_quant_spec_zero, WORD32 *is_gain_limited) {
78*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code;
79*15dc779aSAndroid Build Coastguard Worker   WORD32 ch;
80*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0;
81*15dc779aSAndroid Build Coastguard Worker   WORD32 k = 0;
82*15dc779aSAndroid Build Coastguard Worker   WORD32 j = 0;
83*15dc779aSAndroid Build Coastguard Worker   WORD32 iterations = 0;
84*15dc779aSAndroid Build Coastguard Worker   WORD32 constraints_fulfilled;
85*15dc779aSAndroid Build Coastguard Worker   WORD32 ch_dyn_bits;
86*15dc779aSAndroid Build Coastguard Worker   WORD32 max_ch_dyn_bits[IXHEAACE_MAX_CH_IN_BS_ELE];
87*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ch_bit_dist[IXHEAACE_MAX_CH_IN_BS_ELE];
88*15dc779aSAndroid Build Coastguard Worker   ixheaace_qc_stack *ptr_stack = (ixheaace_qc_stack *)ptr_scratch;
89*15dc779aSAndroid Build Coastguard Worker   ptr_scratch += sizeof(ixheaace_qc_stack);
90*15dc779aSAndroid Build Coastguard Worker 
91*15dc779aSAndroid Build Coastguard Worker   ia_adj_thr_elem_struct *pstr_adj_thr_elem = &pstr_qc_state->str_adj_thr.str_adj_thr_ele;
92*15dc779aSAndroid Build Coastguard Worker   WORD32 gain;
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker   if (pstr_el_bits->bit_res_level < 0) {
95*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_FATAL_INVALID_BIT_RES_LEVEL;
96*15dc779aSAndroid Build Coastguard Worker   }
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker   if (pstr_el_bits->bit_res_level > pstr_el_bits->max_bit_res_bits) {
99*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_EXE_FATAL_INVALID_BIT_RES_LEVEL;
100*15dc779aSAndroid Build Coastguard Worker   }
101*15dc779aSAndroid Build Coastguard Worker   pstr_qc_out_element->static_bits_used =
102*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_count_static_bitdemand(psy_out_ch, pstr_psy_out_element, num_channels,
103*15dc779aSAndroid Build Coastguard Worker                                                aot, adts_flag, stat_bits_flag, flag_last_element);
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker   if (ancillary_data_bytes) {
106*15dc779aSAndroid Build Coastguard Worker     pstr_qc_out_element->anc_bits_used =
107*15dc779aSAndroid Build Coastguard Worker         7 + 8 * (ancillary_data_bytes + (ancillary_data_bytes >= 15));
108*15dc779aSAndroid Build Coastguard Worker   } else {
109*15dc779aSAndroid Build Coastguard Worker     pstr_qc_out_element->anc_bits_used = 0;
110*15dc779aSAndroid Build Coastguard Worker   }
111*15dc779aSAndroid Build Coastguard Worker 
112*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < num_channels; ch++) {
113*15dc779aSAndroid Build Coastguard Worker     iaace_calc_form_fac_per_chan(ptr_stack->sfb_form_fac[ch],
114*15dc779aSAndroid Build Coastguard Worker                                  ptr_stack->sfb_num_relevant_lines[ch], psy_out_ch[ch],
115*15dc779aSAndroid Build Coastguard Worker                                  ptr_stack->sfb_ld_energy[ch]);
116*15dc779aSAndroid Build Coastguard Worker   }
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker   iaace_adjust_threshold(
119*15dc779aSAndroid Build Coastguard Worker       &pstr_qc_state->str_adj_thr, pstr_adj_thr_elem, psy_out_ch, ch_bit_dist,
120*15dc779aSAndroid Build Coastguard Worker       pstr_qc_out_element,
121*15dc779aSAndroid Build Coastguard Worker       pstr_el_bits->average_bits - pstr_qc_out_element->static_bits_used -
122*15dc779aSAndroid Build Coastguard Worker           pstr_qc_out_element->anc_bits_used,
123*15dc779aSAndroid Build Coastguard Worker       pstr_el_bits->bit_res_level, pstr_el_bits->max_bit_res_bits,
124*15dc779aSAndroid Build Coastguard Worker       pstr_qc_out_element->static_bits_used + pstr_qc_out_element->anc_bits_used,
125*15dc779aSAndroid Build Coastguard Worker       &pstr_qc_state->max_bit_fac, ptr_stack->sfb_num_relevant_lines[0],
126*15dc779aSAndroid Build Coastguard Worker       ptr_stack->sfb_ld_energy[0], num_channels, 0, aot, ptr_scratch);
127*15dc779aSAndroid Build Coastguard Worker 
128*15dc779aSAndroid Build Coastguard Worker   iaace_estimate_scfs_chan(psy_out_ch, pstr_qc_out_ch, ptr_stack->sfb_form_fac,
129*15dc779aSAndroid Build Coastguard Worker                            ptr_stack->sfb_num_relevant_lines, num_channels, 0, frame_len_long);
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < num_channels; ch++) {
132*15dc779aSAndroid Build Coastguard Worker     max_ch_dyn_bits[ch] =
133*15dc779aSAndroid Build Coastguard Worker         (pstr_el_bits->average_bits + pstr_el_bits->bit_res_level - 7 -
134*15dc779aSAndroid Build Coastguard Worker          pstr_qc_out_element->static_bits_used - pstr_qc_out_element->anc_bits_used);
135*15dc779aSAndroid Build Coastguard Worker 
136*15dc779aSAndroid Build Coastguard Worker     max_ch_dyn_bits[ch] = (WORD32)floor(ch_bit_dist[ch] * (FLOAT32)(max_ch_dyn_bits[ch]));
137*15dc779aSAndroid Build Coastguard Worker   }
138*15dc779aSAndroid Build Coastguard Worker 
139*15dc779aSAndroid Build Coastguard Worker   pstr_qc_out_element->dyn_bits_used = 0;
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker   for (ch = 0; ch < num_channels; ch++) {
142*15dc779aSAndroid Build Coastguard Worker     /* now loop until bitstream constraints (ch_dyn_bits < maxChDynBits)
143*15dc779aSAndroid Build Coastguard Worker        are fulfilled */
144*15dc779aSAndroid Build Coastguard Worker     WORD32 spec_idx, sfb_offs, sfb;
145*15dc779aSAndroid Build Coastguard Worker     iterations = 0;
146*15dc779aSAndroid Build Coastguard Worker     gain = 0;
147*15dc779aSAndroid Build Coastguard Worker     for (spec_idx = 0; spec_idx < frame_len_long; spec_idx++) {
148*15dc779aSAndroid Build Coastguard Worker       ptr_stack->exp_spec[spec_idx] = (FLOAT32)psy_out_ch[ch]->ptr_spec_coeffs[spec_idx];
149*15dc779aSAndroid Build Coastguard Worker       ptr_stack->mdct_spec_float[spec_idx] = (FLOAT32)psy_out_ch[ch]->ptr_spec_coeffs[spec_idx];
150*15dc779aSAndroid Build Coastguard Worker     }
151*15dc779aSAndroid Build Coastguard Worker     do {
152*15dc779aSAndroid Build Coastguard Worker       WORD32 max_val;
153*15dc779aSAndroid Build Coastguard Worker       constraints_fulfilled = 1;
154*15dc779aSAndroid Build Coastguard Worker       WORD32 quant_spec_is_zero = 1;
155*15dc779aSAndroid Build Coastguard Worker       if (iterations > 0) {
156*15dc779aSAndroid Build Coastguard Worker         for (sfb_offs = 0; sfb_offs < psy_out_ch[ch]->sfb_count;
157*15dc779aSAndroid Build Coastguard Worker              sfb_offs += psy_out_ch[ch]->sfb_per_group) {
158*15dc779aSAndroid Build Coastguard Worker           for (sfb = 0; sfb < psy_out_ch[ch]->max_sfb_per_grp; sfb++) {
159*15dc779aSAndroid Build Coastguard Worker             WORD32 scalefactor = pstr_qc_out_ch[ch]->scalefactor[sfb + sfb_offs];
160*15dc779aSAndroid Build Coastguard Worker             gain = MAX(gain, pstr_qc_out_ch[ch]->global_gain - scalefactor);
161*15dc779aSAndroid Build Coastguard Worker             iaace_quantize_lines(
162*15dc779aSAndroid Build Coastguard Worker                 pstr_qc_out_ch[ch]->global_gain - scalefactor,
163*15dc779aSAndroid Build Coastguard Worker                 psy_out_ch[ch]->sfb_offsets[sfb_offs + sfb + 1] -
164*15dc779aSAndroid Build Coastguard Worker                     psy_out_ch[ch]->sfb_offsets[sfb_offs + sfb],
165*15dc779aSAndroid Build Coastguard Worker                 ptr_stack->exp_spec + psy_out_ch[ch]->sfb_offsets[sfb_offs + sfb],
166*15dc779aSAndroid Build Coastguard Worker                 pstr_qc_out_ch[ch]->quant_spec + psy_out_ch[ch]->sfb_offsets[sfb_offs + sfb],
167*15dc779aSAndroid Build Coastguard Worker                 ptr_stack->mdct_spec_float + psy_out_ch[ch]->sfb_offsets[sfb_offs + sfb]);
168*15dc779aSAndroid Build Coastguard Worker           }
169*15dc779aSAndroid Build Coastguard Worker         }
170*15dc779aSAndroid Build Coastguard Worker       }
171*15dc779aSAndroid Build Coastguard Worker 
172*15dc779aSAndroid Build Coastguard Worker       max_val = iaace_calc_max_val_in_sfb(
173*15dc779aSAndroid Build Coastguard Worker           psy_out_ch[ch]->sfb_count, psy_out_ch[ch]->max_sfb_per_grp,
174*15dc779aSAndroid Build Coastguard Worker           psy_out_ch[ch]->sfb_per_group,
175*15dc779aSAndroid Build Coastguard Worker           psy_out_ch[ch]->sfb_offsets, pstr_qc_out_ch[ch]->quant_spec,
176*15dc779aSAndroid Build Coastguard Worker           pstr_qc_out_ch[ch]->max_val_in_sfb);
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker       if (max_val > MAXIMUM_QUANT) {
179*15dc779aSAndroid Build Coastguard Worker         constraints_fulfilled = 0;
180*15dc779aSAndroid Build Coastguard Worker       }
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker       for (k = 0; ((k < psy_out_ch[ch]->sfb_count) && (quant_spec_is_zero));
183*15dc779aSAndroid Build Coastguard Worker            k += psy_out_ch[ch]->sfb_per_group) {
184*15dc779aSAndroid Build Coastguard Worker         for (i = 0; ((i < psy_out_ch[ch]->max_sfb_per_grp) && (quant_spec_is_zero)); i++) {
185*15dc779aSAndroid Build Coastguard Worker           for (j = psy_out_ch[ch]->sfb_offsets[i+k]; j < psy_out_ch[ch]->sfb_offsets[i+k+1]; j++)
186*15dc779aSAndroid Build Coastguard Worker           {
187*15dc779aSAndroid Build Coastguard Worker             if (pstr_qc_out_ch[ch]->quant_spec[j] != 0) {
188*15dc779aSAndroid Build Coastguard Worker               quant_spec_is_zero = 0;
189*15dc779aSAndroid Build Coastguard Worker               break;
190*15dc779aSAndroid Build Coastguard Worker             }
191*15dc779aSAndroid Build Coastguard Worker           }
192*15dc779aSAndroid Build Coastguard Worker         }
193*15dc779aSAndroid Build Coastguard Worker       }
194*15dc779aSAndroid Build Coastguard Worker       err_code = ia_enhaacplus_enc_dyn_bitcount(
195*15dc779aSAndroid Build Coastguard Worker           pstr_qc_out_ch[ch]->quant_spec, pstr_qc_out_ch[ch]->max_val_in_sfb,
196*15dc779aSAndroid Build Coastguard Worker           pstr_qc_out_ch[ch]->scalefactor, psy_out_ch[ch]->window_sequence,
197*15dc779aSAndroid Build Coastguard Worker           psy_out_ch[ch]->sfb_count, psy_out_ch[ch]->max_sfb_per_grp,
198*15dc779aSAndroid Build Coastguard Worker           psy_out_ch[ch]->sfb_per_group,
199*15dc779aSAndroid Build Coastguard Worker           psy_out_ch[ch]->sfb_offsets, &pstr_qc_out_ch[ch]->section_data,
200*15dc779aSAndroid Build Coastguard Worker           pstr_qc_state->side_info_tab_long, pstr_qc_state->side_info_tab_short,
201*15dc779aSAndroid Build Coastguard Worker           pstr_aac_tables->pstr_huff_tab, pstr_qc_state->qc_scr.shared_buffer_2, aot,
202*15dc779aSAndroid Build Coastguard Worker           &ch_dyn_bits);
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker       if (err_code != IA_NO_ERROR) {
205*15dc779aSAndroid Build Coastguard Worker         return err_code;
206*15dc779aSAndroid Build Coastguard Worker       }
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker       if (ch_dyn_bits >= max_ch_dyn_bits[ch]) {
209*15dc779aSAndroid Build Coastguard Worker         constraints_fulfilled = 0;
210*15dc779aSAndroid Build Coastguard Worker       }
211*15dc779aSAndroid Build Coastguard Worker 
212*15dc779aSAndroid Build Coastguard Worker       if (quant_spec_is_zero == 1) {
213*15dc779aSAndroid Build Coastguard Worker         constraints_fulfilled = 1;
214*15dc779aSAndroid Build Coastguard Worker         /*Bit consuption is exceding bit reservoir, there is no scope left for bit consumption
215*15dc779aSAndroid Build Coastguard Worker           reduction, as spectrum is zero. Hence breaking the quantization loop. */
216*15dc779aSAndroid Build Coastguard Worker         if (iterations > 0) {
217*15dc779aSAndroid Build Coastguard Worker           *is_quant_spec_zero = 1;
218*15dc779aSAndroid Build Coastguard Worker           ch_dyn_bits = max_ch_dyn_bits[ch];
219*15dc779aSAndroid Build Coastguard Worker         }
220*15dc779aSAndroid Build Coastguard Worker       }
221*15dc779aSAndroid Build Coastguard Worker       if ((gain == MAX_GAIN_INDEX) && (constraints_fulfilled == 0)) {
222*15dc779aSAndroid Build Coastguard Worker         /* Bit consuption is exceding bit reservoir, there is no scope left for bit consumption
223*15dc779aSAndroid Build Coastguard Worker            reduction, as gain has reached the maximum value. Hence breaking the quantization
224*15dc779aSAndroid Build Coastguard Worker            loop. */
225*15dc779aSAndroid Build Coastguard Worker         constraints_fulfilled = 1;
226*15dc779aSAndroid Build Coastguard Worker         *is_gain_limited = 1;
227*15dc779aSAndroid Build Coastguard Worker         ch_dyn_bits = max_ch_dyn_bits[ch];
228*15dc779aSAndroid Build Coastguard Worker       }
229*15dc779aSAndroid Build Coastguard Worker       if (!constraints_fulfilled) {
230*15dc779aSAndroid Build Coastguard Worker         pstr_qc_out_ch[ch]->global_gain++;
231*15dc779aSAndroid Build Coastguard Worker       }
232*15dc779aSAndroid Build Coastguard Worker       iterations++;
233*15dc779aSAndroid Build Coastguard Worker 
234*15dc779aSAndroid Build Coastguard Worker     } while (!constraints_fulfilled);
235*15dc779aSAndroid Build Coastguard Worker 
236*15dc779aSAndroid Build Coastguard Worker     pstr_qc_out_element->dyn_bits_used += ch_dyn_bits;
237*15dc779aSAndroid Build Coastguard Worker 
238*15dc779aSAndroid Build Coastguard Worker     pstr_qc_out_ch[ch]->grouping_mask = psy_out_ch[ch]->grouping_mask;
239*15dc779aSAndroid Build Coastguard Worker     pstr_qc_out_ch[ch]->win_shape = psy_out_ch[ch]->window_shape;
240*15dc779aSAndroid Build Coastguard Worker   }
241*15dc779aSAndroid Build Coastguard Worker 
242*15dc779aSAndroid Build Coastguard Worker   pstr_adj_thr_elem->dyn_bits_last = pstr_qc_out_element->dyn_bits_used;
243*15dc779aSAndroid Build Coastguard Worker   {
244*15dc779aSAndroid Build Coastguard Worker     WORD32 bit_res_space = pstr_el_bits->max_bit_res_bits - pstr_el_bits->bit_res_level;
245*15dc779aSAndroid Build Coastguard Worker     WORD32 delta_bit_res = pstr_el_bits->average_bits - (pstr_qc_out_element->static_bits_used +
246*15dc779aSAndroid Build Coastguard Worker                                                          pstr_qc_out_element->dyn_bits_used +
247*15dc779aSAndroid Build Coastguard Worker                                                          pstr_qc_out_element->anc_bits_used);
248*15dc779aSAndroid Build Coastguard Worker 
249*15dc779aSAndroid Build Coastguard Worker     pstr_qc_out_element->fill_bits = MAX(0, (delta_bit_res - bit_res_space));
250*15dc779aSAndroid Build Coastguard Worker   }
251*15dc779aSAndroid Build Coastguard Worker 
252*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
253*15dc779aSAndroid Build Coastguard Worker }
254*15dc779aSAndroid Build Coastguard Worker 
iaace_calc_max_val_in_sfb(WORD32 sfb_count,WORD32 max_sfb_per_grp,WORD32 ptr_sfb_per_grp,WORD32 * ptr_sfb_offset,WORD16 * ptr_quant_spec,UWORD16 * ptr_max_value)255*15dc779aSAndroid Build Coastguard Worker WORD32 iaace_calc_max_val_in_sfb(WORD32 sfb_count, WORD32 max_sfb_per_grp, WORD32 ptr_sfb_per_grp,
256*15dc779aSAndroid Build Coastguard Worker                                  WORD32 *ptr_sfb_offset, WORD16 *ptr_quant_spec,
257*15dc779aSAndroid Build Coastguard Worker                                  UWORD16 *ptr_max_value) {
258*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb;
259*15dc779aSAndroid Build Coastguard Worker   WORD32 max = 0;
260*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_offs;
261*15dc779aSAndroid Build Coastguard Worker 
262*15dc779aSAndroid Build Coastguard Worker   for (sfb_offs = 0; sfb_offs < sfb_count; sfb_offs += ptr_sfb_per_grp) {
263*15dc779aSAndroid Build Coastguard Worker     for (sfb = 0; sfb < max_sfb_per_grp; sfb++) {
264*15dc779aSAndroid Build Coastguard Worker       WORD32 line;
265*15dc779aSAndroid Build Coastguard Worker       WORD32 local_max = 0;
266*15dc779aSAndroid Build Coastguard Worker       for (line = ptr_sfb_offset[sfb + sfb_offs]; line < ptr_sfb_offset[sfb + sfb_offs + 1];
267*15dc779aSAndroid Build Coastguard Worker            line++) {
268*15dc779aSAndroid Build Coastguard Worker         if (abs(ptr_quant_spec[line]) > local_max) {
269*15dc779aSAndroid Build Coastguard Worker           local_max = abs(ptr_quant_spec[line]);
270*15dc779aSAndroid Build Coastguard Worker         }
271*15dc779aSAndroid Build Coastguard Worker       }
272*15dc779aSAndroid Build Coastguard Worker       ptr_max_value[sfb_offs + sfb] = (UWORD16)local_max;
273*15dc779aSAndroid Build Coastguard Worker       if (local_max > max) {
274*15dc779aSAndroid Build Coastguard Worker         max = local_max;
275*15dc779aSAndroid Build Coastguard Worker       }
276*15dc779aSAndroid Build Coastguard Worker     }
277*15dc779aSAndroid Build Coastguard Worker   }
278*15dc779aSAndroid Build Coastguard Worker 
279*15dc779aSAndroid Build Coastguard Worker   return max;
280*15dc779aSAndroid Build Coastguard Worker }
281