xref: /aosp_15_r20/external/libxaac/encoder/iusace_arith_enc.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 <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker /* DRC */
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
35*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
36*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
37*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
40*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
43*15dc779aSAndroid Build Coastguard Worker #include "iusace_arith_enc.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
45*15dc779aSAndroid Build Coastguard Worker #include "iusace_rom.h"
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker #define ARITH_ESCAPE (16)
48*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_map_context(WORD32 pres_n,WORD32 prev_n,WORD32 * ptr_c_prev,WORD32 * ptr_c_pres,WORD32 arith_reset_flag)49*15dc779aSAndroid Build Coastguard Worker static VOID iusace_arith_map_context(WORD32 pres_n, WORD32 prev_n, WORD32 *ptr_c_prev,
50*15dc779aSAndroid Build Coastguard Worker                                      WORD32 *ptr_c_pres, WORD32 arith_reset_flag) {
51*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k;
52*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ratio;
53*15dc779aSAndroid Build Coastguard Worker   WORD32 c_prev[516];
54*15dc779aSAndroid Build Coastguard Worker   WORD32 c_pres[516];
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker   if (arith_reset_flag) {
57*15dc779aSAndroid Build Coastguard Worker     memset(ptr_c_pres, 0, 516 * sizeof(WORD32));
58*15dc779aSAndroid Build Coastguard Worker     memset(ptr_c_prev, 0, 516 * sizeof(WORD32));
59*15dc779aSAndroid Build Coastguard Worker   } else {
60*15dc779aSAndroid Build Coastguard Worker     memcpy(&c_prev[2], &ptr_c_prev[2], (prev_n / 2 + 2) * sizeof(WORD32));
61*15dc779aSAndroid Build Coastguard Worker     memcpy(&c_pres[2], &ptr_c_pres[2], (prev_n / 2 + 2) * sizeof(WORD32));
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker     ratio = (FLOAT32)(prev_n) / (FLOAT32)(pres_n);
64*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < (pres_n / 2); i++) {
65*15dc779aSAndroid Build Coastguard Worker       k = (WORD32)((FLOAT32)(i)*ratio);
66*15dc779aSAndroid Build Coastguard Worker       ptr_c_pres[2 + i] = c_pres[2 + k];
67*15dc779aSAndroid Build Coastguard Worker       ptr_c_prev[2 + i] = c_prev[2 + k];
68*15dc779aSAndroid Build Coastguard Worker     }
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker     ptr_c_pres[(pres_n / 2) + 2] = c_pres[(prev_n / 2) + 2];
71*15dc779aSAndroid Build Coastguard Worker     ptr_c_pres[(pres_n / 2) + 3] = c_pres[(prev_n / 2) + 3];
72*15dc779aSAndroid Build Coastguard Worker     ptr_c_prev[(pres_n / 2) + 2] = c_prev[(prev_n / 2) + 2];
73*15dc779aSAndroid Build Coastguard Worker     ptr_c_prev[(pres_n / 2) + 3] = c_prev[(prev_n / 2) + 3];
74*15dc779aSAndroid Build Coastguard Worker   }
75*15dc779aSAndroid Build Coastguard Worker   return;
76*15dc779aSAndroid Build Coastguard Worker }
77*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_get_state(WORD32 * c_pres,WORD32 * c_prev,WORD32 * s,WORD32 idx)78*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_arith_get_state(WORD32 *c_pres, WORD32 *c_prev, WORD32 *s, WORD32 idx) {
79*15dc779aSAndroid Build Coastguard Worker   WORD32 s_tmp = *s;
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker   s_tmp = s_tmp >> 4;
82*15dc779aSAndroid Build Coastguard Worker   s_tmp = s_tmp + (c_prev[idx + 1] << 12);
83*15dc779aSAndroid Build Coastguard Worker   s_tmp = (s_tmp & 0xFFF0) + c_pres[idx - 1];
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker   *s = s_tmp;
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker   if (idx > 3) {
88*15dc779aSAndroid Build Coastguard Worker     if ((c_pres[idx - 1] + c_pres[idx - 2] + c_pres[idx - 3]) < 5) {
89*15dc779aSAndroid Build Coastguard Worker       return (s_tmp + 0x10000);
90*15dc779aSAndroid Build Coastguard Worker     }
91*15dc779aSAndroid Build Coastguard Worker   }
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker   return (s_tmp);
94*15dc779aSAndroid Build Coastguard Worker }
95*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_get_pk(WORD32 c)96*15dc779aSAndroid Build Coastguard Worker static UWORD16 iusace_arith_get_pk(WORD32 c) {
97*15dc779aSAndroid Build Coastguard Worker   WORD32 j;
98*15dc779aSAndroid Build Coastguard Worker   WORD32 i, i_min, i_max;
99*15dc779aSAndroid Build Coastguard Worker 
100*15dc779aSAndroid Build Coastguard Worker   i_min = -1;
101*15dc779aSAndroid Build Coastguard Worker   i_max = (sizeof(iusace_ari_lookup_m) / sizeof(iusace_ari_lookup_m[0])) - 1;
102*15dc779aSAndroid Build Coastguard Worker   while ((i_max - i_min) > 1) {
103*15dc779aSAndroid Build Coastguard Worker     i = i_min + ((i_max - i_min) / 2);
104*15dc779aSAndroid Build Coastguard Worker     j = iusace_ari_hash_m[i];
105*15dc779aSAndroid Build Coastguard Worker     if (c < j)
106*15dc779aSAndroid Build Coastguard Worker       i_max = i;
107*15dc779aSAndroid Build Coastguard Worker     else if (c > j)
108*15dc779aSAndroid Build Coastguard Worker       i_min = i;
109*15dc779aSAndroid Build Coastguard Worker     else
110*15dc779aSAndroid Build Coastguard Worker       return (iusace_ari_hash_m_lsb[i]);
111*15dc779aSAndroid Build Coastguard Worker   }
112*15dc779aSAndroid Build Coastguard Worker 
113*15dc779aSAndroid Build Coastguard Worker   return (iusace_ari_lookup_m[i_max]);
114*15dc779aSAndroid Build Coastguard Worker }
115*15dc779aSAndroid Build Coastguard Worker 
iusace_copy_bit_buf(ia_bit_buf_struct * it_bit_buff_dest,ia_bit_buf_struct * it_bit_buff_src)116*15dc779aSAndroid Build Coastguard Worker static VOID iusace_copy_bit_buf(ia_bit_buf_struct *it_bit_buff_dest,
117*15dc779aSAndroid Build Coastguard Worker                                 ia_bit_buf_struct *it_bit_buff_src) {
118*15dc779aSAndroid Build Coastguard Worker   if (it_bit_buff_src != NULL && it_bit_buff_dest != NULL) {
119*15dc779aSAndroid Build Coastguard Worker     it_bit_buff_dest->cnt_bits = it_bit_buff_src->cnt_bits;
120*15dc779aSAndroid Build Coastguard Worker     it_bit_buff_dest->ptr_write_next = it_bit_buff_src->ptr_write_next;
121*15dc779aSAndroid Build Coastguard Worker     it_bit_buff_dest->write_position = it_bit_buff_src->write_position;
122*15dc779aSAndroid Build Coastguard Worker   }
123*15dc779aSAndroid Build Coastguard Worker   return;
124*15dc779aSAndroid Build Coastguard Worker }
125*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_encode_level2(ia_bit_buf_struct * pstr_it_bit_buff,WORD32 bp,WORD32 * ptr_c_pres,WORD32 * ptr_c_prev,WORD32 * quant,WORD32 n,WORD32 nt,WORD32 use_stop)126*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_arith_encode_level2(ia_bit_buf_struct *pstr_it_bit_buff, WORD32 bp,
127*15dc779aSAndroid Build Coastguard Worker                                          WORD32 *ptr_c_pres, WORD32 *ptr_c_prev, WORD32 *quant,
128*15dc779aSAndroid Build Coastguard Worker                                          WORD32 n, WORD32 nt, WORD32 use_stop) {
129*15dc779aSAndroid Build Coastguard Worker   WORD32 qs[32];
130*15dc779aSAndroid Build Coastguard Worker   iusace_state_arith as, as_stop;
131*15dc779aSAndroid Build Coastguard Worker 
132*15dc779aSAndroid Build Coastguard Worker   WORD32 a, b, a1, b1, m;
133*15dc779aSAndroid Build Coastguard Worker   WORD32 s, t, i, l, lev, esc_nb;
134*15dc779aSAndroid Build Coastguard Worker   UWORD16 pki;
135*15dc779aSAndroid Build Coastguard Worker   WORD32 bp_start = bp;
136*15dc779aSAndroid Build Coastguard Worker   WORD32 bp_stop = bp;
137*15dc779aSAndroid Build Coastguard Worker   WORD32 stop = 0;
138*15dc779aSAndroid Build Coastguard Worker   WORD32 sopt;
139*15dc779aSAndroid Build Coastguard Worker   WORD32 a2, b2;
140*15dc779aSAndroid Build Coastguard Worker   ia_bit_buf_struct it_bit_buff_temp;
141*15dc779aSAndroid Build Coastguard Worker   memset(&it_bit_buff_temp, 0, sizeof(it_bit_buff_temp));
142*15dc779aSAndroid Build Coastguard Worker   iusace_copy_bit_buf(&it_bit_buff_temp, pstr_it_bit_buff);
143*15dc779aSAndroid Build Coastguard Worker 
144*15dc779aSAndroid Build Coastguard Worker   as.low = 0;
145*15dc779aSAndroid Build Coastguard Worker   as.high = 65535;
146*15dc779aSAndroid Build Coastguard Worker   as.value = 0;
147*15dc779aSAndroid Build Coastguard Worker 
148*15dc779aSAndroid Build Coastguard Worker   sopt = ptr_c_prev[0] << 12;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n; i++) {
151*15dc779aSAndroid Build Coastguard Worker     if ((use_stop == 1 || use_stop == 2) && (stop == 0)) {
152*15dc779aSAndroid Build Coastguard Worker       WORD32 j;
153*15dc779aSAndroid Build Coastguard Worker 
154*15dc779aSAndroid Build Coastguard Worker       stop = 1;
155*15dc779aSAndroid Build Coastguard Worker       for (j = i; j < n; j++) {
156*15dc779aSAndroid Build Coastguard Worker         if (quant[2 * j] != 0 || quant[2 * j + 1] != 0) {
157*15dc779aSAndroid Build Coastguard Worker           stop = 0;
158*15dc779aSAndroid Build Coastguard Worker           break;
159*15dc779aSAndroid Build Coastguard Worker         }
160*15dc779aSAndroid Build Coastguard Worker       }
161*15dc779aSAndroid Build Coastguard Worker 
162*15dc779aSAndroid Build Coastguard Worker       if (stop) {
163*15dc779aSAndroid Build Coastguard Worker         s = iusace_arith_get_state(ptr_c_pres, ptr_c_prev, &sopt, i);
164*15dc779aSAndroid Build Coastguard Worker         t = s & 0xFFFFF;
165*15dc779aSAndroid Build Coastguard Worker 
166*15dc779aSAndroid Build Coastguard Worker         pki = iusace_arith_get_pk(t);
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker         if (use_stop == 1) {
169*15dc779aSAndroid Build Coastguard Worker           bp = iusace_arith_encode(pstr_it_bit_buff, bp, &as, ARITH_ESCAPE, iusace_ari_cf_m[pki]);
170*15dc779aSAndroid Build Coastguard Worker           pki = iusace_arith_get_pk(t + (1 << 17));
171*15dc779aSAndroid Build Coastguard Worker           bp = iusace_arith_encode(pstr_it_bit_buff, bp, &as, 0, iusace_ari_cf_m[pki]);
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker           break;
174*15dc779aSAndroid Build Coastguard Worker         } else {
175*15dc779aSAndroid Build Coastguard Worker           bp_stop = bp;
176*15dc779aSAndroid Build Coastguard Worker           as_stop.low = as.low;
177*15dc779aSAndroid Build Coastguard Worker           as_stop.high = as.high;
178*15dc779aSAndroid Build Coastguard Worker           as_stop.value = as.value;
179*15dc779aSAndroid Build Coastguard Worker 
180*15dc779aSAndroid Build Coastguard Worker           bp_stop =
181*15dc779aSAndroid Build Coastguard Worker               iusace_arith_encode(NULL, bp_stop, &as_stop, ARITH_ESCAPE, iusace_ari_cf_m[pki]);
182*15dc779aSAndroid Build Coastguard Worker 
183*15dc779aSAndroid Build Coastguard Worker           pki = iusace_arith_get_pk(t + (1 << 17));
184*15dc779aSAndroid Build Coastguard Worker           bp_stop = iusace_arith_encode(NULL, bp_stop, &as_stop, (0), iusace_ari_cf_m[pki]);
185*15dc779aSAndroid Build Coastguard Worker         }
186*15dc779aSAndroid Build Coastguard Worker       }
187*15dc779aSAndroid Build Coastguard Worker     }
188*15dc779aSAndroid Build Coastguard Worker     s = iusace_arith_get_state(ptr_c_pres, ptr_c_prev, &sopt, i);
189*15dc779aSAndroid Build Coastguard Worker     t = s & 0xFFFFF;
190*15dc779aSAndroid Build Coastguard Worker 
191*15dc779aSAndroid Build Coastguard Worker     a = quant[2 * i];
192*15dc779aSAndroid Build Coastguard Worker     b = quant[2 * i + 1];
193*15dc779aSAndroid Build Coastguard Worker     a1 = abs(a);
194*15dc779aSAndroid Build Coastguard Worker     b1 = abs(b);
195*15dc779aSAndroid Build Coastguard Worker 
196*15dc779aSAndroid Build Coastguard Worker     ptr_c_pres[i] = a1 + b1 + 1;
197*15dc779aSAndroid Build Coastguard Worker     if (ptr_c_pres[i] > 0xF) {
198*15dc779aSAndroid Build Coastguard Worker       ptr_c_pres[i] = 0xF;
199*15dc779aSAndroid Build Coastguard Worker     }
200*15dc779aSAndroid Build Coastguard Worker 
201*15dc779aSAndroid Build Coastguard Worker     lev = 0;
202*15dc779aSAndroid Build Coastguard Worker     esc_nb = 0;
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker     while ((a1) > 3 || (b1) > 3) {
205*15dc779aSAndroid Build Coastguard Worker       pki = iusace_arith_get_pk(t + (esc_nb << 17));
206*15dc779aSAndroid Build Coastguard Worker 
207*15dc779aSAndroid Build Coastguard Worker       bp = iusace_arith_encode(pstr_it_bit_buff, bp, &as, ARITH_ESCAPE, iusace_ari_cf_m[pki]);
208*15dc779aSAndroid Build Coastguard Worker 
209*15dc779aSAndroid Build Coastguard Worker       qs[lev++] = (a1 & 1) | ((b1 & 1) << 1);
210*15dc779aSAndroid Build Coastguard Worker       a1 >>= 1;
211*15dc779aSAndroid Build Coastguard Worker       b1 >>= 1;
212*15dc779aSAndroid Build Coastguard Worker       esc_nb++;
213*15dc779aSAndroid Build Coastguard Worker 
214*15dc779aSAndroid Build Coastguard Worker       if (esc_nb > 7) {
215*15dc779aSAndroid Build Coastguard Worker         esc_nb = 7;
216*15dc779aSAndroid Build Coastguard Worker       }
217*15dc779aSAndroid Build Coastguard Worker     }
218*15dc779aSAndroid Build Coastguard Worker     m = a1 + (b1 << 2);
219*15dc779aSAndroid Build Coastguard Worker     pki = iusace_arith_get_pk(t + (esc_nb << 17));
220*15dc779aSAndroid Build Coastguard Worker     bp = iusace_arith_encode(pstr_it_bit_buff, bp, &as, m, iusace_ari_cf_m[pki]);
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker     a2 = a1;
223*15dc779aSAndroid Build Coastguard Worker     b2 = b1;
224*15dc779aSAndroid Build Coastguard Worker 
225*15dc779aSAndroid Build Coastguard Worker     for (l = lev - 1; l >= 0; l--) {
226*15dc779aSAndroid Build Coastguard Worker       WORD32 lsbidx = (a2 == 0) ? 1 : ((b2 == 0) ? 0 : 2);
227*15dc779aSAndroid Build Coastguard Worker       bp = iusace_arith_encode(pstr_it_bit_buff, bp, &as, qs[l], iusace_ari_cf_r[lsbidx]);
228*15dc779aSAndroid Build Coastguard Worker 
229*15dc779aSAndroid Build Coastguard Worker       a2 = (a2 << 1) | (qs[l] & 1);
230*15dc779aSAndroid Build Coastguard Worker       b2 = (b2 << 1) | ((qs[l] >> 1) & 1);
231*15dc779aSAndroid Build Coastguard Worker     }
232*15dc779aSAndroid Build Coastguard Worker   }
233*15dc779aSAndroid Build Coastguard Worker 
234*15dc779aSAndroid Build Coastguard Worker   if (use_stop == 2) {
235*15dc779aSAndroid Build Coastguard Worker     bp = iusace_arith_done(pstr_it_bit_buff, bp, &as);
236*15dc779aSAndroid Build Coastguard Worker     if (stop) {
237*15dc779aSAndroid Build Coastguard Worker       bp_stop = iusace_arith_done(NULL, bp_stop, &as_stop);
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker       if (bp_stop < bp) {
240*15dc779aSAndroid Build Coastguard Worker         iusace_copy_bit_buf(pstr_it_bit_buff, &it_bit_buff_temp);
241*15dc779aSAndroid Build Coastguard Worker         bp = iusace_arith_encode_level2(pstr_it_bit_buff, bp_start, ptr_c_pres, ptr_c_prev, quant,
242*15dc779aSAndroid Build Coastguard Worker                                         n, nt, 1);
243*15dc779aSAndroid Build Coastguard Worker       } else {
244*15dc779aSAndroid Build Coastguard Worker         iusace_copy_bit_buf(pstr_it_bit_buff, &it_bit_buff_temp);
245*15dc779aSAndroid Build Coastguard Worker         bp = iusace_arith_encode_level2(pstr_it_bit_buff, bp_start, ptr_c_pres, ptr_c_prev, quant,
246*15dc779aSAndroid Build Coastguard Worker                                         n, nt, 0);
247*15dc779aSAndroid Build Coastguard Worker       }
248*15dc779aSAndroid Build Coastguard Worker     } else {
249*15dc779aSAndroid Build Coastguard Worker       iusace_copy_bit_buf(pstr_it_bit_buff, &it_bit_buff_temp);
250*15dc779aSAndroid Build Coastguard Worker       bp = iusace_arith_encode_level2(pstr_it_bit_buff, bp_start, ptr_c_pres, ptr_c_prev, quant,
251*15dc779aSAndroid Build Coastguard Worker                                       n, nt, 0);
252*15dc779aSAndroid Build Coastguard Worker     }
253*15dc779aSAndroid Build Coastguard Worker   } else {
254*15dc779aSAndroid Build Coastguard Worker     bp = iusace_arith_done(pstr_it_bit_buff, bp, &as);
255*15dc779aSAndroid Build Coastguard Worker 
256*15dc779aSAndroid Build Coastguard Worker     for (; i < nt; i++) {
257*15dc779aSAndroid Build Coastguard Worker       ptr_c_pres[i] = 1;
258*15dc779aSAndroid Build Coastguard Worker     }
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < n; i++) {
261*15dc779aSAndroid Build Coastguard Worker       if (quant[2 * i] != 0) {
262*15dc779aSAndroid Build Coastguard Worker         if (quant[2 * i] > 0) {
263*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
264*15dc779aSAndroid Build Coastguard Worker           bp++;
265*15dc779aSAndroid Build Coastguard Worker         } else {
266*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
267*15dc779aSAndroid Build Coastguard Worker           bp++;
268*15dc779aSAndroid Build Coastguard Worker         }
269*15dc779aSAndroid Build Coastguard Worker       }
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker       if (quant[2 * i + 1] != 0) {
272*15dc779aSAndroid Build Coastguard Worker         if (quant[2 * i + 1] > 0) {
273*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
274*15dc779aSAndroid Build Coastguard Worker           bp++;
275*15dc779aSAndroid Build Coastguard Worker         } else {
276*15dc779aSAndroid Build Coastguard Worker           iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
277*15dc779aSAndroid Build Coastguard Worker           bp++;
278*15dc779aSAndroid Build Coastguard Worker         }
279*15dc779aSAndroid Build Coastguard Worker       }
280*15dc779aSAndroid Build Coastguard Worker     }
281*15dc779aSAndroid Build Coastguard Worker 
282*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < nt; i++) {
283*15dc779aSAndroid Build Coastguard Worker       ptr_c_prev[i] = ptr_c_pres[i];
284*15dc779aSAndroid Build Coastguard Worker       ptr_c_pres[i] = 1;
285*15dc779aSAndroid Build Coastguard Worker     }
286*15dc779aSAndroid Build Coastguard Worker   }
287*15dc779aSAndroid Build Coastguard Worker 
288*15dc779aSAndroid Build Coastguard Worker   return bp;
289*15dc779aSAndroid Build Coastguard Worker }
290*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_enc_spec(ia_bit_buf_struct * it_bit_buf,WORD32 window_sequence,WORD32 * ptr_x_ac_enc,WORD32 max_spec_coefficients,WORD32 * ptr_c_pres,WORD32 * ptr_c_prev,WORD32 * ptr_size_prev,WORD32 arith_reset_flag,WORD32 ccfl)291*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_arith_enc_spec(ia_bit_buf_struct *it_bit_buf, WORD32 window_sequence,
292*15dc779aSAndroid Build Coastguard Worker                              WORD32 *ptr_x_ac_enc, WORD32 max_spec_coefficients,
293*15dc779aSAndroid Build Coastguard Worker                              WORD32 *ptr_c_pres, WORD32 *ptr_c_prev, WORD32 *ptr_size_prev,
294*15dc779aSAndroid Build Coastguard Worker                              WORD32 arith_reset_flag, WORD32 ccfl) {
295*15dc779aSAndroid Build Coastguard Worker   LOOPIDX i;
296*15dc779aSAndroid Build Coastguard Worker   WORD32 write_flag = (it_bit_buf != NULL);
297*15dc779aSAndroid Build Coastguard Worker   WORD32 size;
298*15dc779aSAndroid Build Coastguard Worker   WORD32 num_wins = (window_sequence == EIGHT_SHORT_SEQUENCE) ? MAX_SHORT_WINDOWS : 1;
299*15dc779aSAndroid Build Coastguard Worker   WORD32 bits_data_written = 0;
300*15dc779aSAndroid Build Coastguard Worker 
301*15dc779aSAndroid Build Coastguard Worker   switch (window_sequence) {
302*15dc779aSAndroid Build Coastguard Worker     case ONLY_LONG_SEQUENCE:
303*15dc779aSAndroid Build Coastguard Worker     case LONG_START_SEQUENCE:
304*15dc779aSAndroid Build Coastguard Worker     case STOP_START_SEQUENCE:
305*15dc779aSAndroid Build Coastguard Worker     case LONG_STOP_SEQUENCE:
306*15dc779aSAndroid Build Coastguard Worker       size = ccfl;
307*15dc779aSAndroid Build Coastguard Worker       break;
308*15dc779aSAndroid Build Coastguard Worker     case EIGHT_SHORT_SEQUENCE:
309*15dc779aSAndroid Build Coastguard Worker       size = ccfl >> 3;
310*15dc779aSAndroid Build Coastguard Worker       break;
311*15dc779aSAndroid Build Coastguard Worker     default:
312*15dc779aSAndroid Build Coastguard Worker       size = ccfl >> 3;
313*15dc779aSAndroid Build Coastguard Worker       break;
314*15dc779aSAndroid Build Coastguard Worker   }
315*15dc779aSAndroid Build Coastguard Worker 
316*15dc779aSAndroid Build Coastguard Worker   iusace_arith_map_context(size, *ptr_size_prev, ptr_c_pres, ptr_c_prev, arith_reset_flag);
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker   if (max_spec_coefficients > 0) {
319*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_wins; i++) {
320*15dc779aSAndroid Build Coastguard Worker       bits_data_written = iusace_arith_encode_level2(
321*15dc779aSAndroid Build Coastguard Worker           it_bit_buf, bits_data_written, ptr_c_pres + 2, ptr_c_prev + 2, &ptr_x_ac_enc[i * size],
322*15dc779aSAndroid Build Coastguard Worker           max_spec_coefficients / 2, size / 2, 2);
323*15dc779aSAndroid Build Coastguard Worker     }
324*15dc779aSAndroid Build Coastguard Worker   }
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker   if (write_flag) {
327*15dc779aSAndroid Build Coastguard Worker     *ptr_size_prev = size;
328*15dc779aSAndroid Build Coastguard Worker   }
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker   return bits_data_written;
331*15dc779aSAndroid Build Coastguard Worker }
332*15dc779aSAndroid Build Coastguard Worker 
iusace_tcx_coding(ia_bit_buf_struct * pstr_it_bit_buff,WORD32 tcx_size,WORD32 max_tcx_size,WORD32 * ptr_quant,WORD32 * c_pres,WORD32 * c_prev)333*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_tcx_coding(ia_bit_buf_struct *pstr_it_bit_buff, WORD32 tcx_size,
334*15dc779aSAndroid Build Coastguard Worker                          WORD32 max_tcx_size, WORD32 *ptr_quant, WORD32 *c_pres, WORD32 *c_prev) {
335*15dc779aSAndroid Build Coastguard Worker   WORD32 bits_written = 0;
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker   iusace_arith_map_context(tcx_size, max_tcx_size, c_pres, c_prev, 0);
338*15dc779aSAndroid Build Coastguard Worker 
339*15dc779aSAndroid Build Coastguard Worker   bits_written =
340*15dc779aSAndroid Build Coastguard Worker       iusace_arith_encode_level2(pstr_it_bit_buff, bits_written, c_pres + 2, c_prev + 2,
341*15dc779aSAndroid Build Coastguard Worker                                  &ptr_quant[0], tcx_size / 2, tcx_size / 2, 2);
342*15dc779aSAndroid Build Coastguard Worker 
343*15dc779aSAndroid Build Coastguard Worker   iusace_arith_map_context(max_tcx_size, tcx_size, c_pres, c_prev, 0);
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker   return bits_written;
346*15dc779aSAndroid Build Coastguard Worker }
347*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_done(ia_bit_buf_struct * pstr_it_bit_buff,WORD32 bp,iusace_state_arith * s)348*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_arith_done(ia_bit_buf_struct *pstr_it_bit_buff, WORD32 bp, iusace_state_arith *s) {
349*15dc779aSAndroid Build Coastguard Worker   WORD32 low, high;
350*15dc779aSAndroid Build Coastguard Worker   WORD32 bits_to_follow;
351*15dc779aSAndroid Build Coastguard Worker 
352*15dc779aSAndroid Build Coastguard Worker   low = s->low;
353*15dc779aSAndroid Build Coastguard Worker   high = s->high;
354*15dc779aSAndroid Build Coastguard Worker   bits_to_follow = s->value + 1;
355*15dc779aSAndroid Build Coastguard Worker 
356*15dc779aSAndroid Build Coastguard Worker   if (low < 16384) {
357*15dc779aSAndroid Build Coastguard Worker     iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
358*15dc779aSAndroid Build Coastguard Worker     bp++;
359*15dc779aSAndroid Build Coastguard Worker     while (bits_to_follow) {
360*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
361*15dc779aSAndroid Build Coastguard Worker       bp++;
362*15dc779aSAndroid Build Coastguard Worker       bits_to_follow--;
363*15dc779aSAndroid Build Coastguard Worker     }
364*15dc779aSAndroid Build Coastguard Worker   } else {
365*15dc779aSAndroid Build Coastguard Worker     iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
366*15dc779aSAndroid Build Coastguard Worker     bp++;
367*15dc779aSAndroid Build Coastguard Worker     while (bits_to_follow) {
368*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
369*15dc779aSAndroid Build Coastguard Worker       bp++;
370*15dc779aSAndroid Build Coastguard Worker       bits_to_follow--;
371*15dc779aSAndroid Build Coastguard Worker     }
372*15dc779aSAndroid Build Coastguard Worker   }
373*15dc779aSAndroid Build Coastguard Worker 
374*15dc779aSAndroid Build Coastguard Worker   s->low = low;
375*15dc779aSAndroid Build Coastguard Worker   s->high = high;
376*15dc779aSAndroid Build Coastguard Worker   s->value = bits_to_follow;
377*15dc779aSAndroid Build Coastguard Worker 
378*15dc779aSAndroid Build Coastguard Worker   return bp;
379*15dc779aSAndroid Build Coastguard Worker }
380*15dc779aSAndroid Build Coastguard Worker 
iusace_arith_encode(ia_bit_buf_struct * pstr_it_bit_buff,WORD32 bp,iusace_state_arith * s,WORD32 symbol,UWORD16 const * cum_freq)381*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_arith_encode(ia_bit_buf_struct *pstr_it_bit_buff, WORD32 bp, iusace_state_arith *s,
382*15dc779aSAndroid Build Coastguard Worker                            WORD32 symbol, UWORD16 const *cum_freq) {
383*15dc779aSAndroid Build Coastguard Worker   WORD32 low, high, range;
384*15dc779aSAndroid Build Coastguard Worker   WORD32 bits_to_follow;
385*15dc779aSAndroid Build Coastguard Worker 
386*15dc779aSAndroid Build Coastguard Worker   high = s->high;
387*15dc779aSAndroid Build Coastguard Worker   low = s->low;
388*15dc779aSAndroid Build Coastguard Worker   range = high - low + 1;
389*15dc779aSAndroid Build Coastguard Worker 
390*15dc779aSAndroid Build Coastguard Worker   if (symbol > 0) {
391*15dc779aSAndroid Build Coastguard Worker     high = low + ((range * cum_freq[symbol - 1]) >> 14) - 1;
392*15dc779aSAndroid Build Coastguard Worker   }
393*15dc779aSAndroid Build Coastguard Worker 
394*15dc779aSAndroid Build Coastguard Worker   low = low + ((range * cum_freq[symbol]) >> 14);
395*15dc779aSAndroid Build Coastguard Worker 
396*15dc779aSAndroid Build Coastguard Worker   bits_to_follow = s->value;
397*15dc779aSAndroid Build Coastguard Worker 
398*15dc779aSAndroid Build Coastguard Worker   for (;;) {
399*15dc779aSAndroid Build Coastguard Worker     if (high < 32768) {
400*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
401*15dc779aSAndroid Build Coastguard Worker       bp++;
402*15dc779aSAndroid Build Coastguard Worker       while (bits_to_follow) {
403*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
404*15dc779aSAndroid Build Coastguard Worker         bp++;
405*15dc779aSAndroid Build Coastguard Worker         bits_to_follow--;
406*15dc779aSAndroid Build Coastguard Worker       }
407*15dc779aSAndroid Build Coastguard Worker     } else if (low >= 32768) {
408*15dc779aSAndroid Build Coastguard Worker       iusace_write_bits_buf(pstr_it_bit_buff, 1, 1);
409*15dc779aSAndroid Build Coastguard Worker       bp++;
410*15dc779aSAndroid Build Coastguard Worker       while (bits_to_follow) {
411*15dc779aSAndroid Build Coastguard Worker         iusace_write_bits_buf(pstr_it_bit_buff, 0, 1);
412*15dc779aSAndroid Build Coastguard Worker         bp++;
413*15dc779aSAndroid Build Coastguard Worker         bits_to_follow--;
414*15dc779aSAndroid Build Coastguard Worker       }
415*15dc779aSAndroid Build Coastguard Worker       low -= 32768;
416*15dc779aSAndroid Build Coastguard Worker       high -= 32768;
417*15dc779aSAndroid Build Coastguard Worker     } else if (low >= 16384 && high < 49152) {
418*15dc779aSAndroid Build Coastguard Worker       bits_to_follow += 1;
419*15dc779aSAndroid Build Coastguard Worker       low -= 16384;
420*15dc779aSAndroid Build Coastguard Worker       high -= 16384;
421*15dc779aSAndroid Build Coastguard Worker     } else
422*15dc779aSAndroid Build Coastguard Worker       break;
423*15dc779aSAndroid Build Coastguard Worker 
424*15dc779aSAndroid Build Coastguard Worker     low += low;
425*15dc779aSAndroid Build Coastguard Worker     high += high + 1;
426*15dc779aSAndroid Build Coastguard Worker   }
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker   s->low = low;
429*15dc779aSAndroid Build Coastguard Worker   s->high = high;
430*15dc779aSAndroid Build Coastguard Worker   s->value = bits_to_follow;
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker   return bp;
433*15dc779aSAndroid Build Coastguard Worker }
434