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