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 "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
24*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
25*15dc779aSAndroid Build Coastguard Worker
26*15dc779aSAndroid Build Coastguard Worker /* DRC */
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
37*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
38*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
39*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
40*15dc779aSAndroid Build Coastguard Worker #include "iusace_arith_enc.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_struct_def.h"
43*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_quant.h"
45*15dc779aSAndroid Build Coastguard Worker #include "iusace_ms.h"
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_signal_classifier.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_asc_write.h"
50*15dc779aSAndroid Build Coastguard Worker #include "iusace_main.h"
51*15dc779aSAndroid Build Coastguard Worker #include "iusace_func_prototypes.h"
52*15dc779aSAndroid Build Coastguard Worker #include "iusace_avq_enc.h"
53*15dc779aSAndroid Build Coastguard Worker
iusace_lsf_weight_2st_flt(FLOAT32 * lsfq,FLOAT32 * w,WORD32 mode)54*15dc779aSAndroid Build Coastguard Worker static VOID iusace_lsf_weight_2st_flt(FLOAT32 *lsfq, FLOAT32 *w, WORD32 mode) {
55*15dc779aSAndroid Build Coastguard Worker WORD32 i;
56*15dc779aSAndroid Build Coastguard Worker FLOAT32 d[ORDER + 1];
57*15dc779aSAndroid Build Coastguard Worker
58*15dc779aSAndroid Build Coastguard Worker d[0] = lsfq[0];
59*15dc779aSAndroid Build Coastguard Worker d[ORDER] = FREQ_MAX - lsfq[ORDER - 1];
60*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < ORDER; i++) {
61*15dc779aSAndroid Build Coastguard Worker d[i] = lsfq[i] - lsfq[i - 1];
62*15dc779aSAndroid Build Coastguard Worker }
63*15dc779aSAndroid Build Coastguard Worker
64*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
65*15dc779aSAndroid Build Coastguard Worker w[i] = (FLOAT32)(iusace_wlsf_factor_table[mode] / (FREQ_DIV / sqrt(d[i] * d[i + 1])));
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker }
68*15dc779aSAndroid Build Coastguard Worker
iusace_lsf_weight(FLOAT32 * lsf,FLOAT32 * ptr_w)69*15dc779aSAndroid Build Coastguard Worker static VOID iusace_lsf_weight(FLOAT32 *lsf, FLOAT32 *ptr_w) {
70*15dc779aSAndroid Build Coastguard Worker WORD32 i;
71*15dc779aSAndroid Build Coastguard Worker FLOAT32 d[ORDER + 1];
72*15dc779aSAndroid Build Coastguard Worker
73*15dc779aSAndroid Build Coastguard Worker d[0] = lsf[0];
74*15dc779aSAndroid Build Coastguard Worker d[ORDER] = FREQ_MAX - lsf[ORDER - 1];
75*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < ORDER; i++) {
76*15dc779aSAndroid Build Coastguard Worker d[i] = lsf[i] - lsf[i - 1];
77*15dc779aSAndroid Build Coastguard Worker }
78*15dc779aSAndroid Build Coastguard Worker
79*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
80*15dc779aSAndroid Build Coastguard Worker ptr_w[i] = (1.0f / d[i]) + (1.0f / d[i + 1]);
81*15dc779aSAndroid Build Coastguard Worker }
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker return;
84*15dc779aSAndroid Build Coastguard Worker }
85*15dc779aSAndroid Build Coastguard Worker
iusace_avq_first_approx_abs(FLOAT32 * lsf,FLOAT32 * lsfq)86*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_avq_first_approx_abs(FLOAT32 *lsf, FLOAT32 *lsfq) {
87*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, index;
88*15dc779aSAndroid Build Coastguard Worker FLOAT32 w[ORDER];
89*15dc779aSAndroid Build Coastguard Worker FLOAT32 dist_min, dist, temp;
90*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *p_dico;
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker iusace_lsf_weight(lsf, w);
93*15dc779aSAndroid Build Coastguard Worker
94*15dc779aSAndroid Build Coastguard Worker dist_min = 1.0e30f;
95*15dc779aSAndroid Build Coastguard Worker p_dico = iusace_dico_lsf_abs_8b_flt;
96*15dc779aSAndroid Build Coastguard Worker index = 0;
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 256; i++) {
99*15dc779aSAndroid Build Coastguard Worker dist = 0.0;
100*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < ORDER; j++) {
101*15dc779aSAndroid Build Coastguard Worker temp = lsf[j] - *p_dico++;
102*15dc779aSAndroid Build Coastguard Worker dist += w[j] * temp * temp;
103*15dc779aSAndroid Build Coastguard Worker }
104*15dc779aSAndroid Build Coastguard Worker if (dist < dist_min) {
105*15dc779aSAndroid Build Coastguard Worker dist_min = dist;
106*15dc779aSAndroid Build Coastguard Worker index = i;
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker
110*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < ORDER; j++) {
111*15dc779aSAndroid Build Coastguard Worker lsfq[j] = iusace_dico_lsf_abs_8b_flt[index * ORDER + j];
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker return index;
115*15dc779aSAndroid Build Coastguard Worker }
116*15dc779aSAndroid Build Coastguard Worker
iusace_avq_first_approx_rel(FLOAT32 * ptr_lsf,FLOAT32 * ptr_lsfq,WORD32 * idx,WORD32 mode)117*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_avq_first_approx_rel(FLOAT32 *ptr_lsf, FLOAT32 *ptr_lsfq, WORD32 *idx,
118*15dc779aSAndroid Build Coastguard Worker WORD32 mode) {
119*15dc779aSAndroid Build Coastguard Worker WORD32 i, num_bits;
120*15dc779aSAndroid Build Coastguard Worker FLOAT32 w[ORDER], x[ORDER], temp;
121*15dc779aSAndroid Build Coastguard Worker WORD32 nq, avq[ORDER];
122*15dc779aSAndroid Build Coastguard Worker FLOAT32 lsf_min;
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker iusace_lsf_weight_2st_flt(ptr_lsf, w, 1);
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker temp = 0.0f;
127*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
128*15dc779aSAndroid Build Coastguard Worker x[i] = (ptr_lsf[i] - ptr_lsfq[i]) / w[i];
129*15dc779aSAndroid Build Coastguard Worker temp += x[i] * x[i];
130*15dc779aSAndroid Build Coastguard Worker }
131*15dc779aSAndroid Build Coastguard Worker
132*15dc779aSAndroid Build Coastguard Worker if (temp < 8.0f) {
133*15dc779aSAndroid Build Coastguard Worker idx[0] = 0;
134*15dc779aSAndroid Build Coastguard Worker idx[1] = 0;
135*15dc779aSAndroid Build Coastguard Worker if ((mode == 0) || (mode == 3)) {
136*15dc779aSAndroid Build Coastguard Worker return (10);
137*15dc779aSAndroid Build Coastguard Worker } else if (mode == 1) {
138*15dc779aSAndroid Build Coastguard Worker return (2);
139*15dc779aSAndroid Build Coastguard Worker } else {
140*15dc779aSAndroid Build Coastguard Worker return (6);
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker iusace_lsf_weight_2st_flt(ptr_lsfq, w, mode);
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
147*15dc779aSAndroid Build Coastguard Worker x[i] = (ptr_lsf[i] - ptr_lsfq[i]) / w[i];
148*15dc779aSAndroid Build Coastguard Worker }
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker iusace_alg_vec_quant(x, avq, idx);
151*15dc779aSAndroid Build Coastguard Worker
152*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
153*15dc779aSAndroid Build Coastguard Worker ptr_lsfq[i] += (w[i] * (FLOAT32)avq[i]);
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker num_bits = 0;
157*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
158*15dc779aSAndroid Build Coastguard Worker nq = idx[i];
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker if ((mode == 0) || (mode == 3)) {
161*15dc779aSAndroid Build Coastguard Worker num_bits += (2 + (nq * 4));
162*15dc779aSAndroid Build Coastguard Worker if (nq > 6) {
163*15dc779aSAndroid Build Coastguard Worker num_bits += nq - 3;
164*15dc779aSAndroid Build Coastguard Worker } else if (nq > 4) {
165*15dc779aSAndroid Build Coastguard Worker num_bits += nq - 4;
166*15dc779aSAndroid Build Coastguard Worker } else if (nq == 0) {
167*15dc779aSAndroid Build Coastguard Worker num_bits += 3;
168*15dc779aSAndroid Build Coastguard Worker }
169*15dc779aSAndroid Build Coastguard Worker } else if (mode == 1) {
170*15dc779aSAndroid Build Coastguard Worker num_bits += nq * 5;
171*15dc779aSAndroid Build Coastguard Worker if (nq == 0) {
172*15dc779aSAndroid Build Coastguard Worker num_bits += 1;
173*15dc779aSAndroid Build Coastguard Worker }
174*15dc779aSAndroid Build Coastguard Worker } else {
175*15dc779aSAndroid Build Coastguard Worker num_bits += (2 + (nq * 4));
176*15dc779aSAndroid Build Coastguard Worker if (nq == 0) {
177*15dc779aSAndroid Build Coastguard Worker num_bits += 1;
178*15dc779aSAndroid Build Coastguard Worker } else if (nq > 4) {
179*15dc779aSAndroid Build Coastguard Worker num_bits += nq - 3;
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker }
182*15dc779aSAndroid Build Coastguard Worker }
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker lsf_min = LSF_GAP;
185*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
186*15dc779aSAndroid Build Coastguard Worker if (ptr_lsfq[i] < lsf_min) {
187*15dc779aSAndroid Build Coastguard Worker ptr_lsfq[i] = lsf_min;
188*15dc779aSAndroid Build Coastguard Worker }
189*15dc779aSAndroid Build Coastguard Worker
190*15dc779aSAndroid Build Coastguard Worker lsf_min = ptr_lsfq[i] + LSF_GAP;
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker lsf_min = FREQ_MAX - LSF_GAP;
194*15dc779aSAndroid Build Coastguard Worker for (i = ORDER - 1; i >= 0; i--) {
195*15dc779aSAndroid Build Coastguard Worker if (ptr_lsfq[i] > lsf_min) {
196*15dc779aSAndroid Build Coastguard Worker ptr_lsfq[i] = lsf_min;
197*15dc779aSAndroid Build Coastguard Worker }
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker lsf_min = ptr_lsfq[i] - LSF_GAP;
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker return (num_bits);
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker
iusace_quantize_lpc_avq(FLOAT32 * ptr_lsf,FLOAT32 * ptr_lsfq,WORD32 lpc0,WORD32 * ptr_lpc_idx,WORD32 * nb_indices,WORD32 * nbbits)205*15dc779aSAndroid Build Coastguard Worker VOID iusace_quantize_lpc_avq(FLOAT32 *ptr_lsf, FLOAT32 *ptr_lsfq, WORD32 lpc0,
206*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_lpc_idx, WORD32 *nb_indices, WORD32 *nbbits) {
207*15dc779aSAndroid Build Coastguard Worker WORD32 i;
208*15dc779aSAndroid Build Coastguard Worker FLOAT32 lsfq[ORDER];
209*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_index, indxt[100], num_bits, nbt, nit;
210*15dc779aSAndroid Build Coastguard Worker
211*15dc779aSAndroid Build Coastguard Worker ptr_index = &ptr_lpc_idx[0];
212*15dc779aSAndroid Build Coastguard Worker *nb_indices = 0;
213*15dc779aSAndroid Build Coastguard Worker *nbbits = 0;
214*15dc779aSAndroid Build Coastguard Worker
215*15dc779aSAndroid Build Coastguard Worker ptr_index[0] = iusace_avq_first_approx_abs(&ptr_lsf[3 * ORDER], &ptr_lsfq[3 * ORDER]);
216*15dc779aSAndroid Build Coastguard Worker
217*15dc779aSAndroid Build Coastguard Worker nbt = iusace_avq_first_approx_rel(&ptr_lsf[3 * ORDER], &ptr_lsfq[3 * ORDER], &ptr_index[1], 0);
218*15dc779aSAndroid Build Coastguard Worker nit = 1 + iusace_get_num_params(&ptr_lpc_idx[1]);
219*15dc779aSAndroid Build Coastguard Worker
220*15dc779aSAndroid Build Coastguard Worker ptr_index += nit;
221*15dc779aSAndroid Build Coastguard Worker *nb_indices += nit;
222*15dc779aSAndroid Build Coastguard Worker *nbbits += 8 + nbt;
223*15dc779aSAndroid Build Coastguard Worker
224*15dc779aSAndroid Build Coastguard Worker if (lpc0) {
225*15dc779aSAndroid Build Coastguard Worker *ptr_index = 0;
226*15dc779aSAndroid Build Coastguard Worker ptr_index++;
227*15dc779aSAndroid Build Coastguard Worker *nb_indices += 1;
228*15dc779aSAndroid Build Coastguard Worker *nbbits += 1;
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker ptr_index[0] = iusace_avq_first_approx_abs(&ptr_lsf[-ORDER], &ptr_lsfq[-ORDER]);
231*15dc779aSAndroid Build Coastguard Worker
232*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[-ORDER], &ptr_lsfq[-ORDER], &ptr_index[1], 0);
233*15dc779aSAndroid Build Coastguard Worker nbt = 8 + num_bits;
234*15dc779aSAndroid Build Coastguard Worker nit = 1 + iusace_get_num_params(&ptr_index[1]);
235*15dc779aSAndroid Build Coastguard Worker
236*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = ptr_lsfq[3 * ORDER + i];
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[-ORDER], &lsfq[0], indxt, 3);
239*15dc779aSAndroid Build Coastguard Worker
240*15dc779aSAndroid Build Coastguard Worker if (num_bits < nbt) {
241*15dc779aSAndroid Build Coastguard Worker nbt = num_bits;
242*15dc779aSAndroid Build Coastguard Worker nit = iusace_get_num_params(&indxt[0]);
243*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 1;
244*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[-ORDER + i] = lsfq[i];
245*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nit; i++) ptr_index[i] = indxt[i];
246*15dc779aSAndroid Build Coastguard Worker }
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker ptr_index += nit;
249*15dc779aSAndroid Build Coastguard Worker *nb_indices += nit;
250*15dc779aSAndroid Build Coastguard Worker *nbbits += nbt;
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker
253*15dc779aSAndroid Build Coastguard Worker *ptr_index = 0;
254*15dc779aSAndroid Build Coastguard Worker ptr_index++;
255*15dc779aSAndroid Build Coastguard Worker *nb_indices += 1;
256*15dc779aSAndroid Build Coastguard Worker *nbbits += 1;
257*15dc779aSAndroid Build Coastguard Worker
258*15dc779aSAndroid Build Coastguard Worker ptr_index[0] = iusace_avq_first_approx_abs(&ptr_lsf[ORDER], &ptr_lsfq[ORDER]);
259*15dc779aSAndroid Build Coastguard Worker
260*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[ORDER], &ptr_lsfq[ORDER], &ptr_index[1], 0);
261*15dc779aSAndroid Build Coastguard Worker nbt = 8 + num_bits;
262*15dc779aSAndroid Build Coastguard Worker nit = 1 + iusace_get_num_params(&ptr_index[1]);
263*15dc779aSAndroid Build Coastguard Worker
264*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = ptr_lsfq[3 * ORDER + i];
265*15dc779aSAndroid Build Coastguard Worker
266*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[ORDER], &lsfq[0], indxt, 3);
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker if (num_bits < nbt) {
269*15dc779aSAndroid Build Coastguard Worker nbt = num_bits;
270*15dc779aSAndroid Build Coastguard Worker nit = iusace_get_num_params(&indxt[0]);
271*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 1;
272*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[ORDER + i] = lsfq[i];
273*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nit; i++) ptr_index[i] = indxt[i];
274*15dc779aSAndroid Build Coastguard Worker }
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker ptr_index += nit;
277*15dc779aSAndroid Build Coastguard Worker *nb_indices += nit;
278*15dc779aSAndroid Build Coastguard Worker *nbbits += nbt;
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker *ptr_index = 0;
281*15dc779aSAndroid Build Coastguard Worker ptr_index++;
282*15dc779aSAndroid Build Coastguard Worker *nb_indices += 1;
283*15dc779aSAndroid Build Coastguard Worker
284*15dc779aSAndroid Build Coastguard Worker ptr_index[0] = iusace_avq_first_approx_abs(&ptr_lsf[0], &ptr_lsfq[0]);
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[0], &ptr_lsfq[0], &ptr_index[1], 0);
287*15dc779aSAndroid Build Coastguard Worker nbt = 2 + 8 + num_bits;
288*15dc779aSAndroid Build Coastguard Worker nit = 1 + iusace_get_num_params(&ptr_index[1]);
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = 0.5f * (ptr_lsfq[-ORDER + i] + ptr_lsfq[ORDER + i]);
291*15dc779aSAndroid Build Coastguard Worker
292*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[0], lsfq, indxt, 1);
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker if (num_bits < 10) {
295*15dc779aSAndroid Build Coastguard Worker nbt = 2;
296*15dc779aSAndroid Build Coastguard Worker nit = 0;
297*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 1;
298*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[i] = lsfq[i];
299*15dc779aSAndroid Build Coastguard Worker }
300*15dc779aSAndroid Build Coastguard Worker
301*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = ptr_lsfq[ORDER + i];
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[0], lsfq, indxt, 2);
304*15dc779aSAndroid Build Coastguard Worker num_bits += 1;
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker if (num_bits < nbt) {
307*15dc779aSAndroid Build Coastguard Worker nbt = num_bits;
308*15dc779aSAndroid Build Coastguard Worker nit = iusace_get_num_params(&indxt[0]);
309*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 2;
310*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[i] = lsfq[i];
311*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nit; i++) ptr_index[i] = indxt[i];
312*15dc779aSAndroid Build Coastguard Worker }
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker ptr_index += nit;
315*15dc779aSAndroid Build Coastguard Worker *nb_indices += nit;
316*15dc779aSAndroid Build Coastguard Worker *nbbits += nbt;
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker *ptr_index = 0;
319*15dc779aSAndroid Build Coastguard Worker ptr_index++;
320*15dc779aSAndroid Build Coastguard Worker *nb_indices += 1;
321*15dc779aSAndroid Build Coastguard Worker
322*15dc779aSAndroid Build Coastguard Worker ptr_index[0] = iusace_avq_first_approx_abs(&ptr_lsf[2 * ORDER], &ptr_lsfq[2 * ORDER]);
323*15dc779aSAndroid Build Coastguard Worker
324*15dc779aSAndroid Build Coastguard Worker num_bits =
325*15dc779aSAndroid Build Coastguard Worker iusace_avq_first_approx_rel(&ptr_lsf[2 * ORDER], &ptr_lsfq[2 * ORDER], &ptr_index[1], 0);
326*15dc779aSAndroid Build Coastguard Worker nbt = 2 + 8 + num_bits;
327*15dc779aSAndroid Build Coastguard Worker nit = 1 + iusace_get_num_params(&ptr_index[1]);
328*15dc779aSAndroid Build Coastguard Worker
329*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = 0.5f * (ptr_lsfq[ORDER + i] + ptr_lsfq[3 * ORDER + i]);
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[2 * ORDER], lsfq, indxt, 1);
332*15dc779aSAndroid Build Coastguard Worker num_bits += 1;
333*15dc779aSAndroid Build Coastguard Worker
334*15dc779aSAndroid Build Coastguard Worker if (num_bits < nbt) {
335*15dc779aSAndroid Build Coastguard Worker nbt = num_bits;
336*15dc779aSAndroid Build Coastguard Worker nit = iusace_get_num_params(&indxt[0]);
337*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 1;
338*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[2 * ORDER + i] = lsfq[i];
339*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nit; i++) ptr_index[i] = indxt[i];
340*15dc779aSAndroid Build Coastguard Worker }
341*15dc779aSAndroid Build Coastguard Worker
342*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = ptr_lsfq[ORDER + i];
343*15dc779aSAndroid Build Coastguard Worker
344*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[2 * ORDER], lsfq, indxt, 2);
345*15dc779aSAndroid Build Coastguard Worker num_bits += 3;
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker if (num_bits < nbt) {
348*15dc779aSAndroid Build Coastguard Worker nbt = num_bits;
349*15dc779aSAndroid Build Coastguard Worker nit = iusace_get_num_params(&indxt[0]);
350*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 2;
351*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[2 * ORDER + i] = lsfq[i];
352*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nit; i++) ptr_index[i] = indxt[i];
353*15dc779aSAndroid Build Coastguard Worker }
354*15dc779aSAndroid Build Coastguard Worker
355*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) lsfq[i] = ptr_lsfq[3 * ORDER + i];
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker num_bits = iusace_avq_first_approx_rel(&ptr_lsf[2 * ORDER], lsfq, indxt, 2);
358*15dc779aSAndroid Build Coastguard Worker num_bits += 3;
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker if (num_bits < nbt) {
361*15dc779aSAndroid Build Coastguard Worker nbt = num_bits;
362*15dc779aSAndroid Build Coastguard Worker nit = iusace_get_num_params(&indxt[0]);
363*15dc779aSAndroid Build Coastguard Worker ptr_index[-1] = 3;
364*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) ptr_lsfq[2 * ORDER + i] = lsfq[i];
365*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nit; i++) ptr_index[i] = indxt[i];
366*15dc779aSAndroid Build Coastguard Worker }
367*15dc779aSAndroid Build Coastguard Worker
368*15dc779aSAndroid Build Coastguard Worker *nb_indices += nit;
369*15dc779aSAndroid Build Coastguard Worker *nbbits += nbt;
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker return;
372*15dc779aSAndroid Build Coastguard Worker }
373