xref: /aosp_15_r20/external/libxaac/encoder/iusace_enc_fac.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 <string.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_write_bitstream.h"
52*15dc779aSAndroid Build Coastguard Worker #include "iusace_func_prototypes.h"
53*15dc779aSAndroid Build Coastguard Worker #include "iusace_avq_enc.h"
54*15dc779aSAndroid Build Coastguard Worker #include "iusace_lpd_rom.h"
55*15dc779aSAndroid Build Coastguard Worker 
iusace_unary_code(WORD32 idx,WORD16 * ptr_bit_buf)56*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_unary_code(WORD32 idx, WORD16 *ptr_bit_buf) {
57*15dc779aSAndroid Build Coastguard Worker   WORD32 num_bits;
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker   num_bits = 1;
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker   idx -= 1;
62*15dc779aSAndroid Build Coastguard Worker   while (idx-- > 0) {
63*15dc779aSAndroid Build Coastguard Worker     *ptr_bit_buf++ = 1;
64*15dc779aSAndroid Build Coastguard Worker     num_bits++;
65*15dc779aSAndroid Build Coastguard Worker   }
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker   *ptr_bit_buf = 0;
68*15dc779aSAndroid Build Coastguard Worker 
69*15dc779aSAndroid Build Coastguard Worker   return (num_bits);
70*15dc779aSAndroid Build Coastguard Worker }
71*15dc779aSAndroid Build Coastguard Worker 
iusace_get_nk_mode(WORD32 mode_lpc,ia_bit_buf_struct * pstr_it_bit_buff,WORD32 * nk_mode,WORD32 lpc_set)72*15dc779aSAndroid Build Coastguard Worker static VOID iusace_get_nk_mode(WORD32 mode_lpc, ia_bit_buf_struct *pstr_it_bit_buff,
73*15dc779aSAndroid Build Coastguard Worker                                WORD32 *nk_mode, WORD32 lpc_set) {
74*15dc779aSAndroid Build Coastguard Worker   switch (lpc_set) {
75*15dc779aSAndroid Build Coastguard Worker     case 4:
76*15dc779aSAndroid Build Coastguard Worker       break;
77*15dc779aSAndroid Build Coastguard Worker     case 0:
78*15dc779aSAndroid Build Coastguard Worker     case 2:
79*15dc779aSAndroid Build Coastguard Worker       *nk_mode = 3;
80*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, mode_lpc, 1);
81*15dc779aSAndroid Build Coastguard Worker       break;
82*15dc779aSAndroid Build Coastguard Worker     case 1:
83*15dc779aSAndroid Build Coastguard Worker       *nk_mode = mode_lpc;
84*15dc779aSAndroid Build Coastguard Worker       if (mode_lpc == 2) {
85*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
86*15dc779aSAndroid Build Coastguard Worker       } else if (mode_lpc == 1) {
87*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
88*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
89*15dc779aSAndroid Build Coastguard Worker       } else if (mode_lpc == 0) {
90*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
91*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
92*15dc779aSAndroid Build Coastguard Worker       }
93*15dc779aSAndroid Build Coastguard Worker       break;
94*15dc779aSAndroid Build Coastguard Worker     case 3:
95*15dc779aSAndroid Build Coastguard Worker       if (mode_lpc == 0) {
96*15dc779aSAndroid Build Coastguard Worker         *nk_mode = 0;
97*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
98*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
99*15dc779aSAndroid Build Coastguard Worker       } else if (mode_lpc == 1) {
100*15dc779aSAndroid Build Coastguard Worker         *nk_mode = 1;
101*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
102*15dc779aSAndroid Build Coastguard Worker       } else if (mode_lpc == 2) {
103*15dc779aSAndroid Build Coastguard Worker         *nk_mode = 2;
104*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
105*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
106*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
107*15dc779aSAndroid Build Coastguard Worker       } else {
108*15dc779aSAndroid Build Coastguard Worker         *nk_mode = 2;
109*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
110*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
111*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
112*15dc779aSAndroid Build Coastguard Worker       }
113*15dc779aSAndroid Build Coastguard Worker       break;
114*15dc779aSAndroid Build Coastguard Worker   }
115*15dc779aSAndroid Build Coastguard Worker   return;
116*15dc779aSAndroid Build Coastguard Worker }
117*15dc779aSAndroid Build Coastguard Worker 
iusace_write_qn_data(WORD32 * qn,ia_bit_buf_struct * pstr_it_bit_buff,WORD32 nk_mode,WORD32 num_frames)118*15dc779aSAndroid Build Coastguard Worker static VOID iusace_write_qn_data(WORD32 *qn, ia_bit_buf_struct *pstr_it_bit_buff, WORD32 nk_mode,
119*15dc779aSAndroid Build Coastguard Worker                                  WORD32 num_frames) {
120*15dc779aSAndroid Build Coastguard Worker   WORD32 k, i;
121*15dc779aSAndroid Build Coastguard Worker   switch (nk_mode) {
122*15dc779aSAndroid Build Coastguard Worker     case 1:
123*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 2; k++) {
124*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < qn[k] - 1; i++) {
125*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
126*15dc779aSAndroid Build Coastguard Worker         }
127*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
128*15dc779aSAndroid Build Coastguard Worker       }
129*15dc779aSAndroid Build Coastguard Worker       break;
130*15dc779aSAndroid Build Coastguard Worker     case 0:
131*15dc779aSAndroid Build Coastguard Worker     case 2:
132*15dc779aSAndroid Build Coastguard Worker     case 3:
133*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 2; k++) {
134*15dc779aSAndroid Build Coastguard Worker         WORD32 qn1 = qn[k] - 2;
135*15dc779aSAndroid Build Coastguard Worker         if (qn1 < 0 || qn1 > 3) {
136*15dc779aSAndroid Build Coastguard Worker           qn1 = 3;
137*15dc779aSAndroid Build Coastguard Worker         }
138*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, qn1, 2);
139*15dc779aSAndroid Build Coastguard Worker       }
140*15dc779aSAndroid Build Coastguard Worker       if ((nk_mode == 2) && num_frames != 2) {
141*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < 2; k++) {
142*15dc779aSAndroid Build Coastguard Worker           if (qn[k] > 4) {
143*15dc779aSAndroid Build Coastguard Worker             for (i = 0; i < qn[k] - 4; i++) {
144*15dc779aSAndroid Build Coastguard Worker               iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
145*15dc779aSAndroid Build Coastguard Worker             }
146*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
147*15dc779aSAndroid Build Coastguard Worker           }
148*15dc779aSAndroid Build Coastguard Worker           if (qn[k] == 0) {
149*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
150*15dc779aSAndroid Build Coastguard Worker           }
151*15dc779aSAndroid Build Coastguard Worker         }
152*15dc779aSAndroid Build Coastguard Worker       } else {
153*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < 2; k++) {
154*15dc779aSAndroid Build Coastguard Worker           if (qn[k] == 5) {
155*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
156*15dc779aSAndroid Build Coastguard Worker           } else if (qn[k] == 6) {
157*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
158*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
159*15dc779aSAndroid Build Coastguard Worker           } else if (qn[k] == 0) {
160*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
161*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
162*15dc779aSAndroid Build Coastguard Worker             iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
163*15dc779aSAndroid Build Coastguard Worker           } else {
164*15dc779aSAndroid Build Coastguard Worker             WORD32 qn_ext = qn[k] - 4;
165*15dc779aSAndroid Build Coastguard Worker             if (qn_ext > 0) {
166*15dc779aSAndroid Build Coastguard Worker               for (i = 0; i < qn_ext; i++) {
167*15dc779aSAndroid Build Coastguard Worker                 iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
168*15dc779aSAndroid Build Coastguard Worker               }
169*15dc779aSAndroid Build Coastguard Worker               iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
170*15dc779aSAndroid Build Coastguard Worker             }
171*15dc779aSAndroid Build Coastguard Worker           }
172*15dc779aSAndroid Build Coastguard Worker         }
173*15dc779aSAndroid Build Coastguard Worker       }
174*15dc779aSAndroid Build Coastguard Worker       break;
175*15dc779aSAndroid Build Coastguard Worker   }
176*15dc779aSAndroid Build Coastguard Worker   return;
177*15dc779aSAndroid Build Coastguard Worker }
178*15dc779aSAndroid Build Coastguard Worker 
iusace_write_cb_indices(WORD32 * qn,WORD32 * ptr_params,WORD32 * idx,ia_bit_buf_struct * pstr_it_bit_buff,WORD32 nk_mode,WORD32 num_frames)179*15dc779aSAndroid Build Coastguard Worker static VOID iusace_write_cb_indices(WORD32 *qn, WORD32 *ptr_params, WORD32 *idx,
180*15dc779aSAndroid Build Coastguard Worker                                     ia_bit_buf_struct *pstr_it_bit_buff, WORD32 nk_mode,
181*15dc779aSAndroid Build Coastguard Worker                                     WORD32 num_frames) {
182*15dc779aSAndroid Build Coastguard Worker   WORD32 k;
183*15dc779aSAndroid Build Coastguard Worker   WORD32 j = *idx;
184*15dc779aSAndroid Build Coastguard Worker 
185*15dc779aSAndroid Build Coastguard Worker   iusace_write_qn_data(qn, pstr_it_bit_buff, nk_mode, num_frames);
186*15dc779aSAndroid Build Coastguard Worker 
187*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 2; k++) {
188*15dc779aSAndroid Build Coastguard Worker     if (qn[k] > 0) {
189*15dc779aSAndroid Build Coastguard Worker       WORD32 n, nk, i;
190*15dc779aSAndroid Build Coastguard Worker       if (qn[k] > 4) {
191*15dc779aSAndroid Build Coastguard Worker         nk = (qn[k] - 3) >> 1;
192*15dc779aSAndroid Build Coastguard Worker         n = qn[k] - nk * 2;
193*15dc779aSAndroid Build Coastguard Worker       } else {
194*15dc779aSAndroid Build Coastguard Worker         nk = 0;
195*15dc779aSAndroid Build Coastguard Worker         n = qn[k];
196*15dc779aSAndroid Build Coastguard Worker       }
197*15dc779aSAndroid Build Coastguard Worker 
198*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, ptr_params[j++], (UWORD8)(4 * n));
199*15dc779aSAndroid Build Coastguard Worker 
200*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < 8; i++) {
201*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, ptr_params[j++], (UWORD8)nk);
202*15dc779aSAndroid Build Coastguard Worker       }
203*15dc779aSAndroid Build Coastguard Worker     }
204*15dc779aSAndroid Build Coastguard Worker   }
205*15dc779aSAndroid Build Coastguard Worker 
206*15dc779aSAndroid Build Coastguard Worker   *idx = j;
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker   return;
209*15dc779aSAndroid Build Coastguard Worker }
210*15dc779aSAndroid Build Coastguard Worker 
iusace_write_lpc_data(ia_bit_buf_struct * pstr_it_bit_buff,WORD32 * param_lpc,WORD32 first_lpd_flag,WORD32 * mod,WORD32 num_frames)211*15dc779aSAndroid Build Coastguard Worker static VOID iusace_write_lpc_data(ia_bit_buf_struct *pstr_it_bit_buff, WORD32 *param_lpc,
212*15dc779aSAndroid Build Coastguard Worker                                   WORD32 first_lpd_flag, WORD32 *mod, WORD32 num_frames) {
213*15dc779aSAndroid Build Coastguard Worker   WORD32 nk_mode = 0;
214*15dc779aSAndroid Build Coastguard Worker   WORD32 j = 0, k;
215*15dc779aSAndroid Build Coastguard Worker   WORD32 mode_lpc = 0;
216*15dc779aSAndroid Build Coastguard Worker   WORD32 qn[2] = {0};
217*15dc779aSAndroid Build Coastguard Worker 
218*15dc779aSAndroid Build Coastguard Worker   iusace_get_nk_mode(mode_lpc, pstr_it_bit_buff, &nk_mode, 4);
219*15dc779aSAndroid Build Coastguard Worker 
220*15dc779aSAndroid Build Coastguard Worker   iusace_write_bits_buf(pstr_it_bit_buff, param_lpc[j++], 8);
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 2; k++) {
223*15dc779aSAndroid Build Coastguard Worker     qn[k] = param_lpc[j++];
224*15dc779aSAndroid Build Coastguard Worker   }
225*15dc779aSAndroid Build Coastguard Worker 
226*15dc779aSAndroid Build Coastguard Worker   iusace_write_cb_indices(qn, param_lpc, &j, pstr_it_bit_buff, nk_mode, num_frames);
227*15dc779aSAndroid Build Coastguard Worker 
228*15dc779aSAndroid Build Coastguard Worker   if (first_lpd_flag) {
229*15dc779aSAndroid Build Coastguard Worker     mode_lpc = param_lpc[j++];
230*15dc779aSAndroid Build Coastguard Worker     iusace_get_nk_mode(mode_lpc, pstr_it_bit_buff, &nk_mode, 0);
231*15dc779aSAndroid Build Coastguard Worker 
232*15dc779aSAndroid Build Coastguard Worker     if (mode_lpc == 0) {
233*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, param_lpc[j++], 8);
234*15dc779aSAndroid Build Coastguard Worker     }
235*15dc779aSAndroid Build Coastguard Worker 
236*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
237*15dc779aSAndroid Build Coastguard Worker       qn[k] = param_lpc[j++];
238*15dc779aSAndroid Build Coastguard Worker     }
239*15dc779aSAndroid Build Coastguard Worker 
240*15dc779aSAndroid Build Coastguard Worker     iusace_write_cb_indices(qn, param_lpc, &j, pstr_it_bit_buff, nk_mode, num_frames);
241*15dc779aSAndroid Build Coastguard Worker   }
242*15dc779aSAndroid Build Coastguard Worker 
243*15dc779aSAndroid Build Coastguard Worker   mode_lpc = param_lpc[j++];
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker   if (num_frames == 4 && mod[0] < 3) {
246*15dc779aSAndroid Build Coastguard Worker     iusace_get_nk_mode(mode_lpc, pstr_it_bit_buff, &nk_mode, 2);
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker     if (mode_lpc == 0) {
249*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, param_lpc[j++], 8);
250*15dc779aSAndroid Build Coastguard Worker     }
251*15dc779aSAndroid Build Coastguard Worker 
252*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
253*15dc779aSAndroid Build Coastguard Worker       qn[k] = param_lpc[j++];
254*15dc779aSAndroid Build Coastguard Worker     }
255*15dc779aSAndroid Build Coastguard Worker 
256*15dc779aSAndroid Build Coastguard Worker     iusace_write_cb_indices(qn, param_lpc, &j, pstr_it_bit_buff, nk_mode, num_frames);
257*15dc779aSAndroid Build Coastguard Worker   }
258*15dc779aSAndroid Build Coastguard Worker   mode_lpc = param_lpc[j++];
259*15dc779aSAndroid Build Coastguard Worker   if (mod[0] < 2) {
260*15dc779aSAndroid Build Coastguard Worker     iusace_get_nk_mode(mode_lpc, pstr_it_bit_buff, &nk_mode, 1);
261*15dc779aSAndroid Build Coastguard Worker 
262*15dc779aSAndroid Build Coastguard Worker     if (mode_lpc != 1) {
263*15dc779aSAndroid Build Coastguard Worker       if (mode_lpc == 0) {
264*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, param_lpc[j++], 8);
265*15dc779aSAndroid Build Coastguard Worker       }
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 2; k++) {
268*15dc779aSAndroid Build Coastguard Worker         qn[k] = param_lpc[j++];
269*15dc779aSAndroid Build Coastguard Worker       }
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker       iusace_write_cb_indices(qn, param_lpc, &j, pstr_it_bit_buff, nk_mode, num_frames);
272*15dc779aSAndroid Build Coastguard Worker     }
273*15dc779aSAndroid Build Coastguard Worker   } else if (mode_lpc != 1) {
274*15dc779aSAndroid Build Coastguard Worker     if (mode_lpc == 0) {
275*15dc779aSAndroid Build Coastguard Worker       j++;
276*15dc779aSAndroid Build Coastguard Worker     }
277*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
278*15dc779aSAndroid Build Coastguard Worker       qn[k] = param_lpc[j++];
279*15dc779aSAndroid Build Coastguard Worker     }
280*15dc779aSAndroid Build Coastguard Worker     j += ((qn[0] > 0) ? 9 : 0) + ((qn[1] > 0) ? 9 : 0);
281*15dc779aSAndroid Build Coastguard Worker   }
282*15dc779aSAndroid Build Coastguard Worker 
283*15dc779aSAndroid Build Coastguard Worker   mode_lpc = param_lpc[j++];
284*15dc779aSAndroid Build Coastguard Worker   if (num_frames != 2 && mod[2] < 2) {
285*15dc779aSAndroid Build Coastguard Worker     iusace_get_nk_mode(mode_lpc, pstr_it_bit_buff, &nk_mode, 3);
286*15dc779aSAndroid Build Coastguard Worker     if (mode_lpc == 0) {
287*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, param_lpc[j++], 8);
288*15dc779aSAndroid Build Coastguard Worker     }
289*15dc779aSAndroid Build Coastguard Worker 
290*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
291*15dc779aSAndroid Build Coastguard Worker       qn[k] = param_lpc[j++];
292*15dc779aSAndroid Build Coastguard Worker     }
293*15dc779aSAndroid Build Coastguard Worker     iusace_write_cb_indices(qn, param_lpc, &j, pstr_it_bit_buff, nk_mode, num_frames);
294*15dc779aSAndroid Build Coastguard Worker   }
295*15dc779aSAndroid Build Coastguard Worker   return;
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker 
iusace_encode_fac_params(WORD32 * mod,WORD32 * n_param_tcx,ia_usac_data_struct * usac_data,WORD32 const usac_independency_flag,ia_bit_buf_struct * pstr_it_bit_buff,WORD32 ch_idx)298*15dc779aSAndroid Build Coastguard Worker VOID iusace_encode_fac_params(WORD32 *mod, WORD32 *n_param_tcx, ia_usac_data_struct *usac_data,
299*15dc779aSAndroid Build Coastguard Worker                               WORD32 const usac_independency_flag,
300*15dc779aSAndroid Build Coastguard Worker                               ia_bit_buf_struct *pstr_it_bit_buff, WORD32 ch_idx) {
301*15dc779aSAndroid Build Coastguard Worker   WORD32 *total_nbbits = &usac_data->total_nbbits[ch_idx];
302*15dc779aSAndroid Build Coastguard Worker   ia_usac_td_encoder_struct *pstr_td = usac_data->td_encoder[ch_idx];
303*15dc779aSAndroid Build Coastguard Worker   WORD32 codec_mode = pstr_td->acelp_core_mode;
304*15dc779aSAndroid Build Coastguard Worker   WORD16 *bit_buf = usac_data->td_serial_out[ch_idx];
305*15dc779aSAndroid Build Coastguard Worker   WORD32 is_bass_post_filter = 1;
306*15dc779aSAndroid Build Coastguard Worker   WORD32 first_lpd_flag = (usac_data->core_mode_prev[ch_idx] == CORE_MODE_FD);
307*15dc779aSAndroid Build Coastguard Worker   WORD32 *param_lpc = usac_data->param_buf + (NUM_FRAMES * MAX_NUM_TCX_PRM_PER_DIV);
308*15dc779aSAndroid Build Coastguard Worker   WORD32 *param = usac_data->param_buf;
309*15dc779aSAndroid Build Coastguard Worker   WORD32 j, k, n, sfr, lpd_mode, num_bits, sq_bits, *prm;
310*15dc779aSAndroid Build Coastguard Worker   WORD16 first_tcx_flag = 1;
311*15dc779aSAndroid Build Coastguard Worker   WORD32 nbits_fac, nb_bits_lpc;
312*15dc779aSAndroid Build Coastguard Worker   WORD32 core_mode_last = (first_lpd_flag) ? 0 : 1;
313*15dc779aSAndroid Build Coastguard Worker   WORD32 fac_data_present;
314*15dc779aSAndroid Build Coastguard Worker   WORD32 num_frames = NUM_FRAMES;
315*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_bit_buf = bit_buf;
316*15dc779aSAndroid Build Coastguard Worker 
317*15dc779aSAndroid Build Coastguard Worker   pstr_td->num_bits_per_supfrm = 0;
318*15dc779aSAndroid Build Coastguard Worker   *total_nbbits = 0;
319*15dc779aSAndroid Build Coastguard Worker 
320*15dc779aSAndroid Build Coastguard Worker   iusace_write_bits_buf(pstr_it_bit_buff, pstr_td->acelp_core_mode, 3);
321*15dc779aSAndroid Build Coastguard Worker 
322*15dc779aSAndroid Build Coastguard Worker   if (mod[0] == 3) {
323*15dc779aSAndroid Build Coastguard Worker     lpd_mode = 25;
324*15dc779aSAndroid Build Coastguard Worker   } else if ((mod[0] == 2) && (mod[2] == 2)) {
325*15dc779aSAndroid Build Coastguard Worker     lpd_mode = 24;
326*15dc779aSAndroid Build Coastguard Worker   } else {
327*15dc779aSAndroid Build Coastguard Worker     if (mod[0] == 2) {
328*15dc779aSAndroid Build Coastguard Worker       lpd_mode = 16 + mod[2] + 2 * mod[3];
329*15dc779aSAndroid Build Coastguard Worker     } else if (mod[2] == 2) {
330*15dc779aSAndroid Build Coastguard Worker       lpd_mode = 20 + mod[0] + 2 * mod[1];
331*15dc779aSAndroid Build Coastguard Worker     } else {
332*15dc779aSAndroid Build Coastguard Worker       lpd_mode = mod[0] + 2 * mod[1] + 4 * mod[2] + 8 * mod[3];
333*15dc779aSAndroid Build Coastguard Worker     }
334*15dc779aSAndroid Build Coastguard Worker   }
335*15dc779aSAndroid Build Coastguard Worker   iusace_write_bits_buf(pstr_it_bit_buff, lpd_mode, 5);
336*15dc779aSAndroid Build Coastguard Worker   pstr_td->num_bits_per_supfrm = 5;
337*15dc779aSAndroid Build Coastguard Worker   *total_nbbits += 5;
338*15dc779aSAndroid Build Coastguard Worker 
339*15dc779aSAndroid Build Coastguard Worker   iusace_write_bits_buf(pstr_it_bit_buff, is_bass_post_filter, 1);
340*15dc779aSAndroid Build Coastguard Worker   *total_nbbits += 1;
341*15dc779aSAndroid Build Coastguard Worker 
342*15dc779aSAndroid Build Coastguard Worker   iusace_write_bits_buf(pstr_it_bit_buff, core_mode_last, 1);
343*15dc779aSAndroid Build Coastguard Worker   *total_nbbits += 1;
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker   if (((mod[0] == 0) && (mod[-1] != 0)) || ((mod[0] > 0) && (mod[-1] == 0))) {
346*15dc779aSAndroid Build Coastguard Worker     fac_data_present = 1;
347*15dc779aSAndroid Build Coastguard Worker   } else {
348*15dc779aSAndroid Build Coastguard Worker     fac_data_present = 0;
349*15dc779aSAndroid Build Coastguard Worker   }
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker   iusace_write_bits_buf(pstr_it_bit_buff, fac_data_present, 1);
352*15dc779aSAndroid Build Coastguard Worker   *total_nbbits += 1;
353*15dc779aSAndroid Build Coastguard Worker 
354*15dc779aSAndroid Build Coastguard Worker   num_bits = (iusace_acelp_core_numbits_1024[codec_mode] / 4) - 2;
355*15dc779aSAndroid Build Coastguard Worker 
356*15dc779aSAndroid Build Coastguard Worker   k = 0;
357*15dc779aSAndroid Build Coastguard Worker   while (k < num_frames) {
358*15dc779aSAndroid Build Coastguard Worker     lpd_mode = mod[k];
359*15dc779aSAndroid Build Coastguard Worker     prm = param + (k * MAX_NUM_TCX_PRM_PER_DIV);
360*15dc779aSAndroid Build Coastguard Worker     j = 0;
361*15dc779aSAndroid Build Coastguard Worker 
362*15dc779aSAndroid Build Coastguard Worker     if (((mod[k - 1] == 0) && (mod[k] > 0)) || ((mod[k - 1] > 0) && (mod[k] == 0))) {
363*15dc779aSAndroid Build Coastguard Worker       nbits_fac = iusace_fd_encode_fac(&prm[j], ptr_bit_buf, (pstr_td->len_subfrm) / 2);
364*15dc779aSAndroid Build Coastguard Worker       j += (pstr_td->len_subfrm) / 2;
365*15dc779aSAndroid Build Coastguard Worker       *total_nbbits += nbits_fac;
366*15dc779aSAndroid Build Coastguard Worker       for (WORD32 i = 0; i < nbits_fac; i++) {
367*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, ptr_bit_buf[i], 1);
368*15dc779aSAndroid Build Coastguard Worker       }
369*15dc779aSAndroid Build Coastguard Worker     }
370*15dc779aSAndroid Build Coastguard Worker 
371*15dc779aSAndroid Build Coastguard Worker     if (lpd_mode == 0) {
372*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, prm[j++], 2);
373*15dc779aSAndroid Build Coastguard Worker 
374*15dc779aSAndroid Build Coastguard Worker       for (sfr = 0; sfr < (pstr_td->num_subfrm); sfr++) {
375*15dc779aSAndroid Build Coastguard Worker         n = 6;
376*15dc779aSAndroid Build Coastguard Worker         if ((sfr == 0) || (((pstr_td->len_subfrm) == 256) && (sfr == 2))) n = 9;
377*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, prm[j], (UWORD8)n);
378*15dc779aSAndroid Build Coastguard Worker         j++;
379*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 1);
380*15dc779aSAndroid Build Coastguard Worker         j++;
381*15dc779aSAndroid Build Coastguard Worker         if (codec_mode == ACELP_CORE_MODE_9k6) {
382*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 5);
383*15dc779aSAndroid Build Coastguard Worker           j++;
384*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 5);
385*15dc779aSAndroid Build Coastguard Worker           j++;
386*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 5);
387*15dc779aSAndroid Build Coastguard Worker           j++;
388*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 5);
389*15dc779aSAndroid Build Coastguard Worker           j++;
390*15dc779aSAndroid Build Coastguard Worker         } else if (codec_mode == ACELP_CORE_MODE_11k2) {
391*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
392*15dc779aSAndroid Build Coastguard Worker           j++;
393*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
394*15dc779aSAndroid Build Coastguard Worker           j++;
395*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 5);
396*15dc779aSAndroid Build Coastguard Worker           j++;
397*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 5);
398*15dc779aSAndroid Build Coastguard Worker           j++;
399*15dc779aSAndroid Build Coastguard Worker         } else if (codec_mode == ACELP_CORE_MODE_12k8) {
400*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
401*15dc779aSAndroid Build Coastguard Worker           j++;
402*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
403*15dc779aSAndroid Build Coastguard Worker           j++;
404*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
405*15dc779aSAndroid Build Coastguard Worker           j++;
406*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
407*15dc779aSAndroid Build Coastguard Worker           j++;
408*15dc779aSAndroid Build Coastguard Worker         } else if (codec_mode == ACELP_CORE_MODE_14k4) {
409*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 13);
410*15dc779aSAndroid Build Coastguard Worker           j++;
411*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 13);
412*15dc779aSAndroid Build Coastguard Worker           j++;
413*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
414*15dc779aSAndroid Build Coastguard Worker           j++;
415*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 9);
416*15dc779aSAndroid Build Coastguard Worker           j++;
417*15dc779aSAndroid Build Coastguard Worker         } else if (codec_mode == ACELP_CORE_MODE_16k) {
418*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 13);
419*15dc779aSAndroid Build Coastguard Worker           j++;
420*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 13);
421*15dc779aSAndroid Build Coastguard Worker           j++;
422*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 13);
423*15dc779aSAndroid Build Coastguard Worker           j++;
424*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 13);
425*15dc779aSAndroid Build Coastguard Worker           j++;
426*15dc779aSAndroid Build Coastguard Worker         } else if (codec_mode == ACELP_CORE_MODE_18k4) {
427*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 2);
428*15dc779aSAndroid Build Coastguard Worker           j++;
429*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 2);
430*15dc779aSAndroid Build Coastguard Worker           j++;
431*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 2);
432*15dc779aSAndroid Build Coastguard Worker           j++;
433*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 2);
434*15dc779aSAndroid Build Coastguard Worker           j++;
435*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 14);
436*15dc779aSAndroid Build Coastguard Worker           j++;
437*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 14);
438*15dc779aSAndroid Build Coastguard Worker           j++;
439*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 14);
440*15dc779aSAndroid Build Coastguard Worker           j++;
441*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 14);
442*15dc779aSAndroid Build Coastguard Worker           j++;
443*15dc779aSAndroid Build Coastguard Worker         }
444*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, prm[j], 7);
445*15dc779aSAndroid Build Coastguard Worker         j++;
446*15dc779aSAndroid Build Coastguard Worker       }
447*15dc779aSAndroid Build Coastguard Worker       *total_nbbits += (num_bits - NBITS_LPC);
448*15dc779aSAndroid Build Coastguard Worker       pstr_td->num_bits_per_supfrm += (num_bits - NBITS_LPC);
449*15dc779aSAndroid Build Coastguard Worker       k++;
450*15dc779aSAndroid Build Coastguard Worker     } else {
451*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, prm[j++], 3);
452*15dc779aSAndroid Build Coastguard Worker       *total_nbbits += 3;
453*15dc779aSAndroid Build Coastguard Worker       pstr_td->num_bits_per_supfrm += 3;
454*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, prm[j++], 7);
455*15dc779aSAndroid Build Coastguard Worker       *total_nbbits += 7;
456*15dc779aSAndroid Build Coastguard Worker       pstr_td->num_bits_per_supfrm += 7;
457*15dc779aSAndroid Build Coastguard Worker 
458*15dc779aSAndroid Build Coastguard Worker       if (first_tcx_flag) {
459*15dc779aSAndroid Build Coastguard Worker         first_tcx_flag = 0;
460*15dc779aSAndroid Build Coastguard Worker         if (usac_independency_flag) {
461*15dc779aSAndroid Build Coastguard Worker           pstr_td->arith_reset_flag = 1;
462*15dc779aSAndroid Build Coastguard Worker           memset(pstr_td->c_pres, 0, 516 * sizeof(WORD32));
463*15dc779aSAndroid Build Coastguard Worker           memset(pstr_td->c_prev, 0, 516 * sizeof(WORD32));
464*15dc779aSAndroid Build Coastguard Worker         } else {
465*15dc779aSAndroid Build Coastguard Worker           if (pstr_td->arith_reset_flag) {
466*15dc779aSAndroid Build Coastguard Worker             memset(pstr_td->c_pres, 0, 516 * sizeof(WORD32));
467*15dc779aSAndroid Build Coastguard Worker             memset(pstr_td->c_prev, 0, 516 * sizeof(WORD32));
468*15dc779aSAndroid Build Coastguard Worker           }
469*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, pstr_td->arith_reset_flag, 1);
470*15dc779aSAndroid Build Coastguard Worker           *total_nbbits += 1;
471*15dc779aSAndroid Build Coastguard Worker           pstr_td->num_bits_per_supfrm += 1;
472*15dc779aSAndroid Build Coastguard Worker         }
473*15dc779aSAndroid Build Coastguard Worker       }
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker       sq_bits = iusace_tcx_coding(pstr_it_bit_buff, n_param_tcx[k], pstr_td->len_frame, prm + j,
476*15dc779aSAndroid Build Coastguard Worker                                   pstr_td->c_pres, pstr_td->c_prev);
477*15dc779aSAndroid Build Coastguard Worker 
478*15dc779aSAndroid Build Coastguard Worker       *total_nbbits += sq_bits;
479*15dc779aSAndroid Build Coastguard Worker       pstr_td->num_bits_per_supfrm += sq_bits;
480*15dc779aSAndroid Build Coastguard Worker 
481*15dc779aSAndroid Build Coastguard Worker       k += (1 << (lpd_mode - 1));
482*15dc779aSAndroid Build Coastguard Worker     }
483*15dc779aSAndroid Build Coastguard Worker   }
484*15dc779aSAndroid Build Coastguard Worker 
485*15dc779aSAndroid Build Coastguard Worker   nb_bits_lpc = pstr_it_bit_buff->cnt_bits;
486*15dc779aSAndroid Build Coastguard Worker 
487*15dc779aSAndroid Build Coastguard Worker   iusace_write_lpc_data(pstr_it_bit_buff, param_lpc, first_lpd_flag, mod, num_frames);
488*15dc779aSAndroid Build Coastguard Worker 
489*15dc779aSAndroid Build Coastguard Worker   nb_bits_lpc = pstr_it_bit_buff->cnt_bits - nb_bits_lpc;
490*15dc779aSAndroid Build Coastguard Worker   *total_nbbits += nb_bits_lpc;
491*15dc779aSAndroid Build Coastguard Worker   pstr_td->num_bits_per_supfrm += nb_bits_lpc;
492*15dc779aSAndroid Build Coastguard Worker 
493*15dc779aSAndroid Build Coastguard Worker   if ((core_mode_last == 0) && (fac_data_present == 1)) {
494*15dc779aSAndroid Build Coastguard Worker     WORD32 short_fac_flag = (mod[-1] == -2) ? 1 : 0;
495*15dc779aSAndroid Build Coastguard Worker     iusace_write_bits_buf(pstr_it_bit_buff, short_fac_flag, 1);
496*15dc779aSAndroid Build Coastguard Worker     *total_nbbits += 1;
497*15dc779aSAndroid Build Coastguard Worker   }
498*15dc779aSAndroid Build Coastguard Worker 
499*15dc779aSAndroid Build Coastguard Worker   return;
500*15dc779aSAndroid Build Coastguard Worker }
501*15dc779aSAndroid Build Coastguard Worker 
iusace_fd_encode_fac(WORD32 * prm,WORD16 * ptr_bit_buf,WORD32 fac_length)502*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_fd_encode_fac(WORD32 *prm, WORD16 *ptr_bit_buf, WORD32 fac_length) {
503*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, n, nb, qn, kv[8], nk, fac_bits;
504*15dc779aSAndroid Build Coastguard Worker   WORD32 I;
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker   fac_bits = 0;
507*15dc779aSAndroid Build Coastguard Worker 
508*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < fac_length; i += 8) {
509*15dc779aSAndroid Build Coastguard Worker     iusace_apply_voronoi_ext(&prm[i], &qn, &I, kv);
510*15dc779aSAndroid Build Coastguard Worker 
511*15dc779aSAndroid Build Coastguard Worker     nb = iusace_unary_code(qn, ptr_bit_buf);
512*15dc779aSAndroid Build Coastguard Worker     ptr_bit_buf += nb;
513*15dc779aSAndroid Build Coastguard Worker 
514*15dc779aSAndroid Build Coastguard Worker     fac_bits += nb;
515*15dc779aSAndroid Build Coastguard Worker 
516*15dc779aSAndroid Build Coastguard Worker     nk = 0;
517*15dc779aSAndroid Build Coastguard Worker     n = qn;
518*15dc779aSAndroid Build Coastguard Worker     if (qn > 4) {
519*15dc779aSAndroid Build Coastguard Worker       nk = (qn - 3) >> 1;
520*15dc779aSAndroid Build Coastguard Worker       n = qn - nk * 2;
521*15dc779aSAndroid Build Coastguard Worker     }
522*15dc779aSAndroid Build Coastguard Worker 
523*15dc779aSAndroid Build Coastguard Worker     if (qn != 0) {
524*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits2buf(I, 4 * n, ptr_bit_buf);
525*15dc779aSAndroid Build Coastguard Worker       ptr_bit_buf += 4 * n;
526*15dc779aSAndroid Build Coastguard Worker     }
527*15dc779aSAndroid Build Coastguard Worker     if (qn > 4) {
528*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 8; j++) {
529*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits2buf(kv[j], nk, ptr_bit_buf);
530*15dc779aSAndroid Build Coastguard Worker         ptr_bit_buf += nk;
531*15dc779aSAndroid Build Coastguard Worker       }
532*15dc779aSAndroid Build Coastguard Worker     }
533*15dc779aSAndroid Build Coastguard Worker     fac_bits += 4 * qn;
534*15dc779aSAndroid Build Coastguard Worker   }
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker   return fac_bits;
537*15dc779aSAndroid Build Coastguard Worker }
538