Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /**************************** AAC decoder library ******************************
     96 
     97    Author(s):
     98 
     99    Description:
    100 
    101 *******************************************************************************/
    102 
    103 /*!
    104   \file
    105   \brief  RVLC Decoder
    106   \author Robert Weidner
    107 */
    108 
    109 #include "rvlc.h"
    110 
    111 #include "block.h"
    112 
    113 #include "aac_rom.h"
    114 #include "rvlcbit.h"
    115 #include "rvlcconceal.h"
    116 #include "aacdec_hcr.h"
    117 
    118 /*---------------------------------------------------------------------------------------------
    119      function:     rvlcInit
    120 
    121      description:  init RVLC by data from channelinfo, which was decoded
    122 previously and set up pointers
    123 -----------------------------------------------------------------------------------------------
    124         input:     - pointer rvlc structure
    125                    - pointer channel info structure
    126                    - pointer bitstream structure
    127 -----------------------------------------------------------------------------------------------
    128         return:    -
    129 --------------------------------------------------------------------------------------------
    130 */
    131 
    132 static void rvlcInit(CErRvlcInfo *pRvlc,
    133                      CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    134                      HANDLE_FDK_BITSTREAM bs) {
    135   /* RVLC common initialization part 2 of 2 */
    136   SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc;
    137   SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd;
    138   SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd;
    139   SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
    140   int bnds;
    141 
    142   pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = 0;
    143 
    144   pRvlc->numDecodedEscapeWordsEsc = 0;
    145   pRvlc->numDecodedEscapeWordsFwd = 0;
    146   pRvlc->numDecodedEscapeWordsBwd = 0;
    147 
    148   pRvlc->intensity_used = 0;
    149   pRvlc->errorLogRvlc = 0;
    150 
    151   pRvlc->conceal_max = CONCEAL_MAX_INIT;
    152   pRvlc->conceal_min = CONCEAL_MIN_INIT;
    153 
    154   pRvlc->conceal_max_esc = CONCEAL_MAX_INIT;
    155   pRvlc->conceal_min_esc = CONCEAL_MIN_INIT;
    156 
    157   pRvlc->pHuffTreeRvlcEscape = aHuffTreeRvlcEscape;
    158   pRvlc->pHuffTreeRvlCodewds = aHuffTreeRvlCodewds;
    159 
    160   /* init scf arrays (for savety (in case of there are only zero codebooks)) */
    161   for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) {
    162     pScfFwd[bnds] = 0;
    163     pScfBwd[bnds] = 0;
    164     pScfEsc[bnds] = 0;
    165     pScaleFactor[bnds] = 0;
    166   }
    167 
    168   /* set base bitstream ptr to the RVL-coded part (start of RVLC data (ESC 2))
    169    */
    170   FDKsyncCache(bs);
    171   pRvlc->bsAnchor = (INT)FDKgetValidBits(bs);
    172 
    173   pRvlc->bitstreamIndexRvlFwd =
    174       0; /* first bit within RVL coded block as start address for  forward
    175             decoding */
    176   pRvlc->bitstreamIndexRvlBwd =
    177       pRvlc->length_of_rvlc_sf - 1; /* last bit within RVL coded block as start
    178                                        address for backward decoding */
    179 
    180   /* skip RVLC-bitstream-part -- pointing now to escapes (if present) or to TNS
    181    * data (if present) */
    182   FDKpushFor(bs, pRvlc->length_of_rvlc_sf);
    183 
    184   if (pRvlc->sf_escapes_present != 0) {
    185     /* locate internal bitstream ptr at escapes (which is the second part) */
    186     FDKsyncCache(bs);
    187     pRvlc->bitstreamIndexEsc = pRvlc->bsAnchor - (INT)FDKgetValidBits(bs);
    188 
    189     /* skip escapeRVLC-bitstream-part -- pointing to TNS data (if present)   to
    190      * make decoder continue */
    191     /* decoding of RVLC should work despite this second pushFor during
    192      * initialization because        */
    193     /* bitstream initialization is valid for both ESC2 data parts (RVL-coded
    194      * values and ESC-coded values) */
    195     FDKpushFor(bs, pRvlc->length_of_rvlc_escapes);
    196   }
    197 }
    198 
    199 /*---------------------------------------------------------------------------------------------
    200      function:     rvlcCheckIntensityCb
    201 
    202      description:  Check if a intensity codebook is used in the current channel.
    203 -----------------------------------------------------------------------------------------------
    204         input:     - pointer rvlc structure
    205                    - pointer channel info structure
    206 -----------------------------------------------------------------------------------------------
    207         output:    - intensity_used: 0 no intensity codebook is used
    208                                      1 intensity codebook is used
    209 -----------------------------------------------------------------------------------------------
    210         return:    -
    211 --------------------------------------------------------------------------------------------
    212 */
    213 
    214 static void rvlcCheckIntensityCb(
    215     CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo) {
    216   int group, band, bnds;
    217 
    218   pRvlc->intensity_used = 0;
    219 
    220   for (group = 0; group < pRvlc->numWindowGroups; group++) {
    221     for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
    222       bnds = 16 * group + band;
    223       if ((pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] ==
    224            INTENSITY_HCB) ||
    225           (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] ==
    226            INTENSITY_HCB2)) {
    227         pRvlc->intensity_used = 1;
    228         break;
    229       }
    230     }
    231   }
    232 }
    233 
    234 /*---------------------------------------------------------------------------------------------
    235      function:     rvlcDecodeEscapeWord
    236 
    237      description:  Decode a huffman coded RVLC Escape-word. This value is part
    238 of a DPCM coded scalefactor.
    239 -----------------------------------------------------------------------------------------------
    240         input:     - pointer rvlc structure
    241 -----------------------------------------------------------------------------------------------
    242         return:    - a single RVLC-Escape value which had to be applied to a
    243 DPCM value (which has a absolute value of 7)
    244 --------------------------------------------------------------------------------------------
    245 */
    246 
    247 static SCHAR rvlcDecodeEscapeWord(CErRvlcInfo *pRvlc, HANDLE_FDK_BITSTREAM bs) {
    248   int i;
    249   SCHAR value;
    250   UCHAR carryBit;
    251   UINT treeNode;
    252   UINT branchValue;
    253   UINT branchNode;
    254 
    255   INT *pBitstreamIndexEsc;
    256   const UINT *pEscTree;
    257 
    258   pEscTree = pRvlc->pHuffTreeRvlcEscape;
    259   pBitstreamIndexEsc = &(pRvlc->bitstreamIndexEsc);
    260   treeNode = *pEscTree; /* init at starting node */
    261 
    262   for (i = MAX_LEN_RVLC_ESCAPE_WORD - 1; i >= 0; i--) {
    263     carryBit =
    264         rvlcReadBitFromBitstream(bs, /* get next bit */
    265                                  pRvlc->bsAnchor, pBitstreamIndexEsc, FWD);
    266 
    267     CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in
    268                                        huffman decoding tree */
    269                           treeNode, &branchValue, &branchNode);
    270 
    271     if ((branchNode & TEST_BIT_10) ==
    272         TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-escape-word is
    273                           completely decoded */
    274       value = (SCHAR)branchNode & CLR_BIT_10;
    275       pRvlc->length_of_rvlc_escapes -= (MAX_LEN_RVLC_ESCAPE_WORD - i);
    276 
    277       if (pRvlc->length_of_rvlc_escapes < 0) {
    278         pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
    279         value = -1;
    280       }
    281 
    282       return value;
    283     } else {
    284       treeNode = *(
    285           pEscTree +
    286           branchValue); /* update treeNode for further step in decoding tree */
    287     }
    288   }
    289 
    290   pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
    291 
    292   return -1; /* should not be reached */
    293 }
    294 
    295 /*---------------------------------------------------------------------------------------------
    296      function:     rvlcDecodeEscapes
    297 
    298      description:  Decodes all huffman coded RVLC Escape Words.
    299                    Here a difference to the pseudo-code-implementation from
    300 standard can be found. A while loop (and not two nested for loops) is used for
    301 two reasons:
    302 
    303                    1. The plain huffman encoded escapes are decoded before the
    304 RVL-coded scalefactors. Therefore the escapes are present in the second step
    305                       when decoding the RVL-coded-scalefactor values in forward
    306 and backward direction.
    307 
    308                       When the RVL-coded scalefactors are decoded and there a
    309 escape is needed, then it is just taken out of the array in ascending order.
    310 
    311                    2. It's faster.
    312 -----------------------------------------------------------------------------------------------
    313         input:     - pointer rvlc structure
    314                    - handle to FDK bitstream
    315 -----------------------------------------------------------------------------------------------
    316         return:    - 0 ok     the decoded escapes seem to be valid
    317                    - 1 error  there was a error detected during decoding escapes
    318                               --> all escapes are invalid
    319 --------------------------------------------------------------------------------------------
    320 */
    321 
    322 static void rvlcDecodeEscapes(CErRvlcInfo *pRvlc, SHORT *pEsc,
    323                               HANDLE_FDK_BITSTREAM bs) {
    324   SCHAR escWord;
    325   SCHAR escCnt = 0;
    326   SHORT *pEscBitCntSum;
    327 
    328   pEscBitCntSum = &(pRvlc->length_of_rvlc_escapes);
    329 
    330   /* Decode all RVLC-Escape words with a plain Huffman-Decoder */
    331   while (*pEscBitCntSum > 0) {
    332     escWord = rvlcDecodeEscapeWord(pRvlc, bs);
    333 
    334     if (escWord >= 0) {
    335       pEsc[escCnt] = escWord;
    336       escCnt++;
    337     } else {
    338       pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
    339       pRvlc->numDecodedEscapeWordsEsc = escCnt;
    340 
    341       return;
    342     }
    343   } /* all RVLC escapes decoded */
    344 
    345   pRvlc->numDecodedEscapeWordsEsc = escCnt;
    346 }
    347 
    348 /*---------------------------------------------------------------------------------------------
    349      function:     decodeRVLCodeword
    350 
    351      description:  Decodes a RVL-coded dpcm-word (-part).
    352 -----------------------------------------------------------------------------------------------
    353         input:     - FDK bitstream handle
    354                    - pointer rvlc structure
    355 -----------------------------------------------------------------------------------------------
    356         return:    - a dpcm value which is within range [0,1,..,14] in case of
    357 no errors. The offset of 7 must be subtracted to get a valid dpcm scalefactor
    358 value. In case of errors a forbidden codeword is detected --> returning -1
    359 --------------------------------------------------------------------------------------------
    360 */
    361 
    362 SCHAR decodeRVLCodeword(HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc) {
    363   int i;
    364   SCHAR value;
    365   UCHAR carryBit;
    366   UINT branchValue;
    367   UINT branchNode;
    368 
    369   const UINT *pRvlCodeTree = pRvlc->pHuffTreeRvlCodewds;
    370   UCHAR direction = pRvlc->direction;
    371   INT *pBitstrIndxRvl = pRvlc->pBitstrIndxRvl_RVL;
    372   UINT treeNode = *pRvlCodeTree;
    373 
    374   for (i = MAX_LEN_RVLC_CODE_WORD - 1; i >= 0; i--) {
    375     carryBit =
    376         rvlcReadBitFromBitstream(bs, /* get next bit */
    377                                  pRvlc->bsAnchor, pBitstrIndxRvl, direction);
    378 
    379     CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in
    380                                        huffman decoding tree */
    381                           treeNode, &branchValue, &branchNode);
    382 
    383     if ((branchNode & TEST_BIT_10) ==
    384         TEST_BIT_10) { /* test bit 10 ; if set --> a
    385                           RVLC-codeword is completely decoded
    386                         */
    387       value = (SCHAR)(branchNode & CLR_BIT_10);
    388       *pRvlc->pRvlBitCnt_RVL -= (MAX_LEN_RVLC_CODE_WORD - i);
    389 
    390       /* check available bits for decoding */
    391       if (*pRvlc->pRvlBitCnt_RVL < 0) {
    392         if (direction == FWD) {
    393           pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD;
    394         } else {
    395           pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD;
    396         }
    397         value = -1; /* signalize an error in return value, because too many bits
    398                        was decoded */
    399       }
    400 
    401       /* check max value of dpcm value */
    402       if (value > MAX_ALLOWED_DPCM_INDEX) {
    403         if (direction == FWD) {
    404           pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD;
    405         } else {
    406           pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD;
    407         }
    408         value = -1; /* signalize an error in return value, because a forbidden
    409                        cw was detected*/
    410       }
    411 
    412       return value; /* return a dpcm value with offset +7 or an error status */
    413     } else {
    414       treeNode = *(
    415           pRvlCodeTree +
    416           branchValue); /* update treeNode for further step in decoding tree */
    417     }
    418   }
    419 
    420   return -1;
    421 }
    422 
    423 /*---------------------------------------------------------------------------------------------
    424      function:     rvlcDecodeForward
    425 
    426      description:  Decode RVL-coded codewords in forward direction.
    427 -----------------------------------------------------------------------------------------------
    428         input:     - pointer rvlc structure
    429                    - pointer channel info structure
    430                    - handle to FDK bitstream
    431 -----------------------------------------------------------------------------------------------
    432         return:    -
    433 --------------------------------------------------------------------------------------------
    434 */
    435 
    436 static void rvlcDecodeForward(CErRvlcInfo *pRvlc,
    437                               CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    438                               HANDLE_FDK_BITSTREAM bs) {
    439   int band = 0;
    440   int group = 0;
    441   int bnds = 0;
    442 
    443   SHORT dpcm;
    444 
    445   SHORT factor =
    446       pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET;
    447   SHORT position = -SF_OFFSET;
    448   SHORT noisenrg = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain -
    449                    SF_OFFSET - 90 - 256;
    450 
    451   SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd;
    452   SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc;
    453   UCHAR *pEscFwdCnt = &(pRvlc->numDecodedEscapeWordsFwd);
    454 
    455   pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_fwd);
    456   pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlFwd);
    457 
    458   *pEscFwdCnt = 0;
    459   pRvlc->direction = FWD;
    460   pRvlc->noise_used = 0;
    461   pRvlc->sf_used = 0;
    462   pRvlc->lastScf = 0;
    463   pRvlc->lastNrg = 0;
    464   pRvlc->lastIs = 0;
    465 
    466   rvlcCheckIntensityCb(pRvlc, pAacDecoderChannelInfo);
    467 
    468   /* main loop fwd long */
    469   for (group = 0; group < pRvlc->numWindowGroups; group++) {
    470     for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
    471       bnds = 16 * group + band;
    472 
    473       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
    474         case ZERO_HCB:
    475           pScfFwd[bnds] = 0;
    476           break;
    477 
    478         case INTENSITY_HCB2:
    479         case INTENSITY_HCB:
    480           /* store dpcm_is_position */
    481           dpcm = decodeRVLCodeword(bs, pRvlc);
    482           if (dpcm < 0) {
    483             pRvlc->conceal_max = bnds;
    484             return;
    485           }
    486           dpcm -= TABLE_OFFSET;
    487           if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    488             if (pRvlc->length_of_rvlc_escapes) {
    489               pRvlc->conceal_max = bnds;
    490               return;
    491             } else {
    492               if (dpcm == MIN_RVL) {
    493                 dpcm -= *pScfEsc++;
    494               } else {
    495                 dpcm += *pScfEsc++;
    496               }
    497               (*pEscFwdCnt)++;
    498               if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
    499                 pRvlc->conceal_max_esc = bnds;
    500               }
    501             }
    502           }
    503           position += dpcm;
    504           pScfFwd[bnds] = position;
    505           pRvlc->lastIs = position;
    506           break;
    507 
    508         case NOISE_HCB:
    509           if (pRvlc->noise_used == 0) {
    510             pRvlc->noise_used = 1;
    511             pRvlc->first_noise_band = bnds;
    512             noisenrg += pRvlc->dpcm_noise_nrg;
    513             pScfFwd[bnds] = 100 + noisenrg;
    514             pRvlc->lastNrg = noisenrg;
    515           } else {
    516             dpcm = decodeRVLCodeword(bs, pRvlc);
    517             if (dpcm < 0) {
    518               pRvlc->conceal_max = bnds;
    519               return;
    520             }
    521             dpcm -= TABLE_OFFSET;
    522             if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    523               if (pRvlc->length_of_rvlc_escapes) {
    524                 pRvlc->conceal_max = bnds;
    525                 return;
    526               } else {
    527                 if (dpcm == MIN_RVL) {
    528                   dpcm -= *pScfEsc++;
    529                 } else {
    530                   dpcm += *pScfEsc++;
    531                 }
    532                 (*pEscFwdCnt)++;
    533                 if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
    534                   pRvlc->conceal_max_esc = bnds;
    535                 }
    536               }
    537             }
    538             noisenrg += dpcm;
    539             pScfFwd[bnds] = 100 + noisenrg;
    540             pRvlc->lastNrg = noisenrg;
    541           }
    542           pAacDecoderChannelInfo->data.aac.PnsData.pnsUsed[bnds] = 1;
    543           break;
    544 
    545         default:
    546           pRvlc->sf_used = 1;
    547           dpcm = decodeRVLCodeword(bs, pRvlc);
    548           if (dpcm < 0) {
    549             pRvlc->conceal_max = bnds;
    550             return;
    551           }
    552           dpcm -= TABLE_OFFSET;
    553           if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    554             if (pRvlc->length_of_rvlc_escapes) {
    555               pRvlc->conceal_max = bnds;
    556               return;
    557             } else {
    558               if (dpcm == MIN_RVL) {
    559                 dpcm -= *pScfEsc++;
    560               } else {
    561                 dpcm += *pScfEsc++;
    562               }
    563               (*pEscFwdCnt)++;
    564               if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
    565                 pRvlc->conceal_max_esc = bnds;
    566               }
    567             }
    568           }
    569           factor += dpcm;
    570           pScfFwd[bnds] = factor;
    571           pRvlc->lastScf = factor;
    572           break;
    573       }
    574     }
    575   }
    576 
    577   /* postfetch fwd long */
    578   if (pRvlc->intensity_used) {
    579     dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */
    580     if (dpcm < 0) {
    581       pRvlc->conceal_max = bnds;
    582       return;
    583     }
    584     dpcm -= TABLE_OFFSET;
    585     if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    586       if (pRvlc->length_of_rvlc_escapes) {
    587         pRvlc->conceal_max = bnds;
    588         return;
    589       } else {
    590         if (dpcm == MIN_RVL) {
    591           dpcm -= *pScfEsc++;
    592         } else {
    593           dpcm += *pScfEsc++;
    594         }
    595         (*pEscFwdCnt)++;
    596         if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
    597           pRvlc->conceal_max_esc = bnds;
    598         }
    599       }
    600     }
    601     pRvlc->dpcm_is_last_position = dpcm;
    602   }
    603 }
    604 
    605 /*---------------------------------------------------------------------------------------------
    606      function:     rvlcDecodeBackward
    607 
    608      description:  Decode RVL-coded codewords in backward direction.
    609 -----------------------------------------------------------------------------------------------
    610         input:     - pointer rvlc structure
    611                    - pointer channel info structure
    612                    - handle FDK bitstream
    613 -----------------------------------------------------------------------------------------------
    614         return:    -
    615 --------------------------------------------------------------------------------------------
    616 */
    617 
    618 static void rvlcDecodeBackward(CErRvlcInfo *pRvlc,
    619                                CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    620                                HANDLE_FDK_BITSTREAM bs) {
    621   SHORT band, group, dpcm, offset;
    622   SHORT bnds = pRvlc->maxSfbTransmitted - 1;
    623 
    624   SHORT factor = pRvlc->rev_global_gain - SF_OFFSET;
    625   SHORT position = pRvlc->dpcm_is_last_position - SF_OFFSET;
    626   SHORT noisenrg = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position -
    627                    SF_OFFSET - 90 - 256;
    628 
    629   SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd;
    630   SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc;
    631   UCHAR *pEscEscCnt = &(pRvlc->numDecodedEscapeWordsEsc);
    632   UCHAR *pEscBwdCnt = &(pRvlc->numDecodedEscapeWordsBwd);
    633 
    634   pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_bwd);
    635   pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlBwd);
    636 
    637   *pEscBwdCnt = 0;
    638   pRvlc->direction = BWD;
    639   pScfEsc += *pEscEscCnt - 1; /* set pScfEsc to last entry */
    640   pRvlc->firstScf = 0;
    641   pRvlc->firstNrg = 0;
    642   pRvlc->firstIs = 0;
    643 
    644   /* prefetch long BWD */
    645   if (pRvlc->intensity_used) {
    646     dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */
    647     if (dpcm < 0) {
    648       pRvlc->dpcm_is_last_position = 0;
    649       pRvlc->conceal_min = bnds;
    650       return;
    651     }
    652     dpcm -= TABLE_OFFSET;
    653     if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    654       if (pRvlc->length_of_rvlc_escapes) {
    655         pRvlc->conceal_min = bnds;
    656         return;
    657       } else {
    658         if (dpcm == MIN_RVL) {
    659           dpcm -= *pScfEsc--;
    660         } else {
    661           dpcm += *pScfEsc--;
    662         }
    663         (*pEscBwdCnt)++;
    664         if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
    665           pRvlc->conceal_min_esc = bnds;
    666         }
    667       }
    668     }
    669     pRvlc->dpcm_is_last_position = dpcm;
    670   }
    671 
    672   /* main loop long BWD */
    673   for (group = pRvlc->numWindowGroups - 1; group >= 0; group--) {
    674     for (band = pRvlc->maxSfbTransmitted - 1; band >= 0; band--) {
    675       bnds = 16 * group + band;
    676       if ((band == 0) && (pRvlc->numWindowGroups != 1))
    677         offset = 16 - pRvlc->maxSfbTransmitted + 1;
    678       else
    679         offset = 1;
    680 
    681       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
    682         case ZERO_HCB:
    683           pScfBwd[bnds] = 0;
    684           break;
    685 
    686         case INTENSITY_HCB2:
    687         case INTENSITY_HCB:
    688           /* store dpcm_is_position */
    689           dpcm = decodeRVLCodeword(bs, pRvlc);
    690           if (dpcm < 0) {
    691             pScfBwd[bnds] = position;
    692             pRvlc->conceal_min = fMax(0, bnds - offset);
    693             return;
    694           }
    695           dpcm -= TABLE_OFFSET;
    696           if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    697             if (pRvlc->length_of_rvlc_escapes) {
    698               pScfBwd[bnds] = position;
    699               pRvlc->conceal_min = fMax(0, bnds - offset);
    700               return;
    701             } else {
    702               if (dpcm == MIN_RVL) {
    703                 dpcm -= *pScfEsc--;
    704               } else {
    705                 dpcm += *pScfEsc--;
    706               }
    707               (*pEscBwdCnt)++;
    708               if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
    709                 pRvlc->conceal_min_esc = fMax(0, bnds - offset);
    710               }
    711             }
    712           }
    713           pScfBwd[bnds] = position;
    714           position -= dpcm;
    715           pRvlc->firstIs = position;
    716           break;
    717 
    718         case NOISE_HCB:
    719           if (bnds == pRvlc->first_noise_band) {
    720             pScfBwd[bnds] =
    721                 pRvlc->dpcm_noise_nrg +
    722                 pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain -
    723                 SF_OFFSET - 90 - 256;
    724             pRvlc->firstNrg = pScfBwd[bnds];
    725           } else {
    726             dpcm = decodeRVLCodeword(bs, pRvlc);
    727             if (dpcm < 0) {
    728               pScfBwd[bnds] = noisenrg;
    729               pRvlc->conceal_min = fMax(0, bnds - offset);
    730               return;
    731             }
    732             dpcm -= TABLE_OFFSET;
    733             if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    734               if (pRvlc->length_of_rvlc_escapes) {
    735                 pScfBwd[bnds] = noisenrg;
    736                 pRvlc->conceal_min = fMax(0, bnds - offset);
    737                 return;
    738               } else {
    739                 if (dpcm == MIN_RVL) {
    740                   dpcm -= *pScfEsc--;
    741                 } else {
    742                   dpcm += *pScfEsc--;
    743                 }
    744                 (*pEscBwdCnt)++;
    745                 if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
    746                   pRvlc->conceal_min_esc = fMax(0, bnds - offset);
    747                 }
    748               }
    749             }
    750             pScfBwd[bnds] = noisenrg;
    751             noisenrg -= dpcm;
    752             pRvlc->firstNrg = noisenrg;
    753           }
    754           break;
    755 
    756         default:
    757           dpcm = decodeRVLCodeword(bs, pRvlc);
    758           if (dpcm < 0) {
    759             pScfBwd[bnds] = factor;
    760             pRvlc->conceal_min = fMax(0, bnds - offset);
    761             return;
    762           }
    763           dpcm -= TABLE_OFFSET;
    764           if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
    765             if (pRvlc->length_of_rvlc_escapes) {
    766               pScfBwd[bnds] = factor;
    767               pRvlc->conceal_min = fMax(0, bnds - offset);
    768               return;
    769             } else {
    770               if (dpcm == MIN_RVL) {
    771                 dpcm -= *pScfEsc--;
    772               } else {
    773                 dpcm += *pScfEsc--;
    774               }
    775               (*pEscBwdCnt)++;
    776               if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
    777                 pRvlc->conceal_min_esc = fMax(0, bnds - offset);
    778               }
    779             }
    780           }
    781           pScfBwd[bnds] = factor;
    782           factor -= dpcm;
    783           pRvlc->firstScf = factor;
    784           break;
    785       }
    786     }
    787   }
    788 }
    789 
    790 /*---------------------------------------------------------------------------------------------
    791      function:     rvlcFinalErrorDetection
    792 
    793      description:  Call RVLC concealment if error was detected in decoding
    794 process
    795 -----------------------------------------------------------------------------------------------
    796         input:     - pointer rvlc structure
    797                    - pointer channel info structure
    798 -----------------------------------------------------------------------------------------------
    799         return:    -
    800 --------------------------------------------------------------------------------------------
    801 */
    802 
    803 static void rvlcFinalErrorDetection(
    804     CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    805     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) {
    806   CErRvlcInfo *pRvlc =
    807       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
    808   UCHAR ErrorStatusComplete = 0;
    809   UCHAR ErrorStatusLengthFwd = 0;
    810   UCHAR ErrorStatusLengthBwd = 0;
    811   UCHAR ErrorStatusLengthEscapes = 0;
    812   UCHAR ErrorStatusFirstScf = 0;
    813   UCHAR ErrorStatusLastScf = 0;
    814   UCHAR ErrorStatusFirstNrg = 0;
    815   UCHAR ErrorStatusLastNrg = 0;
    816   UCHAR ErrorStatusFirstIs = 0;
    817   UCHAR ErrorStatusLastIs = 0;
    818   UCHAR ErrorStatusForbiddenCwFwd = 0;
    819   UCHAR ErrorStatusForbiddenCwBwd = 0;
    820   UCHAR ErrorStatusNumEscapesFwd = 0;
    821   UCHAR ErrorStatusNumEscapesBwd = 0;
    822   UCHAR ConcealStatus = 1;
    823   UCHAR currentBlockType; /* short: 0, not short: 1*/
    824 
    825   pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 1;
    826 
    827   /* invalid escape words, bit counter unequal zero, forbidden codeword detected
    828    */
    829   if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD)
    830     ErrorStatusForbiddenCwFwd = 1;
    831 
    832   if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD)
    833     ErrorStatusForbiddenCwBwd = 1;
    834 
    835   /* bit counter forward unequal zero */
    836   if (pRvlc->length_of_rvlc_sf_fwd) ErrorStatusLengthFwd = 1;
    837 
    838   /* bit counter backward unequal zero */
    839   if (pRvlc->length_of_rvlc_sf_bwd) ErrorStatusLengthBwd = 1;
    840 
    841   /* bit counter escape sequences unequal zero */
    842   if (pRvlc->sf_escapes_present)
    843     if (pRvlc->length_of_rvlc_escapes) ErrorStatusLengthEscapes = 1;
    844 
    845   if (pRvlc->sf_used) {
    846     /* first decoded scf does not match to global gain in backward direction */
    847     if (pRvlc->firstScf !=
    848         (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET))
    849       ErrorStatusFirstScf = 1;
    850 
    851     /* last decoded scf does not match to rev global gain in forward direction
    852      */
    853     if (pRvlc->lastScf != (pRvlc->rev_global_gain - SF_OFFSET))
    854       ErrorStatusLastScf = 1;
    855   }
    856 
    857   if (pRvlc->noise_used) {
    858     /* first decoded nrg does not match to dpcm_noise_nrg in backward direction
    859      */
    860     if (pRvlc->firstNrg !=
    861         (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain +
    862          pRvlc->dpcm_noise_nrg - SF_OFFSET - 90 - 256))
    863       ErrorStatusFirstNrg = 1;
    864 
    865     /* last decoded nrg does not match to dpcm_noise_last_position in forward
    866      * direction */
    867     if (pRvlc->lastNrg !=
    868         (pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET -
    869          90 - 256))
    870       ErrorStatusLastNrg = 1;
    871   }
    872 
    873   if (pRvlc->intensity_used) {
    874     /* first decoded is position does not match in backward direction */
    875     if (pRvlc->firstIs != (-SF_OFFSET)) ErrorStatusFirstIs = 1;
    876 
    877     /* last decoded is position does not match in forward direction */
    878     if (pRvlc->lastIs != (pRvlc->dpcm_is_last_position - SF_OFFSET))
    879       ErrorStatusLastIs = 1;
    880   }
    881 
    882   /* decoded escapes and used escapes in forward direction do not fit */
    883   if ((pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) &&
    884       (pRvlc->conceal_max == CONCEAL_MAX_INIT)) {
    885     ErrorStatusNumEscapesFwd = 1;
    886   }
    887 
    888   /* decoded escapes and used escapes in backward direction do not fit */
    889   if ((pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) &&
    890       (pRvlc->conceal_min == CONCEAL_MIN_INIT)) {
    891     ErrorStatusNumEscapesBwd = 1;
    892   }
    893 
    894   if (ErrorStatusLengthEscapes ||
    895       (((pRvlc->conceal_max == CONCEAL_MAX_INIT) &&
    896         (pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) &&
    897         (ErrorStatusLastScf || ErrorStatusLastNrg || ErrorStatusLastIs))
    898 
    899        &&
    900 
    901        ((pRvlc->conceal_min == CONCEAL_MIN_INIT) &&
    902         (pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) &&
    903         (ErrorStatusFirstScf || ErrorStatusFirstNrg || ErrorStatusFirstIs))) ||
    904       ((pRvlc->conceal_max == CONCEAL_MAX_INIT) &&
    905        ((pRvlc->rev_global_gain - SF_OFFSET - pRvlc->lastScf) < -15)) ||
    906       ((pRvlc->conceal_min == CONCEAL_MIN_INIT) &&
    907        ((pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET -
    908          pRvlc->firstScf) < -15))) {
    909     if ((pRvlc->conceal_max == CONCEAL_MAX_INIT) ||
    910         (pRvlc->conceal_min == CONCEAL_MIN_INIT)) {
    911       pRvlc->conceal_max = 0;
    912       pRvlc->conceal_min = fMax(
    913           0, (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1);
    914     } else {
    915       pRvlc->conceal_max = fMin(pRvlc->conceal_max, pRvlc->conceal_max_esc);
    916       pRvlc->conceal_min = fMax(pRvlc->conceal_min, pRvlc->conceal_min_esc);
    917     }
    918   }
    919 
    920   ErrorStatusComplete = ErrorStatusLastScf || ErrorStatusFirstScf ||
    921                         ErrorStatusLastNrg || ErrorStatusFirstNrg ||
    922                         ErrorStatusLastIs || ErrorStatusFirstIs ||
    923                         ErrorStatusForbiddenCwFwd ||
    924                         ErrorStatusForbiddenCwBwd || ErrorStatusLengthFwd ||
    925                         ErrorStatusLengthBwd || ErrorStatusLengthEscapes ||
    926                         ErrorStatusNumEscapesFwd || ErrorStatusNumEscapesBwd;
    927 
    928   currentBlockType =
    929       (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) ? 0
    930                                                                            : 1;
    931 
    932   if (!ErrorStatusComplete) {
    933     int band;
    934     int group;
    935     int bnds;
    936     int lastSfbIndex;
    937 
    938     lastSfbIndex = (pRvlc->numWindowGroups > 1) ? 16 : 64;
    939 
    940     for (group = 0; group < pRvlc->numWindowGroups; group++) {
    941       for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
    942         bnds = 16 * group + band;
    943         pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
    944             pAacDecoderStaticChannelInfo->concealmentInfo
    945                 .aRvlcPreviousScaleFactor[bnds] =
    946                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
    947       }
    948     }
    949 
    950     for (group = 0; group < pRvlc->numWindowGroups; group++) {
    951       for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
    952         bnds = 16 * group + band;
    953         pAacDecoderStaticChannelInfo->concealmentInfo
    954             .aRvlcPreviousCodebook[bnds] =
    955             pAacDecoderChannelInfo->pDynData->aCodeBook[bnds];
    956       }
    957       for (; band < lastSfbIndex; band++) {
    958         bnds = 16 * group + band;
    959         FDK_ASSERT(bnds >= 0 && bnds < RVLC_MAX_SFB);
    960         pAacDecoderStaticChannelInfo->concealmentInfo
    961             .aRvlcPreviousCodebook[bnds] = ZERO_HCB;
    962       }
    963     }
    964   } else {
    965     int band;
    966     int group;
    967 
    968     /* A single bit error was detected in decoding of dpcm values. It also could
    969        be an error with more bits in decoding of escapes and dpcm values whereby
    970        an illegal codeword followed not directly after the corrupted bits but
    971        just after decoding some more (wrong) scalefactors. Use the smaller
    972        scalefactor from forward decoding, backward decoding and previous frame.
    973      */
    974     if (((pRvlc->conceal_min != CONCEAL_MIN_INIT) ||
    975          (pRvlc->conceal_max != CONCEAL_MAX_INIT)) &&
    976         (pRvlc->conceal_min <= pRvlc->conceal_max) &&
    977         (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType ==
    978          currentBlockType) &&
    979         pAacDecoderStaticChannelInfo->concealmentInfo
    980             .rvlcPreviousScaleFactorOK &&
    981         pRvlc->sf_concealment && ConcealStatus) {
    982       BidirectionalEstimation_UseScfOfPrevFrameAsReference(
    983           pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo);
    984       ConcealStatus = 0;
    985     }
    986 
    987     /* A single bit error was detected in decoding of dpcm values. It also could
    988        be an error with more bits in decoding of escapes and dpcm values whereby
    989        an illegal codeword followed not directly after the corrupted bits but
    990        just after decoding some more (wrong) scalefactors. Use the smaller
    991        scalefactor from forward and backward decoding. */
    992     if ((pRvlc->conceal_min <= pRvlc->conceal_max) &&
    993         ((pRvlc->conceal_min != CONCEAL_MIN_INIT) ||
    994          (pRvlc->conceal_max != CONCEAL_MAX_INIT)) &&
    995         !(pAacDecoderStaticChannelInfo->concealmentInfo
    996               .rvlcPreviousScaleFactorOK &&
    997           pRvlc->sf_concealment &&
    998           (pAacDecoderStaticChannelInfo->concealmentInfo
    999                .rvlcPreviousBlockType == currentBlockType)) &&
   1000         ConcealStatus) {
   1001       BidirectionalEstimation_UseLowerScfOfCurrentFrame(pAacDecoderChannelInfo);
   1002       ConcealStatus = 0;
   1003     }
   1004 
   1005     /* No errors were detected in decoding of escapes and dpcm values however
   1006        the first and last value of a group (is,nrg,sf) is incorrect */
   1007     if ((pRvlc->conceal_min <= pRvlc->conceal_max) &&
   1008         ((ErrorStatusLastScf && ErrorStatusFirstScf) ||
   1009          (ErrorStatusLastNrg && ErrorStatusFirstNrg) ||
   1010          (ErrorStatusLastIs && ErrorStatusFirstIs)) &&
   1011         !(ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd ||
   1012           ErrorStatusLengthEscapes) &&
   1013         ConcealStatus) {
   1014       StatisticalEstimation(pAacDecoderChannelInfo);
   1015       ConcealStatus = 0;
   1016     }
   1017 
   1018     /* A error with more bits in decoding of escapes and dpcm values was
   1019        detected. Use the smaller scalefactor from forward decoding, backward
   1020        decoding and previous frame. */
   1021     if ((pRvlc->conceal_min <= pRvlc->conceal_max) &&
   1022         pAacDecoderStaticChannelInfo->concealmentInfo
   1023             .rvlcPreviousScaleFactorOK &&
   1024         pRvlc->sf_concealment &&
   1025         (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType ==
   1026          currentBlockType) &&
   1027         ConcealStatus) {
   1028       PredictiveInterpolation(pAacDecoderChannelInfo,
   1029                               pAacDecoderStaticChannelInfo);
   1030       ConcealStatus = 0;
   1031     }
   1032 
   1033     /* Call frame concealment, because no better strategy was found. Setting the
   1034        scalefactors to zero is done for debugging purposes */
   1035     if (ConcealStatus) {
   1036       for (group = 0; group < pRvlc->numWindowGroups; group++) {
   1037         for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
   1038           pAacDecoderChannelInfo->pDynData->aScaleFactor[16 * group + band] = 0;
   1039         }
   1040       }
   1041       pAacDecoderChannelInfo->pDynData->specificTo.aac
   1042           .rvlcCurrentScaleFactorOK = 0;
   1043     }
   1044   }
   1045 }
   1046 
   1047 /*---------------------------------------------------------------------------------------------
   1048      function:     CRvlc_Read
   1049 
   1050      description:  Read RVLC ESC1 data (side info) from bitstream.
   1051 -----------------------------------------------------------------------------------------------
   1052         input:     - pointer rvlc structure
   1053                    - pointer channel info structure
   1054                    - pointer bitstream structure
   1055 -----------------------------------------------------------------------------------------------
   1056         return:    -
   1057 --------------------------------------------------------------------------------------------
   1058 */
   1059 
   1060 void CRvlc_Read(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
   1061                 HANDLE_FDK_BITSTREAM bs) {
   1062   CErRvlcInfo *pRvlc =
   1063       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
   1064 
   1065   int group, band;
   1066 
   1067   /* RVLC long specific initialization  Init part 1 of 2 */
   1068   pRvlc->numWindowGroups = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
   1069   pRvlc->maxSfbTransmitted =
   1070       GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
   1071   pRvlc->noise_used = 0;               /* noise detection */
   1072   pRvlc->dpcm_noise_nrg = 0;           /* only for debugging */
   1073   pRvlc->dpcm_noise_last_position = 0; /* only for debugging */
   1074   pRvlc->length_of_rvlc_escapes =
   1075       -1; /* default value is used for error detection and concealment */
   1076 
   1077   /* read only error sensitivity class 1 data (ESC 1 - data) */
   1078   pRvlc->sf_concealment = FDKreadBits(bs, 1);  /* #1 */
   1079   pRvlc->rev_global_gain = FDKreadBits(bs, 8); /* #2 */
   1080 
   1081   if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) {
   1082     pRvlc->length_of_rvlc_sf = FDKreadBits(bs, 11); /* #3 */
   1083   } else {
   1084     pRvlc->length_of_rvlc_sf = FDKreadBits(bs, 9); /* #3 */
   1085   }
   1086 
   1087   /* check if noise codebook is used */
   1088   for (group = 0; group < pRvlc->numWindowGroups; group++) {
   1089     for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
   1090       if (pAacDecoderChannelInfo->pDynData->aCodeBook[16 * group + band] ==
   1091           NOISE_HCB) {
   1092         pRvlc->noise_used = 1;
   1093         break;
   1094       }
   1095     }
   1096   }
   1097 
   1098   if (pRvlc->noise_used)
   1099     pRvlc->dpcm_noise_nrg = FDKreadBits(bs, 9); /* #4  PNS */
   1100 
   1101   pRvlc->sf_escapes_present = FDKreadBits(bs, 1); /* #5      */
   1102 
   1103   if (pRvlc->sf_escapes_present) {
   1104     pRvlc->length_of_rvlc_escapes = FDKreadBits(bs, 8); /* #6      */
   1105   }
   1106 
   1107   if (pRvlc->noise_used) {
   1108     pRvlc->dpcm_noise_last_position = FDKreadBits(bs, 9); /* #7  PNS */
   1109     pRvlc->length_of_rvlc_sf -= 9;
   1110   }
   1111 
   1112   pRvlc->length_of_rvlc_sf_fwd = pRvlc->length_of_rvlc_sf;
   1113   pRvlc->length_of_rvlc_sf_bwd = pRvlc->length_of_rvlc_sf;
   1114 }
   1115 
   1116 /*---------------------------------------------------------------------------------------------
   1117      function:     CRvlc_Decode
   1118 
   1119      description:  Decode rvlc data
   1120                    The function reads both the escape sequences and the
   1121 scalefactors in forward and backward direction. If an error occured during
   1122 decoding process which can not be concealed with the rvlc concealment frame
   1123 concealment will be initiated. Then the element "rvlcCurrentScaleFactorOK" in
   1124 the decoder channel info is set to 0 otherwise it is set to 1.
   1125 -----------------------------------------------------------------------------------------------
   1126         input:     - pointer rvlc structure
   1127                    - pointer channel info structure
   1128                    - pointer to persistent channel info structure
   1129                    - pointer bitstream structure
   1130 -----------------------------------------------------------------------------------------------
   1131         return:    ErrorStatus = AAC_DEC_OK
   1132 --------------------------------------------------------------------------------------------
   1133 */
   1134 
   1135 void CRvlc_Decode(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
   1136                   CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
   1137                   HANDLE_FDK_BITSTREAM bs) {
   1138   CErRvlcInfo *pRvlc =
   1139       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
   1140   INT bitCntOffst;
   1141   INT saveBitCnt;
   1142 
   1143   rvlcInit(pRvlc, pAacDecoderChannelInfo, bs);
   1144 
   1145   /* save bitstream position */
   1146   saveBitCnt = (INT)FDKgetValidBits(bs);
   1147 
   1148   if (pRvlc->sf_escapes_present)
   1149     rvlcDecodeEscapes(
   1150         pRvlc, pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc, bs);
   1151 
   1152   rvlcDecodeForward(pRvlc, pAacDecoderChannelInfo, bs);
   1153   rvlcDecodeBackward(pRvlc, pAacDecoderChannelInfo, bs);
   1154   rvlcFinalErrorDetection(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo);
   1155 
   1156   pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed =
   1157       pRvlc->intensity_used;
   1158   pAacDecoderChannelInfo->data.aac.PnsData.PnsActive = pRvlc->noise_used;
   1159 
   1160   /* restore bitstream position */
   1161   bitCntOffst = (INT)FDKgetValidBits(bs) - saveBitCnt;
   1162   if (bitCntOffst) {
   1163     FDKpushBiDirectional(bs, bitCntOffst);
   1164   }
   1165 }
   1166 
   1167 void CRvlc_ElementCheck(
   1168     CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
   1169     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
   1170     const UINT flags, const INT elChannels) {
   1171   int ch;
   1172 
   1173   /* Required for MPS residuals. */
   1174   if (pAacDecoderStaticChannelInfo == NULL) {
   1175     return;
   1176   }
   1177 
   1178   /* RVLC specific sanity checks */
   1179   if ((flags & AC_ER_RVLC) && (elChannels == 2)) { /* to be reviewed */
   1180     if (((pAacDecoderChannelInfo[0]
   1181               ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) ||
   1182          (pAacDecoderChannelInfo[1]
   1183               ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0)) &&
   1184         pAacDecoderChannelInfo[0]->pComData->jointStereoData.MsMaskPresent) {
   1185       pAacDecoderChannelInfo[0]
   1186           ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
   1187       pAacDecoderChannelInfo[1]
   1188           ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
   1189     }
   1190 
   1191     if ((pAacDecoderChannelInfo[0]
   1192              ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) &&
   1193         (pAacDecoderChannelInfo[1]
   1194              ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 1) &&
   1195         (pAacDecoderChannelInfo[1]
   1196              ->pDynData->specificTo.aac.rvlcIntensityUsed == 1)) {
   1197       pAacDecoderChannelInfo[1]
   1198           ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
   1199     }
   1200   }
   1201 
   1202   for (ch = 0; ch < elChannels; ch++) {
   1203     pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousBlockType =
   1204         (GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) == BLOCK_SHORT)
   1205             ? 0
   1206             : 1;
   1207     if (flags & AC_ER_RVLC) {
   1208       pAacDecoderStaticChannelInfo[ch]
   1209           ->concealmentInfo.rvlcPreviousScaleFactorOK =
   1210           pAacDecoderChannelInfo[ch]
   1211               ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK;
   1212     } else {
   1213       pAacDecoderStaticChannelInfo[ch]
   1214           ->concealmentInfo.rvlcPreviousScaleFactorOK = 0;
   1215     }
   1216   }
   1217 }
   1218