diff options
author | Fraunhofer IIS FDK <audio-fdk@iis.fraunhofer.de> | 2018-02-26 20:17:00 +0100 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2018-04-19 11:21:15 -0700 |
commit | 6cfabd35363c3ef5e3b209b867169a500b3ccc3c (patch) | |
tree | 01c0a19f2735e8b5d2407555fe992d4230d089eb /libAACdec/src/rvlc.cpp | |
parent | 6288a1e34c4dede4c2806beb1736ece6580558c7 (diff) | |
download | fdk-aac-6cfabd35363c3ef5e3b209b867169a500b3ccc3c.tar.gz fdk-aac-6cfabd35363c3ef5e3b209b867169a500b3ccc3c.tar.bz2 fdk-aac-6cfabd35363c3ef5e3b209b867169a500b3ccc3c.zip |
Upgrade to FDKv2
Bug: 71430241
Test: CTS DecoderTest and DecoderTestAacDrc
original-Change-Id: Iaa20f749b8a04d553b20247cfe1a8930ebbabe30
Apply clang-format also on header files.
original-Change-Id: I14de1ef16bbc79ec0283e745f98356a10efeb2e4
Fixes for MPEG-D DRC
original-Change-Id: If1de2d74bbbac84b3f67de3b88b83f6a23b8a15c
Catch unsupported tw_mdct at an early stage
original-Change-Id: Ied9dd00d754162a0e3ca1ae3e6b854315d818afe
Fixing PVC transition frames
original-Change-Id: Ib75725abe39252806c32d71176308f2c03547a4e
Move qmf bands sanity check
original-Change-Id: Iab540c3013c174d9490d2ae100a4576f51d8dbc4
Initialize scaling variable
original-Change-Id: I3c4087101b70e998c71c1689b122b0d7762e0f9e
Add 16 qmf band configuration to getSlotNrgHQ()
original-Change-Id: I49a5d30f703a1b126ff163df9656db2540df21f1
Always apply byte alignment at the end of the AudioMuxElement
original-Change-Id: I42d560287506d65d4c3de8bfe3eb9a4ebeb4efc7
Setup SBR element only if no parse error exists
original-Change-Id: I1915b73704bc80ab882b9173d6bec59cbd073676
Additional array index check in HCR
original-Change-Id: I18cc6e501ea683b5009f1bbee26de8ddd04d8267
Fix fade-in index selection in concealment module
original-Change-Id: Ibf802ed6ed8c05e9257e1f3b6d0ac1162e9b81c1
Enable explicit backward compatible parser for AAC_LD
original-Change-Id: I27e9c678dcb5d40ed760a6d1e06609563d02482d
Skip spatial specific config in explicit backward compatible ASC
original-Change-Id: Iff7cc365561319e886090cedf30533f562ea4d6e
Update flags description in decoder API
original-Change-Id: I9a5b4f8da76bb652f5580cbd3ba9760425c43830
Add QMF domain reset function
original-Change-Id: I4f89a8a2c0277d18103380134e4ed86996e9d8d6
DRC upgrade v2.1.0
original-Change-Id: I5731c0540139dab220094cd978ef42099fc45b74
Fix integer overflow in sqrtFixp_lookup()
original-Change-Id: I429a6f0d19aa2cc957e0f181066f0ca73968c914
Fix integer overflow in invSqrtNorm2()
original-Change-Id: I84de5cbf9fb3adeb611db203fe492fabf4eb6155
Fix integer overflow in GenerateRandomVector()
original-Change-Id: I3118a641008bd9484d479e5b0b1ee2b5d7d44d74
Fix integer overflow in adjustTimeSlot_EldGrid()
original-Change-Id: I29d503c247c5c8282349b79df940416a512fb9d5
Fix integer overflow in FDKsbrEnc_codeEnvelope()
original-Change-Id: I6b34b61ebb9d525b0c651ed08de2befc1f801449
Follow-up on: Fix integer overflow in adjustTimeSlot_EldGrid()
original-Change-Id: I6f8f578cc7089e5eb7c7b93e580b72ca35ad689a
Fix integer overflow in get_pk_v2()
original-Change-Id: I63375bed40d45867f6eeaa72b20b1f33e815938c
Fix integer overflow in Syn_filt_zero()
original-Change-Id: Ie0c02fdfbe03988f9d3b20d10cd9fe4c002d1279
Fix integer overflow in CFac_CalcFacSignal()
original-Change-Id: Id2d767c40066c591b51768e978eb8af3b803f0c5
Fix integer overflow in FDKaacEnc_FDKaacEnc_calcPeNoAH()
original-Change-Id: Idcbd0f4a51ae2550ed106aa6f3d678d1f9724841
Fix integer overflow in sbrDecoder_calculateGainVec()
original-Change-Id: I7081bcbe29c5cede9821b38d93de07c7add2d507
Fix integer overflow in CLpc_SynthesisLattice()
original-Change-Id: I4a95ddc18de150102352d4a1845f06094764c881
Fix integer overflow in Pred_Lt4()
original-Change-Id: I4dbd012b2de7d07c3e70a47b92e3bfae8dbc750a
Fix integer overflow in FDKsbrEnc_InitSbrFastTransientDetector()
original-Change-Id: I788cbec1a4a00f44c2f3a72ad7a4afa219807d04
Fix unsigned integer overflow in FDKaacEnc_WriteBitstream()
original-Change-Id: I68fc75166e7d2cd5cd45b18dbe3d8c2a92f1822a
Fix unsigned integer overflow in FDK_MetadataEnc_Init()
original-Change-Id: Ie8d025f9bcdb2442c704bd196e61065c03c10af4
Fix overflow in pseudo random number generators
original-Change-Id: I3e2551ee01356297ca14e3788436ede80bd5513c
Fix unsigned integer overflow in sbrDecoder_Parse()
original-Change-Id: I3f231b2f437e9c37db4d5b964164686710eee971
Fix unsigned integer overflow in longsub()
original-Change-Id: I73c2bc50415cac26f1f5a29e125bbe75f9180a6e
Fix unsigned integer overflow in CAacDecoder_DecodeFrame()
original-Change-Id: Ifce2db4b1454b46fa5f887e9d383f1cc43b291e4
Fix overflow at CLpdChannelStream_Read()
original-Change-Id: Idb9d822ce3a4272e4794b643644f5434e2d4bf3f
Fix unsigned integer overflow in Hcr_State_BODY_SIGN_ESC__ESC_WORD()
original-Change-Id: I1ccf77c0015684b85534c5eb97162740a870b71c
Fix unsigned integer overflow in UsacConfig_Parse()
original-Change-Id: Ie6d27f84b6ae7eef092ecbff4447941c77864d9f
Fix unsigned integer overflow in aacDecoder_drcParse()
original-Change-Id: I713f28e883eea3d70b6fa56a7b8f8c22bcf66ca0
Fix unsigned integer overflow in aacDecoder_drcReadCompression()
original-Change-Id: Ia34dfeb88c4705c558bce34314f584965cafcf7a
Fix unsigned integer overflow in CDataStreamElement_Read()
original-Change-Id: Iae896cc1d11f0a893d21be6aa90bd3e60a2c25f0
Fix unsigned integer overflow in transportDec_AdjustEndOfAccessUnit()
original-Change-Id: I64cf29a153ee784bb4a16fdc088baabebc0007dc
Fix unsigned integer overflow in transportDec_GetAuBitsRemaining()
original-Change-Id: I975b3420faa9c16a041874ba0db82e92035962e4
Fix unsigned integer overflow in extractExtendedData()
original-Change-Id: I2a59eb09e2053cfb58dfb75fcecfad6b85a80a8f
Fix signed integer overflow in CAacDecoder_ExtPayloadParse()
original-Change-Id: I4ad5ca4e3b83b5d964f1c2f8c5e7b17c477c7929
Fix unsigned integer overflow in CAacDecoder_DecodeFrame()
original-Change-Id: I29a39df77d45c52a0c9c5c83c1ba81f8d0f25090
Follow-up on: Fix integer overflow in CLpc_SynthesisLattice()
original-Change-Id: I8fb194ffc073a3432a380845be71036a272d388f
Fix signed integer overflow in _interpolateDrcGain()
original-Change-Id: I879ec9ab14005069a7c47faf80e8bc6e03d22e60
Fix unsigned integer overflow in FDKreadBits()
original-Change-Id: I1f47a6a8037ff70375aa8844947d5681bb4287ad
Fix unsigned integer overflow in FDKbyteAlign()
original-Change-Id: Id5f3a11a0c9e50fc6f76ed6c572dbd4e9f2af766
Fix unsigned integer overflow in FDK_get32()
original-Change-Id: I9d33b8e97e3d38cbb80629cb859266ca0acdce96
Fix unsigned integer overflow in FDK_pushBack()
original-Change-Id: Ic87f899bc8c6acf7a377a8ca7f3ba74c3a1e1c19
Fix unsigned integer overflow in FDK_pushForward()
original-Change-Id: I3b754382f6776a34be1602e66694ede8e0b8effc
Fix unsigned integer overflow in ReadPsData()
original-Change-Id: I25361664ba8139e32bbbef2ca8c106a606ce9c37
Fix signed integer overflow in E_UTIL_residu()
original-Change-Id: I8c3abd1f437ee869caa8fb5903ce7d3d641b6aad
REVERT: Follow-up on: Integer overflow in CLpc_SynthesisLattice().
original-Change-Id: I3d340099acb0414795c8dfbe6362bc0a8f045f9b
Follow-up on: Fix integer overflow in CLpc_SynthesisLattice()
original-Change-Id: I4aedb8b3a187064e9f4d985175aa55bb99cc7590
Follow-up on: Fix unsigned integer overflow in aacDecoder_drcParse()
original-Change-Id: I2aa2e13916213bf52a67e8b0518e7bf7e57fb37d
Fix integer overflow in acelp
original-Change-Id: Ie6390c136d84055f8b728aefbe4ebef6e029dc77
Fix unsigned integer overflow in aacDecoder_UpdateBitStreamCounters()
original-Change-Id: I391ffd97ddb0b2c184cba76139bfb356a3b4d2e2
Adjust concealment default settings
original-Change-Id: I6a95db935a327c47df348030bcceafcb29f54b21
Saturate estimatedStartPos
original-Change-Id: I27be2085e0ae83ec9501409f65e003f6bcba1ab6
Negative shift exponent in _interpolateDrcGain()
original-Change-Id: I18edb26b26d002aafd5e633d4914960f7a359c29
Negative shift exponent in calculateICC()
original-Change-Id: I3dcd2ae98d2eb70ee0d59750863cbb2a6f4f8aba
Too large shift exponent in FDK_put()
original-Change-Id: Ib7d9aaa434d2d8de4a13b720ca0464b31ca9b671
Too large shift exponent in CalcInvLdData()
original-Change-Id: I43e6e78d4cd12daeb1dcd5d82d1798bdc2550262
Member access within null pointer of type SBR_CHANNEL
original-Change-Id: Idc5e4ea8997810376d2f36bbdf628923b135b097
Member access within null pointer of type CpePersistentData
original-Change-Id: Ib6c91cb0d37882768e5baf63324e429589de0d9d
Member access within null pointer FDKaacEnc_psyMain()
original-Change-Id: I7729b7f4479970531d9dc823abff63ca52e01997
Member access within null pointer FDKaacEnc_GetPnsParam()
original-Change-Id: I9aa3b9f3456ae2e0f7483dbd5b3dde95fc62da39
Member access within null pointer FDKsbrEnc_EnvEncodeFrame()
original-Change-Id: I67936f90ea714e90b3e81bc0dd1472cc713eb23a
Add HCR sanity check
original-Change-Id: I6c1d9732ebcf6af12f50b7641400752f74be39f7
Fix memory issue for HBE edge case with 8:3 SBR
original-Change-Id: I11ea58a61e69fbe8bf75034b640baee3011e63e9
Additional SBR parametrization sanity check for ELD
original-Change-Id: Ie26026fbfe174c2c7b3691f6218b5ce63e322140
Add MPEG-D DRC channel layout check
original-Change-Id: Iea70a74f171b227cce636a9eac4ba662777a2f72
Additional out-of-bounds checks in MPEG-D DRC
original-Change-Id: Ife4a8c3452c6fde8a0a09e941154a39a769777d4
Change-Id: Ic63cb2f628720f54fe9b572b0cb528e2599c624e
Diffstat (limited to 'libAACdec/src/rvlc.cpp')
-rw-r--r-- | libAACdec/src/rvlc.cpp | 1379 |
1 files changed, 689 insertions, 690 deletions
diff --git a/libAACdec/src/rvlc.cpp b/libAACdec/src/rvlc.cpp index 16f0bf5..92f9f02 100644 --- a/libAACdec/src/rvlc.cpp +++ b/libAACdec/src/rvlc.cpp @@ -1,74 +1,85 @@ - -/* ----------------------------------------------------------------------------------------------------------- +/* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. - All rights reserved. +© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +Forschung e.V. All rights reserved. 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements -the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. -This FDK AAC Codec software is intended to be used on a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual -audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by -independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part -of the MPEG specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) -may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners -individually for the purpose of encoding or decoding bit streams in products that are compliant with -the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license -these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec -software may already be covered under those patent licenses when it is used for those licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, -are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional -applications information and documentation. +The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software +that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding +scheme for digital audio. This FDK AAC Codec software is intended to be used on +a wide variety of Android devices. + +AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient +general perceptual audio codecs. AAC-ELD is considered the best-performing +full-bandwidth communications codec by independent studies and is widely +deployed. AAC has been standardized by ISO and IEC as part of the MPEG +specifications. + +Patent licenses for necessary patent claims for the FDK AAC Codec (including +those of Fraunhofer) may be obtained through Via Licensing +(www.vialicensing.com) or through the respective patent owners individually for +the purpose of encoding or decoding bit streams in products that are compliant +with the ISO/IEC MPEG audio standards. Please note that most manufacturers of +Android devices already license these patent claims through Via Licensing or +directly from the patent owners, and therefore FDK AAC Codec software may +already be covered under those patent licenses when it is used for those +licensed purposes only. + +Commercially-licensed AAC software libraries, including floating-point versions +with enhanced sound quality, are also available from Fraunhofer. Users are +encouraged to check the Fraunhofer website for additional applications +information and documentation. 2. COPYRIGHT LICENSE -Redistribution and use in source and binary forms, with or without modification, are permitted without -payment of copyright license fees provided that you satisfy the following conditions: +Redistribution and use in source and binary forms, with or without modification, +are permitted without payment of copyright license fees provided that you +satisfy the following conditions: -You must retain the complete text of this software license in redistributions of the FDK AAC Codec or -your modifications thereto in source code form. +You must retain the complete text of this software license in redistributions of +the FDK AAC Codec or your modifications thereto in source code form. -You must retain the complete text of this software license in the documentation and/or other materials -provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. -You must make available free of charge copies of the complete source code of the FDK AAC Codec and your +You must retain the complete text of this software license in the documentation +and/or other materials provided with redistributions of the FDK AAC Codec or +your modifications thereto in binary form. You must make available free of +charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. -The name of Fraunhofer may not be used to endorse or promote products derived from this library without -prior written permission. +The name of Fraunhofer may not be used to endorse or promote products derived +from this library without prior written permission. -You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec -software or your modifications thereto. +You may not charge copyright license fees for anyone to use, copy or distribute +the FDK AAC Codec software or your modifications thereto. -Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software -and the date of any change. For modified versions of the FDK AAC Codec, the term -"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term -"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." +Your modified versions of the FDK AAC Codec must carry prominent notices stating +that you changed the software and the date of any change. For modified versions +of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" +must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK +AAC Codec Library for Android." 3. NO PATENT LICENSE -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, -ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with -respect to this software. +NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without +limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. +Fraunhofer provides no warranty of patent non-infringement with respect to this +software. -You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized -by appropriate patent licenses. +You may use this FDK AAC Codec software or modifications thereto only for +purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors -"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties -of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, -including but not limited to procurement of substitute goods or services; loss of use, data, or profits, -or business interruption, however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence), arising in any way out of the use of this software, even if -advised of the possibility of such damage. +This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright +holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, +including but not limited to the implied warranties of merchantability and +fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, +or consequential damages, including but not limited to procurement of substitute +goods or services; loss of use, data, or profits, or business interruption, +however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence), arising in any way out of the use of +this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION @@ -79,7 +90,15 @@ Am Wolfsmantel 33 www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ +----------------------------------------------------------------------------- */ + +/**************************** AAC decoder library ****************************** + + Author(s): + + Description: + +*******************************************************************************/ /*! \file @@ -89,7 +108,6 @@ amm-info@iis.fraunhofer.de #include "rvlc.h" - #include "block.h" #include "aac_rom.h" @@ -100,26 +118,25 @@ amm-info@iis.fraunhofer.de /*--------------------------------------------------------------------------------------------- function: rvlcInit - description: init RVLC by data from channelinfo, which was decoded previously and - set up pointers + description: init RVLC by data from channelinfo, which was decoded +previously and set up pointers ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure - pointer bitstream structure ----------------------------------------------------------------------------------------------- return: - --------------------------------------------------------------------------------------------- */ +-------------------------------------------------------------------------------------------- +*/ -static -void rvlcInit (CErRvlcInfo *pRvlc, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - HANDLE_FDK_BITSTREAM bs) -{ +static void rvlcInit(CErRvlcInfo *pRvlc, + CAacDecoderChannelInfo *pAacDecoderChannelInfo, + HANDLE_FDK_BITSTREAM bs) { /* RVLC common initialization part 2 of 2 */ - SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; - SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; - SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; - SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; + SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; + SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; + SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; + SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; int bnds; pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = 0; @@ -129,7 +146,7 @@ void rvlcInit (CErRvlcInfo *pRvlc, pRvlc->numDecodedEscapeWordsBwd = 0; pRvlc->intensity_used = 0; - pRvlc->errorLogRvlc = 0; + pRvlc->errorLogRvlc = 0; pRvlc->conceal_max = CONCEAL_MAX_INIT; pRvlc->conceal_min = CONCEAL_MIN_INIT; @@ -137,8 +154,8 @@ void rvlcInit (CErRvlcInfo *pRvlc, pRvlc->conceal_max_esc = CONCEAL_MAX_INIT; pRvlc->conceal_min_esc = CONCEAL_MIN_INIT; - pRvlc->pHuffTreeRvlcEscape = aHuffTreeRvlcEscape; - pRvlc->pHuffTreeRvlCodewds = aHuffTreeRvlCodewds; + pRvlc->pHuffTreeRvlcEscape = aHuffTreeRvlcEscape; + pRvlc->pHuffTreeRvlCodewds = aHuffTreeRvlCodewds; /* init scf arrays (for savety (in case of there are only zero codebooks)) */ for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) { @@ -148,33 +165,36 @@ void rvlcInit (CErRvlcInfo *pRvlc, pScaleFactor[bnds] = 0; } - /* set base bitstream ptr to the RVL-coded part (start of RVLC data (ESC 2)) */ - FDKsyncCache (bs); - - pRvlc->bitstreamIndexRvlFwd = FDKgetBitCnt(bs); /* first bit within RVL coded block as start address for forward decoding */ - pRvlc->bitstreamIndexRvlBwd = FDKgetBitCnt(bs) + pRvlc->length_of_rvlc_sf - 1; /* last bit within RVL coded block as start address for backward decoding */ + /* set base bitstream ptr to the RVL-coded part (start of RVLC data (ESC 2)) + */ + FDKsyncCache(bs); - /* skip RVLC-bitstream-part -- pointing now to escapes (if present) or to TNS data (if present) */ - FDKpushFor (bs, pRvlc->length_of_rvlc_sf); + pRvlc->bitstreamIndexRvlFwd = FDKgetBitCnt( + bs); /* first bit within RVL coded block as start address for forward + decoding */ + pRvlc->bitstreamIndexRvlBwd = FDKgetBitCnt(bs) + pRvlc->length_of_rvlc_sf - + 1; /* last bit within RVL coded block as start + address for backward decoding */ - if ( pRvlc->sf_escapes_present != 0 ) { + /* skip RVLC-bitstream-part -- pointing now to escapes (if present) or to TNS + * data (if present) */ + FDKpushFor(bs, pRvlc->length_of_rvlc_sf); + if (pRvlc->sf_escapes_present != 0) { /* locate internal bitstream ptr at escapes (which is the second part) */ - FDKsyncCache (bs); + FDKsyncCache(bs); pRvlc->bitstreamIndexEsc = FDKgetBitCnt(bs); - /* skip escapeRVLC-bitstream-part -- pointing to TNS data (if present) to make decoder continue */ - /* decoding of RVLC should work despite this second pushFor during initialization because */ - /* bitstream initialization is valid for both ESC2 data parts (RVL-coded values and ESC-coded values) */ - FDKpushFor (bs, pRvlc->length_of_rvlc_escapes); + /* skip escapeRVLC-bitstream-part -- pointing to TNS data (if present) to + * make decoder continue */ + /* decoding of RVLC should work despite this second pushFor during + * initialization because */ + /* bitstream initialization is valid for both ESC2 data parts (RVL-coded + * values and ESC-coded values) */ + FDKpushFor(bs, pRvlc->length_of_rvlc_escapes); } - -#if VERBOSE_RVLC_INIT - DebugOutputInit(pRvlc,pAacDecoderChannelInfo); -#endif } - /*--------------------------------------------------------------------------------------------- function: rvlcCheckIntensityCb @@ -187,20 +207,22 @@ void rvlcInit (CErRvlcInfo *pRvlc, 1 intensity codebook is used ----------------------------------------------------------------------------------------------- return: - --------------------------------------------------------------------------------------------- */ +-------------------------------------------------------------------------------------------- +*/ -static -void rvlcCheckIntensityCb (CErRvlcInfo *pRvlc, - CAacDecoderChannelInfo *pAacDecoderChannelInfo) -{ +static void rvlcCheckIntensityCb( + CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { int group, band, bnds; pRvlc->intensity_used = 0; - for (group=0; group < pRvlc->numWindowGroups; group++) { - for (band=0; band < pRvlc->maxSfbTransmitted; band++) { - bnds = 16*group+band; - if ( (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == INTENSITY_HCB) || (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == INTENSITY_HCB2) ) { + for (group = 0; group < pRvlc->numWindowGroups; group++) { + for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { + bnds = 16 * group + band; + if ((pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == + INTENSITY_HCB) || + (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == + INTENSITY_HCB2)) { pRvlc->intensity_used = 1; break; } @@ -208,49 +230,46 @@ void rvlcCheckIntensityCb (CErRvlcInfo *pRvlc, } } - /*--------------------------------------------------------------------------------------------- function: rvlcDecodeEscapeWord - description: Decode a huffman coded RVLC Escape-word. This value is part of a DPCM coded - scalefactor. + description: Decode a huffman coded RVLC Escape-word. This value is part +of a DPCM coded scalefactor. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure ----------------------------------------------------------------------------------------------- - return: - a single RVLC-Escape value which had to be applied to a DPCM value (which - has a absolute value of 7) --------------------------------------------------------------------------------------------- */ - -static -SCHAR rvlcDecodeEscapeWord (CErRvlcInfo *pRvlc, - HANDLE_FDK_BITSTREAM bs) -{ - int i; - SCHAR value; - UCHAR carryBit; - UINT treeNode; - UINT branchValue; - UINT branchNode; - - USHORT* pBitstreamIndexEsc; - const UINT* pEscTree; + return: - a single RVLC-Escape value which had to be applied to a +DPCM value (which has a absolute value of 7) +-------------------------------------------------------------------------------------------- +*/ + +static SCHAR rvlcDecodeEscapeWord(CErRvlcInfo *pRvlc, HANDLE_FDK_BITSTREAM bs) { + int i; + SCHAR value; + UCHAR carryBit; + UINT treeNode; + UINT branchValue; + UINT branchNode; + + INT *pBitstreamIndexEsc; + const UINT *pEscTree; pEscTree = pRvlc->pHuffTreeRvlcEscape; pBitstreamIndexEsc = &(pRvlc->bitstreamIndexEsc); - treeNode = *pEscTree; /* init at starting node */ + treeNode = *pEscTree; /* init at starting node */ - for (i=MAX_LEN_RVLC_ESCAPE_WORD-1; i >= 0; i--) { - carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */ - pBitstreamIndexEsc, - FWD); + for (i = MAX_LEN_RVLC_ESCAPE_WORD - 1; i >= 0; i--) { + carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */ + pBitstreamIndexEsc, FWD); - CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in huffman decoding tree */ - treeNode, - &branchValue, - &branchNode); + CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in + huffman decoding tree */ + treeNode, &branchValue, &branchNode); - if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-escape-word is completely decoded */ - value = (SCHAR) branchNode & CLR_BIT_10; + if ((branchNode & TEST_BIT_10) == + TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-escape-word is + completely decoded */ + value = (SCHAR)branchNode & CLR_BIT_10; pRvlc->length_of_rvlc_escapes -= (MAX_LEN_RVLC_ESCAPE_WORD - i); if (pRvlc->length_of_rvlc_escapes < 0) { @@ -259,32 +278,33 @@ SCHAR rvlcDecodeEscapeWord (CErRvlcInfo *pRvlc, } return value; - } - else { - treeNode = *(pEscTree + branchValue); /* update treeNode for further step in decoding tree */ + } else { + treeNode = *( + pEscTree + + branchValue); /* update treeNode for further step in decoding tree */ } } pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; - return -1; /* should not be reached */ + return -1; /* should not be reached */ } - /*--------------------------------------------------------------------------------------------- function: rvlcDecodeEscapes description: Decodes all huffman coded RVLC Escape Words. - Here a difference to the pseudo-code-implementation from standard can be - found. A while loop (and not two nested for loops) is used for two reasons: + Here a difference to the pseudo-code-implementation from +standard can be found. A while loop (and not two nested for loops) is used for +two reasons: - 1. The plain huffman encoded escapes are decoded before the RVL-coded - scalefactors. Therefore the escapes are present in the second step - when decoding the RVL-coded-scalefactor values in forward and - backward direction. + 1. The plain huffman encoded escapes are decoded before the +RVL-coded scalefactors. Therefore the escapes are present in the second step + when decoding the RVL-coded-scalefactor values in forward +and backward direction. - When the RVL-coded scalefactors are decoded and there a escape is - needed, then it is just taken out of the array in ascending order. + When the RVL-coded scalefactors are decoded and there a +escape is needed, then it is just taken out of the array in ascending order. 2. It's faster. ----------------------------------------------------------------------------------------------- @@ -294,29 +314,25 @@ SCHAR rvlcDecodeEscapeWord (CErRvlcInfo *pRvlc, return: - 0 ok the decoded escapes seem to be valid - 1 error there was a error detected during decoding escapes --> all escapes are invalid --------------------------------------------------------------------------------------------- */ +-------------------------------------------------------------------------------------------- +*/ -static -void rvlcDecodeEscapes (CErRvlcInfo *pRvlc, - SHORT *pEsc, - HANDLE_FDK_BITSTREAM bs) -{ - SCHAR escWord; - SCHAR escCnt=0; - SHORT* pEscBitCntSum; +static void rvlcDecodeEscapes(CErRvlcInfo *pRvlc, SHORT *pEsc, + HANDLE_FDK_BITSTREAM bs) { + SCHAR escWord; + SCHAR escCnt = 0; + SHORT *pEscBitCntSum; pEscBitCntSum = &(pRvlc->length_of_rvlc_escapes); /* Decode all RVLC-Escape words with a plain Huffman-Decoder */ - while ( *pEscBitCntSum > 0 ) { + while (*pEscBitCntSum > 0) { escWord = rvlcDecodeEscapeWord(pRvlc, bs); if (escWord >= 0) { - pEsc[escCnt] = escWord; escCnt++; - } - else { + } else { pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; pRvlc->numDecodedEscapeWordsEsc = escCnt; @@ -327,7 +343,6 @@ void rvlcDecodeEscapes (CErRvlcInfo *pRvlc, pRvlc->numDecodedEscapeWordsEsc = escCnt; } - /*--------------------------------------------------------------------------------------------- function: decodeRVLCodeword @@ -336,68 +351,71 @@ void rvlcDecodeEscapes (CErRvlcInfo *pRvlc, input: - FDK bitstream handle - pointer rvlc structure ----------------------------------------------------------------------------------------------- - return: - a dpcm value which is within range [0,1,..,14] in case of no errors. - The offset of 7 must be subtracted to get a valid dpcm scalefactor value. - In case of errors a forbidden codeword is detected --> returning -1 --------------------------------------------------------------------------------------------- */ - -SCHAR decodeRVLCodeword (HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc) -{ - int i; - SCHAR value; - UCHAR carryBit; - UINT branchValue; - UINT branchNode; + return: - a dpcm value which is within range [0,1,..,14] in case of +no errors. The offset of 7 must be subtracted to get a valid dpcm scalefactor +value. In case of errors a forbidden codeword is detected --> returning -1 +-------------------------------------------------------------------------------------------- +*/ + +SCHAR decodeRVLCodeword(HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc) { + int i; + SCHAR value; + UCHAR carryBit; + UINT branchValue; + UINT branchNode; const UINT *pRvlCodeTree = pRvlc->pHuffTreeRvlCodewds; - UCHAR direction = pRvlc->direction; - USHORT *pBitstrIndxRvl = pRvlc->pBitstrIndxRvl_RVL; - UINT treeNode = *pRvlCodeTree; - - for (i=MAX_LEN_RVLC_CODE_WORD-1; i >= 0; i--) { - carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */ - pBitstrIndxRvl, - direction); - - CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in huffman decoding tree */ - treeNode, - &branchValue, - &branchNode); - - if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-codeword is completely decoded */ - value = (SCHAR) (branchNode & CLR_BIT_10); - *pRvlc->pRvlBitCnt_RVL -= (MAX_LEN_RVLC_CODE_WORD - i); - + UCHAR direction = pRvlc->direction; + INT *pBitstrIndxRvl = pRvlc->pBitstrIndxRvl_RVL; + UINT treeNode = *pRvlCodeTree; + + for (i = MAX_LEN_RVLC_CODE_WORD - 1; i >= 0; i--) { + carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */ + pBitstrIndxRvl, direction); + + CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in + huffman decoding tree */ + treeNode, &branchValue, &branchNode); + + if ((branchNode & TEST_BIT_10) == + TEST_BIT_10) { /* test bit 10 ; if set --> a + RVLC-codeword is completely decoded + */ + value = (SCHAR)(branchNode & CLR_BIT_10); + *pRvlc->pRvlBitCnt_RVL -= (MAX_LEN_RVLC_CODE_WORD - i); + /* check available bits for decoding */ if (*pRvlc->pRvlBitCnt_RVL < 0) { - if (direction == FWD) { - pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD; } - else { - pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD; } - value = -1; /* signalize an error in return value, because too many bits was decoded */ + if (direction == FWD) { + pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD; + } else { + pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD; + } + value = -1; /* signalize an error in return value, because too many bits + was decoded */ } - + /* check max value of dpcm value */ if (value > MAX_ALLOWED_DPCM_INDEX) { - if (direction == FWD) { - pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD; - } - else { - pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD; + if (direction == FWD) { + pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD; + } else { + pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD; } - value = -1; /* signalize an error in return value, because a forbidden cw was detected*/ - } + value = -1; /* signalize an error in return value, because a forbidden + cw was detected*/ + } - return value; /* return a dpcm value with offset +7 or an error status */ - } - else { - treeNode = *(pRvlCodeTree + branchValue); /* update treeNode for further step in decoding tree */ + return value; /* return a dpcm value with offset +7 or an error status */ + } else { + treeNode = *( + pRvlCodeTree + + branchValue); /* update treeNode for further step in decoding tree */ } } - - return -1; -} + return -1; +} /*--------------------------------------------------------------------------------------------- function: rvlcDecodeForward @@ -409,94 +427,122 @@ SCHAR decodeRVLCodeword (HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc) - handle to FDK bitstream ----------------------------------------------------------------------------------------------- return: - --------------------------------------------------------------------------------------------- */ - -static -void rvlcDecodeForward (CErRvlcInfo *pRvlc, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - HANDLE_FDK_BITSTREAM bs) -{ - int band = 0; +-------------------------------------------------------------------------------------------- +*/ + +static void rvlcDecodeForward(CErRvlcInfo *pRvlc, + CAacDecoderChannelInfo *pAacDecoderChannelInfo, + HANDLE_FDK_BITSTREAM bs) { + int band = 0; int group = 0; - int bnds = 0; + int bnds = 0; SHORT dpcm; - SHORT factor = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; - SHORT position = - SF_OFFSET; - SHORT noisenrg = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256; + SHORT factor = + pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; + SHORT position = -SF_OFFSET; + SHORT noisenrg = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - + SF_OFFSET - 90 - 256; + + SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; + SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; + UCHAR *pEscFwdCnt = &(pRvlc->numDecodedEscapeWordsFwd); - SHORT* pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; - SHORT* pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; - UCHAR* pEscFwdCnt = &(pRvlc->numDecodedEscapeWordsFwd); - pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_fwd); pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlFwd); - *pEscFwdCnt = 0; - pRvlc->direction = FWD; + *pEscFwdCnt = 0; + pRvlc->direction = FWD; pRvlc->noise_used = 0; - pRvlc->sf_used = 0; - pRvlc->lastScf = 0; - pRvlc->lastNrg = 0; - pRvlc->lastIs = 0; + pRvlc->sf_used = 0; + pRvlc->lastScf = 0; + pRvlc->lastNrg = 0; + pRvlc->lastIs = 0; - rvlcCheckIntensityCb(pRvlc,pAacDecoderChannelInfo); + rvlcCheckIntensityCb(pRvlc, pAacDecoderChannelInfo); /* main loop fwd long */ - for (group=0; group < pRvlc->numWindowGroups; group++) { - for (band=0; band < pRvlc->maxSfbTransmitted; band++) { - bnds = 16*group+band; + for (group = 0; group < pRvlc->numWindowGroups; group++) { + for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { + bnds = 16 * group + band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { + case ZERO_HCB: + pScfFwd[bnds] = 0; + break; - case ZERO_HCB : - pScfFwd[bnds] = 0; - break; - - case INTENSITY_HCB2 : - case INTENSITY_HCB : - /* store dpcm_is_position */ - dpcm = decodeRVLCodeword(bs, pRvlc); - if ( dpcm < 0 ) { - pRvlc->conceal_max = bnds; - return; - } - dpcm -= TABLE_OFFSET; - if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { - if (pRvlc->length_of_rvlc_escapes) { + case INTENSITY_HCB2: + case INTENSITY_HCB: + /* store dpcm_is_position */ + dpcm = decodeRVLCodeword(bs, pRvlc); + if (dpcm < 0) { pRvlc->conceal_max = bnds; return; } - else { - if (dpcm == MIN_RVL) { - dpcm -= *pScfEsc++; + dpcm -= TABLE_OFFSET; + if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { + if (pRvlc->length_of_rvlc_escapes) { + pRvlc->conceal_max = bnds; + return; + } else { + if (dpcm == MIN_RVL) { + dpcm -= *pScfEsc++; + } else { + dpcm += *pScfEsc++; + } + (*pEscFwdCnt)++; + if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { + pRvlc->conceal_max_esc = bnds; + } } - else { - dpcm += *pScfEsc++; + } + position += dpcm; + pScfFwd[bnds] = position; + pRvlc->lastIs = position; + break; + + case NOISE_HCB: + if (pRvlc->noise_used == 0) { + pRvlc->noise_used = 1; + pRvlc->first_noise_band = bnds; + noisenrg += pRvlc->dpcm_noise_nrg; + pScfFwd[bnds] = 100 + noisenrg; + pRvlc->lastNrg = noisenrg; + } else { + dpcm = decodeRVLCodeword(bs, pRvlc); + if (dpcm < 0) { + pRvlc->conceal_max = bnds; + return; } - (*pEscFwdCnt)++; - if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { - pRvlc->conceal_max_esc = bnds; + dpcm -= TABLE_OFFSET; + if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { + if (pRvlc->length_of_rvlc_escapes) { + pRvlc->conceal_max = bnds; + return; + } else { + if (dpcm == MIN_RVL) { + dpcm -= *pScfEsc++; + } else { + dpcm += *pScfEsc++; + } + (*pEscFwdCnt)++; + if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { + pRvlc->conceal_max_esc = bnds; + } + } } + noisenrg += dpcm; + pScfFwd[bnds] = 100 + noisenrg; + pRvlc->lastNrg = noisenrg; } - } - position += dpcm; - pScfFwd[bnds] = position; - pRvlc->lastIs = position; - break; + pAacDecoderChannelInfo->data.aac.PnsData.pnsUsed[bnds] = 1; + break; - case NOISE_HCB : - if (pRvlc->noise_used == 0) { - pRvlc->noise_used = 1; - pRvlc->first_noise_band = bnds; - noisenrg += pRvlc->dpcm_noise_nrg; - pScfFwd[bnds] = 100 + noisenrg; - pRvlc->lastNrg = noisenrg; - } - else { + default: + pRvlc->sf_used = 1; dpcm = decodeRVLCodeword(bs, pRvlc); - if ( dpcm < 0 ) { + if (dpcm < 0) { pRvlc->conceal_max = bnds; return; } @@ -505,13 +551,11 @@ void rvlcDecodeForward (CErRvlcInfo *pRvlc, if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_max = bnds; return; - } - else { - if (dpcm == MIN_RVL) { - dpcm -= *pScfEsc++; - } - else { - dpcm += *pScfEsc++; + } else { + if (dpcm == MIN_RVL) { + dpcm -= *pScfEsc++; + } else { + dpcm += *pScfEsc++; } (*pEscFwdCnt)++; if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { @@ -519,50 +563,18 @@ void rvlcDecodeForward (CErRvlcInfo *pRvlc, } } } - noisenrg += dpcm; - pScfFwd[bnds] = 100 + noisenrg; - pRvlc->lastNrg = noisenrg; - } - pAacDecoderChannelInfo->data.aac.PnsData.pnsUsed[bnds] = 1; - break ; - - default : - pRvlc->sf_used = 1; - dpcm = decodeRVLCodeword(bs, pRvlc); - if ( dpcm < 0 ) { - pRvlc->conceal_max = bnds; - return; - } - dpcm -= TABLE_OFFSET; - if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { - if (pRvlc->length_of_rvlc_escapes) { - pRvlc->conceal_max = bnds; - return; - } - else { - if (dpcm == MIN_RVL) { - dpcm -= *pScfEsc++; } - else { - dpcm += *pScfEsc++; - } - (*pEscFwdCnt)++; - if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { - pRvlc->conceal_max_esc = bnds; - } - } - } - factor += dpcm; - pScfFwd[bnds] = factor; - pRvlc->lastScf = factor; - break; + factor += dpcm; + pScfFwd[bnds] = factor; + pRvlc->lastScf = factor; + break; } } } /* postfetch fwd long */ if (pRvlc->intensity_used) { - dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ - if ( dpcm < 0 ) { + dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ + if (dpcm < 0) { pRvlc->conceal_max = bnds; return; } @@ -571,15 +583,13 @@ void rvlcDecodeForward (CErRvlcInfo *pRvlc, if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_max = bnds; return; - } - else { - if (dpcm == MIN_RVL) { - dpcm -= *pScfEsc++; - } - else { - dpcm += *pScfEsc++; + } else { + if (dpcm == MIN_RVL) { + dpcm -= *pScfEsc++; + } else { + dpcm += *pScfEsc++; } - (*pEscFwdCnt)++; + (*pEscFwdCnt)++; if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { pRvlc->conceal_max_esc = bnds; } @@ -589,7 +599,6 @@ void rvlcDecodeForward (CErRvlcInfo *pRvlc, } } - /*--------------------------------------------------------------------------------------------- function: rvlcDecodeBackward @@ -600,22 +609,22 @@ void rvlcDecodeForward (CErRvlcInfo *pRvlc, - handle FDK bitstream ----------------------------------------------------------------------------------------------- return: - --------------------------------------------------------------------------------------------- */ - -static -void rvlcDecodeBackward (CErRvlcInfo *pRvlc, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - HANDLE_FDK_BITSTREAM bs) -{ - SHORT band, group, dpcm, offset; - SHORT bnds = pRvlc->maxSfbTransmitted-1; - - SHORT factor = pRvlc->rev_global_gain - SF_OFFSET; - SHORT position = pRvlc->dpcm_is_last_position - SF_OFFSET; - SHORT noisenrg = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256; - - SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; - SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; +-------------------------------------------------------------------------------------------- +*/ + +static void rvlcDecodeBackward(CErRvlcInfo *pRvlc, + CAacDecoderChannelInfo *pAacDecoderChannelInfo, + HANDLE_FDK_BITSTREAM bs) { + SHORT band, group, dpcm, offset; + SHORT bnds = pRvlc->maxSfbTransmitted - 1; + + SHORT factor = pRvlc->rev_global_gain - SF_OFFSET; + SHORT position = pRvlc->dpcm_is_last_position - SF_OFFSET; + SHORT noisenrg = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - + SF_OFFSET - 90 - 256; + + SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; + SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; UCHAR *pEscEscCnt = &(pRvlc->numDecodedEscapeWordsEsc); UCHAR *pEscBwdCnt = &(pRvlc->numDecodedEscapeWordsBwd); @@ -624,15 +633,15 @@ void rvlcDecodeBackward (CErRvlcInfo *pRvlc, *pEscBwdCnt = 0; pRvlc->direction = BWD; - pScfEsc += *pEscEscCnt - 1; /* set pScfEsc to last entry */ + pScfEsc += *pEscEscCnt - 1; /* set pScfEsc to last entry */ pRvlc->firstScf = 0; pRvlc->firstNrg = 0; pRvlc->firstIs = 0; /* prefetch long BWD */ if (pRvlc->intensity_used) { - dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ - if ( dpcm < 0 ) { + dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ + if (dpcm < 0) { pRvlc->dpcm_is_last_position = 0; pRvlc->conceal_min = bnds; return; @@ -642,15 +651,13 @@ void rvlcDecodeBackward (CErRvlcInfo *pRvlc, if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_min = bnds; return; - } - else { + } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc--; - } - else { + } else { dpcm += *pScfEsc--; } - (*pEscBwdCnt)++; + (*pEscBwdCnt)++; if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { pRvlc->conceal_min_esc = bnds; } @@ -660,171 +667,162 @@ void rvlcDecodeBackward (CErRvlcInfo *pRvlc, } /* main loop long BWD */ - for (group=pRvlc->numWindowGroups-1; group >= 0; group--) { - for (band=pRvlc->maxSfbTransmitted-1; band >= 0; band--) { - bnds = 16*group+band; + for (group = pRvlc->numWindowGroups - 1; group >= 0; group--) { + for (band = pRvlc->maxSfbTransmitted - 1; band >= 0; band--) { + bnds = 16 * group + band; if ((band == 0) && (pRvlc->numWindowGroups != 1)) offset = 16 - pRvlc->maxSfbTransmitted + 1; else offset = 1; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { + case ZERO_HCB: + pScfBwd[bnds] = 0; + break; - case ZERO_HCB : - pScfBwd[bnds] = 0; - break; - - case INTENSITY_HCB2 : - case INTENSITY_HCB : - /* store dpcm_is_position */ - dpcm = decodeRVLCodeword(bs, pRvlc); - if ( dpcm < 0 ) { - pScfBwd[bnds] = position; - pRvlc->conceal_min = FDKmax(0,bnds-offset); - return; - } - dpcm -= TABLE_OFFSET; - if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { - if (pRvlc->length_of_rvlc_escapes) { + case INTENSITY_HCB2: + case INTENSITY_HCB: + /* store dpcm_is_position */ + dpcm = decodeRVLCodeword(bs, pRvlc); + if (dpcm < 0) { pScfBwd[bnds] = position; - pRvlc->conceal_min = FDKmax(0,bnds-offset); + pRvlc->conceal_min = fMax(0, bnds - offset); return; } - else { - if (dpcm == MIN_RVL) { - dpcm -= *pScfEsc--; + dpcm -= TABLE_OFFSET; + if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { + if (pRvlc->length_of_rvlc_escapes) { + pScfBwd[bnds] = position; + pRvlc->conceal_min = fMax(0, bnds - offset); + return; + } else { + if (dpcm == MIN_RVL) { + dpcm -= *pScfEsc--; + } else { + dpcm += *pScfEsc--; + } + (*pEscBwdCnt)++; + if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { + pRvlc->conceal_min_esc = fMax(0, bnds - offset); + } } - else { - dpcm += *pScfEsc--; + } + pScfBwd[bnds] = position; + position -= dpcm; + pRvlc->firstIs = position; + break; + + case NOISE_HCB: + if (bnds == pRvlc->first_noise_band) { + pScfBwd[bnds] = + pRvlc->dpcm_noise_nrg + + pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - + SF_OFFSET - 90 - 256; + pRvlc->firstNrg = pScfBwd[bnds]; + } else { + dpcm = decodeRVLCodeword(bs, pRvlc); + if (dpcm < 0) { + pScfBwd[bnds] = noisenrg; + pRvlc->conceal_min = fMax(0, bnds - offset); + return; } - (*pEscBwdCnt)++; - if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { - pRvlc->conceal_min_esc = FDKmax(0,bnds-offset); + dpcm -= TABLE_OFFSET; + if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { + if (pRvlc->length_of_rvlc_escapes) { + pScfBwd[bnds] = noisenrg; + pRvlc->conceal_min = fMax(0, bnds - offset); + return; + } else { + if (dpcm == MIN_RVL) { + dpcm -= *pScfEsc--; + } else { + dpcm += *pScfEsc--; + } + (*pEscBwdCnt)++; + if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { + pRvlc->conceal_min_esc = fMax(0, bnds - offset); + } + } } + pScfBwd[bnds] = noisenrg; + noisenrg -= dpcm; + pRvlc->firstNrg = noisenrg; } - } - pScfBwd[bnds] = position; - position -= dpcm; - pRvlc->firstIs = position; - break; + break; - case NOISE_HCB : - if ( bnds == pRvlc->first_noise_band ) { - pScfBwd[bnds] = pRvlc->dpcm_noise_nrg + pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256; - pRvlc->firstNrg = pScfBwd[bnds]; - } - else { + default: dpcm = decodeRVLCodeword(bs, pRvlc); - if ( dpcm < 0 ) { - pScfBwd[bnds] = noisenrg; - pRvlc->conceal_min = FDKmax(0,bnds-offset); + if (dpcm < 0) { + pScfBwd[bnds] = factor; + pRvlc->conceal_min = fMax(0, bnds - offset); return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { - pScfBwd[bnds] = noisenrg; - pRvlc->conceal_min = FDKmax(0,bnds-offset); + pScfBwd[bnds] = factor; + pRvlc->conceal_min = fMax(0, bnds - offset); return; - } - else { + } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc--; - } - else { + } else { dpcm += *pScfEsc--; } (*pEscBwdCnt)++; if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { - pRvlc->conceal_min_esc = FDKmax(0,bnds-offset); + pRvlc->conceal_min_esc = fMax(0, bnds - offset); } } } - pScfBwd[bnds] = noisenrg; - noisenrg -= dpcm; - pRvlc->firstNrg = noisenrg; - } - break ; - - default : - dpcm = decodeRVLCodeword(bs, pRvlc); - if ( dpcm < 0 ) { pScfBwd[bnds] = factor; - pRvlc->conceal_min = FDKmax(0,bnds-offset); - return; - } - dpcm -= TABLE_OFFSET; - if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { - if (pRvlc->length_of_rvlc_escapes) { - pScfBwd[bnds] = factor; - pRvlc->conceal_min = FDKmax(0,bnds-offset); - return; - } - else { - if (dpcm == MIN_RVL) { - dpcm -= *pScfEsc--; - } - else { - dpcm += *pScfEsc--; - } - (*pEscBwdCnt)++; - if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { - pRvlc->conceal_min_esc = FDKmax(0,bnds-offset); - } - } - } - pScfBwd[bnds] = factor; - factor -= dpcm; - pRvlc->firstScf = factor; - break; + factor -= dpcm; + pRvlc->firstScf = factor; + break; } } } } - /*--------------------------------------------------------------------------------------------- - function: rvlcFinalErrorDetection + function: rvlcFinalErrorDetection - description: Call RVLC concealment if error was detected in decoding process + description: Call RVLC concealment if error was detected in decoding +process ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure ----------------------------------------------------------------------------------------------- return: - --------------------------------------------------------------------------------------------- */ - -static -void rvlcFinalErrorDetection (CAacDecoderChannelInfo *pAacDecoderChannelInfo, - CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) -{ - CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; - UCHAR ErrorStatusComplete = 0; - UCHAR ErrorStatusLengthFwd = 0; - UCHAR ErrorStatusLengthBwd = 0; - UCHAR ErrorStatusLengthEscapes = 0; - UCHAR ErrorStatusFirstScf = 0; - UCHAR ErrorStatusLastScf = 0; - UCHAR ErrorStatusFirstNrg = 0; - UCHAR ErrorStatusLastNrg = 0; - UCHAR ErrorStatusFirstIs = 0; - UCHAR ErrorStatusLastIs = 0; +-------------------------------------------------------------------------------------------- +*/ + +static void rvlcFinalErrorDetection( + CAacDecoderChannelInfo *pAacDecoderChannelInfo, + CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) { + CErRvlcInfo *pRvlc = + &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; + UCHAR ErrorStatusComplete = 0; + UCHAR ErrorStatusLengthFwd = 0; + UCHAR ErrorStatusLengthBwd = 0; + UCHAR ErrorStatusLengthEscapes = 0; + UCHAR ErrorStatusFirstScf = 0; + UCHAR ErrorStatusLastScf = 0; + UCHAR ErrorStatusFirstNrg = 0; + UCHAR ErrorStatusLastNrg = 0; + UCHAR ErrorStatusFirstIs = 0; + UCHAR ErrorStatusLastIs = 0; UCHAR ErrorStatusForbiddenCwFwd = 0; UCHAR ErrorStatusForbiddenCwBwd = 0; - UCHAR ErrorStatusNumEscapesFwd = 0; - UCHAR ErrorStatusNumEscapesBwd = 0; - UCHAR ConcealStatus = 1; - UCHAR currentBlockType; /* short: 0, not short: 1*/ - -#if VERBOSE_RVLC_OUTPUT - CHAR Strategy[60]="No"; - SHORT conceal_max; - SHORT conceal_min; -#endif + UCHAR ErrorStatusNumEscapesFwd = 0; + UCHAR ErrorStatusNumEscapesBwd = 0; + UCHAR ConcealStatus = 1; + UCHAR currentBlockType; /* short: 0, not short: 1*/ pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 1; - /* invalid escape words, bit counter unequal zero, forbidden codeword detected */ + /* invalid escape words, bit counter unequal zero, forbidden codeword detected + */ if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD) ErrorStatusForbiddenCwFwd = 1; @@ -832,100 +830,102 @@ void rvlcFinalErrorDetection (CAacDecoderChannelInfo *pAacDecoderChannelInfo, ErrorStatusForbiddenCwBwd = 1; /* bit counter forward unequal zero */ - if (pRvlc->length_of_rvlc_sf_fwd) - ErrorStatusLengthFwd = 1; + if (pRvlc->length_of_rvlc_sf_fwd) ErrorStatusLengthFwd = 1; /* bit counter backward unequal zero */ - if (pRvlc->length_of_rvlc_sf_bwd) - ErrorStatusLengthBwd = 1; + if (pRvlc->length_of_rvlc_sf_bwd) ErrorStatusLengthBwd = 1; /* bit counter escape sequences unequal zero */ if (pRvlc->sf_escapes_present) - if (pRvlc->length_of_rvlc_escapes) - ErrorStatusLengthEscapes = 1; + if (pRvlc->length_of_rvlc_escapes) ErrorStatusLengthEscapes = 1; if (pRvlc->sf_used) { /* first decoded scf does not match to global gain in backward direction */ - if (pRvlc->firstScf != (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET) ) + if (pRvlc->firstScf != + (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET)) ErrorStatusFirstScf = 1; - /* last decoded scf does not match to rev global gain in forward direction */ - if (pRvlc->lastScf != (pRvlc->rev_global_gain - SF_OFFSET) ) + /* last decoded scf does not match to rev global gain in forward direction + */ + if (pRvlc->lastScf != (pRvlc->rev_global_gain - SF_OFFSET)) ErrorStatusLastScf = 1; } if (pRvlc->noise_used) { - /* first decoded nrg does not match to dpcm_noise_nrg in backward direction */ - if (pRvlc->firstNrg != (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain + pRvlc->dpcm_noise_nrg - SF_OFFSET -90 - 256) ) + /* first decoded nrg does not match to dpcm_noise_nrg in backward direction + */ + if (pRvlc->firstNrg != + (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain + + pRvlc->dpcm_noise_nrg - SF_OFFSET - 90 - 256)) ErrorStatusFirstNrg = 1; - /* last decoded nrg does not match to dpcm_noise_last_position in forward direction */ - if (pRvlc->lastNrg != (pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256) ) + /* last decoded nrg does not match to dpcm_noise_last_position in forward + * direction */ + if (pRvlc->lastNrg != + (pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - + 90 - 256)) ErrorStatusLastNrg = 1; } if (pRvlc->intensity_used) { /* first decoded is position does not match in backward direction */ - if (pRvlc->firstIs != (-SF_OFFSET) ) - ErrorStatusFirstIs = 1; + if (pRvlc->firstIs != (-SF_OFFSET)) ErrorStatusFirstIs = 1; /* last decoded is position does not match in forward direction */ - if (pRvlc->lastIs != (pRvlc->dpcm_is_last_position - SF_OFFSET) ) + if (pRvlc->lastIs != (pRvlc->dpcm_is_last_position - SF_OFFSET)) ErrorStatusLastIs = 1; } /* decoded escapes and used escapes in forward direction do not fit */ - if ((pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && (pRvlc->conceal_max == CONCEAL_MAX_INIT)) { + if ((pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && + (pRvlc->conceal_max == CONCEAL_MAX_INIT)) { ErrorStatusNumEscapesFwd = 1; } /* decoded escapes and used escapes in backward direction do not fit */ - if ((pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { + if ((pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && + (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { ErrorStatusNumEscapesBwd = 1; } -#if VERBOSE_RVLC_OUTPUT - conceal_max = pRvlc->conceal_max; - conceal_min = pRvlc->conceal_min; -#endif - - if ( ErrorStatusLengthEscapes - || ( - ( (pRvlc->conceal_max == CONCEAL_MAX_INIT) - && (pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) - && (ErrorStatusLastScf || ErrorStatusLastNrg || ErrorStatusLastIs) ) - - && - - ( (pRvlc->conceal_min == CONCEAL_MIN_INIT) - && (pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) - && (ErrorStatusFirstScf || ErrorStatusFirstNrg || ErrorStatusFirstIs) ) - ) - || ( (pRvlc->conceal_max == CONCEAL_MAX_INIT) - && ((pRvlc->rev_global_gain - SF_OFFSET - pRvlc->lastScf) < -15) - ) - || ( (pRvlc->conceal_min == CONCEAL_MIN_INIT) - && ((pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - pRvlc->firstScf) < -15) - ) - ) { - if ((pRvlc->conceal_max == CONCEAL_MAX_INIT) || (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { - pRvlc->conceal_max = 0; - pRvlc->conceal_min = FDKmax(0, (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1); - } - else { - pRvlc->conceal_max = FDKmin(pRvlc->conceal_max,pRvlc->conceal_max_esc); - pRvlc->conceal_min = FDKmax(pRvlc->conceal_min,pRvlc->conceal_min_esc); + if (ErrorStatusLengthEscapes || + (((pRvlc->conceal_max == CONCEAL_MAX_INIT) && + (pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && + (ErrorStatusLastScf || ErrorStatusLastNrg || ErrorStatusLastIs)) + + && + + ((pRvlc->conceal_min == CONCEAL_MIN_INIT) && + (pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && + (ErrorStatusFirstScf || ErrorStatusFirstNrg || ErrorStatusFirstIs))) || + ((pRvlc->conceal_max == CONCEAL_MAX_INIT) && + ((pRvlc->rev_global_gain - SF_OFFSET - pRvlc->lastScf) < -15)) || + ((pRvlc->conceal_min == CONCEAL_MIN_INIT) && + ((pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - + pRvlc->firstScf) < -15))) { + if ((pRvlc->conceal_max == CONCEAL_MAX_INIT) || + (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { + pRvlc->conceal_max = 0; + pRvlc->conceal_min = fMax( + 0, (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1); + } else { + pRvlc->conceal_max = fMin(pRvlc->conceal_max, pRvlc->conceal_max_esc); + pRvlc->conceal_min = fMax(pRvlc->conceal_min, pRvlc->conceal_min_esc); } } - ErrorStatusComplete = ErrorStatusLastScf || ErrorStatusFirstScf || ErrorStatusLastNrg || ErrorStatusFirstNrg - || ErrorStatusLastIs || ErrorStatusFirstIs || ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd - || ErrorStatusLengthFwd || ErrorStatusLengthBwd || ErrorStatusLengthEscapes || ErrorStatusNumEscapesFwd - || ErrorStatusNumEscapesBwd; + ErrorStatusComplete = ErrorStatusLastScf || ErrorStatusFirstScf || + ErrorStatusLastNrg || ErrorStatusFirstNrg || + ErrorStatusLastIs || ErrorStatusFirstIs || + ErrorStatusForbiddenCwFwd || + ErrorStatusForbiddenCwBwd || ErrorStatusLengthFwd || + ErrorStatusLengthBwd || ErrorStatusLengthEscapes || + ErrorStatusNumEscapesFwd || ErrorStatusNumEscapesBwd; - currentBlockType = (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) ? 0 : 1; + currentBlockType = + (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) ? 0 + : 1; - if (!ErrorStatusComplete) { int band; int group; @@ -934,111 +934,115 @@ void rvlcFinalErrorDetection (CAacDecoderChannelInfo *pAacDecoderChannelInfo, lastSfbIndex = (pRvlc->numWindowGroups > 1) ? 16 : 64; - for (group=0; group < pRvlc->numWindowGroups; group++) { - for (band=0; band<pRvlc->maxSfbTransmitted; band++) { - bnds = 16*group+band; - pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; + for (group = 0; group < pRvlc->numWindowGroups; group++) { + for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { + bnds = 16 * group + band; + pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = + pAacDecoderStaticChannelInfo->concealmentInfo + .aRvlcPreviousScaleFactor[bnds] = + pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; } } - for (group=0; group < pRvlc->numWindowGroups; group++) - { - for (band=0; band<pRvlc->maxSfbTransmitted; band++) { - bnds = 16*group+band; - pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds] = pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]; + for (group = 0; group < pRvlc->numWindowGroups; group++) { + for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { + bnds = 16 * group + band; + pAacDecoderStaticChannelInfo->concealmentInfo + .aRvlcPreviousCodebook[bnds] = + pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]; } - for (; band <lastSfbIndex; band++) { - bnds = 16*group+band; + for (; band < lastSfbIndex; band++) { + bnds = 16 * group + band; FDK_ASSERT(bnds >= 0 && bnds < RVLC_MAX_SFB); - pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds] = ZERO_HCB; + pAacDecoderStaticChannelInfo->concealmentInfo + .aRvlcPreviousCodebook[bnds] = ZERO_HCB; } } - } - else { + } else { int band; int group; - /* A single bit error was detected in decoding of dpcm values. It also could be an error with more bits in decoding - of escapes and dpcm values whereby an illegal codeword followed not directly after the corrupted bits but just - after decoding some more (wrong) scalefactors. Use the smaller scalefactor from forward decoding, backward decoding - and previous frame. */ - if ( ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && (pRvlc->conceal_min <= pRvlc->conceal_max) - && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType) && pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK - && pRvlc->sf_concealment && ConcealStatus ) - { - BidirectionalEstimation_UseScfOfPrevFrameAsReference (pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); - ConcealStatus=0; -#if VERBOSE_RVLC_OUTPUT - FDKstrcpy(Strategy,"Yes (BidirectionalEstimation_UseScfOfPrevFrameAsReference)"); -#endif + /* A single bit error was detected in decoding of dpcm values. It also could + be an error with more bits in decoding of escapes and dpcm values whereby + an illegal codeword followed not directly after the corrupted bits but + just after decoding some more (wrong) scalefactors. Use the smaller + scalefactor from forward decoding, backward decoding and previous frame. + */ + if (((pRvlc->conceal_min != CONCEAL_MIN_INIT) || + (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && + (pRvlc->conceal_min <= pRvlc->conceal_max) && + (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == + currentBlockType) && + pAacDecoderStaticChannelInfo->concealmentInfo + .rvlcPreviousScaleFactorOK && + pRvlc->sf_concealment && ConcealStatus) { + BidirectionalEstimation_UseScfOfPrevFrameAsReference( + pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); + ConcealStatus = 0; } - /* A single bit error was detected in decoding of dpcm values. It also could be an error with more bits in decoding - of escapes and dpcm values whereby an illegal codeword followed not directly after the corrupted bits but just - after decoding some more (wrong) scalefactors. Use the smaller scalefactor from forward and backward decoding. */ - if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || (pRvlc->conceal_max != CONCEAL_MAX_INIT)) - && !(pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType)) - && ConcealStatus ) - { - BidirectionalEstimation_UseLowerScfOfCurrentFrame (pAacDecoderChannelInfo); - ConcealStatus=0; -#if VERBOSE_RVLC_OUTPUT - FDKstrcpy(Strategy,"Yes (BidirectionalEstimation_UseLowerScfOfCurrentFrame)"); -#endif + /* A single bit error was detected in decoding of dpcm values. It also could + be an error with more bits in decoding of escapes and dpcm values whereby + an illegal codeword followed not directly after the corrupted bits but + just after decoding some more (wrong) scalefactors. Use the smaller + scalefactor from forward and backward decoding. */ + if ((pRvlc->conceal_min <= pRvlc->conceal_max) && + ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || + (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && + !(pAacDecoderStaticChannelInfo->concealmentInfo + .rvlcPreviousScaleFactorOK && + pRvlc->sf_concealment && + (pAacDecoderStaticChannelInfo->concealmentInfo + .rvlcPreviousBlockType == currentBlockType)) && + ConcealStatus) { + BidirectionalEstimation_UseLowerScfOfCurrentFrame(pAacDecoderChannelInfo); + ConcealStatus = 0; } - /* No errors were detected in decoding of escapes and dpcm values however the first and last value - of a group (is,nrg,sf) is incorrect */ - if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && ((ErrorStatusLastScf && ErrorStatusFirstScf) - || (ErrorStatusLastNrg && ErrorStatusFirstNrg) || (ErrorStatusLastIs && ErrorStatusFirstIs)) - && !(ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd || ErrorStatusLengthEscapes ) && ConcealStatus) - { - StatisticalEstimation (pAacDecoderChannelInfo); - ConcealStatus=0; -#if VERBOSE_RVLC_OUTPUT - FDKstrcpy(Strategy,"Yes (StatisticalEstimation)"); -#endif + /* No errors were detected in decoding of escapes and dpcm values however + the first and last value of a group (is,nrg,sf) is incorrect */ + if ((pRvlc->conceal_min <= pRvlc->conceal_max) && + ((ErrorStatusLastScf && ErrorStatusFirstScf) || + (ErrorStatusLastNrg && ErrorStatusFirstNrg) || + (ErrorStatusLastIs && ErrorStatusFirstIs)) && + !(ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd || + ErrorStatusLengthEscapes) && + ConcealStatus) { + StatisticalEstimation(pAacDecoderChannelInfo); + ConcealStatus = 0; } - /* A error with more bits in decoding of escapes and dpcm values was detected. Use the smaller scalefactor from forward - decoding, backward decoding and previous frame. */ - if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment - && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType) && ConcealStatus ) - { - PredictiveInterpolation(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); - ConcealStatus=0; -#if VERBOSE_RVLC_OUTPUT - FDKstrcpy(Strategy,"Yes (PredictiveInterpolation)"); -#endif + /* A error with more bits in decoding of escapes and dpcm values was + detected. Use the smaller scalefactor from forward decoding, backward + decoding and previous frame. */ + if ((pRvlc->conceal_min <= pRvlc->conceal_max) && + pAacDecoderStaticChannelInfo->concealmentInfo + .rvlcPreviousScaleFactorOK && + pRvlc->sf_concealment && + (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == + currentBlockType) && + ConcealStatus) { + PredictiveInterpolation(pAacDecoderChannelInfo, + pAacDecoderStaticChannelInfo); + ConcealStatus = 0; } - /* Call frame concealment, because no better strategy was found. Setting the scalefactors to zero is done for debugging - purposes */ + /* Call frame concealment, because no better strategy was found. Setting the + scalefactors to zero is done for debugging purposes */ if (ConcealStatus) { - for (group=0; group < pRvlc->numWindowGroups; group++) { - for (band=0; band<pRvlc->maxSfbTransmitted; band++) { - pAacDecoderChannelInfo->pDynData->aScaleFactor[16*group+band] = 0; + for (group = 0; group < pRvlc->numWindowGroups; group++) { + for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { + pAacDecoderChannelInfo->pDynData->aScaleFactor[16 * group + band] = 0; } } - pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; -#if VERBOSE_RVLC_OUTPUT - FDKstrcpy(Strategy,"Yes (FrameConcealment)"); -#endif + pAacDecoderChannelInfo->pDynData->specificTo.aac + .rvlcCurrentScaleFactorOK = 0; } } - -#if VERBOSE_RVLC_OUTPUT - DebugOutputDistortedBitstreams(pRvlc,pAacDecoderChannelInfo,ErrorStatusLengthFwd,ErrorStatusLengthBwd, - ErrorStatusLengthEscapes,ErrorStatusFirstScf,ErrorStatusLastScf, - ErrorStatusFirstNrg,ErrorStatusLastNrg,ErrorStatusFirstIs,ErrorStatusLastIs, - ErrorStatusForbiddenCwFwd,ErrorStatusForbiddenCwBwd,ErrorStatusNumEscapesFwd, - ErrorStatusNumEscapesBwd,conceal_max,conceal_min,Strategy); -#endif } - /*--------------------------------------------------------------------------------------------- - function: CRvlc_Read + function: CRvlc_Read description: Read RVLC ESC1 data (side info) from bitstream. ----------------------------------------------------------------------------------------------- @@ -1047,56 +1051,58 @@ void rvlcFinalErrorDetection (CAacDecoderChannelInfo *pAacDecoderChannelInfo, - pointer bitstream structure ----------------------------------------------------------------------------------------------- return: - --------------------------------------------------------------------------------------------- */ +-------------------------------------------------------------------------------------------- +*/ -void CRvlc_Read ( - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - HANDLE_FDK_BITSTREAM bs) -{ - CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; +void CRvlc_Read(CAacDecoderChannelInfo *pAacDecoderChannelInfo, + HANDLE_FDK_BITSTREAM bs) { + CErRvlcInfo *pRvlc = + &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; - int group,band; + int group, band; /* RVLC long specific initialization Init part 1 of 2 */ - pRvlc->numWindowGroups = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); - pRvlc->maxSfbTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); - pRvlc->noise_used = 0; /* noise detection */ - pRvlc->dpcm_noise_nrg = 0; /* only for debugging */ - pRvlc->dpcm_noise_last_position = 0; /* only for debugging */ - pRvlc->length_of_rvlc_escapes = -1; /* default value is used for error detection and concealment */ + pRvlc->numWindowGroups = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); + pRvlc->maxSfbTransmitted = + GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); + pRvlc->noise_used = 0; /* noise detection */ + pRvlc->dpcm_noise_nrg = 0; /* only for debugging */ + pRvlc->dpcm_noise_last_position = 0; /* only for debugging */ + pRvlc->length_of_rvlc_escapes = + -1; /* default value is used for error detection and concealment */ /* read only error sensitivity class 1 data (ESC 1 - data) */ - pRvlc->sf_concealment = FDKreadBits(bs,1); /* #1 */ - pRvlc->rev_global_gain = FDKreadBits(bs,8); /* #2 */ - - if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) { - pRvlc->length_of_rvlc_sf = FDKreadBits(bs,11); /* #3 */ - } - else { - pRvlc->length_of_rvlc_sf = FDKreadBits(bs,9); /* #3 */ + pRvlc->sf_concealment = FDKreadBits(bs, 1); /* #1 */ + pRvlc->rev_global_gain = FDKreadBits(bs, 8); /* #2 */ + + if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) { + pRvlc->length_of_rvlc_sf = FDKreadBits(bs, 11); /* #3 */ + } else { + pRvlc->length_of_rvlc_sf = FDKreadBits(bs, 9); /* #3 */ } /* check if noise codebook is used */ for (group = 0; group < pRvlc->numWindowGroups; group++) { - for (band=0; band < pRvlc->maxSfbTransmitted; band++) { - if (pAacDecoderChannelInfo->pDynData->aCodeBook[16*group+band] == NOISE_HCB) { + for (band = 0; band < pRvlc->maxSfbTransmitted; band++) { + if (pAacDecoderChannelInfo->pDynData->aCodeBook[16 * group + band] == + NOISE_HCB) { pRvlc->noise_used = 1; - break; + break; } } } - if (pRvlc->noise_used) - pRvlc->dpcm_noise_nrg = FDKreadBits(bs, 9); /* #4 PNS */ + if (pRvlc->noise_used) + pRvlc->dpcm_noise_nrg = FDKreadBits(bs, 9); /* #4 PNS */ - pRvlc->sf_escapes_present = FDKreadBits(bs, 1); /* #5 */ + pRvlc->sf_escapes_present = FDKreadBits(bs, 1); /* #5 */ - if ( pRvlc->sf_escapes_present) { - pRvlc->length_of_rvlc_escapes = FDKreadBits(bs, 8); /* #6 */ + if (pRvlc->sf_escapes_present) { + pRvlc->length_of_rvlc_escapes = FDKreadBits(bs, 8); /* #6 */ } - if (pRvlc->noise_used) { - pRvlc->dpcm_noise_last_position = FDKreadBits(bs, 9); /* #7 PNS */ + if (pRvlc->noise_used) { + pRvlc->dpcm_noise_last_position = FDKreadBits(bs, 9); /* #7 PNS */ pRvlc->length_of_rvlc_sf -= 9; } @@ -1104,16 +1110,15 @@ void CRvlc_Read ( pRvlc->length_of_rvlc_sf_bwd = pRvlc->length_of_rvlc_sf; } - /*--------------------------------------------------------------------------------------------- - function: CRvlc_Decode + function: CRvlc_Decode description: Decode rvlc data - The function reads both the escape sequences and the scalefactors in forward - and backward direction. If an error occured during decoding process which can - not be concealed with the rvlc concealment frame concealment will be initiated. - Then the element "rvlcCurrentScaleFactorOK" in the decoder channel info is set - to 0 otherwise it is set to 1. + The function reads both the escape sequences and the +scalefactors in forward and backward direction. If an error occured during +decoding process which can not be concealed with the rvlc concealment frame +concealment will be initiated. Then the element "rvlcCurrentScaleFactorOK" in +the decoder channel info is set to 0 otherwise it is set to 1. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure @@ -1121,62 +1126,45 @@ void CRvlc_Read ( - pointer bitstream structure ----------------------------------------------------------------------------------------------- return: ErrorStatus = AAC_DEC_OK --------------------------------------------------------------------------------------------- */ +-------------------------------------------------------------------------------------------- +*/ -void CRvlc_Decode ( - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - HANDLE_FDK_BITSTREAM bs - ) -{ - CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; - INT bitCntOffst; - UINT saveBitCnt; +void CRvlc_Decode(CAacDecoderChannelInfo *pAacDecoderChannelInfo, + CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, + HANDLE_FDK_BITSTREAM bs) { + CErRvlcInfo *pRvlc = + &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; + INT bitCntOffst; + INT saveBitCnt; - rvlcInit(pRvlc,pAacDecoderChannelInfo,bs); + rvlcInit(pRvlc, pAacDecoderChannelInfo, bs); /* save bitstream position */ saveBitCnt = FDKgetBitCnt(bs); -#if RVLC_ADVANCED_BITSTREAM_ERROR_GENERATOR_SF - GenerateSingleBitError(pRvlc, - &(pRvlc->bitstreamIndexRvlFwd), - pRvlc->length_of_rvlc_sf, - 0); -#endif - -#if RVLC_ADVANCED_BITSTREAM_ERROR_GENERATOR_ESC if (pRvlc->sf_escapes_present) - GenerateSingleBitError(pRvlc, - &(pRvlc->bitstreamIndexEsc), - pRvlc->length_of_rvlc_escapes, - 1); -#endif + rvlcDecodeEscapes( + pRvlc, pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc, bs); - if ( pRvlc->sf_escapes_present) - rvlcDecodeEscapes(pRvlc, pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc, bs); - - rvlcDecodeForward(pRvlc,pAacDecoderChannelInfo, bs); - rvlcDecodeBackward(pRvlc,pAacDecoderChannelInfo, bs); + rvlcDecodeForward(pRvlc, pAacDecoderChannelInfo, bs); + rvlcDecodeBackward(pRvlc, pAacDecoderChannelInfo, bs); rvlcFinalErrorDetection(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); - pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = pRvlc->intensity_used; + pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = + pRvlc->intensity_used; pAacDecoderChannelInfo->data.aac.PnsData.PnsActive = pRvlc->noise_used; /* restore bitstream position */ bitCntOffst = saveBitCnt - FDKgetBitCnt(bs); - if( bitCntOffst ) { + if (bitCntOffst) { FDKpushBiDirectional(bs, bitCntOffst); } } -void CRvlc_ElementCheck ( - CAacDecoderChannelInfo *pAacDecoderChannelInfo[], - CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], - const UINT flags, - const INT elChannels - ) -{ +void CRvlc_ElementCheck( + CAacDecoderChannelInfo *pAacDecoderChannelInfo[], + CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], + const UINT flags, const INT elChannels) { int ch; /* Required for MPS residuals. */ @@ -1185,31 +1173,42 @@ void CRvlc_ElementCheck ( } /* RVLC specific sanity checks */ - if ( (flags & AC_ER_RVLC) && (elChannels == 2)) { /* to be reviewed */ - if ( ( (pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) || - (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) ) - && pAacDecoderChannelInfo[0]->pComData->jointStereoData.MsMaskPresent ) { - pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; - pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; + if ((flags & AC_ER_RVLC) && (elChannels == 2)) { /* to be reviewed */ + if (((pAacDecoderChannelInfo[0] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) || + (pAacDecoderChannelInfo[1] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0)) && + pAacDecoderChannelInfo[0]->pComData->jointStereoData.MsMaskPresent) { + pAacDecoderChannelInfo[0] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; + pAacDecoderChannelInfo[1] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; } - if ( (pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) - && (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 1) - && (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcIntensityUsed == 1) ){ - pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; + if ((pAacDecoderChannelInfo[0] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) && + (pAacDecoderChannelInfo[1] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 1) && + (pAacDecoderChannelInfo[1] + ->pDynData->specificTo.aac.rvlcIntensityUsed == 1)) { + pAacDecoderChannelInfo[1] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; } } - for (ch = 0; ch < elChannels; ch ++) - { - pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousBlockType = (GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) == EightShortSequence) ? 0 : 1; + for (ch = 0; ch < elChannels; ch++) { + pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousBlockType = + (GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) == BLOCK_SHORT) + ? 0 + : 1; if (flags & AC_ER_RVLC) { - pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousScaleFactorOK = pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK; - } - else { - pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousScaleFactorOK = 0; + pAacDecoderStaticChannelInfo[ch] + ->concealmentInfo.rvlcPreviousScaleFactorOK = + pAacDecoderChannelInfo[ch] + ->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK; + } else { + pAacDecoderStaticChannelInfo[ch] + ->concealmentInfo.rvlcPreviousScaleFactorOK = 0; } } } - - |