aboutsummaryrefslogtreecommitdiffstats
path: root/libAACdec/src/rvlc.cpp
diff options
context:
space:
mode:
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;
}
}
}
-
-