xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_avq_dec.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <stdio.h>
21*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <float.h>
23*15dc779aSAndroid Build Coastguard Worker #include <math.h>
24*15dc779aSAndroid Build Coastguard Worker #include <assert.h>
25*15dc779aSAndroid Build Coastguard Worker #include <string.h>
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_com.h"
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_factorial_7[8];
33*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_iso_code_index_table[LEN_ABS_LEADER];
34*15dc779aSAndroid Build Coastguard Worker extern const UWORD8 ixheaacd_iso_code_data_table[LEN_SIGN_LEADER];
35*15dc779aSAndroid Build Coastguard Worker extern const UWORD32 ixheaacd_signed_leader_is[LEN_SIGN_LEADER];
36*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaacd_iso_code_num_table[],
37*15dc779aSAndroid Build Coastguard Worker     ixheaacd_pos_abs_leaders_a3[], ixheaacd_pos_abs_leaders_a4[];
38*15dc779aSAndroid Build Coastguard Worker extern const UWORD8 ixheaacd_absolute_leader_tab_da[][8];
39*15dc779aSAndroid Build Coastguard Worker extern const UWORD32 ixheaacd_cardinality_offset_table_i3[],
40*15dc779aSAndroid Build Coastguard Worker     ixheaacd_cardinality_offset_tab_i4[];
41*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_nearest_neighbor_2d(WORD32 x[],WORD32 y[],WORD32 count,WORD32 * rem)42*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_nearest_neighbor_2d(WORD32 x[], WORD32 y[], WORD32 count,
43*15dc779aSAndroid Build Coastguard Worker                                          WORD32 *rem) {
44*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, sum;
45*15dc779aSAndroid Build Coastguard Worker   WORD32 s, e[8], em;
46*15dc779aSAndroid Build Coastguard Worker   WORD32 rem_temp[8];
47*15dc779aSAndroid Build Coastguard Worker 
48*15dc779aSAndroid Build Coastguard Worker   memcpy(rem_temp, rem, 8 * sizeof(WORD32));
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker   sum = 0;
51*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
52*15dc779aSAndroid Build Coastguard Worker     if (x[i] < 0) {
53*15dc779aSAndroid Build Coastguard Worker       y[i] = ixheaac_negate32_sat(
54*15dc779aSAndroid Build Coastguard Worker           ixheaac_shl32_sat((ixheaac_sub32_sat(1, x[i]) >> 1), 1));
55*15dc779aSAndroid Build Coastguard Worker     } else {
56*15dc779aSAndroid Build Coastguard Worker       y[i] = ixheaac_shl32_sat((ixheaac_add32_sat(1, x[i]) >> 1), 1);
57*15dc779aSAndroid Build Coastguard Worker     }
58*15dc779aSAndroid Build Coastguard Worker     sum = ixheaac_add32_sat(sum, y[i]);
59*15dc779aSAndroid Build Coastguard Worker 
60*15dc779aSAndroid Build Coastguard Worker     if (x[i] % 2 != 0) {
61*15dc779aSAndroid Build Coastguard Worker       if (x[i] < 0) {
62*15dc779aSAndroid Build Coastguard Worker         rem_temp[i] = ixheaac_negate32_sat(
63*15dc779aSAndroid Build Coastguard Worker             ixheaac_sub32_sat(rem_temp[i], (1 << count)));
64*15dc779aSAndroid Build Coastguard Worker       } else {
65*15dc779aSAndroid Build Coastguard Worker         rem_temp[i] = ixheaac_sub32_sat(rem_temp[i], (1 << count));
66*15dc779aSAndroid Build Coastguard Worker       }
67*15dc779aSAndroid Build Coastguard Worker     }
68*15dc779aSAndroid Build Coastguard Worker   }
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker   if (sum % 4) {
71*15dc779aSAndroid Build Coastguard Worker     em = 0;
72*15dc779aSAndroid Build Coastguard Worker     j = 0;
73*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) {
74*15dc779aSAndroid Build Coastguard Worker       e[i] = rem_temp[i];
75*15dc779aSAndroid Build Coastguard Worker     }
76*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) {
77*15dc779aSAndroid Build Coastguard Worker       if (e[i] < 0) {
78*15dc779aSAndroid Build Coastguard Worker         s = -e[i];
79*15dc779aSAndroid Build Coastguard Worker       } else {
80*15dc779aSAndroid Build Coastguard Worker         s = e[i];
81*15dc779aSAndroid Build Coastguard Worker       }
82*15dc779aSAndroid Build Coastguard Worker 
83*15dc779aSAndroid Build Coastguard Worker       if (em < s) {
84*15dc779aSAndroid Build Coastguard Worker         em = s;
85*15dc779aSAndroid Build Coastguard Worker         j = i;
86*15dc779aSAndroid Build Coastguard Worker       }
87*15dc779aSAndroid Build Coastguard Worker     }
88*15dc779aSAndroid Build Coastguard Worker 
89*15dc779aSAndroid Build Coastguard Worker     if (e[j] < 0) {
90*15dc779aSAndroid Build Coastguard Worker       y[j] -= 2;
91*15dc779aSAndroid Build Coastguard Worker       rem_temp[j] = ixheaac_add32_sat(rem_temp[j], (2 << count));
92*15dc779aSAndroid Build Coastguard Worker     } else {
93*15dc779aSAndroid Build Coastguard Worker       y[j] = ixheaac_add32_sat(y[j], 2);
94*15dc779aSAndroid Build Coastguard Worker       rem_temp[j] = ixheaac_sub32_sat(rem_temp[j], (2 << count));
95*15dc779aSAndroid Build Coastguard Worker     }
96*15dc779aSAndroid Build Coastguard Worker   }
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker   memcpy(rem, rem_temp, 8 * sizeof(WORD32));
99*15dc779aSAndroid Build Coastguard Worker   return;
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_voronoi_search(WORD32 x[],WORD32 y[],WORD32 count,WORD32 * rem1,WORD32 * rem2)102*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_voronoi_search(WORD32 x[], WORD32 y[], WORD32 count, WORD32 *rem1,
103*15dc779aSAndroid Build Coastguard Worker                              WORD32 *rem2) {
104*15dc779aSAndroid Build Coastguard Worker   WORD32 i, y0[8], y1[8];
105*15dc779aSAndroid Build Coastguard Worker   WORD32 x1[8], tmp;
106*15dc779aSAndroid Build Coastguard Worker   WORD32 e0, e1;
107*15dc779aSAndroid Build Coastguard Worker 
108*15dc779aSAndroid Build Coastguard Worker   ixheaacd_nearest_neighbor_2d(x, y0, count, rem1);
109*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
110*15dc779aSAndroid Build Coastguard Worker     if (x[i] == 0) {
111*15dc779aSAndroid Build Coastguard Worker       if (rem2[i] == 0) {
112*15dc779aSAndroid Build Coastguard Worker         x1[i] = x[i] - 1;
113*15dc779aSAndroid Build Coastguard Worker       } else {
114*15dc779aSAndroid Build Coastguard Worker         x1[i] = 0;
115*15dc779aSAndroid Build Coastguard Worker         rem2[i] = ixheaac_sub32_sat(rem2[i], (1 << count));
116*15dc779aSAndroid Build Coastguard Worker       }
117*15dc779aSAndroid Build Coastguard Worker     } else {
118*15dc779aSAndroid Build Coastguard Worker       x1[i] = ixheaac_sub32_sat(x[i], 1);
119*15dc779aSAndroid Build Coastguard Worker     }
120*15dc779aSAndroid Build Coastguard Worker   }
121*15dc779aSAndroid Build Coastguard Worker 
122*15dc779aSAndroid Build Coastguard Worker   ixheaacd_nearest_neighbor_2d(x1, y1, count, rem2);
123*15dc779aSAndroid Build Coastguard Worker 
124*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
125*15dc779aSAndroid Build Coastguard Worker     y1[i] = ixheaac_add32_sat(y1[i], 1);
126*15dc779aSAndroid Build Coastguard Worker   }
127*15dc779aSAndroid Build Coastguard Worker 
128*15dc779aSAndroid Build Coastguard Worker   e0 = e1 = 0;
129*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
130*15dc779aSAndroid Build Coastguard Worker     tmp = rem1[i];
131*15dc779aSAndroid Build Coastguard Worker     e0 = ixheaac_add32_sat(ixheaac_sat64_32((WORD64)tmp * (WORD64)tmp), e0);
132*15dc779aSAndroid Build Coastguard Worker     tmp = rem2[i];
133*15dc779aSAndroid Build Coastguard Worker     e1 = ixheaac_add32_sat(ixheaac_sat64_32((WORD64)tmp * (WORD64)tmp), e1);
134*15dc779aSAndroid Build Coastguard Worker   }
135*15dc779aSAndroid Build Coastguard Worker 
136*15dc779aSAndroid Build Coastguard Worker   if (e0 < e1) {
137*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) {
138*15dc779aSAndroid Build Coastguard Worker       y[i] = y0[i];
139*15dc779aSAndroid Build Coastguard Worker     }
140*15dc779aSAndroid Build Coastguard Worker   } else {
141*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) {
142*15dc779aSAndroid Build Coastguard Worker       y[i] = y1[i];
143*15dc779aSAndroid Build Coastguard Worker     }
144*15dc779aSAndroid Build Coastguard Worker   }
145*15dc779aSAndroid Build Coastguard Worker   return;
146*15dc779aSAndroid Build Coastguard Worker }
147*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_voronoi_idx_dec(WORD32 * kv,WORD32 m,WORD32 * y,WORD32 count)148*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_voronoi_idx_dec(WORD32 *kv, WORD32 m, WORD32 *y, WORD32 count) {
149*15dc779aSAndroid Build Coastguard Worker   WORD32 i, v[8], tmp, sum, *ptr1, *ptr2;
150*15dc779aSAndroid Build Coastguard Worker   WORD32 z[8];
151*15dc779aSAndroid Build Coastguard Worker   WORD32 rem1[8], rem2[8];
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) y[i] = kv[7];
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker   z[7] = y[7] >> count;
156*15dc779aSAndroid Build Coastguard Worker   rem1[7] = y[7] & (m - 1);
157*15dc779aSAndroid Build Coastguard Worker   sum = 0;
158*15dc779aSAndroid Build Coastguard Worker   for (i = 6; i >= 1; i--) {
159*15dc779aSAndroid Build Coastguard Worker     tmp = ixheaac_shl32_sat(kv[i], 1);
160*15dc779aSAndroid Build Coastguard Worker     sum = ixheaac_add32_sat(sum, tmp);
161*15dc779aSAndroid Build Coastguard Worker     y[i] = ixheaac_add32_sat(y[i], tmp);
162*15dc779aSAndroid Build Coastguard Worker     z[i] = y[i] >> count;
163*15dc779aSAndroid Build Coastguard Worker     rem1[i] = y[i] & (m - 1);
164*15dc779aSAndroid Build Coastguard Worker   }
165*15dc779aSAndroid Build Coastguard Worker   y[0] = ixheaac_add32_sat(
166*15dc779aSAndroid Build Coastguard Worker       y[0],
167*15dc779aSAndroid Build Coastguard Worker       ixheaac_add32_sat(ixheaac_sat64_32((WORD64)4 * (WORD64)kv[0]), sum));
168*15dc779aSAndroid Build Coastguard Worker   z[0] = (ixheaac_sub32_sat(y[0], 2)) >> count;
169*15dc779aSAndroid Build Coastguard Worker   if (m != 0)
170*15dc779aSAndroid Build Coastguard Worker     rem1[0] = (ixheaac_sub32_sat(y[0], 2)) % m;
171*15dc779aSAndroid Build Coastguard Worker   else
172*15dc779aSAndroid Build Coastguard Worker     rem1[0] = ixheaac_sub32_sat(y[0], 2);
173*15dc779aSAndroid Build Coastguard Worker 
174*15dc779aSAndroid Build Coastguard Worker   memcpy(rem2, rem1, 8 * sizeof(WORD32));
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker   ixheaacd_voronoi_search(z, v, count, rem1, rem2);
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker   ptr1 = y;
179*15dc779aSAndroid Build Coastguard Worker   ptr2 = v;
180*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
181*15dc779aSAndroid Build Coastguard Worker     *ptr1 = ixheaac_sub32_sat(*ptr1,
182*15dc779aSAndroid Build Coastguard Worker                                ixheaac_sat64_32((WORD64)m * (WORD64)*ptr2++));
183*15dc779aSAndroid Build Coastguard Worker     ptr1++;
184*15dc779aSAndroid Build Coastguard Worker   }
185*15dc779aSAndroid Build Coastguard Worker }
186*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_gosset_rank_of_permutation(WORD32 rank,WORD32 * xs)187*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_gosset_rank_of_permutation(WORD32 rank, WORD32 *xs) {
188*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, a[8], w[8], base, fac, fac_b, target;
189*15dc779aSAndroid Build Coastguard Worker 
190*15dc779aSAndroid Build Coastguard Worker   j = 0;
191*15dc779aSAndroid Build Coastguard Worker   w[j] = 1;
192*15dc779aSAndroid Build Coastguard Worker   a[j] = xs[0];
193*15dc779aSAndroid Build Coastguard Worker   base = 1;
194*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < 8; i++) {
195*15dc779aSAndroid Build Coastguard Worker     if (xs[i] != xs[i - 1]) {
196*15dc779aSAndroid Build Coastguard Worker       j++;
197*15dc779aSAndroid Build Coastguard Worker       w[j] = 1;
198*15dc779aSAndroid Build Coastguard Worker       a[j] = xs[i];
199*15dc779aSAndroid Build Coastguard Worker     } else {
200*15dc779aSAndroid Build Coastguard Worker       w[j]++;
201*15dc779aSAndroid Build Coastguard Worker       base *= w[j];
202*15dc779aSAndroid Build Coastguard Worker     }
203*15dc779aSAndroid Build Coastguard Worker   }
204*15dc779aSAndroid Build Coastguard Worker 
205*15dc779aSAndroid Build Coastguard Worker   if (w[0] == 8) {
206*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) xs[i] = a[0];
207*15dc779aSAndroid Build Coastguard Worker   } else {
208*15dc779aSAndroid Build Coastguard Worker     target = rank * base;
209*15dc779aSAndroid Build Coastguard Worker     fac_b = 1;
210*15dc779aSAndroid Build Coastguard Worker 
211*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) {
212*15dc779aSAndroid Build Coastguard Worker       fac = fac_b * ixheaacd_factorial_7[i];
213*15dc779aSAndroid Build Coastguard Worker       j = -1;
214*15dc779aSAndroid Build Coastguard Worker       do {
215*15dc779aSAndroid Build Coastguard Worker         target -= w[++j] * fac;
216*15dc779aSAndroid Build Coastguard Worker       } while (target >= 0);
217*15dc779aSAndroid Build Coastguard Worker       xs[i] = a[j];
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker       target += w[j] * fac;
220*15dc779aSAndroid Build Coastguard Worker       fac_b *= w[j];
221*15dc779aSAndroid Build Coastguard Worker       w[j]--;
222*15dc779aSAndroid Build Coastguard Worker     }
223*15dc779aSAndroid Build Coastguard Worker   }
224*15dc779aSAndroid Build Coastguard Worker 
225*15dc779aSAndroid Build Coastguard Worker   return;
226*15dc779aSAndroid Build Coastguard Worker }
227*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_get_abs_leader_tbl(const UWORD32 * table,UWORD32 code_book_ind,WORD32 size)228*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_get_abs_leader_tbl(const UWORD32 *table,
229*15dc779aSAndroid Build Coastguard Worker                                           UWORD32 code_book_ind, WORD32 size) {
230*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
231*15dc779aSAndroid Build Coastguard Worker 
232*15dc779aSAndroid Build Coastguard Worker   for (i = 4; i < size; i += 4) {
233*15dc779aSAndroid Build Coastguard Worker     if (code_book_ind < table[i]) break;
234*15dc779aSAndroid Build Coastguard Worker   }
235*15dc779aSAndroid Build Coastguard Worker   if (i > size) i = size;
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker   if (code_book_ind < table[i - 2]) i -= 2;
238*15dc779aSAndroid Build Coastguard Worker   if (code_book_ind < table[i - 1]) i--;
239*15dc779aSAndroid Build Coastguard Worker   i--;
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker   return (i);
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_gosset_decode_base_index(WORD32 n,UWORD32 code_book_ind,WORD32 * ya)244*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_gosset_decode_base_index(WORD32 n, UWORD32 code_book_ind,
245*15dc779aSAndroid Build Coastguard Worker                                               WORD32 *ya) {
246*15dc779aSAndroid Build Coastguard Worker   WORD32 i, im, t, sign_code, idx = 0, ks, rank;
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker   if (n < 2) {
249*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) ya[i] = 0;
250*15dc779aSAndroid Build Coastguard Worker   } else {
251*15dc779aSAndroid Build Coastguard Worker     switch (n) {
252*15dc779aSAndroid Build Coastguard Worker       case 2:
253*15dc779aSAndroid Build Coastguard Worker       case 3:
254*15dc779aSAndroid Build Coastguard Worker         i = ixheaacd_get_abs_leader_tbl(ixheaacd_cardinality_offset_table_i3,
255*15dc779aSAndroid Build Coastguard Worker                                         code_book_ind, LEN_I3);
256*15dc779aSAndroid Build Coastguard Worker         idx = ixheaacd_pos_abs_leaders_a3[i];
257*15dc779aSAndroid Build Coastguard Worker         break;
258*15dc779aSAndroid Build Coastguard Worker       case 4:
259*15dc779aSAndroid Build Coastguard Worker         i = ixheaacd_get_abs_leader_tbl(ixheaacd_cardinality_offset_tab_i4,
260*15dc779aSAndroid Build Coastguard Worker                                         code_book_ind, LEN_I4);
261*15dc779aSAndroid Build Coastguard Worker         idx = ixheaacd_pos_abs_leaders_a4[i];
262*15dc779aSAndroid Build Coastguard Worker         break;
263*15dc779aSAndroid Build Coastguard Worker     }
264*15dc779aSAndroid Build Coastguard Worker 
265*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) ya[i] = ixheaacd_absolute_leader_tab_da[idx][i];
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker     t = ixheaacd_iso_code_index_table[idx];
268*15dc779aSAndroid Build Coastguard Worker     im = ixheaacd_iso_code_num_table[idx];
269*15dc779aSAndroid Build Coastguard Worker     ks = ixheaacd_get_abs_leader_tbl(ixheaacd_signed_leader_is + t,
270*15dc779aSAndroid Build Coastguard Worker                                      code_book_ind, im);
271*15dc779aSAndroid Build Coastguard Worker 
272*15dc779aSAndroid Build Coastguard Worker     sign_code = 2 * ixheaacd_iso_code_data_table[t + ks];
273*15dc779aSAndroid Build Coastguard Worker     for (i = 7; i >= 0; i--) {
274*15dc779aSAndroid Build Coastguard Worker       ya[i] *= (1 - (sign_code & 2));
275*15dc779aSAndroid Build Coastguard Worker       sign_code >>= 1;
276*15dc779aSAndroid Build Coastguard Worker     }
277*15dc779aSAndroid Build Coastguard Worker 
278*15dc779aSAndroid Build Coastguard Worker     rank = code_book_ind - ixheaacd_signed_leader_is[t + ks];
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker     ixheaacd_gosset_rank_of_permutation(rank, ya);
281*15dc779aSAndroid Build Coastguard Worker   }
282*15dc779aSAndroid Build Coastguard Worker   return;
283*15dc779aSAndroid Build Coastguard Worker }
284*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_rotated_gosset_mtx_dec(WORD32 qn,WORD32 code_book_idx,WORD32 * kv,WORD32 * b)285*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_rotated_gosset_mtx_dec(WORD32 qn, WORD32 code_book_idx,
286*15dc779aSAndroid Build Coastguard Worker                                      WORD32 *kv, WORD32 *b) {
287*15dc779aSAndroid Build Coastguard Worker   if (qn <= 4) {
288*15dc779aSAndroid Build Coastguard Worker     ixheaacd_gosset_decode_base_index(qn, code_book_idx, b);
289*15dc779aSAndroid Build Coastguard Worker   } else {
290*15dc779aSAndroid Build Coastguard Worker     WORD32 i, m, c[8];
291*15dc779aSAndroid Build Coastguard Worker     WORD32 count = 0;
292*15dc779aSAndroid Build Coastguard Worker     while (qn > 4) {
293*15dc779aSAndroid Build Coastguard Worker       count++;
294*15dc779aSAndroid Build Coastguard Worker       qn -= 2;
295*15dc779aSAndroid Build Coastguard Worker     }
296*15dc779aSAndroid Build Coastguard Worker 
297*15dc779aSAndroid Build Coastguard Worker     if (count >= 31)
298*15dc779aSAndroid Build Coastguard Worker       m = MAX_32;
299*15dc779aSAndroid Build Coastguard Worker     else
300*15dc779aSAndroid Build Coastguard Worker       m = 1 << count;
301*15dc779aSAndroid Build Coastguard Worker 
302*15dc779aSAndroid Build Coastguard Worker     ixheaacd_gosset_decode_base_index(qn, code_book_idx, b);
303*15dc779aSAndroid Build Coastguard Worker 
304*15dc779aSAndroid Build Coastguard Worker     ixheaacd_voronoi_idx_dec(kv, m, c, count);
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 8; i++) {
307*15dc779aSAndroid Build Coastguard Worker       b[i] =
308*15dc779aSAndroid Build Coastguard Worker           ixheaac_add32_sat(ixheaac_sat64_32((WORD64)m * (WORD64)b[i]), c[i]);
309*15dc779aSAndroid Build Coastguard Worker     }
310*15dc779aSAndroid Build Coastguard Worker   }
311*15dc779aSAndroid Build Coastguard Worker   return;
312*15dc779aSAndroid Build Coastguard Worker }