aboutsummaryrefslogtreecommitdiffstats
path: root/libAACdec/src/rvlc.cpp
diff options
context:
space:
mode:
authorFraunhofer IIS FDK <audio-fdk@iis.fraunhofer.de>2018-02-26 20:17:00 +0100
committerJean-Michel Trivi <jmtrivi@google.com>2018-04-19 11:21:15 -0700
commit6cfabd35363c3ef5e3b209b867169a500b3ccc3c (patch)
tree01c0a19f2735e8b5d2407555fe992d4230d089eb /libAACdec/src/rvlc.cpp
parent6288a1e34c4dede4c2806beb1736ece6580558c7 (diff)
downloadfdk-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.cpp1379
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;
}
}
}
-
-