• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* -----------------------------------------------------------------------------------------------------------
3 Software 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
9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16 of the MPEG specifications.
17 
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
24 
25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27 applications information and documentation.
28 
29 2.    COPYRIGHT LICENSE
30 
31 Redistribution and use in source and binary forms, with or without modification, are permitted without
32 payment of copyright license fees provided that you satisfy the following conditions:
33 
34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35 your modifications thereto in source code form.
36 
37 You must retain the complete text of this software license in the documentation and/or other materials
38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40 modifications thereto to recipients of copies in binary form.
41 
42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43 prior written permission.
44 
45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46 software or your modifications thereto.
47 
48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49 and 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 
53 3.    NO PATENT LICENSE
54 
55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57 respect to this software.
58 
59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60 by appropriate patent licenses.
61 
62 4.    DISCLAIMER
63 
64 This 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
66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69 or business interruption, however caused and on any theory of liability, whether in contract, strict
70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
71 advised of the possibility of such damage.
72 
73 5.    CONTACT INFORMATION
74 
75 Fraunhofer Institute for Integrated Circuits IIS
76 Attention: Audio and Multimedia Departments - FDK AAC LL
77 Am Wolfsmantel 33
78 91058 Erlangen, Germany
79 
80 www.iis.fraunhofer.de/amm
81 amm-info@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
83 
84 /******************************** MPEG Audio Encoder **************************
85 
86    Initial author:       M.Werner
87    contents/description: Noiseless coder module
88 
89 ******************************************************************************/
90 
91 #include "dyn_bits.h"
92 #include "bit_cnt.h"
93 #include "psy_const.h"
94 #include "aacenc_pns.h"
95 #include "aacEnc_ram.h"
96 #include "aacEnc_rom.h"
97 
98 typedef INT (*lookUpTable)[CODE_BOOK_ESC_NDX + 1];
99 
FDKaacEnc_getSideInfoBits(const SECTION_INFO * const huffsection,const SHORT * const sideInfoTab,const INT useHCR)100 static INT FDKaacEnc_getSideInfoBits(
101         const SECTION_INFO* const huffsection,
102         const SHORT* const        sideInfoTab,
103         const INT                 useHCR
104         )
105 {
106   INT sideInfoBits;
107 
108   if ( useHCR && ((huffsection->codeBook == 11) || (huffsection->codeBook >= 16)) ) {
109     sideInfoBits = 5;
110   }
111   else {
112     sideInfoBits = sideInfoTab[huffsection->sfbCnt];
113   }
114 
115   return (sideInfoBits);
116 }
117 
118 /* count bits using all possible tables */
FDKaacEnc_buildBitLookUp(const SHORT * const quantSpectrum,const INT maxSfb,const INT * const sfbOffset,const UINT * const sfbMax,INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX+1],SECTION_INFO * const huffsection)119 static void FDKaacEnc_buildBitLookUp(
120         const SHORT* const        quantSpectrum,
121         const INT                 maxSfb,
122         const INT* const          sfbOffset,
123         const UINT* const         sfbMax,
124         INT                       bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
125         SECTION_INFO* const       huffsection
126         )
127 {
128   INT i, sfbWidth;
129 
130   for (i = 0; i < maxSfb; i++)
131   {
132     huffsection[i].sfbCnt = 1;
133     huffsection[i].sfbStart = i;
134     huffsection[i].sectionBits = INVALID_BITCOUNT;
135     huffsection[i].codeBook = -1;
136     sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
137     FDKaacEnc_bitCount(quantSpectrum + sfbOffset[i], sfbWidth, sfbMax[i], bitLookUp[i]);
138   }
139 }
140 
141 /* essential helper functions */
FDKaacEnc_findBestBook(const INT * const bc,INT * const book,const INT useVCB11)142 static INT FDKaacEnc_findBestBook(
143         const INT* const          bc,
144         INT* const                book,
145         const INT                 useVCB11
146         )
147 {
148   INT minBits = INVALID_BITCOUNT, j;
149 
150   int end = CODE_BOOK_ESC_NDX;
151 
152 
153   for (j = 0; j <= end; j++)
154   {
155     if (bc[j] < minBits)
156     {
157       minBits = bc[j];
158       *book = j;
159     }
160   }
161   return (minBits);
162 }
163 
FDKaacEnc_findMinMergeBits(const INT * const bc1,const INT * const bc2,const INT useVCB11)164 static INT FDKaacEnc_findMinMergeBits(
165         const INT* const          bc1,
166         const INT* const          bc2,
167         const INT                 useVCB11
168         )
169 {
170   INT minBits = INVALID_BITCOUNT, j;
171 
172   int end = CODE_BOOK_ESC_NDX;
173 
174 
175   for (j = 0; j <= end; j++)
176   {
177     if (bc1[j] + bc2[j] < minBits)
178     {
179       minBits = bc1[j] + bc2[j];
180     }
181   }
182   return (minBits);
183 }
184 
FDKaacEnc_mergeBitLookUp(INT * const bc1,const INT * const bc2)185 static void FDKaacEnc_mergeBitLookUp(
186         INT* const                bc1,
187         const INT* const          bc2
188         )
189 {
190   int j;
191 
192   for (j = 0; j <= CODE_BOOK_ESC_NDX; j++)
193   {
194     bc1[j] = fixMin(bc1[j] + bc2[j], INVALID_BITCOUNT);
195   }
196 }
197 
FDKaacEnc_findMaxMerge(const INT * const mergeGainLookUp,const SECTION_INFO * const huffsection,const INT maxSfb,INT * const maxNdx)198 static INT FDKaacEnc_findMaxMerge(
199         const INT* const          mergeGainLookUp,
200         const SECTION_INFO* const  huffsection,
201         const INT maxSfb,
202         INT* const                maxNdx
203         )
204 {
205   INT i, maxMergeGain = 0;
206 
207   for (i = 0; i + huffsection[i].sfbCnt < maxSfb; i += huffsection[i].sfbCnt)
208   {
209     if (mergeGainLookUp[i] > maxMergeGain)
210     {
211       maxMergeGain = mergeGainLookUp[i];
212       *maxNdx = i;
213     }
214   }
215   return (maxMergeGain);
216 }
217 
FDKaacEnc_CalcMergeGain(const SECTION_INFO * const huffsection,const INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX+1],const SHORT * const sideInfoTab,const INT ndx1,const INT ndx2,const INT useVCB11)218 static INT FDKaacEnc_CalcMergeGain(
219         const SECTION_INFO* const huffsection,
220         const INT                 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
221         const SHORT* const        sideInfoTab,
222         const INT                 ndx1,
223         const INT                 ndx2,
224         const INT                 useVCB11
225         )
226 {
227   INT MergeGain, MergeBits, SplitBits;
228 
229   MergeBits = sideInfoTab[huffsection[ndx1].sfbCnt + huffsection[ndx2].sfbCnt] + FDKaacEnc_findMinMergeBits(bitLookUp[ndx1], bitLookUp[ndx2], useVCB11);
230   SplitBits = huffsection[ndx1].sectionBits + huffsection[ndx2].sectionBits; /* Bit amount for splitted huffsections */
231   MergeGain = SplitBits - MergeBits;
232 
233   if ( (huffsection[ndx1].codeBook==CODE_BOOK_PNS_NO)||(huffsection[ndx2].codeBook==CODE_BOOK_PNS_NO)
234     || (huffsection[ndx1].codeBook==CODE_BOOK_IS_OUT_OF_PHASE_NO)||(huffsection[ndx2].codeBook==CODE_BOOK_IS_OUT_OF_PHASE_NO)
235     || (huffsection[ndx1].codeBook==CODE_BOOK_IS_IN_PHASE_NO)||(huffsection[ndx2].codeBook==CODE_BOOK_IS_IN_PHASE_NO)
236     )
237   {
238     MergeGain = -1;
239   }
240 
241   return (MergeGain);
242 }
243 
244 
245 /* sectioning Stage 0:find minimum codbooks */
FDKaacEnc_gmStage0(SECTION_INFO * const RESTRICT huffsection,const INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX+1],const INT maxSfb,const INT * const noiseNrg,const INT * const isBook)246 static void FDKaacEnc_gmStage0(
247         SECTION_INFO* const RESTRICT huffsection,
248         const INT                    bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
249         const INT                    maxSfb,
250         const INT* const             noiseNrg,
251         const INT* const             isBook
252         )
253 {
254   INT i;
255 
256   for (i = 0; i < maxSfb; i++)
257   {
258     /* Side-Info bits will be calculated in Stage 1! */
259     if (huffsection[i].sectionBits == INVALID_BITCOUNT)
260     {
261       /* intensity and pns codebooks are already allocated in bitcount.c */
262       if(noiseNrg[i] != NO_NOISE_PNS){
263         huffsection[i].codeBook=CODE_BOOK_PNS_NO;
264         huffsection[i].sectionBits = 0;
265       }
266       else if( isBook[i] ) {
267         huffsection[i].codeBook=isBook[i];
268         huffsection[i].sectionBits = 0;
269       }
270       else {
271         huffsection[i].sectionBits = FDKaacEnc_findBestBook(bitLookUp[i], &(huffsection[i].codeBook), 0); /* useVCB11 must be 0!!! */
272       }
273     }
274   }
275 }
276 
277 /*
278    sectioning Stage 1:merge all connected regions with the same code book and
279    calculate side info
280  */
FDKaacEnc_gmStage1(SECTION_INFO * const RESTRICT huffsection,INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX+1],const INT maxSfb,const SHORT * const sideInfoTab,const INT useVCB11)281 static void FDKaacEnc_gmStage1(
282         SECTION_INFO* const RESTRICT huffsection,
283         INT                          bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
284         const INT                    maxSfb,
285         const SHORT* const           sideInfoTab,
286         const INT                    useVCB11
287         )
288 {
289   INT mergeStart = 0, mergeEnd;
290 
291   do
292   {
293     for (mergeEnd = mergeStart + 1; mergeEnd < maxSfb; mergeEnd++)
294     {
295       if (huffsection[mergeStart].codeBook != huffsection[mergeEnd].codeBook)
296         break;
297 
298 
299       /* we can merge. update tables, side info bits will be updated outside of this loop */
300       huffsection[mergeStart].sfbCnt++;
301       huffsection[mergeStart].sectionBits += huffsection[mergeEnd].sectionBits;
302 
303       /* update bit look up for all code books */
304       FDKaacEnc_mergeBitLookUp(bitLookUp[mergeStart], bitLookUp[mergeEnd]);
305     }
306 
307     /* add side info info bits */
308     huffsection[mergeStart].sectionBits += FDKaacEnc_getSideInfoBits(&huffsection[mergeStart], sideInfoTab, useVCB11);
309     huffsection[mergeEnd - 1].sfbStart = huffsection[mergeStart].sfbStart;      /* speed up prev search */
310 
311     mergeStart = mergeEnd;
312 
313   } while (mergeStart < maxSfb);
314 }
315 
316 /*
317    sectioning Stage 2:greedy merge algorithm, merge connected sections with
318    maximum bit gain until no more gain is possible
319  */
320 static void
FDKaacEnc_gmStage2(SECTION_INFO * const RESTRICT huffsection,INT * const RESTRICT mergeGainLookUp,INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX+1],const INT maxSfb,const SHORT * const sideInfoTab,const INT useVCB11)321 FDKaacEnc_gmStage2(
322         SECTION_INFO* const RESTRICT huffsection,
323         INT* const RESTRICT          mergeGainLookUp,
324         INT                          bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
325         const INT                    maxSfb,
326         const SHORT* const           sideInfoTab,
327         const INT                    useVCB11
328         )
329 {
330   INT i;
331 
332   for (i = 0; i + huffsection[i].sfbCnt < maxSfb; i += huffsection[i].sfbCnt)
333   {
334     mergeGainLookUp[i] = FDKaacEnc_CalcMergeGain(huffsection,
335                                        bitLookUp,
336                                        sideInfoTab,
337                                        i,
338                                        i + huffsection[i].sfbCnt,
339                                        useVCB11);
340   }
341 
342   while (TRUE)
343   {
344     INT maxMergeGain, maxNdx = 0, maxNdxNext, maxNdxLast;
345 
346     maxMergeGain = FDKaacEnc_findMaxMerge(mergeGainLookUp, huffsection, maxSfb, &maxNdx);
347 
348     /* exit while loop if no more gain is possible */
349     if (maxMergeGain <= 0)
350       break;
351 
352     maxNdxNext = maxNdx + huffsection[maxNdx].sfbCnt;
353 
354     /* merge sections with maximum bit gain */
355     huffsection[maxNdx].sfbCnt += huffsection[maxNdxNext].sfbCnt;
356     huffsection[maxNdx].sectionBits += huffsection[maxNdxNext].sectionBits - maxMergeGain;
357 
358     /* update bit look up table for merged huffsection  */
359     FDKaacEnc_mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
360 
361     /* update mergeLookUpTable */
362     if (maxNdx != 0)
363     {
364       maxNdxLast = huffsection[maxNdx - 1].sfbStart;
365       mergeGainLookUp[maxNdxLast] = FDKaacEnc_CalcMergeGain(huffsection,
366                                                   bitLookUp,
367                                                   sideInfoTab,
368                                                   maxNdxLast,
369                                                   maxNdx,
370                                                   useVCB11);
371 
372     }
373     maxNdxNext = maxNdx + huffsection[maxNdx].sfbCnt;
374 
375     huffsection[maxNdxNext - 1].sfbStart = huffsection[maxNdx].sfbStart;
376 
377     if (maxNdxNext < maxSfb)
378       mergeGainLookUp[maxNdx] = FDKaacEnc_CalcMergeGain(huffsection,
379                                               bitLookUp,
380                                               sideInfoTab,
381                                               maxNdx,
382                                               maxNdxNext,
383                                               useVCB11);
384 
385   }
386 }
387 
388 /* count bits used by the noiseless coder */
FDKaacEnc_noiselessCounter(SECTION_DATA * const RESTRICT sectionData,INT mergeGainLookUp[MAX_SFB_LONG],INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX+1],const SHORT * const quantSpectrum,const UINT * const maxValueInSfb,const INT * const sfbOffset,const INT blockType,const INT * const noiseNrg,const INT * const isBook,const INT useVCB11)389 static void FDKaacEnc_noiselessCounter(
390         SECTION_DATA* const RESTRICT sectionData,
391         INT                          mergeGainLookUp[MAX_SFB_LONG],
392         INT                          bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
393         const SHORT* const           quantSpectrum,
394         const UINT* const            maxValueInSfb,
395         const INT* const             sfbOffset,
396         const INT                    blockType,
397         const INT* const             noiseNrg,
398         const INT* const             isBook,
399         const INT                    useVCB11
400         )
401 {
402   INT grpNdx, i;
403   const SHORT *sideInfoTab = NULL;
404   SECTION_INFO *huffsection;
405 
406   /* use appropriate side info table */
407   switch (blockType)
408   {
409   case LONG_WINDOW:
410   case START_WINDOW:
411   case STOP_WINDOW:
412     sideInfoTab = FDKaacEnc_sideInfoTabLong;
413     break;
414   case SHORT_WINDOW:
415     sideInfoTab = FDKaacEnc_sideInfoTabShort;
416     break;
417   }
418 
419   sectionData->noOfSections = 0;
420   sectionData->huffmanBits = 0;
421   sectionData->sideInfoBits = 0;
422 
423 
424   if (sectionData->maxSfbPerGroup == 0)
425     return;
426 
427   /* loop trough groups */
428   for (grpNdx = 0; grpNdx < sectionData->sfbCnt; grpNdx += sectionData->sfbPerGroup)
429   {
430     huffsection = sectionData->huffsection + sectionData->noOfSections;
431 
432     /* count bits in this group */
433     FDKaacEnc_buildBitLookUp(quantSpectrum,
434                    sectionData->maxSfbPerGroup,
435                    sfbOffset + grpNdx,
436                    maxValueInSfb + grpNdx,
437                    bitLookUp,
438                    huffsection);
439 
440     /* 0.Stage :Find minimum Codebooks */
441     FDKaacEnc_gmStage0(huffsection, bitLookUp, sectionData->maxSfbPerGroup, noiseNrg+grpNdx, isBook+grpNdx);
442 
443     /* 1.Stage :Merge all connected regions with the same code book */
444     FDKaacEnc_gmStage1(huffsection, bitLookUp, sectionData->maxSfbPerGroup, sideInfoTab, useVCB11);
445 
446 
447     /*
448        2.Stage
449        greedy merge algorithm, merge connected huffsections with maximum bit
450        gain until no more gain is possible
451      */
452 
453     FDKaacEnc_gmStage2(huffsection,
454              mergeGainLookUp,
455              bitLookUp,
456              sectionData->maxSfbPerGroup,
457              sideInfoTab,
458              useVCB11);
459 
460 
461 
462     /*
463        compress output, calculate total huff and side bits
464        since we did not update the actual codebook in stage 2
465        to save time, we must set it here for later use in bitenc
466      */
467 
468     for (i = 0; i < sectionData->maxSfbPerGroup; i += huffsection[i].sfbCnt)
469     {
470       if ((huffsection[i].codeBook==CODE_BOOK_PNS_NO) ||
471           (huffsection[i].codeBook==CODE_BOOK_IS_OUT_OF_PHASE_NO) ||
472           (huffsection[i].codeBook==CODE_BOOK_IS_IN_PHASE_NO))
473       {
474         huffsection[i].sectionBits=0;
475       } else {
476         /* the sections in the sectionData are now marked with the optimal code book */
477 
478           FDKaacEnc_findBestBook(bitLookUp[i], &(huffsection[i].codeBook), useVCB11);
479 
480         sectionData->huffmanBits += huffsection[i].sectionBits - FDKaacEnc_getSideInfoBits(&huffsection[i], sideInfoTab, useVCB11);
481       }
482 
483       huffsection[i].sfbStart += grpNdx;
484 
485       /* sum up side info bits (section data bits) */
486       sectionData->sideInfoBits += FDKaacEnc_getSideInfoBits(&huffsection[i], sideInfoTab, useVCB11);
487       sectionData->huffsection[sectionData->noOfSections++] = huffsection[i];
488     }
489   }
490 }
491 
492 
493 /*******************************************************************************
494 
495      functionname: FDKaacEnc_scfCount
496      returns     : ---
497      description : count bits used by scalefactors.
498 
499                    not in all cases if maxValueInSfb[] == 0 we set deltaScf
500                    to zero. only if the difference of the last and future
501                    scalefacGain is not greater then CODE_BOOK_SCF_LAV (60).
502 
503      example:
504                   ^
505      scalefacGain |
506                   |
507                   |       last 75
508                   |          |
509                   |          |
510                   |          |
511                   |          |      current 50
512                   |          |          |
513                   |          |          |
514                   |          |          |
515                   |          |          |
516                   |          |          |      future 5
517                   |          |          |          |
518                   --- ... ---------------------------- ... --------->
519                                                                 sfb
520 
521 
522                   if maxValueInSfb[] of current is zero because of a
523                   notfallstrategie, we do not save bits and transmit a
524                   deltaScf of 25. otherwise the deltaScf between the last
525                   scalfacGain (75) and the future scalefacGain (5) is 70.
526 
527 ********************************************************************************/
FDKaacEnc_scfCount(const INT * const scalefacGain,const UINT * const maxValueInSfb,SECTION_DATA * const RESTRICT sectionData,const INT * const isScale)528 static void FDKaacEnc_scfCount(
529         const INT* const             scalefacGain,
530         const UINT* const            maxValueInSfb,
531         SECTION_DATA* const RESTRICT sectionData,
532         const INT* const             isScale
533         )
534 {
535   INT i, j, k, m, n;
536 
537   INT lastValScf     = 0;
538   INT deltaScf       = 0;
539   INT found          = 0;
540   INT scfSkipCounter = 0;
541   INT lastValIs      = 0;
542 
543   sectionData->scalefacBits = 0;
544 
545   if (scalefacGain == NULL)
546     return;
547 
548   sectionData->firstScf = 0;
549 
550   for (i=0; i<sectionData->noOfSections; i++)
551   {
552     if (sectionData->huffsection[i].codeBook != CODE_BOOK_ZERO_NO)
553     {
554       sectionData->firstScf = sectionData->huffsection[i].sfbStart;
555       lastValScf = scalefacGain[sectionData->firstScf];
556       break;
557     }
558   }
559 
560   for (i=0; i<sectionData->noOfSections; i++)
561   {
562     if ((sectionData->huffsection[i].codeBook == CODE_BOOK_IS_OUT_OF_PHASE_NO) ||
563         (sectionData->huffsection[i].codeBook == CODE_BOOK_IS_IN_PHASE_NO))
564     {
565       for (j = sectionData->huffsection[i].sfbStart;
566            j < sectionData->huffsection[i].sfbStart + sectionData->huffsection[i].sfbCnt;
567            j++)
568       {
569         INT deltaIs = isScale[j]-lastValIs;
570         lastValIs   = isScale[j];
571         sectionData->scalefacBits+=FDKaacEnc_bitCountScalefactorDelta(deltaIs);
572       }
573     } /* Intensity */
574     else if ((sectionData->huffsection[i].codeBook != CODE_BOOK_ZERO_NO) &&
575              (sectionData->huffsection[i].codeBook != CODE_BOOK_PNS_NO))
576     {
577       INT tmp = sectionData->huffsection[i].sfbStart + sectionData->huffsection[i].sfbCnt;
578       for (j = sectionData->huffsection[i].sfbStart; j<tmp; j++)
579       {
580         /* check if we can repeat the last value to save bits */
581         if (maxValueInSfb[j] == 0)
582         {
583           found = 0;
584           /* are scalefactors skipped? */
585           if (scfSkipCounter == 0)
586           {
587             /* end of section */
588             if (j == (tmp - 1) )
589               found = 0;  /* search in other sections for maxValueInSfb != 0 */
590             else
591             {
592               /* search in this section for the next maxValueInSfb[] != 0 */
593               for (k = (j+1); k < tmp; k++)
594               {
595                 if (maxValueInSfb[k] != 0)
596                 {
597                   found = 1;
598                   if ( (fixp_abs(scalefacGain[k] - lastValScf)) <= CODE_BOOK_SCF_LAV)
599                      deltaScf = 0; /* save bits */
600                   else
601                   {
602                     /* do not save bits */
603                     deltaScf = lastValScf - scalefacGain[j];
604                     lastValScf = scalefacGain[j];
605                     scfSkipCounter = 0;
606                   }
607                   break;
608                 }
609                 /* count scalefactor skip */
610                 scfSkipCounter++;
611               }
612             }
613 
614             /* search for the next maxValueInSfb[] != 0 in all other sections */
615             for (m=(i+1); (m < sectionData->noOfSections) && (found == 0); m++)
616             {
617               if ((sectionData->huffsection[m].codeBook != CODE_BOOK_ZERO_NO) && (sectionData->huffsection[m].codeBook != CODE_BOOK_PNS_NO))
618               {
619                 INT end = sectionData->huffsection[m].sfbStart + sectionData->huffsection[m].sfbCnt;
620                 for (n = sectionData->huffsection[m].sfbStart; n<end; n++)
621                 {
622                   if (maxValueInSfb[n] != 0)
623                   {
624                     found = 1;
625                     if (fixp_abs(scalefacGain[n] - lastValScf) <= CODE_BOOK_SCF_LAV)
626                       deltaScf = 0;  /* save bits */
627                     else
628                     {
629                       /* do not save bits */
630                       deltaScf = lastValScf - scalefacGain[j];
631                       lastValScf = scalefacGain[j];
632                       scfSkipCounter = 0;
633                     }
634                     break;
635                   }
636                   /* count scalefactor skip */
637                   scfSkipCounter++;
638                 }
639               }
640             }
641             /* no maxValueInSfb[] != 0 found */
642             if (found == 0)
643             {
644               deltaScf = 0;
645               scfSkipCounter = 0;
646             }
647           }
648           else {
649             /* consider skipped scalefactors */
650             deltaScf = 0;
651             scfSkipCounter--;
652           }
653         }
654         else {
655           deltaScf = lastValScf - scalefacGain[j];
656           lastValScf = scalefacGain[j];
657         }
658         sectionData->scalefacBits += FDKaacEnc_bitCountScalefactorDelta(deltaScf);
659       }
660     }
661   } /* for (i=0; i<sectionData->noOfSections; i++) */
662 }
663 
664 #ifdef PNS_PRECOUNT_ENABLE
665 /*
666   preCount bits used pns
667 */
668 /* estimate bits used by pns for correction of static bits */
669 /* no codebook switch estimation, see AAC LD FASTENC */
noisePreCount(const INT * noiseNrg,INT maxSfb)670 INT noisePreCount(const INT *noiseNrg, INT maxSfb)
671 {
672   INT   noisePCMFlag = TRUE;
673   INT   lastValPns = 0, deltaPns;
674   int   i, bits=0;
675 
676  for (i = 0; i < maxSfb; i++) {
677    if (noiseNrg[i] != NO_NOISE_PNS) {
678 
679      if (noisePCMFlag) {
680        bits+=PNS_PCM_BITS;
681        lastValPns   = noiseNrg[i];
682        noisePCMFlag = FALSE;
683      }else {
684        deltaPns     = noiseNrg[i]-lastValPns;
685        lastValPns   = noiseNrg[i];
686        bits+=FDKaacEnc_bitCountScalefactorDelta(deltaPns);
687      }
688    }
689  }
690  return ( bits );
691 }
692 #endif /* PNS_PRECOUNT_ENABLE */
693 
694 /* count bits used by pns */
FDKaacEnc_noiseCount(SECTION_DATA * const RESTRICT sectionData,const INT * const noiseNrg)695 static void FDKaacEnc_noiseCount(
696         SECTION_DATA* const RESTRICT sectionData,
697         const INT* const             noiseNrg
698         )
699 {
700   INT noisePCMFlag = TRUE;
701   INT lastValPns = 0, deltaPns;
702   int i, j;
703 
704   sectionData->noiseNrgBits = 0;
705 
706   for (i = 0; i < sectionData->noOfSections; i++) {
707     if (sectionData->huffsection[i].codeBook == CODE_BOOK_PNS_NO) {
708       int sfbStart = sectionData->huffsection[i].sfbStart;
709       int sfbEnd = sfbStart + sectionData->huffsection[i].sfbCnt;
710       for (j=sfbStart; j<sfbEnd; j++) {
711 
712         if (noisePCMFlag) {
713           sectionData->noiseNrgBits+=PNS_PCM_BITS;
714           lastValPns   = noiseNrg[j];
715           noisePCMFlag = FALSE;
716         } else {
717           deltaPns     = noiseNrg[j]-lastValPns;
718           lastValPns   = noiseNrg[j];
719           sectionData->noiseNrgBits+=FDKaacEnc_bitCountScalefactorDelta(deltaPns);
720         }
721       }
722     }
723   }
724 }
725 
FDKaacEnc_dynBitCount(BITCNTR_STATE * const hBC,const SHORT * const quantSpectrum,const UINT * const maxValueInSfb,const INT * const scalefac,const INT blockType,const INT sfbCnt,const INT maxSfbPerGroup,const INT sfbPerGroup,const INT * const sfbOffset,SECTION_DATA * const RESTRICT sectionData,const INT * const noiseNrg,const INT * const isBook,const INT * const isScale,const UINT syntaxFlags)726 INT FDKaacEnc_dynBitCount(
727         BITCNTR_STATE* const         hBC,
728         const SHORT* const           quantSpectrum,
729         const UINT* const            maxValueInSfb,
730         const INT* const             scalefac,
731         const INT                    blockType,
732         const INT                    sfbCnt,
733         const INT                    maxSfbPerGroup,
734         const INT                    sfbPerGroup,
735         const INT* const             sfbOffset,
736         SECTION_DATA* const RESTRICT sectionData,
737         const INT* const             noiseNrg,
738         const INT* const             isBook,
739         const INT* const             isScale,
740         const UINT                   syntaxFlags
741         )
742 {
743   sectionData->blockType      = blockType;
744   sectionData->sfbCnt         = sfbCnt;
745   sectionData->sfbPerGroup    = sfbPerGroup;
746   sectionData->noOfGroups     = sfbCnt / sfbPerGroup;
747   sectionData->maxSfbPerGroup = maxSfbPerGroup;
748 
749   FDKaacEnc_noiselessCounter(
750                    sectionData,
751                    hBC->mergeGainLookUp,
752                    (lookUpTable)hBC->bitLookUp,
753                    quantSpectrum,
754                    maxValueInSfb,
755                    sfbOffset,
756                    blockType,
757                    noiseNrg,
758                    isBook,
759                    (syntaxFlags & AC_ER_VCB11)?1:0);
760 
761   FDKaacEnc_scfCount(
762            scalefac,
763            maxValueInSfb,
764            sectionData,
765            isScale);
766 
767   FDKaacEnc_noiseCount(sectionData,
768              noiseNrg);
769 
770   return (sectionData->huffmanBits +
771           sectionData->sideInfoBits +
772           sectionData->scalefacBits +
773           sectionData->noiseNrgBits);
774 }
775 
FDKaacEnc_BCNew(BITCNTR_STATE ** phBC,UCHAR * dynamic_RAM)776 INT FDKaacEnc_BCNew(BITCNTR_STATE **phBC
777          ,UCHAR* dynamic_RAM
778          )
779 {
780   BITCNTR_STATE *hBC =  GetRam_aacEnc_BitCntrState();
781 
782   if (hBC)
783   {
784     *phBC = hBC;
785     hBC->bitLookUp       = GetRam_aacEnc_BitLookUp(0,dynamic_RAM);
786     hBC->mergeGainLookUp = GetRam_aacEnc_MergeGainLookUp(0,dynamic_RAM);
787     if (hBC->bitLookUp       == 0 ||
788         hBC->mergeGainLookUp == 0)
789     {
790       return 1;
791     }
792   }
793   return (hBC == 0) ? 1 : 0;
794 }
795 
FDKaacEnc_BCClose(BITCNTR_STATE ** phBC)796 void FDKaacEnc_BCClose(BITCNTR_STATE **phBC)
797 {
798   if (*phBC!=NULL) {
799 
800     FreeRam_aacEnc_BitCntrState(phBC);
801   }
802 }
803 
804 
805 
806