xref: /aosp_15_r20/external/aac/libAACenc/src/bit_cnt.cpp (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker 
4*e5436536SAndroid Build Coastguard Worker © Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker 
7*e5436536SAndroid Build Coastguard Worker  1.    INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker 
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker 
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker 
34*e5436536SAndroid Build Coastguard Worker 2.    COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker 
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker 
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker 
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker 
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker 
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker 
61*e5436536SAndroid Build Coastguard Worker 3.    NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker 
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker 
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker 
71*e5436536SAndroid Build Coastguard Worker 4.    DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker 
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker 
84*e5436536SAndroid Build Coastguard Worker 5.    CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker 
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker 
95*e5436536SAndroid Build Coastguard Worker /**************************** AAC encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   M.Werner
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: Huffman Bitcounter & coder
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #include "bit_cnt.h"
104*e5436536SAndroid Build Coastguard Worker 
105*e5436536SAndroid Build Coastguard Worker #include "aacEnc_ram.h"
106*e5436536SAndroid Build Coastguard Worker 
107*e5436536SAndroid Build Coastguard Worker #define HI_LTAB(a) (a >> 16)
108*e5436536SAndroid Build Coastguard Worker #define LO_LTAB(a) (a & 0xffff)
109*e5436536SAndroid Build Coastguard Worker 
110*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
111*e5436536SAndroid Build Coastguard Worker 
112*e5436536SAndroid Build Coastguard Worker 
113*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11
114*e5436536SAndroid Build Coastguard Worker     description:  counts tables 1-11
115*e5436536SAndroid Build Coastguard Worker     returns:
116*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
117*e5436536SAndroid Build Coastguard Worker     output:       bitCount for tables 1-11
118*e5436536SAndroid Build Coastguard Worker 
119*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
120*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11(const SHORT * const values,const INT width,INT * RESTRICT bitCount)121*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11(const SHORT *const values,
122*e5436536SAndroid Build Coastguard Worker                                                    const INT width,
123*e5436536SAndroid Build Coastguard Worker                                                    INT *RESTRICT bitCount) {
124*e5436536SAndroid Build Coastguard Worker   INT i;
125*e5436536SAndroid Build Coastguard Worker   INT bc1_2, bc3_4, bc5_6, bc7_8, bc9_10, bc11, sc;
126*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t2, t3;
127*e5436536SAndroid Build Coastguard Worker   bc1_2 = 0;
128*e5436536SAndroid Build Coastguard Worker   bc3_4 = 0;
129*e5436536SAndroid Build Coastguard Worker   bc5_6 = 0;
130*e5436536SAndroid Build Coastguard Worker   bc7_8 = 0;
131*e5436536SAndroid Build Coastguard Worker   bc9_10 = 0;
132*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
133*e5436536SAndroid Build Coastguard Worker   sc = 0;
134*e5436536SAndroid Build Coastguard Worker 
135*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
136*e5436536SAndroid Build Coastguard Worker 
137*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 4) {
138*e5436536SAndroid Build Coastguard Worker     t0 = values[i + 0];
139*e5436536SAndroid Build Coastguard Worker     t1 = values[i + 1];
140*e5436536SAndroid Build Coastguard Worker     t2 = values[i + 2];
141*e5436536SAndroid Build Coastguard Worker     t3 = values[i + 3];
142*e5436536SAndroid Build Coastguard Worker 
143*e5436536SAndroid Build Coastguard Worker     bc1_2 += (INT)FDKaacEnc_huff_ltab1_2[t0 + 1][t1 + 1][t2 + 1][t3 + 1];
144*e5436536SAndroid Build Coastguard Worker     bc5_6 += (INT)FDKaacEnc_huff_ltab5_6[t0 + 4][t1 + 4] +
145*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab5_6[t2 + 4][t3 + 4];
146*e5436536SAndroid Build Coastguard Worker 
147*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(t0);
148*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0);
149*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(t1);
150*e5436536SAndroid Build Coastguard Worker     sc += (t1 > 0);
151*e5436536SAndroid Build Coastguard Worker     t2 = fixp_abs(t2);
152*e5436536SAndroid Build Coastguard Worker     sc += (t2 > 0);
153*e5436536SAndroid Build Coastguard Worker     t3 = fixp_abs(t3);
154*e5436536SAndroid Build Coastguard Worker     sc += (t3 > 0);
155*e5436536SAndroid Build Coastguard Worker 
156*e5436536SAndroid Build Coastguard Worker     bc3_4 += (INT)FDKaacEnc_huff_ltab3_4[t0][t1][t2][t3];
157*e5436536SAndroid Build Coastguard Worker     bc7_8 += (INT)FDKaacEnc_huff_ltab7_8[t0][t1] +
158*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab7_8[t2][t3];
159*e5436536SAndroid Build Coastguard Worker     bc9_10 += (INT)FDKaacEnc_huff_ltab9_10[t0][t1] +
160*e5436536SAndroid Build Coastguard Worker               (INT)FDKaacEnc_huff_ltab9_10[t2][t3];
161*e5436536SAndroid Build Coastguard Worker     bc11 +=
162*e5436536SAndroid Build Coastguard Worker         (INT)FDKaacEnc_huff_ltab11[t0][t1] + (INT)FDKaacEnc_huff_ltab11[t2][t3];
163*e5436536SAndroid Build Coastguard Worker   }
164*e5436536SAndroid Build Coastguard Worker   bitCount[1] = HI_LTAB(bc1_2);
165*e5436536SAndroid Build Coastguard Worker   bitCount[2] = LO_LTAB(bc1_2);
166*e5436536SAndroid Build Coastguard Worker   bitCount[3] = HI_LTAB(bc3_4) + sc;
167*e5436536SAndroid Build Coastguard Worker   bitCount[4] = LO_LTAB(bc3_4) + sc;
168*e5436536SAndroid Build Coastguard Worker   bitCount[5] = HI_LTAB(bc5_6);
169*e5436536SAndroid Build Coastguard Worker   bitCount[6] = LO_LTAB(bc5_6);
170*e5436536SAndroid Build Coastguard Worker   bitCount[7] = HI_LTAB(bc7_8) + sc;
171*e5436536SAndroid Build Coastguard Worker   bitCount[8] = LO_LTAB(bc7_8) + sc;
172*e5436536SAndroid Build Coastguard Worker   bitCount[9] = HI_LTAB(bc9_10) + sc;
173*e5436536SAndroid Build Coastguard Worker   bitCount[10] = LO_LTAB(bc9_10) + sc;
174*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc;
175*e5436536SAndroid Build Coastguard Worker }
176*e5436536SAndroid Build Coastguard Worker 
177*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
178*e5436536SAndroid Build Coastguard Worker 
179*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_count3_4_5_6_7_8_9_10_11
180*e5436536SAndroid Build Coastguard Worker     description:  counts tables 3-11
181*e5436536SAndroid Build Coastguard Worker     returns:
182*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
183*e5436536SAndroid Build Coastguard Worker     output:       bitCount for tables 3-11
184*e5436536SAndroid Build Coastguard Worker 
185*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
186*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_count3_4_5_6_7_8_9_10_11(const SHORT * const values,const INT width,INT * RESTRICT bitCount)187*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_count3_4_5_6_7_8_9_10_11(const SHORT *const values,
188*e5436536SAndroid Build Coastguard Worker                                                const INT width,
189*e5436536SAndroid Build Coastguard Worker                                                INT *RESTRICT bitCount) {
190*e5436536SAndroid Build Coastguard Worker   INT i;
191*e5436536SAndroid Build Coastguard Worker   INT bc3_4, bc5_6, bc7_8, bc9_10, bc11, sc;
192*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t2, t3;
193*e5436536SAndroid Build Coastguard Worker 
194*e5436536SAndroid Build Coastguard Worker   bc3_4 = 0;
195*e5436536SAndroid Build Coastguard Worker   bc5_6 = 0;
196*e5436536SAndroid Build Coastguard Worker   bc7_8 = 0;
197*e5436536SAndroid Build Coastguard Worker   bc9_10 = 0;
198*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
199*e5436536SAndroid Build Coastguard Worker   sc = 0;
200*e5436536SAndroid Build Coastguard Worker 
201*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
202*e5436536SAndroid Build Coastguard Worker 
203*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 4) {
204*e5436536SAndroid Build Coastguard Worker     t0 = values[i + 0];
205*e5436536SAndroid Build Coastguard Worker     t1 = values[i + 1];
206*e5436536SAndroid Build Coastguard Worker     t2 = values[i + 2];
207*e5436536SAndroid Build Coastguard Worker     t3 = values[i + 3];
208*e5436536SAndroid Build Coastguard Worker 
209*e5436536SAndroid Build Coastguard Worker     bc5_6 += (INT)FDKaacEnc_huff_ltab5_6[t0 + 4][t1 + 4] +
210*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab5_6[t2 + 4][t3 + 4];
211*e5436536SAndroid Build Coastguard Worker 
212*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(t0);
213*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0);
214*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(t1);
215*e5436536SAndroid Build Coastguard Worker     sc += (t1 > 0);
216*e5436536SAndroid Build Coastguard Worker     t2 = fixp_abs(t2);
217*e5436536SAndroid Build Coastguard Worker     sc += (t2 > 0);
218*e5436536SAndroid Build Coastguard Worker     t3 = fixp_abs(t3);
219*e5436536SAndroid Build Coastguard Worker     sc += (t3 > 0);
220*e5436536SAndroid Build Coastguard Worker 
221*e5436536SAndroid Build Coastguard Worker     bc3_4 += (INT)FDKaacEnc_huff_ltab3_4[t0][t1][t2][t3];
222*e5436536SAndroid Build Coastguard Worker     bc7_8 += (INT)FDKaacEnc_huff_ltab7_8[t0][t1] +
223*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab7_8[t2][t3];
224*e5436536SAndroid Build Coastguard Worker     bc9_10 += (INT)FDKaacEnc_huff_ltab9_10[t0][t1] +
225*e5436536SAndroid Build Coastguard Worker               (INT)FDKaacEnc_huff_ltab9_10[t2][t3];
226*e5436536SAndroid Build Coastguard Worker     bc11 +=
227*e5436536SAndroid Build Coastguard Worker         (INT)FDKaacEnc_huff_ltab11[t0][t1] + (INT)FDKaacEnc_huff_ltab11[t2][t3];
228*e5436536SAndroid Build Coastguard Worker   }
229*e5436536SAndroid Build Coastguard Worker 
230*e5436536SAndroid Build Coastguard Worker   bitCount[1] = INVALID_BITCOUNT;
231*e5436536SAndroid Build Coastguard Worker   bitCount[2] = INVALID_BITCOUNT;
232*e5436536SAndroid Build Coastguard Worker   bitCount[3] = HI_LTAB(bc3_4) + sc;
233*e5436536SAndroid Build Coastguard Worker   bitCount[4] = LO_LTAB(bc3_4) + sc;
234*e5436536SAndroid Build Coastguard Worker   bitCount[5] = HI_LTAB(bc5_6);
235*e5436536SAndroid Build Coastguard Worker   bitCount[6] = LO_LTAB(bc5_6);
236*e5436536SAndroid Build Coastguard Worker   bitCount[7] = HI_LTAB(bc7_8) + sc;
237*e5436536SAndroid Build Coastguard Worker   bitCount[8] = LO_LTAB(bc7_8) + sc;
238*e5436536SAndroid Build Coastguard Worker   bitCount[9] = HI_LTAB(bc9_10) + sc;
239*e5436536SAndroid Build Coastguard Worker   bitCount[10] = LO_LTAB(bc9_10) + sc;
240*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc;
241*e5436536SAndroid Build Coastguard Worker }
242*e5436536SAndroid Build Coastguard Worker 
243*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
244*e5436536SAndroid Build Coastguard Worker 
245*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_count5_6_7_8_9_10_11
246*e5436536SAndroid Build Coastguard Worker     description:  counts tables 5-11
247*e5436536SAndroid Build Coastguard Worker     returns:
248*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
249*e5436536SAndroid Build Coastguard Worker     output:       bitCount for tables 5-11
250*e5436536SAndroid Build Coastguard Worker 
251*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
252*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_count5_6_7_8_9_10_11(const SHORT * const values,const INT width,INT * RESTRICT bitCount)253*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_count5_6_7_8_9_10_11(const SHORT *const values,
254*e5436536SAndroid Build Coastguard Worker                                            const INT width,
255*e5436536SAndroid Build Coastguard Worker                                            INT *RESTRICT bitCount) {
256*e5436536SAndroid Build Coastguard Worker   INT i;
257*e5436536SAndroid Build Coastguard Worker   INT bc5_6, bc7_8, bc9_10, bc11, sc;
258*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t2, t3;
259*e5436536SAndroid Build Coastguard Worker   bc5_6 = 0;
260*e5436536SAndroid Build Coastguard Worker   bc7_8 = 0;
261*e5436536SAndroid Build Coastguard Worker   bc9_10 = 0;
262*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
263*e5436536SAndroid Build Coastguard Worker   sc = 0;
264*e5436536SAndroid Build Coastguard Worker 
265*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
266*e5436536SAndroid Build Coastguard Worker 
267*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 4) {
268*e5436536SAndroid Build Coastguard Worker     t0 = values[i + 0];
269*e5436536SAndroid Build Coastguard Worker     t1 = values[i + 1];
270*e5436536SAndroid Build Coastguard Worker     t2 = values[i + 2];
271*e5436536SAndroid Build Coastguard Worker     t3 = values[i + 3];
272*e5436536SAndroid Build Coastguard Worker 
273*e5436536SAndroid Build Coastguard Worker     bc5_6 += (INT)FDKaacEnc_huff_ltab5_6[t0 + 4][t1 + 4] +
274*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab5_6[t2 + 4][t3 + 4];
275*e5436536SAndroid Build Coastguard Worker 
276*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(t0);
277*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0);
278*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(t1);
279*e5436536SAndroid Build Coastguard Worker     sc += (t1 > 0);
280*e5436536SAndroid Build Coastguard Worker     t2 = fixp_abs(t2);
281*e5436536SAndroid Build Coastguard Worker     sc += (t2 > 0);
282*e5436536SAndroid Build Coastguard Worker     t3 = fixp_abs(t3);
283*e5436536SAndroid Build Coastguard Worker     sc += (t3 > 0);
284*e5436536SAndroid Build Coastguard Worker 
285*e5436536SAndroid Build Coastguard Worker     bc7_8 += (INT)FDKaacEnc_huff_ltab7_8[t0][t1] +
286*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab7_8[t2][t3];
287*e5436536SAndroid Build Coastguard Worker     bc9_10 += (INT)FDKaacEnc_huff_ltab9_10[t0][t1] +
288*e5436536SAndroid Build Coastguard Worker               (INT)FDKaacEnc_huff_ltab9_10[t2][t3];
289*e5436536SAndroid Build Coastguard Worker     bc11 +=
290*e5436536SAndroid Build Coastguard Worker         (INT)FDKaacEnc_huff_ltab11[t0][t1] + (INT)FDKaacEnc_huff_ltab11[t2][t3];
291*e5436536SAndroid Build Coastguard Worker   }
292*e5436536SAndroid Build Coastguard Worker   bitCount[1] = INVALID_BITCOUNT;
293*e5436536SAndroid Build Coastguard Worker   bitCount[2] = INVALID_BITCOUNT;
294*e5436536SAndroid Build Coastguard Worker   bitCount[3] = INVALID_BITCOUNT;
295*e5436536SAndroid Build Coastguard Worker   bitCount[4] = INVALID_BITCOUNT;
296*e5436536SAndroid Build Coastguard Worker   bitCount[5] = HI_LTAB(bc5_6);
297*e5436536SAndroid Build Coastguard Worker   bitCount[6] = LO_LTAB(bc5_6);
298*e5436536SAndroid Build Coastguard Worker   bitCount[7] = HI_LTAB(bc7_8) + sc;
299*e5436536SAndroid Build Coastguard Worker   bitCount[8] = LO_LTAB(bc7_8) + sc;
300*e5436536SAndroid Build Coastguard Worker   bitCount[9] = HI_LTAB(bc9_10) + sc;
301*e5436536SAndroid Build Coastguard Worker   bitCount[10] = LO_LTAB(bc9_10) + sc;
302*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc;
303*e5436536SAndroid Build Coastguard Worker }
304*e5436536SAndroid Build Coastguard Worker 
305*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
306*e5436536SAndroid Build Coastguard Worker 
307*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_count7_8_9_10_11
308*e5436536SAndroid Build Coastguard Worker     description:  counts tables 7-11
309*e5436536SAndroid Build Coastguard Worker     returns:
310*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
311*e5436536SAndroid Build Coastguard Worker     output:       bitCount for tables 7-11
312*e5436536SAndroid Build Coastguard Worker 
313*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
314*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_count7_8_9_10_11(const SHORT * const values,const INT width,INT * RESTRICT bitCount)315*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_count7_8_9_10_11(const SHORT *const values,
316*e5436536SAndroid Build Coastguard Worker                                        const INT width,
317*e5436536SAndroid Build Coastguard Worker                                        INT *RESTRICT bitCount) {
318*e5436536SAndroid Build Coastguard Worker   INT i;
319*e5436536SAndroid Build Coastguard Worker   INT bc7_8, bc9_10, bc11, sc;
320*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t2, t3;
321*e5436536SAndroid Build Coastguard Worker 
322*e5436536SAndroid Build Coastguard Worker   bc7_8 = 0;
323*e5436536SAndroid Build Coastguard Worker   bc9_10 = 0;
324*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
325*e5436536SAndroid Build Coastguard Worker   sc = 0;
326*e5436536SAndroid Build Coastguard Worker 
327*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
328*e5436536SAndroid Build Coastguard Worker 
329*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 4) {
330*e5436536SAndroid Build Coastguard Worker     t0 = values[i + 0];
331*e5436536SAndroid Build Coastguard Worker     t1 = values[i + 1];
332*e5436536SAndroid Build Coastguard Worker     t2 = values[i + 2];
333*e5436536SAndroid Build Coastguard Worker     t3 = values[i + 3];
334*e5436536SAndroid Build Coastguard Worker 
335*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(t0);
336*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0);
337*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(t1);
338*e5436536SAndroid Build Coastguard Worker     sc += (t1 > 0);
339*e5436536SAndroid Build Coastguard Worker     t2 = fixp_abs(t2);
340*e5436536SAndroid Build Coastguard Worker     sc += (t2 > 0);
341*e5436536SAndroid Build Coastguard Worker     t3 = fixp_abs(t3);
342*e5436536SAndroid Build Coastguard Worker     sc += (t3 > 0);
343*e5436536SAndroid Build Coastguard Worker 
344*e5436536SAndroid Build Coastguard Worker     bc7_8 += (INT)FDKaacEnc_huff_ltab7_8[t0][t1] +
345*e5436536SAndroid Build Coastguard Worker              (INT)FDKaacEnc_huff_ltab7_8[t2][t3];
346*e5436536SAndroid Build Coastguard Worker     bc9_10 += (INT)FDKaacEnc_huff_ltab9_10[t0][t1] +
347*e5436536SAndroid Build Coastguard Worker               (INT)FDKaacEnc_huff_ltab9_10[t2][t3];
348*e5436536SAndroid Build Coastguard Worker     bc11 +=
349*e5436536SAndroid Build Coastguard Worker         (INT)FDKaacEnc_huff_ltab11[t0][t1] + (INT)FDKaacEnc_huff_ltab11[t2][t3];
350*e5436536SAndroid Build Coastguard Worker   }
351*e5436536SAndroid Build Coastguard Worker 
352*e5436536SAndroid Build Coastguard Worker   bitCount[1] = INVALID_BITCOUNT;
353*e5436536SAndroid Build Coastguard Worker   bitCount[2] = INVALID_BITCOUNT;
354*e5436536SAndroid Build Coastguard Worker   bitCount[3] = INVALID_BITCOUNT;
355*e5436536SAndroid Build Coastguard Worker   bitCount[4] = INVALID_BITCOUNT;
356*e5436536SAndroid Build Coastguard Worker   bitCount[5] = INVALID_BITCOUNT;
357*e5436536SAndroid Build Coastguard Worker   bitCount[6] = INVALID_BITCOUNT;
358*e5436536SAndroid Build Coastguard Worker   bitCount[7] = HI_LTAB(bc7_8) + sc;
359*e5436536SAndroid Build Coastguard Worker   bitCount[8] = LO_LTAB(bc7_8) + sc;
360*e5436536SAndroid Build Coastguard Worker   bitCount[9] = HI_LTAB(bc9_10) + sc;
361*e5436536SAndroid Build Coastguard Worker   bitCount[10] = LO_LTAB(bc9_10) + sc;
362*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc;
363*e5436536SAndroid Build Coastguard Worker }
364*e5436536SAndroid Build Coastguard Worker 
365*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
366*e5436536SAndroid Build Coastguard Worker 
367*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_count9_10_11
368*e5436536SAndroid Build Coastguard Worker     description:  counts tables 9-11
369*e5436536SAndroid Build Coastguard Worker     returns:
370*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
371*e5436536SAndroid Build Coastguard Worker     output:       bitCount for tables 9-11
372*e5436536SAndroid Build Coastguard Worker 
373*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
374*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_count9_10_11(const SHORT * const values,const INT width,INT * RESTRICT bitCount)375*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_count9_10_11(const SHORT *const values, const INT width,
376*e5436536SAndroid Build Coastguard Worker                                    INT *RESTRICT bitCount) {
377*e5436536SAndroid Build Coastguard Worker   INT i;
378*e5436536SAndroid Build Coastguard Worker   INT bc9_10, bc11, sc;
379*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t2, t3;
380*e5436536SAndroid Build Coastguard Worker 
381*e5436536SAndroid Build Coastguard Worker   bc9_10 = 0;
382*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
383*e5436536SAndroid Build Coastguard Worker   sc = 0;
384*e5436536SAndroid Build Coastguard Worker 
385*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
386*e5436536SAndroid Build Coastguard Worker 
387*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 4) {
388*e5436536SAndroid Build Coastguard Worker     t0 = values[i + 0];
389*e5436536SAndroid Build Coastguard Worker     t1 = values[i + 1];
390*e5436536SAndroid Build Coastguard Worker     t2 = values[i + 2];
391*e5436536SAndroid Build Coastguard Worker     t3 = values[i + 3];
392*e5436536SAndroid Build Coastguard Worker 
393*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(t0);
394*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0);
395*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(t1);
396*e5436536SAndroid Build Coastguard Worker     sc += (t1 > 0);
397*e5436536SAndroid Build Coastguard Worker     t2 = fixp_abs(t2);
398*e5436536SAndroid Build Coastguard Worker     sc += (t2 > 0);
399*e5436536SAndroid Build Coastguard Worker     t3 = fixp_abs(t3);
400*e5436536SAndroid Build Coastguard Worker     sc += (t3 > 0);
401*e5436536SAndroid Build Coastguard Worker 
402*e5436536SAndroid Build Coastguard Worker     bc9_10 += (INT)FDKaacEnc_huff_ltab9_10[t0][t1] +
403*e5436536SAndroid Build Coastguard Worker               (INT)FDKaacEnc_huff_ltab9_10[t2][t3];
404*e5436536SAndroid Build Coastguard Worker     bc11 +=
405*e5436536SAndroid Build Coastguard Worker         (INT)FDKaacEnc_huff_ltab11[t0][t1] + (INT)FDKaacEnc_huff_ltab11[t2][t3];
406*e5436536SAndroid Build Coastguard Worker   }
407*e5436536SAndroid Build Coastguard Worker 
408*e5436536SAndroid Build Coastguard Worker   bitCount[1] = INVALID_BITCOUNT;
409*e5436536SAndroid Build Coastguard Worker   bitCount[2] = INVALID_BITCOUNT;
410*e5436536SAndroid Build Coastguard Worker   bitCount[3] = INVALID_BITCOUNT;
411*e5436536SAndroid Build Coastguard Worker   bitCount[4] = INVALID_BITCOUNT;
412*e5436536SAndroid Build Coastguard Worker   bitCount[5] = INVALID_BITCOUNT;
413*e5436536SAndroid Build Coastguard Worker   bitCount[6] = INVALID_BITCOUNT;
414*e5436536SAndroid Build Coastguard Worker   bitCount[7] = INVALID_BITCOUNT;
415*e5436536SAndroid Build Coastguard Worker   bitCount[8] = INVALID_BITCOUNT;
416*e5436536SAndroid Build Coastguard Worker   bitCount[9] = HI_LTAB(bc9_10) + sc;
417*e5436536SAndroid Build Coastguard Worker   bitCount[10] = LO_LTAB(bc9_10) + sc;
418*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc;
419*e5436536SAndroid Build Coastguard Worker }
420*e5436536SAndroid Build Coastguard Worker 
421*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
422*e5436536SAndroid Build Coastguard Worker 
423*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_count11
424*e5436536SAndroid Build Coastguard Worker     description:  counts table 11
425*e5436536SAndroid Build Coastguard Worker     returns:
426*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
427*e5436536SAndroid Build Coastguard Worker     output:       bitCount for table 11
428*e5436536SAndroid Build Coastguard Worker 
429*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
430*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_count11(const SHORT * const values,const INT width,INT * RESTRICT bitCount)431*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_count11(const SHORT *const values, const INT width,
432*e5436536SAndroid Build Coastguard Worker                               INT *RESTRICT bitCount) {
433*e5436536SAndroid Build Coastguard Worker   INT i;
434*e5436536SAndroid Build Coastguard Worker   INT bc11, sc;
435*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t2, t3;
436*e5436536SAndroid Build Coastguard Worker 
437*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
438*e5436536SAndroid Build Coastguard Worker   sc = 0;
439*e5436536SAndroid Build Coastguard Worker 
440*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
441*e5436536SAndroid Build Coastguard Worker 
442*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 4) {
443*e5436536SAndroid Build Coastguard Worker     t0 = values[i + 0];
444*e5436536SAndroid Build Coastguard Worker     t1 = values[i + 1];
445*e5436536SAndroid Build Coastguard Worker     t2 = values[i + 2];
446*e5436536SAndroid Build Coastguard Worker     t3 = values[i + 3];
447*e5436536SAndroid Build Coastguard Worker 
448*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(t0);
449*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0);
450*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(t1);
451*e5436536SAndroid Build Coastguard Worker     sc += (t1 > 0);
452*e5436536SAndroid Build Coastguard Worker     t2 = fixp_abs(t2);
453*e5436536SAndroid Build Coastguard Worker     sc += (t2 > 0);
454*e5436536SAndroid Build Coastguard Worker     t3 = fixp_abs(t3);
455*e5436536SAndroid Build Coastguard Worker     sc += (t3 > 0);
456*e5436536SAndroid Build Coastguard Worker 
457*e5436536SAndroid Build Coastguard Worker     bc11 +=
458*e5436536SAndroid Build Coastguard Worker         (INT)FDKaacEnc_huff_ltab11[t0][t1] + (INT)FDKaacEnc_huff_ltab11[t2][t3];
459*e5436536SAndroid Build Coastguard Worker   }
460*e5436536SAndroid Build Coastguard Worker 
461*e5436536SAndroid Build Coastguard Worker   bitCount[1] = INVALID_BITCOUNT;
462*e5436536SAndroid Build Coastguard Worker   bitCount[2] = INVALID_BITCOUNT;
463*e5436536SAndroid Build Coastguard Worker   bitCount[3] = INVALID_BITCOUNT;
464*e5436536SAndroid Build Coastguard Worker   bitCount[4] = INVALID_BITCOUNT;
465*e5436536SAndroid Build Coastguard Worker   bitCount[5] = INVALID_BITCOUNT;
466*e5436536SAndroid Build Coastguard Worker   bitCount[6] = INVALID_BITCOUNT;
467*e5436536SAndroid Build Coastguard Worker   bitCount[7] = INVALID_BITCOUNT;
468*e5436536SAndroid Build Coastguard Worker   bitCount[8] = INVALID_BITCOUNT;
469*e5436536SAndroid Build Coastguard Worker   bitCount[9] = INVALID_BITCOUNT;
470*e5436536SAndroid Build Coastguard Worker   bitCount[10] = INVALID_BITCOUNT;
471*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc;
472*e5436536SAndroid Build Coastguard Worker }
473*e5436536SAndroid Build Coastguard Worker 
474*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
475*e5436536SAndroid Build Coastguard Worker 
476*e5436536SAndroid Build Coastguard Worker     functionname: FDKaacEnc_countEsc
477*e5436536SAndroid Build Coastguard Worker     description:  counts table 11 (with Esc)
478*e5436536SAndroid Build Coastguard Worker     returns:
479*e5436536SAndroid Build Coastguard Worker     input:        quantized spectrum
480*e5436536SAndroid Build Coastguard Worker     output:       bitCount for tables 11 (with Esc)
481*e5436536SAndroid Build Coastguard Worker 
482*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
483*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_countEsc(const SHORT * const values,const INT width,INT * RESTRICT bitCount)484*e5436536SAndroid Build Coastguard Worker static void FDKaacEnc_countEsc(const SHORT *const values, const INT width,
485*e5436536SAndroid Build Coastguard Worker                                INT *RESTRICT bitCount) {
486*e5436536SAndroid Build Coastguard Worker   INT i;
487*e5436536SAndroid Build Coastguard Worker   INT bc11, ec, sc;
488*e5436536SAndroid Build Coastguard Worker   INT t0, t1, t00, t01;
489*e5436536SAndroid Build Coastguard Worker 
490*e5436536SAndroid Build Coastguard Worker   bc11 = 0;
491*e5436536SAndroid Build Coastguard Worker   sc = 0;
492*e5436536SAndroid Build Coastguard Worker   ec = 0;
493*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < width; i += 2) {
494*e5436536SAndroid Build Coastguard Worker     t0 = fixp_abs(values[i + 0]);
495*e5436536SAndroid Build Coastguard Worker     t1 = fixp_abs(values[i + 1]);
496*e5436536SAndroid Build Coastguard Worker 
497*e5436536SAndroid Build Coastguard Worker     sc += (t0 > 0) + (t1 > 0);
498*e5436536SAndroid Build Coastguard Worker 
499*e5436536SAndroid Build Coastguard Worker     t00 = fixMin(t0, 16);
500*e5436536SAndroid Build Coastguard Worker     t01 = fixMin(t1, 16);
501*e5436536SAndroid Build Coastguard Worker     bc11 += (INT)FDKaacEnc_huff_ltab11[t00][t01];
502*e5436536SAndroid Build Coastguard Worker 
503*e5436536SAndroid Build Coastguard Worker     if (t0 >= 16) {
504*e5436536SAndroid Build Coastguard Worker       ec += 5;
505*e5436536SAndroid Build Coastguard Worker       while ((t0 >>= 1) >= 16) ec += 2;
506*e5436536SAndroid Build Coastguard Worker     }
507*e5436536SAndroid Build Coastguard Worker 
508*e5436536SAndroid Build Coastguard Worker     if (t1 >= 16) {
509*e5436536SAndroid Build Coastguard Worker       ec += 5;
510*e5436536SAndroid Build Coastguard Worker       while ((t1 >>= 1) >= 16) ec += 2;
511*e5436536SAndroid Build Coastguard Worker     }
512*e5436536SAndroid Build Coastguard Worker   }
513*e5436536SAndroid Build Coastguard Worker 
514*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < 11; i++) bitCount[i] = INVALID_BITCOUNT;
515*e5436536SAndroid Build Coastguard Worker 
516*e5436536SAndroid Build Coastguard Worker   bitCount[11] = bc11 + sc + ec;
517*e5436536SAndroid Build Coastguard Worker }
518*e5436536SAndroid Build Coastguard Worker 
519*e5436536SAndroid Build Coastguard Worker typedef void (*COUNT_FUNCTION)(const SHORT *const values, const INT width,
520*e5436536SAndroid Build Coastguard Worker                                INT *RESTRICT bitCount);
521*e5436536SAndroid Build Coastguard Worker 
522*e5436536SAndroid Build Coastguard Worker static const COUNT_FUNCTION countFuncTable[CODE_BOOK_ESC_LAV + 1] = {
523*e5436536SAndroid Build Coastguard Worker 
524*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11, /* 0  */
525*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11, /* 1  */
526*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count3_4_5_6_7_8_9_10_11,     /* 2  */
527*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count5_6_7_8_9_10_11,         /* 3  */
528*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count5_6_7_8_9_10_11,         /* 4  */
529*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count7_8_9_10_11,             /* 5  */
530*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count7_8_9_10_11,             /* 6  */
531*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count7_8_9_10_11,             /* 7  */
532*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count9_10_11,                 /* 8  */
533*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count9_10_11,                 /* 9  */
534*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count9_10_11,                 /* 10 */
535*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count9_10_11,                 /* 11 */
536*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count9_10_11,                 /* 12 */
537*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count11,                      /* 13 */
538*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count11,                      /* 14 */
539*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_count11,                      /* 15 */
540*e5436536SAndroid Build Coastguard Worker     FDKaacEnc_countEsc                      /* 16 */
541*e5436536SAndroid Build Coastguard Worker };
542*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_bitCount(const SHORT * const values,const INT width,const INT maxVal,INT * const RESTRICT bitCount)543*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_bitCount(const SHORT *const values, const INT width,
544*e5436536SAndroid Build Coastguard Worker                        const INT maxVal, INT *const RESTRICT bitCount) {
545*e5436536SAndroid Build Coastguard Worker   /*
546*e5436536SAndroid Build Coastguard Worker     check if we can use codebook 0
547*e5436536SAndroid Build Coastguard Worker   */
548*e5436536SAndroid Build Coastguard Worker 
549*e5436536SAndroid Build Coastguard Worker   bitCount[0] = (maxVal == 0) ? 0 : INVALID_BITCOUNT;
550*e5436536SAndroid Build Coastguard Worker 
551*e5436536SAndroid Build Coastguard Worker   countFuncTable[fixMin(maxVal, (INT)CODE_BOOK_ESC_LAV)](values, width,
552*e5436536SAndroid Build Coastguard Worker                                                          bitCount);
553*e5436536SAndroid Build Coastguard Worker 
554*e5436536SAndroid Build Coastguard Worker   return (0);
555*e5436536SAndroid Build Coastguard Worker }
556*e5436536SAndroid Build Coastguard Worker 
557*e5436536SAndroid Build Coastguard Worker /*
558*e5436536SAndroid Build Coastguard Worker   count difference between actual and zeroed lines
559*e5436536SAndroid Build Coastguard Worker */
FDKaacEnc_countValues(SHORT * RESTRICT values,INT width,INT codeBook)560*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_countValues(SHORT *RESTRICT values, INT width, INT codeBook) {
561*e5436536SAndroid Build Coastguard Worker   INT i, t0, t1, t2, t3;
562*e5436536SAndroid Build Coastguard Worker   INT bitCnt = 0;
563*e5436536SAndroid Build Coastguard Worker 
564*e5436536SAndroid Build Coastguard Worker   switch (codeBook) {
565*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_ZERO_NO:
566*e5436536SAndroid Build Coastguard Worker       break;
567*e5436536SAndroid Build Coastguard Worker 
568*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_1_NO:
569*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
570*e5436536SAndroid Build Coastguard Worker         t0 = values[i + 0];
571*e5436536SAndroid Build Coastguard Worker         t1 = values[i + 1];
572*e5436536SAndroid Build Coastguard Worker         t2 = values[i + 2];
573*e5436536SAndroid Build Coastguard Worker         t3 = values[i + 3];
574*e5436536SAndroid Build Coastguard Worker         bitCnt +=
575*e5436536SAndroid Build Coastguard Worker             HI_LTAB(FDKaacEnc_huff_ltab1_2[t0 + 1][t1 + 1][t2 + 1][t3 + 1]);
576*e5436536SAndroid Build Coastguard Worker       }
577*e5436536SAndroid Build Coastguard Worker       break;
578*e5436536SAndroid Build Coastguard Worker 
579*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_2_NO:
580*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
581*e5436536SAndroid Build Coastguard Worker         t0 = values[i + 0];
582*e5436536SAndroid Build Coastguard Worker         t1 = values[i + 1];
583*e5436536SAndroid Build Coastguard Worker         t2 = values[i + 2];
584*e5436536SAndroid Build Coastguard Worker         t3 = values[i + 3];
585*e5436536SAndroid Build Coastguard Worker         bitCnt +=
586*e5436536SAndroid Build Coastguard Worker             LO_LTAB(FDKaacEnc_huff_ltab1_2[t0 + 1][t1 + 1][t2 + 1][t3 + 1]);
587*e5436536SAndroid Build Coastguard Worker       }
588*e5436536SAndroid Build Coastguard Worker       break;
589*e5436536SAndroid Build Coastguard Worker 
590*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_3_NO:
591*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
592*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
593*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
594*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
595*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
596*e5436536SAndroid Build Coastguard Worker         t2 = fixp_abs(values[i + 2]);
597*e5436536SAndroid Build Coastguard Worker         bitCnt += (t2 > 0);
598*e5436536SAndroid Build Coastguard Worker         t3 = fixp_abs(values[i + 3]);
599*e5436536SAndroid Build Coastguard Worker         bitCnt += (t3 > 0);
600*e5436536SAndroid Build Coastguard Worker         bitCnt += HI_LTAB(FDKaacEnc_huff_ltab3_4[t0][t1][t2][t3]);
601*e5436536SAndroid Build Coastguard Worker       }
602*e5436536SAndroid Build Coastguard Worker       break;
603*e5436536SAndroid Build Coastguard Worker 
604*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_4_NO:
605*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
606*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
607*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
608*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
609*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
610*e5436536SAndroid Build Coastguard Worker         t2 = fixp_abs(values[i + 2]);
611*e5436536SAndroid Build Coastguard Worker         bitCnt += (t2 > 0);
612*e5436536SAndroid Build Coastguard Worker         t3 = fixp_abs(values[i + 3]);
613*e5436536SAndroid Build Coastguard Worker         bitCnt += (t3 > 0);
614*e5436536SAndroid Build Coastguard Worker         bitCnt += LO_LTAB(FDKaacEnc_huff_ltab3_4[t0][t1][t2][t3]);
615*e5436536SAndroid Build Coastguard Worker       }
616*e5436536SAndroid Build Coastguard Worker       break;
617*e5436536SAndroid Build Coastguard Worker 
618*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_5_NO:
619*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
620*e5436536SAndroid Build Coastguard Worker         t0 = values[i + 0];
621*e5436536SAndroid Build Coastguard Worker         t1 = values[i + 1];
622*e5436536SAndroid Build Coastguard Worker         t2 = values[i + 2];
623*e5436536SAndroid Build Coastguard Worker         t3 = values[i + 3];
624*e5436536SAndroid Build Coastguard Worker         bitCnt += HI_LTAB(FDKaacEnc_huff_ltab5_6[t0 + 4][t1 + 4]) +
625*e5436536SAndroid Build Coastguard Worker                   HI_LTAB(FDKaacEnc_huff_ltab5_6[t2 + 4][t3 + 4]);
626*e5436536SAndroid Build Coastguard Worker       }
627*e5436536SAndroid Build Coastguard Worker       break;
628*e5436536SAndroid Build Coastguard Worker 
629*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_6_NO:
630*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
631*e5436536SAndroid Build Coastguard Worker         t0 = values[i + 0];
632*e5436536SAndroid Build Coastguard Worker         t1 = values[i + 1];
633*e5436536SAndroid Build Coastguard Worker         t2 = values[i + 2];
634*e5436536SAndroid Build Coastguard Worker         t3 = values[i + 3];
635*e5436536SAndroid Build Coastguard Worker         bitCnt += LO_LTAB(FDKaacEnc_huff_ltab5_6[t0 + 4][t1 + 4]) +
636*e5436536SAndroid Build Coastguard Worker                   LO_LTAB(FDKaacEnc_huff_ltab5_6[t2 + 4][t3 + 4]);
637*e5436536SAndroid Build Coastguard Worker       }
638*e5436536SAndroid Build Coastguard Worker       break;
639*e5436536SAndroid Build Coastguard Worker 
640*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_7_NO:
641*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
642*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
643*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
644*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
645*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
646*e5436536SAndroid Build Coastguard Worker         t2 = fixp_abs(values[i + 2]);
647*e5436536SAndroid Build Coastguard Worker         bitCnt += (t2 > 0);
648*e5436536SAndroid Build Coastguard Worker         t3 = fixp_abs(values[i + 3]);
649*e5436536SAndroid Build Coastguard Worker         bitCnt += (t3 > 0);
650*e5436536SAndroid Build Coastguard Worker         bitCnt += HI_LTAB(FDKaacEnc_huff_ltab7_8[t0][t1]) +
651*e5436536SAndroid Build Coastguard Worker                   HI_LTAB(FDKaacEnc_huff_ltab7_8[t2][t3]);
652*e5436536SAndroid Build Coastguard Worker       }
653*e5436536SAndroid Build Coastguard Worker       break;
654*e5436536SAndroid Build Coastguard Worker 
655*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_8_NO:
656*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
657*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
658*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
659*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
660*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
661*e5436536SAndroid Build Coastguard Worker         t2 = fixp_abs(values[i + 2]);
662*e5436536SAndroid Build Coastguard Worker         bitCnt += (t2 > 0);
663*e5436536SAndroid Build Coastguard Worker         t3 = fixp_abs(values[i + 3]);
664*e5436536SAndroid Build Coastguard Worker         bitCnt += (t3 > 0);
665*e5436536SAndroid Build Coastguard Worker         bitCnt += LO_LTAB(FDKaacEnc_huff_ltab7_8[t0][t1]) +
666*e5436536SAndroid Build Coastguard Worker                   LO_LTAB(FDKaacEnc_huff_ltab7_8[t2][t3]);
667*e5436536SAndroid Build Coastguard Worker       }
668*e5436536SAndroid Build Coastguard Worker       break;
669*e5436536SAndroid Build Coastguard Worker 
670*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_9_NO:
671*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
672*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
673*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
674*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
675*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
676*e5436536SAndroid Build Coastguard Worker         t2 = fixp_abs(values[i + 2]);
677*e5436536SAndroid Build Coastguard Worker         bitCnt += (t2 > 0);
678*e5436536SAndroid Build Coastguard Worker         t3 = fixp_abs(values[i + 3]);
679*e5436536SAndroid Build Coastguard Worker         bitCnt += (t3 > 0);
680*e5436536SAndroid Build Coastguard Worker         bitCnt += HI_LTAB(FDKaacEnc_huff_ltab9_10[t0][t1]) +
681*e5436536SAndroid Build Coastguard Worker                   HI_LTAB(FDKaacEnc_huff_ltab9_10[t2][t3]);
682*e5436536SAndroid Build Coastguard Worker       }
683*e5436536SAndroid Build Coastguard Worker       break;
684*e5436536SAndroid Build Coastguard Worker 
685*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_10_NO:
686*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
687*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
688*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
689*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
690*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
691*e5436536SAndroid Build Coastguard Worker         t2 = fixp_abs(values[i + 2]);
692*e5436536SAndroid Build Coastguard Worker         bitCnt += (t2 > 0);
693*e5436536SAndroid Build Coastguard Worker         t3 = fixp_abs(values[i + 3]);
694*e5436536SAndroid Build Coastguard Worker         bitCnt += (t3 > 0);
695*e5436536SAndroid Build Coastguard Worker         bitCnt += LO_LTAB(FDKaacEnc_huff_ltab9_10[t0][t1]) +
696*e5436536SAndroid Build Coastguard Worker                   LO_LTAB(FDKaacEnc_huff_ltab9_10[t2][t3]);
697*e5436536SAndroid Build Coastguard Worker       }
698*e5436536SAndroid Build Coastguard Worker       break;
699*e5436536SAndroid Build Coastguard Worker 
700*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_ESC_NO:
701*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 2) {
702*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(values[i + 0]);
703*e5436536SAndroid Build Coastguard Worker         bitCnt += (t0 > 0);
704*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(values[i + 1]);
705*e5436536SAndroid Build Coastguard Worker         bitCnt += (t1 > 0);
706*e5436536SAndroid Build Coastguard Worker         bitCnt += (INT)FDKaacEnc_huff_ltab11[fixMin(t0, 16)][fixMin(t1, 16)];
707*e5436536SAndroid Build Coastguard Worker         if (t0 >= 16) {
708*e5436536SAndroid Build Coastguard Worker           bitCnt += 5;
709*e5436536SAndroid Build Coastguard Worker           while ((t0 >>= 1) >= 16) bitCnt += 2;
710*e5436536SAndroid Build Coastguard Worker         }
711*e5436536SAndroid Build Coastguard Worker         if (t1 >= 16) {
712*e5436536SAndroid Build Coastguard Worker           bitCnt += 5;
713*e5436536SAndroid Build Coastguard Worker           while ((t1 >>= 1) >= 16) bitCnt += 2;
714*e5436536SAndroid Build Coastguard Worker         }
715*e5436536SAndroid Build Coastguard Worker       }
716*e5436536SAndroid Build Coastguard Worker       break;
717*e5436536SAndroid Build Coastguard Worker 
718*e5436536SAndroid Build Coastguard Worker     default:
719*e5436536SAndroid Build Coastguard Worker       break;
720*e5436536SAndroid Build Coastguard Worker   }
721*e5436536SAndroid Build Coastguard Worker 
722*e5436536SAndroid Build Coastguard Worker   return (bitCnt);
723*e5436536SAndroid Build Coastguard Worker }
724*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_codeValues(SHORT * RESTRICT values,INT width,INT codeBook,HANDLE_FDK_BITSTREAM hBitstream)725*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_codeValues(SHORT *RESTRICT values, INT width, INT codeBook,
726*e5436536SAndroid Build Coastguard Worker                          HANDLE_FDK_BITSTREAM hBitstream) {
727*e5436536SAndroid Build Coastguard Worker   INT i, t0, t1, t2, t3, t00, t01;
728*e5436536SAndroid Build Coastguard Worker   INT codeWord, codeLength;
729*e5436536SAndroid Build Coastguard Worker   INT sign, signLength;
730*e5436536SAndroid Build Coastguard Worker 
731*e5436536SAndroid Build Coastguard Worker   DWORD_ALIGNED(values);
732*e5436536SAndroid Build Coastguard Worker 
733*e5436536SAndroid Build Coastguard Worker   switch (codeBook) {
734*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_ZERO_NO:
735*e5436536SAndroid Build Coastguard Worker       break;
736*e5436536SAndroid Build Coastguard Worker 
737*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_1_NO:
738*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
739*e5436536SAndroid Build Coastguard Worker         t0 = values[i + 0] + 1;
740*e5436536SAndroid Build Coastguard Worker         t1 = values[i + 1] + 1;
741*e5436536SAndroid Build Coastguard Worker         t2 = values[i + 2] + 1;
742*e5436536SAndroid Build Coastguard Worker         t3 = values[i + 3] + 1;
743*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab1[t0][t1][t2][t3];
744*e5436536SAndroid Build Coastguard Worker         codeLength = HI_LTAB(FDKaacEnc_huff_ltab1_2[t0][t1][t2][t3]);
745*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, codeWord, codeLength);
746*e5436536SAndroid Build Coastguard Worker       }
747*e5436536SAndroid Build Coastguard Worker       break;
748*e5436536SAndroid Build Coastguard Worker 
749*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_2_NO:
750*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
751*e5436536SAndroid Build Coastguard Worker         t0 = values[i + 0] + 1;
752*e5436536SAndroid Build Coastguard Worker         t1 = values[i + 1] + 1;
753*e5436536SAndroid Build Coastguard Worker         t2 = values[i + 2] + 1;
754*e5436536SAndroid Build Coastguard Worker         t3 = values[i + 3] + 1;
755*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab2[t0][t1][t2][t3];
756*e5436536SAndroid Build Coastguard Worker         codeLength = LO_LTAB(FDKaacEnc_huff_ltab1_2[t0][t1][t2][t3]);
757*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, codeWord, codeLength);
758*e5436536SAndroid Build Coastguard Worker       }
759*e5436536SAndroid Build Coastguard Worker       break;
760*e5436536SAndroid Build Coastguard Worker 
761*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_3_NO:
762*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 2); i++) {
763*e5436536SAndroid Build Coastguard Worker         sign = 0;
764*e5436536SAndroid Build Coastguard Worker         signLength = 0;
765*e5436536SAndroid Build Coastguard Worker         int index[4];
766*e5436536SAndroid Build Coastguard Worker         for (int j = 0; j < 4; j++) {
767*e5436536SAndroid Build Coastguard Worker           int ti = *values++;
768*e5436536SAndroid Build Coastguard Worker           int zero = (ti == 0) ? 0 : 1;
769*e5436536SAndroid Build Coastguard Worker           signLength += zero;
770*e5436536SAndroid Build Coastguard Worker           sign = (sign << zero) + ((UINT)ti >> 31);
771*e5436536SAndroid Build Coastguard Worker           index[j] = fixp_abs(ti);
772*e5436536SAndroid Build Coastguard Worker         }
773*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab3[index[0]][index[1]][index[2]][index[3]];
774*e5436536SAndroid Build Coastguard Worker         codeLength = HI_LTAB(
775*e5436536SAndroid Build Coastguard Worker             FDKaacEnc_huff_ltab3_4[index[0]][index[1]][index[2]][index[3]]);
776*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
777*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
778*e5436536SAndroid Build Coastguard Worker       }
779*e5436536SAndroid Build Coastguard Worker       break;
780*e5436536SAndroid Build Coastguard Worker 
781*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_4_NO:
782*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < width; i += 4) {
783*e5436536SAndroid Build Coastguard Worker         sign = 0;
784*e5436536SAndroid Build Coastguard Worker         signLength = 0;
785*e5436536SAndroid Build Coastguard Worker         int index[4];
786*e5436536SAndroid Build Coastguard Worker         for (int j = 0; j < 4; j++) {
787*e5436536SAndroid Build Coastguard Worker           int ti = *values++;
788*e5436536SAndroid Build Coastguard Worker           int zero = (ti == 0) ? 0 : 1;
789*e5436536SAndroid Build Coastguard Worker           signLength += zero;
790*e5436536SAndroid Build Coastguard Worker           sign = (sign << zero) + ((UINT)ti >> 31);
791*e5436536SAndroid Build Coastguard Worker           index[j] = fixp_abs(ti);
792*e5436536SAndroid Build Coastguard Worker         }
793*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab4[index[0]][index[1]][index[2]][index[3]];
794*e5436536SAndroid Build Coastguard Worker         codeLength = LO_LTAB(
795*e5436536SAndroid Build Coastguard Worker             FDKaacEnc_huff_ltab3_4[index[0]][index[1]][index[2]][index[3]]);
796*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
797*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
798*e5436536SAndroid Build Coastguard Worker       }
799*e5436536SAndroid Build Coastguard Worker       break;
800*e5436536SAndroid Build Coastguard Worker 
801*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_5_NO:
802*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 2); i++) {
803*e5436536SAndroid Build Coastguard Worker         t0 = *values++ + 4;
804*e5436536SAndroid Build Coastguard Worker         t1 = *values++ + 4;
805*e5436536SAndroid Build Coastguard Worker         t2 = *values++ + 4;
806*e5436536SAndroid Build Coastguard Worker         t3 = *values++ + 4;
807*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab5[t0][t1];
808*e5436536SAndroid Build Coastguard Worker         codeLength =
809*e5436536SAndroid Build Coastguard Worker             HI_LTAB(FDKaacEnc_huff_ltab5_6[t2][t3]); /* length of 2nd cw */
810*e5436536SAndroid Build Coastguard Worker         codeWord = (codeWord << codeLength) + FDKaacEnc_huff_ctab5[t2][t3];
811*e5436536SAndroid Build Coastguard Worker         codeLength += HI_LTAB(FDKaacEnc_huff_ltab5_6[t0][t1]);
812*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, codeWord, codeLength);
813*e5436536SAndroid Build Coastguard Worker       }
814*e5436536SAndroid Build Coastguard Worker       break;
815*e5436536SAndroid Build Coastguard Worker 
816*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_6_NO:
817*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 2); i++) {
818*e5436536SAndroid Build Coastguard Worker         t0 = *values++ + 4;
819*e5436536SAndroid Build Coastguard Worker         t1 = *values++ + 4;
820*e5436536SAndroid Build Coastguard Worker         t2 = *values++ + 4;
821*e5436536SAndroid Build Coastguard Worker         t3 = *values++ + 4;
822*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab6[t0][t1];
823*e5436536SAndroid Build Coastguard Worker         codeLength =
824*e5436536SAndroid Build Coastguard Worker             LO_LTAB(FDKaacEnc_huff_ltab5_6[t2][t3]); /* length of 2nd cw */
825*e5436536SAndroid Build Coastguard Worker         codeWord = (codeWord << codeLength) + FDKaacEnc_huff_ctab6[t2][t3];
826*e5436536SAndroid Build Coastguard Worker         codeLength += LO_LTAB(FDKaacEnc_huff_ltab5_6[t0][t1]);
827*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, codeWord, codeLength);
828*e5436536SAndroid Build Coastguard Worker       }
829*e5436536SAndroid Build Coastguard Worker       break;
830*e5436536SAndroid Build Coastguard Worker 
831*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_7_NO:
832*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 1); i++) {
833*e5436536SAndroid Build Coastguard Worker         t0 = *values++;
834*e5436536SAndroid Build Coastguard Worker         sign = ((UINT)t0 >> 31);
835*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(t0);
836*e5436536SAndroid Build Coastguard Worker         signLength = (t0 == 0) ? 0 : 1;
837*e5436536SAndroid Build Coastguard Worker         t1 = *values++;
838*e5436536SAndroid Build Coastguard Worker         INT zero = (t1 == 0) ? 0 : 1;
839*e5436536SAndroid Build Coastguard Worker         signLength += zero;
840*e5436536SAndroid Build Coastguard Worker         sign = (sign << zero) + ((UINT)t1 >> 31);
841*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(t1);
842*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab7[t0][t1];
843*e5436536SAndroid Build Coastguard Worker         codeLength = HI_LTAB(FDKaacEnc_huff_ltab7_8[t0][t1]);
844*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
845*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
846*e5436536SAndroid Build Coastguard Worker       }
847*e5436536SAndroid Build Coastguard Worker       break;
848*e5436536SAndroid Build Coastguard Worker 
849*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_8_NO:
850*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 1); i++) {
851*e5436536SAndroid Build Coastguard Worker         t0 = *values++;
852*e5436536SAndroid Build Coastguard Worker         sign = ((UINT)t0 >> 31);
853*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(t0);
854*e5436536SAndroid Build Coastguard Worker         signLength = (t0 == 0) ? 0 : 1;
855*e5436536SAndroid Build Coastguard Worker         t1 = *values++;
856*e5436536SAndroid Build Coastguard Worker         INT zero = (t1 == 0) ? 0 : 1;
857*e5436536SAndroid Build Coastguard Worker         signLength += zero;
858*e5436536SAndroid Build Coastguard Worker         sign = (sign << zero) + ((UINT)t1 >> 31);
859*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(t1);
860*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab8[t0][t1];
861*e5436536SAndroid Build Coastguard Worker         codeLength = LO_LTAB(FDKaacEnc_huff_ltab7_8[t0][t1]);
862*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
863*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
864*e5436536SAndroid Build Coastguard Worker       }
865*e5436536SAndroid Build Coastguard Worker       break;
866*e5436536SAndroid Build Coastguard Worker 
867*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_9_NO:
868*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 1); i++) {
869*e5436536SAndroid Build Coastguard Worker         t0 = *values++;
870*e5436536SAndroid Build Coastguard Worker         sign = ((UINT)t0 >> 31);
871*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(t0);
872*e5436536SAndroid Build Coastguard Worker         signLength = (t0 == 0) ? 0 : 1;
873*e5436536SAndroid Build Coastguard Worker         t1 = *values++;
874*e5436536SAndroid Build Coastguard Worker         INT zero = (t1 == 0) ? 0 : 1;
875*e5436536SAndroid Build Coastguard Worker         signLength += zero;
876*e5436536SAndroid Build Coastguard Worker         sign = (sign << zero) + ((UINT)t1 >> 31);
877*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(t1);
878*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab9[t0][t1];
879*e5436536SAndroid Build Coastguard Worker         codeLength = HI_LTAB(FDKaacEnc_huff_ltab9_10[t0][t1]);
880*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
881*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
882*e5436536SAndroid Build Coastguard Worker       }
883*e5436536SAndroid Build Coastguard Worker       break;
884*e5436536SAndroid Build Coastguard Worker 
885*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_10_NO:
886*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 1); i++) {
887*e5436536SAndroid Build Coastguard Worker         t0 = *values++;
888*e5436536SAndroid Build Coastguard Worker         sign = ((UINT)t0 >> 31);
889*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(t0);
890*e5436536SAndroid Build Coastguard Worker         signLength = (t0 == 0) ? 0 : 1;
891*e5436536SAndroid Build Coastguard Worker         t1 = *values++;
892*e5436536SAndroid Build Coastguard Worker         INT zero = (t1 == 0) ? 0 : 1;
893*e5436536SAndroid Build Coastguard Worker         signLength += zero;
894*e5436536SAndroid Build Coastguard Worker         sign = (sign << zero) + ((UINT)t1 >> 31);
895*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(t1);
896*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab10[t0][t1];
897*e5436536SAndroid Build Coastguard Worker         codeLength = LO_LTAB(FDKaacEnc_huff_ltab9_10[t0][t1]);
898*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
899*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
900*e5436536SAndroid Build Coastguard Worker       }
901*e5436536SAndroid Build Coastguard Worker       break;
902*e5436536SAndroid Build Coastguard Worker 
903*e5436536SAndroid Build Coastguard Worker     case CODE_BOOK_ESC_NO:
904*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < (width >> 1); i++) {
905*e5436536SAndroid Build Coastguard Worker         t0 = *values++;
906*e5436536SAndroid Build Coastguard Worker         sign = ((UINT)t0 >> 31);
907*e5436536SAndroid Build Coastguard Worker         t0 = fixp_abs(t0);
908*e5436536SAndroid Build Coastguard Worker         signLength = (t0 == 0) ? 0 : 1;
909*e5436536SAndroid Build Coastguard Worker         t1 = *values++;
910*e5436536SAndroid Build Coastguard Worker         INT zero = (t1 == 0) ? 0 : 1;
911*e5436536SAndroid Build Coastguard Worker         signLength += zero;
912*e5436536SAndroid Build Coastguard Worker         sign = (sign << zero) + ((UINT)t1 >> 31);
913*e5436536SAndroid Build Coastguard Worker         t1 = fixp_abs(t1);
914*e5436536SAndroid Build Coastguard Worker 
915*e5436536SAndroid Build Coastguard Worker         t00 = fixMin(t0, 16);
916*e5436536SAndroid Build Coastguard Worker         t01 = fixMin(t1, 16);
917*e5436536SAndroid Build Coastguard Worker 
918*e5436536SAndroid Build Coastguard Worker         codeWord = FDKaacEnc_huff_ctab11[t00][t01];
919*e5436536SAndroid Build Coastguard Worker         codeLength = (INT)FDKaacEnc_huff_ltab11[t00][t01];
920*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitstream, (codeWord << signLength) | sign,
921*e5436536SAndroid Build Coastguard Worker                      codeLength + signLength);
922*e5436536SAndroid Build Coastguard Worker         for (int j = 0; j < 2; j++) {
923*e5436536SAndroid Build Coastguard Worker           if (t0 >= 16) {
924*e5436536SAndroid Build Coastguard Worker             INT n = 4, p = t0;
925*e5436536SAndroid Build Coastguard Worker             for (; (p >>= 1) >= 16;) n++;
926*e5436536SAndroid Build Coastguard Worker             FDKwriteBits(hBitstream,
927*e5436536SAndroid Build Coastguard Worker                          (((1 << (n - 3)) - 2) << n) | (t0 - (1 << n)),
928*e5436536SAndroid Build Coastguard Worker                          n + n - 3);
929*e5436536SAndroid Build Coastguard Worker           }
930*e5436536SAndroid Build Coastguard Worker           t0 = t1;
931*e5436536SAndroid Build Coastguard Worker         }
932*e5436536SAndroid Build Coastguard Worker       }
933*e5436536SAndroid Build Coastguard Worker       break;
934*e5436536SAndroid Build Coastguard Worker 
935*e5436536SAndroid Build Coastguard Worker     default:
936*e5436536SAndroid Build Coastguard Worker       break;
937*e5436536SAndroid Build Coastguard Worker   }
938*e5436536SAndroid Build Coastguard Worker   return (0);
939*e5436536SAndroid Build Coastguard Worker }
940*e5436536SAndroid Build Coastguard Worker 
FDKaacEnc_codeScalefactorDelta(INT delta,HANDLE_FDK_BITSTREAM hBitstream)941*e5436536SAndroid Build Coastguard Worker INT FDKaacEnc_codeScalefactorDelta(INT delta, HANDLE_FDK_BITSTREAM hBitstream) {
942*e5436536SAndroid Build Coastguard Worker   INT codeWord, codeLength;
943*e5436536SAndroid Build Coastguard Worker 
944*e5436536SAndroid Build Coastguard Worker   if (fixp_abs(delta) > CODE_BOOK_SCF_LAV) return (1);
945*e5436536SAndroid Build Coastguard Worker 
946*e5436536SAndroid Build Coastguard Worker   codeWord = FDKaacEnc_huff_ctabscf[delta + CODE_BOOK_SCF_LAV];
947*e5436536SAndroid Build Coastguard Worker   codeLength = (INT)FDKaacEnc_huff_ltabscf[delta + CODE_BOOK_SCF_LAV];
948*e5436536SAndroid Build Coastguard Worker   FDKwriteBits(hBitstream, codeWord, codeLength);
949*e5436536SAndroid Build Coastguard Worker   return (0);
950*e5436536SAndroid Build Coastguard Worker }
951