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