• 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: Quantizing & coding
88 
89 ******************************************************************************/
90 
91 #include "qc_main.h"
92 #include "quantize.h"
93 #include "interface.h"
94 #include "adj_thr.h"
95 #include "sf_estim.h"
96 #include "bit_cnt.h"
97 #include "dyn_bits.h"
98 #include "channel_map.h"
99 #include "aacEnc_ram.h"
100 
101 #include "genericStds.h"
102 
103 
104 typedef struct {
105   QCDATA_BR_MODE bitrateMode;
106   LONG vbrQualFactor;
107 } TAB_VBR_QUAL_FACTOR;
108 
109 static const TAB_VBR_QUAL_FACTOR tableVbrQualFactor[] = {
110   {QCDATA_BR_MODE_CBR,   FL2FXCONST_DBL(0.00f)},
111   {QCDATA_BR_MODE_VBR_1, FL2FXCONST_DBL(0.160f)}, /* 32 kbps mono   AAC-LC + SBR + PS */
112   {QCDATA_BR_MODE_VBR_2, FL2FXCONST_DBL(0.148f)}, /* 64 kbps stereo AAC-LC + SBR      */
113   {QCDATA_BR_MODE_VBR_3, FL2FXCONST_DBL(0.135f)}, /* 80 - 96 kbps stereo AAC-LC       */
114   {QCDATA_BR_MODE_VBR_4, FL2FXCONST_DBL(0.111f)}, /* 128 kbps stereo AAC-LC           */
115   {QCDATA_BR_MODE_VBR_5, FL2FXCONST_DBL(0.070f)}, /* 192 kbps stereo AAC-LC           */
116   {QCDATA_BR_MODE_SFR,   FL2FXCONST_DBL(0.00f)},
117   {QCDATA_BR_MODE_FF,    FL2FXCONST_DBL(0.00f)}
118 };
119 
isConstantBitrateMode(const QCDATA_BR_MODE bitrateMode)120 static INT isConstantBitrateMode(
121         const QCDATA_BR_MODE bitrateMode
122         )
123 {
124   return ( ((bitrateMode==QCDATA_BR_MODE_CBR) || (bitrateMode==QCDATA_BR_MODE_SFR) || (bitrateMode==QCDATA_BR_MODE_FF)) ? 1 : 0 );
125 }
126 
127 
128 
129 typedef enum{
130     FRAME_LEN_BYTES_MODULO =  1,
131     FRAME_LEN_BYTES_INT    =  2
132 }FRAME_LEN_RESULT_MODE;
133 
134 /* forward declarations */
135 
136 static INT FDKaacEnc_calcMaxValueInSfb(INT   sfbCnt,
137                              INT   maxSfbPerGroup,
138                              INT   sfbPerGroup,
139                              INT  *RESTRICT sfbOffset,
140                              SHORT *RESTRICT quantSpectrum,
141                              UINT *RESTRICT maxValue);
142 
143 static void FDKaacEnc_crashRecovery(INT               nChannels,
144                           PSY_OUT_ELEMENT*  psyOutElement,
145                           QC_OUT*           qcOut,
146                           QC_OUT_ELEMENT   *qcElement,
147                           INT               bitsToSave,
148                           AUDIO_OBJECT_TYPE aot,
149                           UINT              syntaxFlags,
150                           SCHAR             epConfig);
151 
152 static
153 AAC_ENCODER_ERROR FDKaacEnc_reduceBitConsumption(int*             iterations,
154                                        const int        maxIterations,
155                                        int              gainAdjustment,
156                                        int*             chConstraintsFulfilled,
157                                        int*             calculateQuant,
158                                        int              nChannels,
159                                        PSY_OUT_ELEMENT* psyOutElement,
160                                        QC_OUT*          qcOut,
161                                        QC_OUT_ELEMENT*  qcOutElement,
162                                        ELEMENT_BITS*    elBits,
163                                        AUDIO_OBJECT_TYPE  aot,
164                                        UINT             syntaxFlags,
165                                        SCHAR            epConfig);
166 
167 
168 void  FDKaacEnc_QCClose (QC_STATE  **phQCstate, QC_OUT **phQC);
169 
170 /*****************************************************************************
171 
172     functionname: FDKaacEnc_calcFrameLen
173     description:
174     returns:
175     input:
176     output:
177 
178 *****************************************************************************/
FDKaacEnc_calcFrameLen(INT bitRate,INT sampleRate,INT granuleLength,FRAME_LEN_RESULT_MODE mode)179 static INT FDKaacEnc_calcFrameLen(INT bitRate,
180                         INT sampleRate,
181                         INT granuleLength,
182                         FRAME_LEN_RESULT_MODE mode)
183 {
184 
185    INT result;
186 
187    result = ((granuleLength)>>3)*(bitRate);
188 
189    switch(mode) {
190      case FRAME_LEN_BYTES_MODULO:
191          result %= sampleRate;
192      break;
193      case FRAME_LEN_BYTES_INT:
194          result /= sampleRate;
195      break;
196    }
197    return(result);
198 }
199 
200 /*****************************************************************************
201 
202     functionname:FDKaacEnc_framePadding
203     description: Calculates if padding is needed for actual frame
204     returns:
205     input:
206     output:
207 
208 *****************************************************************************/
FDKaacEnc_framePadding(INT bitRate,INT sampleRate,INT granuleLength,INT * paddingRest)209 static INT FDKaacEnc_framePadding(INT bitRate,
210                         INT sampleRate,
211                         INT granuleLength,
212                         INT *paddingRest)
213 {
214   INT paddingOn;
215   INT difference;
216 
217   paddingOn = 0;
218 
219   difference = FDKaacEnc_calcFrameLen( bitRate,
220                              sampleRate,
221                              granuleLength,
222                              FRAME_LEN_BYTES_MODULO );
223   *paddingRest-=difference;
224 
225   if (*paddingRest <= 0 ) {
226     paddingOn = 1;
227     *paddingRest += sampleRate;
228   }
229 
230   return( paddingOn );
231 }
232 
233 
234 /*********************************************************************************
235 
236          functionname: FDKaacEnc_QCOutNew
237          description:
238          return:
239 
240 **********************************************************************************/
FDKaacEnc_QCOutNew(QC_OUT ** phQC,const INT nElements,const INT nChannels,const INT nSubFrames,UCHAR * dynamic_RAM)241 AAC_ENCODER_ERROR FDKaacEnc_QCOutNew(QC_OUT    **phQC,
242                                      const INT   nElements,
243                                      const INT   nChannels,
244                                      const INT   nSubFrames
245                                     ,UCHAR      *dynamic_RAM
246                                     )
247 {
248   AAC_ENCODER_ERROR ErrorStatus;
249   int n, i;
250   int elInc = 0, chInc = 0;
251 
252   for (n=0; n<nSubFrames; n++) {
253     phQC[n] = GetRam_aacEnc_QCout(n);
254     if (phQC[n] == NULL) {
255       ErrorStatus = AAC_ENC_NO_MEMORY;
256       goto QCOutNew_bail;
257     }
258 
259     for (i=0; i<nChannels; i++) {
260       phQC[n]->pQcOutChannels[i] = GetRam_aacEnc_QCchannel(chInc, dynamic_RAM);
261       if ( phQC[n]->pQcOutChannels[i] == NULL
262          )
263       {
264          ErrorStatus = AAC_ENC_NO_MEMORY;
265          goto QCOutNew_bail;
266       }
267       chInc++;
268     } /* nChannels */
269 
270     for (i=0; i<nElements; i++) {
271       phQC[n]->qcElement[i]      = GetRam_aacEnc_QCelement(elInc);
272       if (phQC[n]->qcElement[i] == NULL)
273       {
274         ErrorStatus = AAC_ENC_NO_MEMORY;
275         goto QCOutNew_bail;
276       }
277       elInc++;
278     } /* nElements */
279 
280   } /* nSubFrames */
281 
282 
283   return AAC_ENC_OK;
284 
285 QCOutNew_bail:
286   return ErrorStatus;
287 }
288 
289 /*********************************************************************************
290 
291          functionname: FDKaacEnc_QCOutInit
292          description:
293          return:
294 
295 **********************************************************************************/
FDKaacEnc_QCOutInit(QC_OUT * phQC[(1)],const INT nSubFrames,const CHANNEL_MAPPING * cm)296 AAC_ENCODER_ERROR FDKaacEnc_QCOutInit(QC_OUT          *phQC[(1)],
297                                       const INT        nSubFrames,
298                                       const CHANNEL_MAPPING *cm)
299 {
300   INT n,i,ch;
301 
302   for (n=0; n<nSubFrames; n++) {
303     INT chInc = 0;
304     for (i=0; i<cm->nElements; i++) {
305       for (ch=0; ch<cm->elInfo[i].nChannelsInEl; ch++) {
306         phQC[n]->qcElement[i]->qcOutChannel[ch] = phQC[n]->pQcOutChannels[chInc];
307         chInc++;
308       } /* chInEl */
309     } /* nElements */
310   } /* nSubFrames */
311 
312   return AAC_ENC_OK;
313 }
314 
315 /*********************************************************************************
316 
317          functionname: FDKaacEnc_QCNew
318          description:
319          return:
320 
321 **********************************************************************************/
FDKaacEnc_QCNew(QC_STATE ** phQC,INT nElements,UCHAR * dynamic_RAM)322 AAC_ENCODER_ERROR FDKaacEnc_QCNew(QC_STATE  **phQC,
323                                   INT         nElements
324                                  ,UCHAR*      dynamic_RAM
325            )
326 {
327   AAC_ENCODER_ERROR ErrorStatus;
328   int i;
329 
330   QC_STATE* hQC = GetRam_aacEnc_QCstate();
331   *phQC = hQC;
332   if (hQC == NULL) {
333     ErrorStatus = AAC_ENC_NO_MEMORY;
334     goto QCNew_bail;
335   }
336 
337   if (FDKaacEnc_AdjThrNew(&hQC->hAdjThr, nElements)) {
338     ErrorStatus = AAC_ENC_NO_MEMORY;
339     goto QCNew_bail;
340   }
341 
342   if (FDKaacEnc_BCNew(&(hQC->hBitCounter), dynamic_RAM)) {
343     ErrorStatus = AAC_ENC_NO_MEMORY;
344     goto QCNew_bail;
345   }
346 
347   for (i=0; i<nElements; i++) {
348     hQC->elementBits[i] = GetRam_aacEnc_ElementBits(i);
349     if (hQC->elementBits[i] == NULL) {
350       ErrorStatus = AAC_ENC_NO_MEMORY;
351       goto QCNew_bail;
352     }
353   }
354 
355   return AAC_ENC_OK;
356 
357 QCNew_bail:
358   FDKaacEnc_QCClose(phQC, NULL);
359   return ErrorStatus;
360 }
361 
362 /*********************************************************************************
363 
364          functionname: FDKaacEnc_QCInit
365          description:
366          return:
367 
368 **********************************************************************************/
FDKaacEnc_QCInit(QC_STATE * hQC,struct QC_INIT * init)369 AAC_ENCODER_ERROR FDKaacEnc_QCInit(QC_STATE *hQC,
370                                    struct QC_INIT *init)
371 {
372   hQC->maxBitsPerFrame = init->maxBits;
373   hQC->minBitsPerFrame = init->minBits;
374   hQC->nElements       = init->channelMapping->nElements;
375   hQC->bitResTotMax    = init->bitRes;
376   hQC->bitResTot       = init->bitRes;
377   hQC->maxBitFac       = init->maxBitFac;
378   hQC->bitrateMode     = init->bitrateMode;
379   hQC->invQuant        = init->invQuant;
380   hQC->maxIterations   = init->maxIterations;
381 
382   if ( isConstantBitrateMode(hQC->bitrateMode) ) {
383     INT bitresPerChannel = (hQC->bitResTotMax / init->channelMapping->nChannelsEff);
384     /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
385     hQC->bitDistributionMode = (bitresPerChannel>100) ? 0 : (bitresPerChannel>0) ? 1 : 2;
386   }
387   else {
388     hQC->bitDistributionMode = 0; /* full bitreservoir */
389   }
390 
391 
392   hQC->padding.paddingRest = init->padding.paddingRest;
393 
394   hQC->globHdrBits = init->staticBits; /* Bit overhead due to transport */
395 
396   FDKaacEnc_InitElementBits(hQC,
397                             init->channelMapping,
398                             init->bitrate,
399                             (init->averageBits/init->nSubFrames) - hQC->globHdrBits,
400                             hQC->maxBitsPerFrame/init->channelMapping->nChannelsEff);
401 
402   switch(hQC->bitrateMode){
403     case QCDATA_BR_MODE_CBR:
404     case QCDATA_BR_MODE_VBR_1:
405     case QCDATA_BR_MODE_VBR_2:
406     case QCDATA_BR_MODE_VBR_3:
407     case QCDATA_BR_MODE_VBR_4:
408     case QCDATA_BR_MODE_VBR_5:
409     case QCDATA_BR_MODE_SFR:
410     case QCDATA_BR_MODE_FF:
411       if((int)hQC->bitrateMode < (int)(sizeof(tableVbrQualFactor)/sizeof(TAB_VBR_QUAL_FACTOR))){
412         hQC->vbrQualFactor = (FIXP_DBL)tableVbrQualFactor[hQC->bitrateMode].vbrQualFactor;
413       } else {
414         hQC->vbrQualFactor = FL2FXCONST_DBL(0.f); /* default setting */
415       }
416       break;
417     case QCDATA_BR_MODE_INVALID:
418     default:
419       hQC->vbrQualFactor = FL2FXCONST_DBL(0.f);
420       break;
421   }
422 
423   FDKaacEnc_AdjThrInit(
424         hQC->hAdjThr,
425         init->meanPe,
426         hQC->elementBits,                 /* or channelBitrates, was: channelBitrate */
427         hQC->invQuant,
428         init->channelMapping->nElements,
429         init->channelMapping->nChannelsEff,
430         init->sampleRate,                 /* output sample rate */
431         init->advancedBitsToPe,           /* if set, calc bits2PE factor depending on samplerate */
432         hQC->vbrQualFactor
433         );
434 
435   return AAC_ENC_OK;
436 }
437 
438 
439 
440 /*********************************************************************************
441 
442          functionname: FDKaacEnc_QCMainPrepare
443          description:
444          return:
445 
446 **********************************************************************************/
FDKaacEnc_QCMainPrepare(ELEMENT_INFO * elInfo,ATS_ELEMENT * RESTRICT adjThrStateElement,PSY_OUT_ELEMENT * RESTRICT psyOutElement,QC_OUT_ELEMENT * RESTRICT qcOutElement,AUDIO_OBJECT_TYPE aot,UINT syntaxFlags,SCHAR epConfig)447 AAC_ENCODER_ERROR FDKaacEnc_QCMainPrepare(ELEMENT_INFO              *elInfo,
448                                           ATS_ELEMENT* RESTRICT      adjThrStateElement,
449                                           PSY_OUT_ELEMENT* RESTRICT  psyOutElement,
450                                           QC_OUT_ELEMENT* RESTRICT   qcOutElement,
451                                           AUDIO_OBJECT_TYPE          aot,
452                                           UINT                       syntaxFlags,
453                                           SCHAR                      epConfig
454                                          )
455 {
456   AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK;
457   INT  nChannels = elInfo->nChannelsInEl;
458 
459   PSY_OUT_CHANNEL** RESTRICT psyOutChannel = psyOutElement->psyOutChannel;    /* may be modified in-place */
460 
461   FDKaacEnc_CalcFormFactor(qcOutElement->qcOutChannel, psyOutChannel, nChannels);
462 
463   /* prepare and calculate PE without reduction */
464   FDKaacEnc_peCalculation(&qcOutElement->peData, psyOutChannel, qcOutElement->qcOutChannel, &psyOutElement->toolsInfo, adjThrStateElement, nChannels);
465 
466   ErrorStatus = FDKaacEnc_ChannelElementWrite( NULL, elInfo, NULL,
467                                                psyOutElement,
468                                                psyOutElement->psyOutChannel,
469                                                syntaxFlags,
470                                                aot,
471                                                epConfig,
472                                               &qcOutElement->staticBitsUsed,
473                                                0 );
474 
475   return ErrorStatus;
476 }
477 
478 /*********************************************************************************
479 
480          functionname: FDKaacEnc_AdjustBitrate
481          description:  adjusts framelength via padding on a frame to frame basis,
482                        to achieve a bitrate that demands a non byte aligned
483                        framelength
484          return:       errorcode
485 
486 **********************************************************************************/
FDKaacEnc_AdjustBitrate(QC_STATE * RESTRICT hQC,CHANNEL_MAPPING * RESTRICT cm,INT * avgTotalBits,INT bitRate,INT sampleRate,INT granuleLength)487 AAC_ENCODER_ERROR FDKaacEnc_AdjustBitrate(QC_STATE        *RESTRICT hQC,
488                                           CHANNEL_MAPPING *RESTRICT cm,
489                                           INT             *avgTotalBits,
490                                           INT              bitRate,       /* total bitrate */
491                                           INT              sampleRate,    /* output sampling rate */
492                                           INT              granuleLength) /* frame length */
493 {
494   INT paddingOn;
495   INT frameLen;
496 
497   /* Do we need an extra padding byte? */
498   paddingOn = FDKaacEnc_framePadding(bitRate,
499                            sampleRate,
500                            granuleLength,
501                           &hQC->padding.paddingRest);
502 
503   frameLen = paddingOn + FDKaacEnc_calcFrameLen(bitRate,
504                                       sampleRate,
505                                       granuleLength,
506                                       FRAME_LEN_BYTES_INT);
507 
508   *avgTotalBits = frameLen<<3;
509 
510   return AAC_ENC_OK;
511 }
512 
FDKaacEnc_distributeElementDynBits(QC_STATE * hQC,QC_OUT_ELEMENT * qcElement[(8)],CHANNEL_MAPPING * cm,INT codeBits)513 static AAC_ENCODER_ERROR FDKaacEnc_distributeElementDynBits(QC_STATE*         hQC,
514                                                   QC_OUT_ELEMENT*   qcElement[(8)],
515                                                   CHANNEL_MAPPING*  cm,
516                                                   INT               codeBits)
517 {
518 
519   INT i, firstEl = cm->nElements-1;
520   INT totalBits = 0;
521 
522   for (i=(cm->nElements-1); i>=0; i--) {
523     if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) ||
524         (cm->elInfo[i].elType == ID_LFE))
525     {
526       qcElement[i]->grantedDynBits =  (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)codeBits);
527       totalBits += qcElement[i]->grantedDynBits;
528       firstEl = i;
529     }
530   }
531   qcElement[firstEl]->grantedDynBits += codeBits - totalBits;
532 
533   return AAC_ENC_OK;
534 }
535 
536 /**
537  * \brief  Verify whether minBitsPerFrame criterion can be satisfied.
538  *
539  * This function evaluates the bit consumption only if minBitsPerFrame parameter is not 0.
540  * In hyperframing mode the difference between grantedDynBits and usedDynBits of all sub frames
541  * results the number of fillbits to be written.
542  * This bits can be distrubitued in superframe to reach minBitsPerFrame bit consumption in single AU's.
543  * The return value denotes if enough desired fill bits are available to achieve minBitsPerFrame in all frames.
544  * This check can only be used within superframes.
545  *
546  * \param qcOut            Pointer to coding data struct.
547  * \param minBitsPerFrame  Minimal number of bits to be consumed in each frame.
548  * \param nSubFrames       Number of frames in superframe
549  *
550  * \return
551  *          - 1: all fine
552  *          - 0: criterion not fulfilled
553  */
checkMinFrameBitsDemand(QC_OUT ** qcOut,const INT minBitsPerFrame,const INT nSubFrames)554 static int checkMinFrameBitsDemand(
555         QC_OUT**                  qcOut,
556         const INT                 minBitsPerFrame,
557         const INT                 nSubFrames
558         )
559 {
560   int result = 1; /* all fine*/
561   return result;
562 }
563 
564 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
565 
566 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
567 /*********************************************************************************
568 
569          functionname: FDKaacEnc_getMinimalStaticBitdemand
570          description:  calculate minmal size of static bits by reduction ,
571                        to zero spectrum and deactivating tns and MS
572          return:       number of static bits
573 
574 **********************************************************************************/
FDKaacEnc_getMinimalStaticBitdemand(CHANNEL_MAPPING * cm,PSY_OUT ** psyOut)575 static int FDKaacEnc_getMinimalStaticBitdemand(CHANNEL_MAPPING*     cm,
576                                                PSY_OUT**            psyOut)
577 {
578   AUDIO_OBJECT_TYPE aot = AOT_AAC_LC;
579   UINT  syntaxFlags = 0;
580   SCHAR epConfig = -1;
581   int i, bitcount = 0;
582 
583   for (i=0; i<cm->nElements; i++) {
584       ELEMENT_INFO elInfo = cm->elInfo[i];
585 
586       if ( (elInfo.elType == ID_SCE)
587         || (elInfo.elType == ID_CPE)
588         || (elInfo.elType == ID_LFE) )
589       {
590         INT minElBits = 0;
591 
592         FDKaacEnc_ChannelElementWrite( NULL, &elInfo, NULL,
593                                        psyOut[0]->psyOutElement[i],
594                                        psyOut[0]->psyOutElement[i]->psyOutChannel,
595                                        syntaxFlags,
596                                        aot,
597                                        epConfig,
598                                       &minElBits,
599                                        1 );
600         bitcount += minElBits;
601       }
602   }
603 
604   return bitcount;
605 }
606 
607 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
608 
FDKaacEnc_prepareBitDistribution(QC_STATE * hQC,PSY_OUT ** psyOut,QC_OUT ** qcOut,CHANNEL_MAPPING * cm,QC_OUT_ELEMENT * qcElement[(1)][(8)],INT avgTotalBits,INT * totalAvailableBits,INT * avgTotalDynBits)609 static AAC_ENCODER_ERROR FDKaacEnc_prepareBitDistribution(QC_STATE*            hQC,
610                                                 PSY_OUT**            psyOut,
611                                                 QC_OUT**             qcOut,
612                                                 CHANNEL_MAPPING*     cm,
613                                                 QC_OUT_ELEMENT*      qcElement[(1)][(8)],
614                                                 INT                  avgTotalBits,
615                                                 INT                 *totalAvailableBits,
616                                                 INT                 *avgTotalDynBits)
617 {
618     int i;
619       /* get maximal allowed dynamic bits */
620       qcOut[0]->grantedDynBits =  (fixMin(hQC->maxBitsPerFrame, avgTotalBits) - hQC->globHdrBits)&~7;
621       qcOut[0]->grantedDynBits -= (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits);
622       qcOut[0]->maxDynBits = ((hQC->maxBitsPerFrame)&~7) - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits);
623       /* assure that enough bits are available */
624       if ((qcOut[0]->grantedDynBits+hQC->bitResTot) < 0) {
625         /* crash recovery allows to reduce static bits to a minimum */
626         if ( (qcOut[0]->grantedDynBits+hQC->bitResTot) < (FDKaacEnc_getMinimalStaticBitdemand(cm, psyOut)-qcOut[0]->staticBits) )
627           return AAC_ENC_BITRES_TOO_LOW;
628       }
629 
630       /* distribute dynamic bits to each element */
631       FDKaacEnc_distributeElementDynBits(hQC,
632                                qcElement[0],
633                                cm,
634                                qcOut[0]->grantedDynBits);
635 
636       *avgTotalDynBits = 0; /*frameDynBits;*/
637 
638     *totalAvailableBits = avgTotalBits;
639 
640     /* sum up corrected granted PE */
641     qcOut[0]->totalGrantedPeCorr = 0;
642 
643     for (i=0; i<cm->nElements; i++)
644     {
645         ELEMENT_INFO elInfo = cm->elInfo[i];
646         int nChannels = elInfo.nChannelsInEl;
647 
648         if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
649             (elInfo.elType == ID_LFE))
650         {
651                 /* for ( all sub frames ) ... */
652                 FDKaacEnc_DistributeBits(hQC->hAdjThr,
653                                          hQC->hAdjThr->adjThrStateElem[i],
654                                          psyOut[0]->psyOutElement[i]->psyOutChannel,
655                                         &qcElement[0][i]->peData,
656                                         &qcElement[0][i]->grantedPe,
657                                         &qcElement[0][i]->grantedPeCorr,
658                                          nChannels,
659                                          psyOut[0]->psyOutElement[i]->commonWindow,
660                                          qcElement[0][i]->grantedDynBits,
661                                          hQC->elementBits[i]->bitResLevelEl,
662                                          hQC->elementBits[i]->maxBitResBitsEl,
663                                          hQC->maxBitFac,
664                                          hQC->bitDistributionMode);
665 
666                 *totalAvailableBits += hQC->elementBits[i]->bitResLevelEl;
667         /* get total corrected granted PE */
668         qcOut[0]->totalGrantedPeCorr += qcElement[0][i]->grantedPeCorr;
669         }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
670 
671     }  /* -end- element loop */
672 
673     *totalAvailableBits = FDKmin(hQC->maxBitsPerFrame, (*totalAvailableBits));
674 
675     return AAC_ENC_OK;
676 }
677 
678 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FDKaacEnc_updateUsedDynBits(INT * sumDynBitsConsumed,QC_OUT_ELEMENT * qcElement[(8)],CHANNEL_MAPPING * cm)679 static AAC_ENCODER_ERROR FDKaacEnc_updateUsedDynBits(INT*               sumDynBitsConsumed,
680                                             QC_OUT_ELEMENT*    qcElement[(8)],
681                                             CHANNEL_MAPPING*   cm)
682 {
683   INT i;
684 
685   *sumDynBitsConsumed = 0;
686 
687   for (i=0; i<cm->nElements; i++)
688   {
689       ELEMENT_INFO elInfo = cm->elInfo[i];
690 
691       if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
692           (elInfo.elType == ID_LFE))
693       {
694           /* sum up bits consumed */
695           *sumDynBitsConsumed  += qcElement[i]->dynBitsUsed;
696       }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
697 
698   }  /* -end- element loop */
699 
700   return AAC_ENC_OK;
701 }
702 
703 
FDKaacEnc_getTotalConsumedDynBits(QC_OUT ** qcOut,INT nSubFrames)704 static INT FDKaacEnc_getTotalConsumedDynBits(QC_OUT** qcOut,
705                                    INT nSubFrames)
706 {
707     INT c, totalBits=0;
708 
709     /* sum up bit consumption for all sub frames */
710     for (c=0; c<nSubFrames; c++)
711     {
712         /* bit consumption not valid if dynamic bits
713            not available in one sub frame */
714         if (qcOut[c]->usedDynBits==-1) return -1;
715         totalBits += qcOut[c]->usedDynBits;
716     }
717 
718     return totalBits;
719 
720 }
721 
FDKaacEnc_getTotalConsumedBits(QC_OUT ** qcOut,QC_OUT_ELEMENT * qcElement[(1)][(8)],CHANNEL_MAPPING * cm,INT globHdrBits,INT nSubFrames)722 static INT FDKaacEnc_getTotalConsumedBits(QC_OUT**          qcOut,
723                                 QC_OUT_ELEMENT*   qcElement[(1)][(8)],
724                                 CHANNEL_MAPPING*  cm,
725                                 INT               globHdrBits,
726                                 INT               nSubFrames)
727 {
728     int c, i;
729     int totalUsedBits = 0;
730 
731     for (c = 0 ; c < nSubFrames ; c++ )
732     {
733         int dataBits = 0;
734         for (i=0; i<cm->nElements; i++)
735         {
736             if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) ||
737                 (cm->elInfo[i].elType == ID_LFE))
738             {
739                    dataBits += qcElement[c][i]->dynBitsUsed + qcElement[c][i]->staticBitsUsed + qcElement[c][i]->extBitsUsed;
740             }
741         }
742         dataBits += qcOut[c]->globalExtBits;
743 
744         totalUsedBits += (8 - (dataBits) % 8) % 8;
745         totalUsedBits += dataBits + globHdrBits;  /* header bits for every frame */
746     }
747     return totalUsedBits;
748 }
749 
FDKaacEnc_BitResRedistribution(QC_STATE * const hQC,const CHANNEL_MAPPING * const cm,const INT avgTotalBits)750 static AAC_ENCODER_ERROR FDKaacEnc_BitResRedistribution(
751         QC_STATE *const              hQC,
752         const CHANNEL_MAPPING *const cm,
753         const INT                    avgTotalBits
754         )
755 {
756     /* check bitreservoir fill level */
757     if (hQC->bitResTot < 0) {
758       return AAC_ENC_BITRES_TOO_LOW;
759     }
760     else if (hQC->bitResTot > hQC->bitResTotMax) {
761       return AAC_ENC_BITRES_TOO_HIGH;
762     }
763     else {
764       INT i, firstEl = cm->nElements-1;
765       INT totalBits = 0, totalBits_max = 0;
766 
767       int totalBitreservoir    = FDKmin(hQC->bitResTot, (hQC->maxBitsPerFrame-avgTotalBits));
768       int totalBitreservoirMax = FDKmin(hQC->bitResTotMax, (hQC->maxBitsPerFrame-avgTotalBits));
769 
770       int sc_bitResTot = CountLeadingBits(totalBitreservoir);
771       int sc_bitResTotMax = CountLeadingBits(totalBitreservoirMax);
772 
773       for (i=(cm->nElements-1); i>=0; i--) {
774         if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) ||
775             (cm->elInfo[i].elType == ID_LFE))
776         {
777           hQC->elementBits[i]->bitResLevelEl = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)(totalBitreservoir<<sc_bitResTot))>>sc_bitResTot;
778           totalBits += hQC->elementBits[i]->bitResLevelEl;
779 
780           hQC->elementBits[i]->maxBitResBitsEl = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)(totalBitreservoirMax<<sc_bitResTotMax))>>sc_bitResTotMax;
781           totalBits_max += hQC->elementBits[i]->maxBitResBitsEl;
782 
783           firstEl = i;
784         }
785       }
786       hQC->elementBits[firstEl]->bitResLevelEl   += totalBitreservoir - totalBits;
787       hQC->elementBits[firstEl]->maxBitResBitsEl += totalBitreservoirMax - totalBits_max;
788     }
789 
790     return AAC_ENC_OK;
791 }
792 
793 
FDKaacEnc_QCMain(QC_STATE * RESTRICT hQC,PSY_OUT ** psyOut,QC_OUT ** qcOut,INT avgTotalBits,CHANNEL_MAPPING * cm,AUDIO_OBJECT_TYPE aot,UINT syntaxFlags,SCHAR epConfig)794 AAC_ENCODER_ERROR FDKaacEnc_QCMain(QC_STATE* RESTRICT         hQC,
795                                    PSY_OUT**                  psyOut,
796                                    QC_OUT**                   qcOut,
797                                    INT                        avgTotalBits,
798                                    CHANNEL_MAPPING*           cm
799                                   ,AUDIO_OBJECT_TYPE          aot,
800                                    UINT                       syntaxFlags,
801                                    SCHAR                      epConfig
802                                   )
803 {
804   int i, c;
805   AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK;
806   INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */
807   INT totalAvailableBits = 0;
808   INT nSubFrames = 1;
809 
810   /*-------------------------------------------- */
811   /* redistribute total bitreservoir to elements */
812   ErrorStatus = FDKaacEnc_BitResRedistribution(hQC, cm, avgTotalBits);
813   if (ErrorStatus != AAC_ENC_OK) {
814     return ErrorStatus;
815   }
816 
817   /*-------------------------------------------- */
818   /* fastenc needs one time threshold simulation,
819      in case of multiple frames, one more guess has to be calculated */
820 
821       /*-------------------------------------------- */
822       /* helper pointer */
823       QC_OUT_ELEMENT*  qcElement[(1)][(8)];
824 
825       /* work on a copy of qcChannel and qcElement */
826       for (i=0; i<cm->nElements; i++)
827       {
828           ELEMENT_INFO elInfo = cm->elInfo[i];
829 
830           if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
831               (elInfo.elType == ID_LFE))
832           {
833               /* for ( all sub frames ) ... */
834               for (c = 0 ; c < nSubFrames ; c++ )
835               {
836                   {
837                       qcElement[c][i] = qcOut[c]->qcElement[i];
838                   }
839               }
840           }
841       }
842 
843       /*-------------------------------------------- */
844       /*-------------------------------------------- */
845       if ( isConstantBitrateMode(hQC->bitrateMode) )
846       {
847           /* calc granted dynamic bits for sub frame and
848              distribute it to each element */
849           ErrorStatus = FDKaacEnc_prepareBitDistribution(
850                                  hQC,
851                                  psyOut,
852                                  qcOut,
853                                  cm,
854                                  qcElement,
855                                  avgTotalBits,
856                                 &totalAvailableBits,
857                                 &avgTotalDynBits);
858 
859           if (ErrorStatus != AAC_ENC_OK) {
860             return ErrorStatus;
861           }
862       }
863       else {
864           qcOut[0]->grantedDynBits = ((hQC->maxBitsPerFrame - (hQC->globHdrBits))&~7)
865                                    - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits);
866           qcOut[0]->maxDynBits     = qcOut[0]->grantedDynBits;
867 
868           totalAvailableBits = hQC->maxBitsPerFrame;
869           avgTotalDynBits = 0;
870       }
871 
872 #ifdef PNS_PRECOUNT_ENABLE
873       /* Calculate estimated pns bits and substract them from grantedDynBits to get a more accurate number of available bits. */
874       if (syntaxFlags & (AC_LD|AC_ELD))
875       {
876         int estimatedPnsBits = 0, ch;
877 
878         for (ch=0; ch<cm->nChannels; ch++) {
879           qcOut[0]->pQcOutChannels[ch]->sectionData.noiseNrgBits = noisePreCount(psyOut[0]->pPsyOutChannels[ch]->noiseNrg, psyOut[0]->pPsyOutChannels[ch]->maxSfbPerGroup);
880           estimatedPnsBits += qcOut[0]->pQcOutChannels[ch]->sectionData.noiseNrgBits;
881         }
882         qcOut[0]->grantedDynBits -= estimatedPnsBits;
883       }
884 #endif
885 
886       /* for ( all sub frames ) ... */
887       for (c = 0 ; c < nSubFrames ; c++ )
888       {
889           /* for CBR and VBR mode */
890           FDKaacEnc_AdjustThresholds(hQC->hAdjThr->adjThrStateElem,
891                                      qcElement[c],
892                                      qcOut[c],
893                                      psyOut[c]->psyOutElement,
894                                      isConstantBitrateMode(hQC->bitrateMode),
895                                      cm);
896 
897       } /* -end- sub frame counter */
898 
899       /*-------------------------------------------- */
900       INT iterations[(1)][(8)];
901       INT chConstraintsFulfilled[(1)][(8)][(2)];
902       INT calculateQuant[(1)][(8)][(2)];
903       INT constraintsFulfilled[(1)][(8)];
904       /*-------------------------------------------- */
905 
906 
907       /* for ( all sub frames ) ... */
908       for (c = 0 ; c < nSubFrames ; c++ )
909       {
910           for (i=0; i<cm->nElements; i++)
911           {
912               ELEMENT_INFO elInfo = cm->elInfo[i];
913               INT ch, nChannels = elInfo.nChannelsInEl;
914 
915               if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
916                   (elInfo.elType == ID_LFE))
917               {
918                       /* Turn thresholds into scalefactors, optimize bit consumption and verify conformance */
919                       FDKaacEnc_EstimateScaleFactors(psyOut[c]->psyOutElement[i]->psyOutChannel,
920                                             qcElement[c][i]->qcOutChannel,
921                                             hQC->invQuant,
922                                             cm->elInfo[i].nChannelsInEl);
923 
924 
925                       /*-------------------------------------------- */
926                       constraintsFulfilled[c][i] = 1;
927                       iterations[c][i] = 0 ;
928 
929                       for (ch = 0; ch < nChannels; ch++)
930                       {
931                           chConstraintsFulfilled[c][i][ch] = 1;
932                           calculateQuant[c][i][ch] = 1;
933                       }
934 
935                       /*-------------------------------------------- */
936 
937               }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
938 
939           }  /* -end- element loop */
940 
941           qcOut[c]->usedDynBits = -1;
942 
943       } /* -end- sub frame counter */
944 
945 
946 
947       INT quantizationDone = 0;
948       INT sumDynBitsConsumedTotal  = 0;
949       INT decreaseBitConsumption = -1; /* no direction yet! */
950 
951       /*-------------------------------------------- */
952       /* -start- Quantization loop ...               */
953       /*-------------------------------------------- */
954       do /* until max allowed bits per frame and maxDynBits!=-1*/
955       {
956           quantizationDone = 0;
957 
958               c = 0;              /* get frame to process */
959 
960               for (i=0; i<cm->nElements; i++)
961               {
962                   ELEMENT_INFO elInfo = cm->elInfo[i];
963                   INT ch, nChannels = elInfo.nChannelsInEl;
964 
965                   if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
966                       (elInfo.elType == ID_LFE))
967                   {
968                       do /* until spectral values < MAX_QUANT */
969                       {
970                           /*-------------------------------------------- */
971                           if (!constraintsFulfilled[c][i])
972                           {
973                               FDKaacEnc_reduceBitConsumption(&iterations[c][i],
974                                                     hQC->maxIterations,
975                                                     (decreaseBitConsumption) ? 1 : -1,
976                                                     chConstraintsFulfilled[c][i],
977                                                     calculateQuant[c][i],
978                                                     nChannels,
979                                                     psyOut[c]->psyOutElement[i],
980                                                     qcOut[c],
981                                                     qcElement[c][i],
982                                                     hQC->elementBits[i],
983                                                     aot,
984                                                     syntaxFlags,
985                                                     epConfig);
986                           }
987 
988                           /*-------------------------------------------- */
989                           /*-------------------------------------------- */
990                           constraintsFulfilled[c][i] = 1 ;
991 
992                           /*-------------------------------------------- */
993                           /* quantize spectrum (per each channel) */
994                           for (ch = 0; ch < nChannels; ch++)
995                           {
996                               /*-------------------------------------------- */
997                               chConstraintsFulfilled[c][i][ch] = 1;
998 
999                               /*-------------------------------------------- */
1000 
1001                               if (calculateQuant[c][i][ch])
1002                               {
1003                                   QC_OUT_CHANNEL* qcOutCh = qcElement[c][i]->qcOutChannel[ch];
1004                                   PSY_OUT_CHANNEL* psyOutCh = psyOut[c]->psyOutElement[i]->psyOutChannel[ch];
1005 
1006                                   calculateQuant[c][i][ch] = 0; /* calculate quantization only if necessary */
1007 
1008                                   /*-------------------------------------------- */
1009                                   FDKaacEnc_QuantizeSpectrum(psyOutCh->sfbCnt,
1010                                                              psyOutCh->maxSfbPerGroup,
1011                                                              psyOutCh->sfbPerGroup,
1012                                                              psyOutCh->sfbOffsets,
1013                                                              qcOutCh->mdctSpectrum,
1014                                                              qcOutCh->globalGain,
1015                                                              qcOutCh->scf,
1016                                                              qcOutCh->quantSpec) ;
1017 
1018                                   /*-------------------------------------------- */
1019                                   if (FDKaacEnc_calcMaxValueInSfb(psyOutCh->sfbCnt,
1020                                                         psyOutCh->maxSfbPerGroup,
1021                                                         psyOutCh->sfbPerGroup,
1022                                                         psyOutCh->sfbOffsets,
1023                                                         qcOutCh->quantSpec,
1024                                                         qcOutCh->maxValueInSfb) > MAX_QUANT)
1025                                   {
1026                                     chConstraintsFulfilled[c][i][ch] = 0;
1027                                     constraintsFulfilled[c][i] = 0 ;
1028                                     /* if quanizted value out of range; increase global gain! */
1029                                     decreaseBitConsumption = 1;
1030                                   }
1031 
1032                                   /*-------------------------------------------- */
1033 
1034                               } /* if calculateQuant[c][i][ch] */
1035 
1036                           } /* channel loop */
1037 
1038                           /*-------------------------------------------- */
1039                           /* quantize spectrum (per each channel) */
1040 
1041                           /*-------------------------------------------- */
1042 
1043                       } while (!constraintsFulfilled[c][i]) ; /* does not regard bit consumption */
1044 
1045 
1046                       /*-------------------------------------------- */
1047                       /*-------------------------------------------- */
1048                       qcElement[c][i]->dynBitsUsed = 0 ; /* reset dynamic bits */
1049 
1050                       /* quantization valid in current channel! */
1051                       for (ch = 0; ch < nChannels; ch++)
1052                       {
1053                           QC_OUT_CHANNEL* qcOutCh = qcElement[c][i]->qcOutChannel[ch];
1054                           PSY_OUT_CHANNEL *psyOutCh = psyOut[c]->psyOutElement[i]->psyOutChannel[ch];
1055 
1056                           /* count dynamic bits */
1057                           INT chDynBits = FDKaacEnc_dynBitCount(hQC->hBitCounter,
1058                                                                 qcOutCh->quantSpec,
1059                                                                 qcOutCh->maxValueInSfb,
1060                                                                 qcOutCh->scf,
1061                                                                 psyOutCh->lastWindowSequence,
1062                                                                 psyOutCh->sfbCnt,
1063                                                                 psyOutCh->maxSfbPerGroup,
1064                                                                 psyOutCh->sfbPerGroup,
1065                                                                 psyOutCh->sfbOffsets,
1066                                                                 &qcOutCh->sectionData,
1067                                                                 psyOutCh->noiseNrg,
1068                                                                 psyOutCh->isBook,
1069                                                                 psyOutCh->isScale,
1070                                                                 syntaxFlags) ;
1071 
1072                           /* sum up dynamic channel bits */
1073                           qcElement[c][i]->dynBitsUsed += chDynBits;
1074                       }
1075 
1076                       /* save dynBitsUsed for correction of bits2pe relation */
1077                       if(hQC->hAdjThr->adjThrStateElem[i]->dynBitsLast==-1) {
1078                           hQC->hAdjThr->adjThrStateElem[i]->dynBitsLast = qcElement[c][i]->dynBitsUsed;
1079                       }
1080                   }  /*  -end- if(ID_SCE || ID_CPE || ID_LFE) */
1081 
1082               }  /* -end- element loop */
1083 
1084               /* update dynBits of current subFrame */
1085               FDKaacEnc_updateUsedDynBits(&qcOut[c]->usedDynBits,
1086                                  qcElement[c],
1087                                  cm);
1088 
1089               /* get total consumed bits, dyn bits in all sub frames have to be valid */
1090               sumDynBitsConsumedTotal = FDKaacEnc_getTotalConsumedDynBits(qcOut, nSubFrames);
1091 
1092               if (sumDynBitsConsumedTotal==-1)
1093               {
1094                   quantizationDone = 0; /* bit consumption not valid in all sub frames */
1095               }
1096               else
1097               {
1098                 int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames);
1099 
1100                 /* in all frames are valid dynamic bits */
1101                 if ( ((sumBitsConsumedTotal < totalAvailableBits) || qcOut[c]->usedDynBits==0) && (decreaseBitConsumption==1) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)
1102                       /*()*/  )
1103                 {
1104                     quantizationDone = 1; /* exit bit adjustment */
1105                 }
1106                 if (sumBitsConsumedTotal > totalAvailableBits && (decreaseBitConsumption==0) )
1107 //                      /*()*/  )
1108                 {
1109                     quantizationDone = 0; /* reset! */
1110                     break;
1111                 }
1112               }
1113 
1114 
1115           /*-------------------------------------------- */
1116 
1117               int emergencyIterations = 1;
1118               int dynBitsOvershoot    = 0;
1119 
1120               for (c = 0 ; c < nSubFrames ; c++ )
1121               {
1122                   for (i=0; i<cm->nElements; i++)
1123                   {
1124                       ELEMENT_INFO elInfo = cm->elInfo[i];
1125 
1126                       if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) ||
1127                           (elInfo.elType == ID_LFE))
1128                       {
1129                         /* iteration limitation */
1130                         emergencyIterations &= ((iterations[c][i] < hQC->maxIterations) ? 0 : 1);
1131                       }
1132                   }
1133                   /* detection if used dyn bits exceeds the maximal allowed criterion */
1134                   dynBitsOvershoot |= ((qcOut[c]->usedDynBits > qcOut[c]->maxDynBits) ? 1 : 0);
1135               }
1136 
1137               if (quantizationDone==0 || dynBitsOvershoot)
1138               {
1139 
1140                   int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames);
1141 
1142                   if ( (sumDynBitsConsumedTotal >= avgTotalDynBits) || (sumDynBitsConsumedTotal==0) ) {
1143                       quantizationDone = 1;
1144                   }
1145                   if (emergencyIterations && (sumBitsConsumedTotal < totalAvailableBits)) {
1146                       quantizationDone = 1;
1147                   }
1148                   if ((sumBitsConsumedTotal > totalAvailableBits) || !checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)) {
1149                       quantizationDone = 0;
1150                   }
1151                   if ((sumBitsConsumedTotal < totalAvailableBits) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)) {
1152                       decreaseBitConsumption = 0;
1153                   }
1154                   else {
1155                       decreaseBitConsumption = 1;
1156                   }
1157 
1158                   if (dynBitsOvershoot) {
1159                      quantizationDone = 0;
1160                      decreaseBitConsumption = 1;
1161                   }
1162 
1163                   /* reset constraints fullfilled flags */
1164                   FDKmemclear(constraintsFulfilled, sizeof(constraintsFulfilled));
1165                   FDKmemclear(chConstraintsFulfilled, sizeof(chConstraintsFulfilled));
1166 
1167 
1168               }/* quantizationDone */
1169 
1170       } while (!quantizationDone) ;
1171 
1172       /*-------------------------------------------- */
1173       /* ... -end- Quantization loop                 */
1174       /*-------------------------------------------- */
1175 
1176   /*-------------------------------------------- */
1177   /*-------------------------------------------- */
1178 
1179   return AAC_ENC_OK;
1180 }
1181 
1182 
FDKaacEnc_reduceBitConsumption(int * iterations,const int maxIterations,int gainAdjustment,int * chConstraintsFulfilled,int * calculateQuant,int nChannels,PSY_OUT_ELEMENT * psyOutElement,QC_OUT * qcOut,QC_OUT_ELEMENT * qcOutElement,ELEMENT_BITS * elBits,AUDIO_OBJECT_TYPE aot,UINT syntaxFlags,SCHAR epConfig)1183 static AAC_ENCODER_ERROR FDKaacEnc_reduceBitConsumption(int*             iterations,
1184                                               const int        maxIterations,
1185                                               int              gainAdjustment,
1186                                               int*             chConstraintsFulfilled,
1187                                               int*             calculateQuant,
1188                                               int              nChannels,
1189                                               PSY_OUT_ELEMENT* psyOutElement,
1190                                               QC_OUT*          qcOut,
1191                                               QC_OUT_ELEMENT*  qcOutElement,
1192                                               ELEMENT_BITS*    elBits,
1193                                               AUDIO_OBJECT_TYPE aot,
1194                                               UINT             syntaxFlags,
1195                                               SCHAR            epConfig)
1196 {
1197   int ch;
1198 
1199   /** SOLVING PROBLEM **/
1200   if ((*iterations)++ >= maxIterations)
1201   {
1202     if (qcOutElement->dynBitsUsed==0) {
1203     }
1204     /* crash recovery */
1205     else {
1206       INT bitsToSave = 0;
1207       if ( (bitsToSave = fixMax((qcOutElement->dynBitsUsed + 8) - (elBits->bitResLevelEl + qcOutElement->grantedDynBits),
1208                                 (qcOutElement->dynBitsUsed + qcOutElement->staticBitsUsed + 8) - (elBits->maxBitsEl))) > 0 )
1209       {
1210         FDKaacEnc_crashRecovery(nChannels,
1211                       psyOutElement,
1212                       qcOut,
1213                       qcOutElement,
1214                       bitsToSave,
1215                       aot,
1216                       syntaxFlags,
1217                       epConfig) ;
1218     }
1219     else
1220     {
1221       for (ch = 0; ch < nChannels; ch++)
1222       {
1223           qcOutElement->qcOutChannel[ch]->globalGain += 1;
1224       }
1225     }
1226     for (ch = 0; ch < nChannels; ch++)
1227     {
1228       calculateQuant[ch] = 1;
1229     }
1230   }
1231   }
1232   else /* iterations >= maxIterations */
1233   {
1234     /* increase gain (+ next iteration) */
1235     for (ch = 0; ch < nChannels; ch++)
1236     {
1237       if(!chConstraintsFulfilled[ch])
1238       {
1239           qcOutElement->qcOutChannel[ch]->globalGain += gainAdjustment ;
1240           calculateQuant[ch] = 1; /* global gain has changed, recalculate quantization in next iteration! */
1241       }
1242     }
1243   }
1244 
1245   return AAC_ENC_OK;
1246 }
1247 
FDKaacEnc_updateFillBits(CHANNEL_MAPPING * cm,QC_STATE * qcKernel,ELEMENT_BITS * RESTRICT elBits[(8)],QC_OUT ** qcOut)1248 AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING*          cm,
1249                                            QC_STATE*                 qcKernel,
1250                                            ELEMENT_BITS* RESTRICT    elBits[(8)],
1251                                            QC_OUT**                  qcOut)
1252 {
1253   switch (qcKernel->bitrateMode) {
1254     case QCDATA_BR_MODE_SFR:
1255       break;
1256 
1257     case QCDATA_BR_MODE_FF:
1258        break;
1259 
1260     case QCDATA_BR_MODE_VBR_1:
1261     case QCDATA_BR_MODE_VBR_2:
1262     case QCDATA_BR_MODE_VBR_3:
1263     case QCDATA_BR_MODE_VBR_4:
1264     case QCDATA_BR_MODE_VBR_5:
1265       qcOut[0]->totFillBits = (qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits)&7; /* precalculate alignment bits */
1266       break;
1267 
1268     case QCDATA_BR_MODE_CBR:
1269     case QCDATA_BR_MODE_INVALID:
1270     default:
1271       INT bitResSpace = qcKernel->bitResTotMax - qcKernel->bitResTot ;
1272       /* processing fill-bits */
1273       INT deltaBitRes = qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits ;
1274       qcOut[0]->totFillBits = fixMax((deltaBitRes&7), (deltaBitRes - (fixMax(0,bitResSpace-7)&~7)));
1275       break;
1276   } /* switch (qcKernel->bitrateMode) */
1277 
1278   return AAC_ENC_OK;
1279 }
1280 
1281 
1282 
1283 
1284 /*********************************************************************************
1285 
1286          functionname: FDKaacEnc_calcMaxValueInSfb
1287          description:
1288          return:
1289 
1290 **********************************************************************************/
1291 
FDKaacEnc_calcMaxValueInSfb(INT sfbCnt,INT maxSfbPerGroup,INT sfbPerGroup,INT * RESTRICT sfbOffset,SHORT * RESTRICT quantSpectrum,UINT * RESTRICT maxValue)1292 static INT FDKaacEnc_calcMaxValueInSfb(INT   sfbCnt,
1293                              INT   maxSfbPerGroup,
1294                              INT   sfbPerGroup,
1295                              INT  *RESTRICT sfbOffset,
1296                              SHORT *RESTRICT quantSpectrum,
1297                              UINT *RESTRICT maxValue)
1298 {
1299   INT sfbOffs,sfb;
1300   INT maxValueAll = 0;
1301 
1302   for (sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup)
1303     for (sfb = 0; sfb < maxSfbPerGroup; sfb++)
1304     {
1305       INT line;
1306       INT maxThisSfb = 0;
1307       for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++)
1308       {
1309         INT tmp = fixp_abs(quantSpectrum[line]);
1310         maxThisSfb = fixMax(tmp, maxThisSfb);
1311       }
1312 
1313       maxValue[sfbOffs+sfb] = maxThisSfb;
1314       maxValueAll = fixMax(maxThisSfb, maxValueAll);
1315     }
1316   return maxValueAll;
1317 }
1318 
1319 
1320 /*********************************************************************************
1321 
1322          functionname: FDKaacEnc_updateBitres
1323          description:
1324          return:
1325 
1326 **********************************************************************************/
FDKaacEnc_updateBitres(CHANNEL_MAPPING * cm,QC_STATE * qcKernel,QC_OUT ** qcOut)1327 void FDKaacEnc_updateBitres(CHANNEL_MAPPING *cm,
1328                             QC_STATE* qcKernel,
1329                             QC_OUT** qcOut)
1330 {
1331   switch (qcKernel->bitrateMode) {
1332     case QCDATA_BR_MODE_FF:
1333     case QCDATA_BR_MODE_VBR_1:
1334     case QCDATA_BR_MODE_VBR_2:
1335     case QCDATA_BR_MODE_VBR_3:
1336     case QCDATA_BR_MODE_VBR_4:
1337     case QCDATA_BR_MODE_VBR_5:
1338       /* variable bitrate */
1339       qcKernel->bitResTot = FDKmin(qcKernel->maxBitsPerFrame, qcKernel->bitResTotMax);
1340       break;
1341 
1342     case QCDATA_BR_MODE_CBR:
1343     case QCDATA_BR_MODE_SFR:
1344     case QCDATA_BR_MODE_INVALID:
1345     default:
1346       int c = 0;
1347       /* constant bitrate */
1348       {
1349         qcKernel->bitResTot += qcOut[c]->grantedDynBits - (qcOut[c]->usedDynBits + qcOut[c]->totFillBits + qcOut[c]->alignBits);
1350       }
1351       break;
1352   }
1353 }
1354 
1355 /*********************************************************************************
1356 
1357          functionname: FDKaacEnc_FinalizeBitConsumption
1358          description:
1359          return:
1360 
1361 **********************************************************************************/
FDKaacEnc_FinalizeBitConsumption(CHANNEL_MAPPING * cm,QC_STATE * qcKernel,QC_OUT * qcOut,QC_OUT_ELEMENT ** qcElement,HANDLE_TRANSPORTENC hTpEnc,AUDIO_OBJECT_TYPE aot,UINT syntaxFlags,SCHAR epConfig)1362 AAC_ENCODER_ERROR FDKaacEnc_FinalizeBitConsumption(CHANNEL_MAPPING *cm,
1363                                                    QC_STATE *qcKernel,
1364                                                    QC_OUT *qcOut,
1365                                                    QC_OUT_ELEMENT** qcElement,
1366                                                    HANDLE_TRANSPORTENC hTpEnc,
1367                                                    AUDIO_OBJECT_TYPE   aot,
1368                                                    UINT                syntaxFlags,
1369                                                    SCHAR               epConfig)
1370 {
1371   QC_OUT_EXTENSION fillExtPayload;
1372   INT totFillBits, alignBits;
1373 
1374   /* Get total consumed bits in AU */
1375   qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits  + qcOut->totFillBits +
1376                      qcOut->elementExtBits + qcOut->globalExtBits;
1377 
1378   if (qcKernel->bitrateMode==QCDATA_BR_MODE_CBR) {
1379 
1380     /* Now we can get the exact transport bit amount, and hopefully it is equal to the estimated value */
1381     INT exactTpBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
1382 
1383     if (exactTpBits != qcKernel->globHdrBits) {
1384       INT diffFillBits = 0;
1385 
1386       /* How many bits can be taken by bitreservoir */
1387       const INT bitresSpace = qcKernel->bitResTotMax - (qcKernel->bitResTot + (qcOut->grantedDynBits - (qcOut->usedDynBits + qcOut->totFillBits) ) );
1388 
1389       /* Number of bits which can be moved to bitreservoir. */
1390       const INT bitsToBitres = qcKernel->globHdrBits - exactTpBits;
1391       FDK_ASSERT(bitsToBitres>=0); /* is always positive */
1392 
1393       /* If bitreservoir can not take all bits, move ramaining bits to fillbits */
1394       diffFillBits = FDKmax(0, bitsToBitres - bitresSpace);
1395 
1396       /* Assure previous alignment */
1397       diffFillBits = (diffFillBits+7)&~7;
1398 
1399       /* Move as many bits as possible to bitreservoir */
1400       qcKernel->bitResTot    += (bitsToBitres-diffFillBits);
1401 
1402       /* Write remaing bits as fill bits */
1403       qcOut->totFillBits     += diffFillBits;
1404       qcOut->totalBits       += diffFillBits;
1405       qcOut->grantedDynBits  += diffFillBits;
1406 
1407       /* Get new header bits */
1408       qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
1409 
1410       if (qcKernel->globHdrBits != exactTpBits) {
1411         /* In previous step, fill bits and corresponding total bits were changed when bitreservoir was completely filled.
1412            Now we can take the too much taken bits caused by header overhead from bitreservoir.
1413          */
1414         qcKernel->bitResTot -= (qcKernel->globHdrBits - exactTpBits);
1415       }
1416     }
1417 
1418   } /* MODE_CBR */
1419 
1420   /* Update exact number of consumed header bits. */
1421   qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits);
1422 
1423   /* Save total fill bits and distribut to alignment and fill bits */
1424   totFillBits = qcOut->totFillBits;
1425 
1426   /* fake a fill extension payload */
1427   FDKmemclear(&fillExtPayload, sizeof(QC_OUT_EXTENSION));
1428 
1429   fillExtPayload.type = EXT_FILL_DATA;
1430   fillExtPayload.nPayloadBits = totFillBits;
1431 
1432   /* ask bitstream encoder how many of that bits can be written in a fill extension data entity */
1433   qcOut->totFillBits = FDKaacEnc_writeExtensionData( NULL,
1434                                                     &fillExtPayload,
1435                                                      0, 0,
1436                                                      syntaxFlags,
1437                                                      aot,
1438                                                      epConfig );
1439 
1440   /* now distribute extra fillbits and alignbits */
1441   alignBits = 7 - (qcOut->staticBits + qcOut->usedDynBits + qcOut->elementExtBits
1442                    + qcOut->totFillBits + qcOut->globalExtBits -1)%8;
1443 
1444   /* Maybe we could remove this */
1445   if( ((alignBits + qcOut->totFillBits - totFillBits)==8) && (qcOut->totFillBits>8) )
1446         qcOut->totFillBits -= 8;
1447 
1448   qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits + qcOut->totFillBits +
1449                      alignBits + qcOut->elementExtBits + qcOut->globalExtBits;
1450 
1451   if ( (qcOut->totalBits>qcKernel->maxBitsPerFrame) || (qcOut->totalBits<qcKernel->minBitsPerFrame) ) {
1452     return AAC_ENC_QUANT_ERROR;
1453   }
1454 
1455   qcOut->alignBits = alignBits;
1456 
1457   return AAC_ENC_OK;
1458 }
1459 
1460 
1461 
1462 /*********************************************************************************
1463 
1464          functionname: FDKaacEnc_crashRecovery
1465          description:  fulfills constraints by means of brute force...
1466                        => bits are saved by cancelling out spectral lines!!
1467                           (beginning at the highest frequencies)
1468          return:       errorcode
1469 
1470 **********************************************************************************/
1471 
FDKaacEnc_crashRecovery(INT nChannels,PSY_OUT_ELEMENT * psyOutElement,QC_OUT * qcOut,QC_OUT_ELEMENT * qcElement,INT bitsToSave,AUDIO_OBJECT_TYPE aot,UINT syntaxFlags,SCHAR epConfig)1472 static void FDKaacEnc_crashRecovery(INT               nChannels,
1473                           PSY_OUT_ELEMENT*  psyOutElement,
1474                           QC_OUT*           qcOut,
1475                           QC_OUT_ELEMENT   *qcElement,
1476                           INT               bitsToSave,
1477                           AUDIO_OBJECT_TYPE aot,
1478                           UINT              syntaxFlags,
1479                           SCHAR             epConfig)
1480 {
1481   INT ch ;
1482   INT savedBits = 0 ;
1483   INT sfb, sfbGrp ;
1484   INT bitsPerScf[(2)][MAX_GROUPED_SFB] ;
1485   INT sectionToScf[(2)][MAX_GROUPED_SFB] ;
1486   INT *sfbOffset ;
1487   INT sect, statBitsNew ;
1488   QC_OUT_CHANNEL **qcChannel = qcElement->qcOutChannel;
1489   PSY_OUT_CHANNEL **psyChannel = psyOutElement->psyOutChannel;
1490 
1491   /* create a table which converts frq-bins to bit-demand...    [bitsPerScf] */
1492   /* ...and another one which holds the corresponding sections [sectionToScf] */
1493   for (ch = 0; ch < nChannels; ch++)
1494   {
1495     sfbOffset = psyChannel[ch]->sfbOffsets ;
1496 
1497     for (sect = 0; sect < qcChannel[ch]->sectionData.noOfSections; sect++)
1498     {
1499       INT sfb ;
1500       INT codeBook = qcChannel[ch]->sectionData.huffsection[sect].codeBook ;
1501 
1502       for (sfb = qcChannel[ch]->sectionData.huffsection[sect].sfbStart;
1503            sfb < qcChannel[ch]->sectionData.huffsection[sect].sfbStart +
1504                  qcChannel[ch]->sectionData.huffsection[sect].sfbCnt;
1505            sfb++)
1506       {
1507         bitsPerScf[ch][sfb] = 0;
1508         if ( (codeBook != CODE_BOOK_PNS_NO) /*&&
1509              (sfb < (qcChannel[ch]->sectionData.noOfGroups*qcChannel[ch]->sectionData.maxSfbPerGroup))*/ )
1510         {
1511             INT sfbStartLine = sfbOffset[sfb] ;
1512             INT noOfLines    = sfbOffset[sfb+1] - sfbStartLine ;
1513             bitsPerScf[ch][sfb] = FDKaacEnc_countValues(&(qcChannel[ch]->quantSpec[sfbStartLine]), noOfLines, codeBook) ;
1514         }
1515         sectionToScf[ch][sfb] = sect ;
1516       }
1517 
1518     }
1519   }
1520 
1521   /* LOWER [maxSfb] IN BOTH CHANNELS!! */
1522   /* Attention: in case of stereo: maxSfbL == maxSfbR, GroupingL == GroupingR ; */
1523 
1524   for (sfb = qcChannel[0]->sectionData.maxSfbPerGroup-1; sfb >= 0; sfb--)
1525   {
1526     for (sfbGrp = 0; sfbGrp < psyChannel[0]->sfbCnt; sfbGrp += psyChannel[0]->sfbPerGroup)
1527     {
1528       for (ch = 0; ch < nChannels; ch++)
1529       {
1530         int sect = sectionToScf[ch][sfbGrp+sfb];
1531         qcChannel[ch]->sectionData.huffsection[sect].sfbCnt-- ;
1532         savedBits += bitsPerScf[ch][sfbGrp+sfb] ;
1533 
1534         if (qcChannel[ch]->sectionData.huffsection[sect].sfbCnt == 0) {
1535           savedBits += (psyChannel[ch]->lastWindowSequence!=SHORT_WINDOW) ? FDKaacEnc_sideInfoTabLong[0]
1536                                                                       : FDKaacEnc_sideInfoTabShort[0];
1537         }
1538       }
1539     }
1540 
1541     /* ...have enough bits been saved? */
1542     if (savedBits >= bitsToSave)
1543       break ;
1544 
1545   } /* sfb loop */
1546 
1547   /* if not enough bits saved,
1548      clean whole spectrum and remove side info overhead */
1549   if (sfb == -1) {
1550     sfb = 0 ;
1551   }
1552 
1553   for (ch = 0; ch < nChannels; ch++)
1554   {
1555     qcChannel[ch]->sectionData.maxSfbPerGroup = sfb ;
1556     psyChannel[ch]->maxSfbPerGroup = sfb ;
1557     /* when no spectrum is coded save tools info in bitstream */
1558     if(sfb==0) {
1559       FDKmemclear(&psyChannel[ch]->tnsInfo, sizeof(TNS_INFO));
1560       FDKmemclear(&psyOutElement->toolsInfo, sizeof(TOOLSINFO));
1561     }
1562   }
1563   /* dynamic bits will be updated in iteration loop */
1564 
1565   { /* if stop sfb has changed save bits in side info, e.g. MS or TNS coding */
1566     ELEMENT_INFO elInfo;
1567 
1568     FDKmemclear(&elInfo, sizeof(ELEMENT_INFO));
1569     elInfo.nChannelsInEl = nChannels;
1570     elInfo.elType = (nChannels == 2) ? ID_CPE : ID_SCE;
1571 
1572     FDKaacEnc_ChannelElementWrite( NULL, &elInfo, NULL,
1573                                    psyOutElement,
1574                                    psyChannel,
1575                                    syntaxFlags,
1576                                    aot,
1577                                    epConfig,
1578                                   &statBitsNew,
1579                                    0 );
1580   }
1581 
1582   savedBits = qcElement->staticBitsUsed - statBitsNew;
1583 
1584   /* update static and dynamic bits */
1585   qcElement->staticBitsUsed -= savedBits;
1586   qcElement->grantedDynBits += savedBits;
1587 
1588   qcOut->staticBits     -= savedBits;
1589   qcOut->grantedDynBits += savedBits;
1590   qcOut->maxDynBits     += savedBits;
1591 
1592 
1593 }
1594 
1595 
1596 
FDKaacEnc_QCClose(QC_STATE ** phQCstate,QC_OUT ** phQC)1597 void  FDKaacEnc_QCClose (QC_STATE  **phQCstate, QC_OUT **phQC)
1598 {
1599   int n, i;
1600 
1601   if (phQC!=NULL) {
1602 
1603     for (n=0;n<(1);n++) {
1604       if (phQC[n] != NULL) {
1605         QC_OUT    *hQC      = phQC[n];
1606         for (i=0; i<(8); i++) {
1607         }
1608 
1609         for (i=0; i<(8); i++) {
1610           if (hQC->qcElement[i])
1611             FreeRam_aacEnc_QCelement(&hQC->qcElement[i]);
1612         }
1613 
1614         FreeRam_aacEnc_QCout(&phQC[n]);
1615       }
1616     }
1617   }
1618 
1619   if (phQCstate!=NULL) {
1620     if (*phQCstate != NULL) {
1621       QC_STATE  *hQCstate = *phQCstate;
1622 
1623       if (hQCstate->hAdjThr != NULL)
1624         FDKaacEnc_AdjThrClose(&hQCstate->hAdjThr);
1625 
1626       if (hQCstate->hBitCounter != NULL)
1627         FDKaacEnc_BCClose(&hQCstate->hBitCounter);
1628 
1629       for (i=0; i<(8); i++) {
1630         if (hQCstate->elementBits[i]!=NULL) {
1631           FreeRam_aacEnc_ElementBits(&hQCstate->elementBits[i]);
1632         }
1633       }
1634       FreeRam_aacEnc_QCstate(phQCstate);
1635     }
1636   }
1637 }
1638 
1639