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 }