aboutsummaryrefslogtreecommitdiffstats
path: root/libAACdec/src/aacdec_hcr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libAACdec/src/aacdec_hcr.cpp')
-rw-r--r--libAACdec/src/aacdec_hcr.cpp1783
1 files changed, 845 insertions, 938 deletions
diff --git a/libAACdec/src/aacdec_hcr.cpp b/libAACdec/src/aacdec_hcr.cpp
index e314e27..84e05b0 100644
--- a/libAACdec/src/aacdec_hcr.cpp
+++ b/libAACdec/src/aacdec_hcr.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,11 +90,12 @@ Am Wolfsmantel 33
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
------------------------------------------------------------------------------------------------------------ */
+----------------------------------------------------------------------------- */
-/***************************** MPEG-4 AAC Decoder ***************************
+/**************************** AAC decoder library ******************************
Author(s): Robert Weidner (DSP Solutions)
+
Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo,
decode priority codewords (PCWs)
@@ -91,8 +103,6 @@ amm-info@iis.fraunhofer.de
#include "aacdec_hcr.h"
-
-
#include "aacdec_hcr_types.h"
#include "aacdec_hcr_bit.h"
#include "aacdec_hcrs.h"
@@ -101,263 +111,247 @@ amm-info@iis.fraunhofer.de
#include "channel.h"
#include "block.h"
-#include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */
+#include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */
#include "FDK_bitstream.h"
extern int mlFileChCurr;
-static void errDetectorInHcrSideinfoShrt(SCHAR cb,
- SHORT numLine,
+static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,
UINT *errorWord);
-static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
- SHORT lengthOfReorderedSpectralData,
- UINT *errorWord);
+static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
+ SHORT lengthOfReorderedSpectralData,
+ UINT *errorWord);
-static void HcrCalcNumCodeword (H_HCR_INFO pHcr);
+static void HcrCalcNumCodeword(H_HCR_INFO pHcr);
static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr);
-static void HcrPrepareSegmentationGrid (H_HCR_INFO pHcr);
-static void HcrExtendedSectionInfo (H_HCR_INFO pHcr);
-
-static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment,
- USHORT *pNumExtendedSortedCodewordInSection,
- int numExtendedSortedCodewordInSectionIdx,
- USHORT *pNumExtendedSortedSectionsInSets,
- int numExtendedSortedSectionsInSetsIdx);
-
-static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs,
- INT quantSpecCoef,
- USHORT *pLeftStartOfSegment,
- SCHAR *pRemainingBitsInSegment,
- int *pNumDecodedBits
- );
-
-static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs,
- UINT codebookDim,
- const SCHAR *pQuantVal,
- FIXP_DBL *pQuantSpecCoef,
- int *quantSpecCoefIdx,
- USHORT *pLeftStartOfSegment,
- SCHAR *pRemainingBitsInSegment,
- int *pNumDecodedBits
- );
-
-static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs,
- const UINT *pCurrentTree,
- const SCHAR *pQuantValBase,
- USHORT *pLeftStartOfSegment,
- SCHAR *pRemainingBitsInSegment,
- int *pNumDecodedBits
- );
+static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr);
+static void HcrExtendedSectionInfo(H_HCR_INFO pHcr);
+
+static void DeriveNumberOfExtendedSortedSectionsInSets(
+ UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection,
+ int numExtendedSortedCodewordInSectionIdx,
+ USHORT *pNumExtendedSortedSectionsInSets,
+ int numExtendedSortedSectionsInSetsIdx);
+
+static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, INT quantSpecCoef,
+ INT *pLeftStartOfSegment,
+ SCHAR *pRemainingBitsInSegment,
+ int *pNumDecodedBits);
+
+static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, UINT codebookDim,
+ const SCHAR *pQuantVal, FIXP_DBL *pQuantSpecCoef,
+ int *quantSpecCoefIdx, INT *pLeftStartOfSegment,
+ SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits);
+
+static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs,
+ const UINT *pCurrentTree,
+ const SCHAR *pQuantValBase,
+ INT *pLeftStartOfSegment,
+ SCHAR *pRemainingBitsInSegment,
+ int *pNumDecodedBits);
static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr);
static void HcrReorderQuantizedSpectralCoefficients(
- H_HCR_INFO pHcr,
- CAacDecoderChannelInfo *pAacDecoderChannelInfo,
- const SamplingRateInfo *pSamplingRateInfo
- );
+ H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
+ const SamplingRateInfo *pSamplingRateInfo);
+static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
+ H_HCR_INFO pHcr, PCW_TYPE kind,
+ FIXP_DBL *qsc_base_of_cw,
+ UCHAR dimension);
-#if CHECK_SEGMENTATION_IMMEDIATELY
-static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
- H_HCR_INFO pHcr,
- PCW_TYPE kind,
- FIXP_DBL *qsc_base_of_cw,
- UCHAR dimension);
-#endif
-
-#if CHECK_SEGMENTATION_FINAL
static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr);
-#endif
/*---------------------------------------------------------------------------------------------
- description: Check if codebook and numSect are within allowed range (short only)
--------------------------------------------------------------------------------------------- */
-static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,UINT* errorWord)
-{
-
-
-
- if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) {
+ description: Check if codebook and numSect are within allowed range
+(short only)
+--------------------------------------------------------------------------------------------
+*/
+static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,
+ UINT *errorWord) {
+ if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) {
*errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK;
}
- if ( numLine < 0 || numLine > 1024 ) {
+ if (numLine < 0 || numLine > 1024) {
*errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK;
}
}
/*---------------------------------------------------------------------------------------------
description: Check both HCR lengths
--------------------------------------------------------------------------------------------- */
-static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
- SHORT lengthOfReorderedSpectralData,
- UINT *errorWord)
-{
- if ( lengthOfReorderedSpectralData < lengthOfLongestCodeword ) {
+--------------------------------------------------------------------------------------------
+*/
+static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
+ SHORT lengthOfReorderedSpectralData,
+ UINT *errorWord) {
+ if (lengthOfReorderedSpectralData < lengthOfLongestCodeword) {
*errorWord |= HCR_SI_LENGTHS_FAILURE;
}
}
/*---------------------------------------------------------------------------------------------
- description: Decode (and adapt if necessary) the two HCR sideinfo components:
- 'reordered_spectral_data_length' and 'longest_codeword_length'
--------------------------------------------------------------------------------------------- */
-
-void CHcr_Read(HANDLE_FDK_BITSTREAM bs,
- CAacDecoderChannelInfo *pAacDecoderChannelInfo)
-{
- INT globalHcrType = getHcrType(&pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo);
- SHORT lengOfReorderedSpectralData;
- SCHAR lengOfLongestCodeword;
-
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = 0;
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0;
-
-
-
- /* ------- SI-Value No 1 ------- */
- lengOfReorderedSpectralData = FDKreadBits(bs,14) + ERROR_LORSD;
- if ( globalHcrType == ID_CPE ) {
- if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) {
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */
- }
- else {
- if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) {
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = CPE_TOP_LENGTH; /* use valid maximum */
- }
+ description: Decode (and adapt if necessary) the two HCR sideinfo
+components: 'reordered_spectral_data_length' and 'longest_codeword_length'
+--------------------------------------------------------------------------------------------
+*/
+
+void CHcr_Read(HANDLE_FDK_BITSTREAM bs,
+ CAacDecoderChannelInfo *pAacDecoderChannelInfo,
+ const MP4_ELEMENT_ID globalHcrType) {
+ SHORT lengOfReorderedSpectralData;
+ SCHAR lengOfLongestCodeword;
+
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData =
+ 0;
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0;
+
+ /* ------- SI-Value No 1 ------- */
+ lengOfReorderedSpectralData = FDKreadBits(bs, 14) + ERROR_LORSD;
+ if (globalHcrType == ID_CPE) {
+ if ((lengOfReorderedSpectralData >= 0) &&
+ (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) {
+ pAacDecoderChannelInfo->pDynData->specificTo.aac
+ .lenOfReorderedSpectralData =
+ lengOfReorderedSpectralData; /* the decoded value is within range */
+ } else {
+ if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) {
+ pAacDecoderChannelInfo->pDynData->specificTo.aac
+ .lenOfReorderedSpectralData =
+ CPE_TOP_LENGTH; /* use valid maximum */
}
}
- else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE || globalHcrType == ID_CCE ) {
- if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) {
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */
- }
- else {
- if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) {
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = SCE_TOP_LENGTH; /* use valid maximum */
- }
+ } else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE ||
+ globalHcrType == ID_CCE) {
+ if ((lengOfReorderedSpectralData >= 0) &&
+ (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) {
+ pAacDecoderChannelInfo->pDynData->specificTo.aac
+ .lenOfReorderedSpectralData =
+ lengOfReorderedSpectralData; /* the decoded value is within range */
+ } else {
+ if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) {
+ pAacDecoderChannelInfo->pDynData->specificTo.aac
+ .lenOfReorderedSpectralData =
+ SCE_TOP_LENGTH; /* use valid maximum */
}
}
+ }
- /* ------- SI-Value No 2 ------- */
- lengOfLongestCodeword = FDKreadBits(bs,6) + ERROR_LOLC;
- if ((lengOfLongestCodeword >= 0) && (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) {
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = lengOfLongestCodeword; /* the decoded value is within range */
- }
- else {
- if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) {
- pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */
- }
+ /* ------- SI-Value No 2 ------- */
+ lengOfLongestCodeword = FDKreadBits(bs, 6) + ERROR_LOLC;
+ if ((lengOfLongestCodeword >= 0) &&
+ (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) {
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword =
+ lengOfLongestCodeword; /* the decoded value is within range */
+ } else {
+ if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) {
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword =
+ LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */
}
-}
-
-
-/*---------------------------------------------------------------------------------------------
- description: Sets up HCR ROM-Tables
--------------------------------------------------------------------------------------------- */
-
-void HcrInitRom(H_HCR_INFO pHcr)
-{
- pHcr->cbPairs.pMinOfCbPair = aMinOfCbPair;
- pHcr->cbPairs.pMaxOfCbPair = aMaxOfCbPair;
-
- pHcr->tableInfo.pMaxCwLength = aMaxCwLen;
- pHcr->tableInfo.pCbDimension = aDimCb;
- pHcr->tableInfo.pCbDimShift = aDimCbShift;
- pHcr->tableInfo.pCbSign = aSignCb;
- pHcr->tableInfo.pCbPriority = aCbPriority;
- pHcr->tableInfo.pLargestAbsVal = aLargestAbsoluteValue;
+ }
}
/*---------------------------------------------------------------------------------------------
- description: Set up HCR - must be called before every call to HcrDecoder().
- For short block a sorting algorithm is applied to get the SI in the order
- that HCR could assemble the qsc's as if it is a long block.
+ description: Set up HCR - must be called before every call to
+HcrDecoder(). For short block a sorting algorithm is applied to get the SI in
+the order that HCR could assemble the qsc's as if it is a long block.
-----------------------------------------------------------------------------------------------
return: error log
--------------------------------------------------------------------------------------------- */
+--------------------------------------------------------------------------------------------
+*/
-UINT HcrInit(H_HCR_INFO pHcr,
- CAacDecoderChannelInfo *pAacDecoderChannelInfo,
+UINT HcrInit(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
const SamplingRateInfo *pSamplingRateInfo,
- HANDLE_FDK_BITSTREAM bs)
-{
+ HANDLE_FDK_BITSTREAM bs) {
CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo;
SHORT *pNumLinesInSec;
UCHAR *pCodeBk;
- SHORT numSection;
- SCHAR cb;
- int numLine;
- int i;
-
- pHcr->decInOut.lengthOfReorderedSpectralData = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData;
- pHcr->decInOut.lengthOfLongestCodeword = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword;
- pHcr->decInOut.pQuantizedSpectralCoefficientsBase = pAacDecoderChannelInfo->pSpectralCoefficient;
- pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0;
- pHcr->decInOut.pCodebook = pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
- pHcr->decInOut.pNumLineInSect = pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
- pHcr->decInOut.numSection = pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection;
+ SHORT numSection;
+ SCHAR cb;
+ int numLine;
+ int i;
+
+ pHcr->decInOut.lengthOfReorderedSpectralData =
+ pAacDecoderChannelInfo->pDynData->specificTo.aac
+ .lenOfReorderedSpectralData;
+ pHcr->decInOut.lengthOfLongestCodeword =
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword;
+ pHcr->decInOut.pQuantizedSpectralCoefficientsBase =
+ pAacDecoderChannelInfo->pSpectralCoefficient;
+ pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0;
+ pHcr->decInOut.pCodebook =
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
+ pHcr->decInOut.pNumLineInSect =
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
+ pHcr->decInOut.numSection =
+ pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection;
pHcr->decInOut.errorLog = 0;
- pHcr->nonPcwSideinfo.pResultBase = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
+ pHcr->nonPcwSideinfo.pResultBase =
+ SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
FDKsyncCache(bs);
- pHcr->decInOut.bitstreamIndex = FDKgetBitCnt(bs);
+ pHcr->decInOut.bitstreamIndex = FDKgetBitCnt(bs);
- if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */
+ if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */
{
- SHORT band;
- SHORT maxBand;
- SCHAR group;
- SCHAR winGroupLen;
- SCHAR window;
- SCHAR numUnitInBand;
- SCHAR cntUnitInBand;
- SCHAR groupWin;
- SCHAR cb_prev;
+ SHORT band;
+ SHORT maxBand;
+ SCHAR group;
+ SCHAR winGroupLen;
+ SCHAR window;
+ SCHAR numUnitInBand;
+ SCHAR cntUnitInBand;
+ SCHAR groupWin;
+ SCHAR cb_prev;
UCHAR *pCodeBook;
const SHORT *BandOffsets;
- SCHAR numOfGroups;
-
+ SCHAR numOfGroups;
- pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */
- pNumLinesInSec = pHcr->decInOut.pNumLineInSect; /* out */
- pCodeBk = pHcr->decInOut.pCodebook; /* out */
- BandOffsets = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */
- numOfGroups = GetWindowGroups(pIcsInfo);
+ pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */
+ pNumLinesInSec = pHcr->decInOut.pNumLineInSect; /* out */
+ pCodeBk = pHcr->decInOut.pCodebook; /* out */
+ BandOffsets =
+ GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */
+ numOfGroups = GetWindowGroups(pIcsInfo);
numLine = 0;
numSection = 0;
- cb = pCodeBook[0];
+ cb = pCodeBook[0];
cb_prev = pCodeBook[0];
- /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new section starts */
+ /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new
+ * section starts */
*pCodeBk++ = cb_prev;
maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
- for (band = 0; band < maxBand; band++) { /* from low to high sfbs i.e. from low to high frequencies */
- numUnitInBand = ((BandOffsets[band+1] - BandOffsets[band]) >> FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */
- for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0; cntUnitInBand-- ) { /* for every unit in the band */
+ for (band = 0; band < maxBand;
+ band++) { /* from low to high sfbs i.e. from low to high frequencies */
+ numUnitInBand =
+ ((BandOffsets[band + 1] - BandOffsets[band]) >>
+ FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */
+ for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0;
+ cntUnitInBand--) { /* for every unit in the band */
for (window = 0, group = 0; group < numOfGroups; group++) {
- winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
+ winGroupLen = (SCHAR)GetWindowGroupLength(
+ &pAacDecoderChannelInfo->icsInfo, group);
for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) {
cb = pCodeBook[group * 16 + band];
if (cb != cb_prev) {
-#if CHECK_VALID_HCR_INPUT /* short-block 1 of 2 */
- errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog );
- if (pHcr->decInOut.errorLog != 0 ) {
- return ( pHcr->decInOut.errorLog );
+ errDetectorInHcrSideinfoShrt(cb, numLine,
+ &pHcr->decInOut.errorLog);
+ if (pHcr->decInOut.errorLog != 0) {
+ return (pHcr->decInOut.errorLog);
}
-#endif
*pCodeBk++ = cb;
*pNumLinesInSec++ = numLine;
numSection++;
cb_prev = cb;
numLine = LINES_PER_UNIT;
- }
- else {
+ } else {
numLine += LINES_PER_UNIT;
}
}
@@ -367,18 +361,16 @@ UINT HcrInit(H_HCR_INFO pHcr,
numSection++;
-#if CHECK_VALID_HCR_INPUT /* short-block 2 of 2 */
- errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog );
- if ( numSection <= 0 || numSection > 1024/2 ) {
+ errDetectorInHcrSideinfoShrt(cb, numLine, &pHcr->decInOut.errorLog);
+ if (numSection <= 0 || numSection > 1024 / 2) {
pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK;
}
errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
pHcr->decInOut.lengthOfReorderedSpectralData,
- &pHcr->decInOut.errorLog);
- if (pHcr->decInOut.errorLog != 0 ) {
- return ( pHcr->decInOut.errorLog );
+ &pHcr->decInOut.errorLog);
+ if (pHcr->decInOut.errorLog != 0) {
+ return (pHcr->decInOut.errorLog);
}
-#endif
*pCodeBk = cb;
*pNumLinesInSec = numLine;
@@ -386,46 +378,40 @@ UINT HcrInit(H_HCR_INFO pHcr,
} else /* end short block prepare SI */
{ /* long block */
-#if CHECK_VALID_HCR_INPUT /* long-block 1 of 1 */
errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
pHcr->decInOut.lengthOfReorderedSpectralData,
- &pHcr->decInOut.errorLog);
- numSection = pHcr->decInOut.numSection;
+ &pHcr->decInOut.errorLog);
+ numSection = pHcr->decInOut.numSection;
pNumLinesInSec = pHcr->decInOut.pNumLineInSect;
- pCodeBk = pHcr->decInOut.pCodebook;
- if ( numSection <= 0 || numSection > 64 ) {
+ pCodeBk = pHcr->decInOut.pCodebook;
+ if (numSection <= 0 || numSection > 64) {
pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK;
numSection = 0;
}
- for ( i = numSection; i != 0; i-- )
- {
+ for (i = numSection; i != 0; i--) {
cb = *pCodeBk++;
- if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) {
+ if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) {
pHcr->decInOut.errorLog |= CB_OUT_OF_RANGE_LONG_BLOCK;
}
numLine = *pNumLinesInSec++;
/* FDK_ASSERT(numLine > 0); */
- if ( (numLine <= 0) || (numLine > 1024) ) {
+ if ((numLine <= 0) || (numLine > 1024)) {
pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK;
}
}
- if (pHcr->decInOut.errorLog != 0 ) {
- return ( pHcr->decInOut.errorLog );
+ if (pHcr->decInOut.errorLog != 0) {
+ return (pHcr->decInOut.errorLog);
}
-#endif /* CHECK_VALID_HCR_INPUT */
}
pCodeBk = pHcr->decInOut.pCodebook;
- for ( i = 0; i < numSection; i++ ) {
- if (
- (*pCodeBk == NOISE_HCB) ||
- (*pCodeBk == INTENSITY_HCB2) ||
- (*pCodeBk == INTENSITY_HCB))
- {
+ for (i = 0; i < numSection; i++) {
+ if ((*pCodeBk == NOISE_HCB) || (*pCodeBk == INTENSITY_HCB2) ||
+ (*pCodeBk == INTENSITY_HCB)) {
*pCodeBk = 0;
}
pCodeBk++;
@@ -433,54 +419,24 @@ UINT HcrInit(H_HCR_INFO pHcr,
/* HCR-sideinfo-input is complete and seems to be valid */
-
-
- return ( pHcr->decInOut.errorLog );
-}
-
-
-
-
-#if USE_HCR_DUMMY
-
-/*---------------------------------------------------------------------------------------------
-
- description: This HCR - dummy - function writes only a dirac-sequence in output buffer
-
--------------------------------------------------------------------------------------------- */
-UINT HcrDecoder(H_HCR_INFO pHcr,
- const CAacDecoderChannelInfo *pAacDecoderChannelInfo,
- HANDLE_FDK_BITSTREAM bs)
-{
- for (SHORT i=0; i < 1024; i++ ) {
- pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = FL2FXCONST_DBL(0.0f);
- if ( i % 30 == 0) {
- pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = (FIXP_DBL)HCR_DIRAC;
- }
- }
- return 0;
+ return (pHcr->decInOut.errorLog);
}
-#else /* USE_HCR_DUMMY */
-
/*---------------------------------------------------------------------------------------------
- description: This function decodes the codewords of the spectral coefficients from the
- bitstream according to the HCR algorithm and stores the quantized spectral
- coefficients in correct order in the output buffer.
--------------------------------------------------------------------------------------------- */
-
-UINT HcrDecoder(H_HCR_INFO pHcr,
- CAacDecoderChannelInfo *pAacDecoderChannelInfo,
- const SamplingRateInfo *pSamplingRateInfo,
- HANDLE_FDK_BITSTREAM bs)
-{
+ description: This function decodes the codewords of the spectral
+coefficients from the bitstream according to the HCR algorithm and stores the
+quantized spectral coefficients in correct order in the output buffer.
+--------------------------------------------------------------------------------------------
+*/
+
+UINT HcrDecoder(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
+ const SamplingRateInfo *pSamplingRateInfo,
+ HANDLE_FDK_BITSTREAM bs) {
int pTmp1, pTmp2, pTmp3, pTmp4;
-#if DETECT_TOO_LONG_CW_READS
- int pTmp5;
-#endif
+ int pTmp5;
- INT bitCntOffst;
- UINT saveBitCnt = FDKgetBitCnt(bs); /* save bitstream position */
+ INT bitCntOffst;
+ INT saveBitCnt = FDKgetBitCnt(bs); /* save bitstream position */
HcrCalcNumCodeword(pHcr);
@@ -490,244 +446,240 @@ UINT HcrDecoder(H_HCR_INFO pHcr,
HcrExtendedSectionInfo(pHcr);
- if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) != 0 ) {
- return ( pHcr->decInOut.errorLog ); /* sideinfo is massively corrupt, return from HCR without having decoded anything */
+ if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) != 0) {
+ return (pHcr->decInOut.errorLog); /* sideinfo is massively corrupt, return
+ from HCR without having decoded
+ anything */
}
- DeriveNumberOfExtendedSortedSectionsInSets(pHcr->segmentInfo.numSegment,
- pHcr->sectionInfo.pNumExtendedSortedCodewordInSection,
- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx,
- pHcr->sectionInfo.pNumExtendedSortedSectionsInSets,
- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx);
+ DeriveNumberOfExtendedSortedSectionsInSets(
+ pHcr->segmentInfo.numSegment,
+ pHcr->sectionInfo.pNumExtendedSortedCodewordInSection,
+ pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx,
+ pHcr->sectionInfo.pNumExtendedSortedSectionsInSets,
+ pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx);
/* store */
pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx;
pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
-#if DETECT_TOO_LONG_CW_READS
pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
-#endif
/* ------- decode meaningful PCWs ------ */
DecodePCWs(bs, pHcr);
- if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) == 0 ) {
+ if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) == 0) {
/* ------ decode the non-PCWs -------- */
DecodeNonPCWs(bs, pHcr);
}
-
-#if CHECK_SEGMENTATION_FINAL
errDetectWithinSegmentationFinal(pHcr);
-#endif
/* restore */
pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1;
- pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2;
- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3;
- pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4;
-#if DETECT_TOO_LONG_CW_READS
- pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5;
-#endif
+ pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2;
+ pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3;
+ pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4;
+ pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5;
- HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo, pSamplingRateInfo);
+ HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo,
+ pSamplingRateInfo);
/* restore bitstream position */
bitCntOffst = saveBitCnt - FDKgetBitCnt(bs);
- if( bitCntOffst ) {
+ if (bitCntOffst) {
FDKpushBiDirectional(bs, bitCntOffst);
}
- return ( pHcr->decInOut.errorLog );
+ return (pHcr->decInOut.errorLog);
}
-
-#endif /* USE_HCR_DUMMY */
-
-
-
-
/*---------------------------------------------------------------------------------------------
- description: This function reorders the quantized spectral coefficients sectionwise for
- long- and short-blocks and compares to the LAV (Largest Absolute Value of
- the current codebook) -- a counter is incremented if there is an error
+ description: This function reorders the quantized spectral coefficients
+sectionwise for long- and short-blocks and compares to the LAV (Largest Absolute
+Value of the current codebook) -- a counter is incremented if there is an error
detected.
- Additional for short-blocks a unit-based-deinterleaving is applied.
- Moreover (for short blocks) the scaling is derived (compare plain huffman
- decoder).
--------------------------------------------------------------------------------------------- */
+ Additional for short-blocks a unit-based-deinterleaving is
+applied. Moreover (for short blocks) the scaling is derived (compare plain
+huffman decoder).
+--------------------------------------------------------------------------------------------
+*/
static void HcrReorderQuantizedSpectralCoefficients(
- H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
- const SamplingRateInfo *pSamplingRateInfo
- )
-{
- INT qsc;
- UINT abs_qsc;
- UINT i,j;
- USHORT numSpectralValuesInSection;
+ H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
+ const SamplingRateInfo *pSamplingRateInfo) {
+ INT qsc;
+ UINT abs_qsc;
+ UINT i, j;
+ USHORT numSpectralValuesInSection;
FIXP_DBL *pTeVa;
- USHORT lavErrorCnt = 0;
-
- UINT numSection = pHcr->decInOut.numSection;
- SPECTRAL_PTR pQuantizedSpectralCoefficientsBase = pHcr->decInOut.pQuantizedSpectralCoefficientsBase;
- FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
- const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift;
- const USHORT *pLargestAbsVal = pHcr->tableInfo.pLargestAbsVal;
- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
- USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
- USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
- FIXP_DBL *pTempValues = pHcr->segmentInfo.pTempValues;
- FIXP_DBL *pBak = pHcr->segmentInfo.pTempValues;
-
- FDKmemclear(pTempValues,1024*sizeof(FIXP_DBL));
-
- /* long and short: check if decoded huffman-values (quantized spectral coefficients) are within range */
- for ( i=numSection; i != 0; i-- ) {
- numSpectralValuesInSection = *pNumSortedCodewordInSection++ << pCbDimShift[*pSortedCodebook];
+ USHORT lavErrorCnt = 0;
+
+ UINT numSection = pHcr->decInOut.numSection;
+ SPECTRAL_PTR pQuantizedSpectralCoefficientsBase =
+ pHcr->decInOut.pQuantizedSpectralCoefficientsBase;
+ FIXP_DBL *pQuantizedSpectralCoefficients =
+ SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
+ const UCHAR *pCbDimShift = aDimCbShift;
+ const USHORT *pLargestAbsVal = aLargestAbsoluteValue;
+ UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
+ USHORT *pNumSortedCodewordInSection =
+ pHcr->sectionInfo.pNumSortedCodewordInSection;
+ USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
+ FIXP_DBL pTempValues[1024];
+ FIXP_DBL *pBak = pTempValues;
+
+ FDKmemclear(pTempValues, 1024 * sizeof(FIXP_DBL));
+
+ /* long and short: check if decoded huffman-values (quantized spectral
+ * coefficients) are within range */
+ for (i = numSection; i != 0; i--) {
+ numSpectralValuesInSection = *pNumSortedCodewordInSection++
+ << pCbDimShift[*pSortedCodebook];
pTeVa = &pTempValues[*pReorderOffset++];
- for( j = numSpectralValuesInSection; j != 0; j-- ) {
+ for (j = numSpectralValuesInSection; j != 0; j--) {
qsc = *pQuantizedSpectralCoefficients++;
- abs_qsc = FDKabs(qsc);
-#if VALID_LAV_ERROR_TRIGGER
- if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) {
- *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */
- }
- else { /* line is too high .. */
- if ( abs_qsc == Q_VALUE_INVALID ) { /* .. because of previous marking --> dont set LAV flag (would be confusing), just copy out the already marked value */
- *pTeVa++ = (FIXP_DBL) qsc;
- }
- else { /* .. because a too high value was decoded for this cb --> set LAV flag */
- *pTeVa++ = (FIXP_DBL) Q_VALUE_INVALID;
+ abs_qsc = fAbs(qsc);
+ if (abs_qsc <= pLargestAbsVal[*pSortedCodebook]) {
+ *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */
+ } else { /* line is too high .. */
+ if (abs_qsc ==
+ Q_VALUE_INVALID) { /* .. because of previous marking --> dont set
+ LAV flag (would be confusing), just copy out
+ the already marked value */
+ *pTeVa++ = (FIXP_DBL)qsc;
+ } else { /* .. because a too high value was decoded for this cb --> set
+ LAV flag */
+ *pTeVa++ = (FIXP_DBL)Q_VALUE_INVALID;
lavErrorCnt += 1;
}
}
-#else
- if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) {
- *pTeVa++ = qsc;
- }
- else {
- *pTeVa++ = Q_VALUE_INVALID;
- lavErrorCnt += 1;
- }
-#endif
}
pSortedCodebook++;
}
- if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo))
- {
+ if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
FIXP_DBL *pOut;
- FIXP_DBL locMax;
- FIXP_DBL tmp;
- SCHAR groupoffset;
- SCHAR group;
- SCHAR band;
- SCHAR groupwin;
- SCHAR window;
- SCHAR numWinGroup;
- SHORT interm;
- SCHAR numSfbTransm;
- SCHAR winGroupLen;
- SHORT index;
- INT msb;
- INT lsb;
-
- SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor;
- SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale;
- const SHORT *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
-
- pBak = pHcr->segmentInfo.pTempValues;
+ FIXP_DBL locMax;
+ FIXP_DBL tmp;
+ SCHAR groupoffset;
+ SCHAR group;
+ SCHAR band;
+ SCHAR groupwin;
+ SCHAR window;
+ SCHAR numWinGroup;
+ SHORT interm;
+ SCHAR numSfbTransm;
+ SCHAR winGroupLen;
+ SHORT index;
+ INT msb;
+ INT lsb;
+
+ SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor;
+ SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale;
+ const SHORT *BandOffsets = GetScaleFactorBandOffsets(
+ &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
+
+ pBak = pTempValues;
/* deinterleave unitwise for short blocks */
- for ( window = 0; window < (8); window++ ) {
- pOut = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength);
- for ( i=0; i < (LINES_PER_UNIT_GROUP); i++ ) {
- pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) + i * 32; /* distance of lines between unit groups has to be constant for every framelength (32)! */
- for ( j=(LINES_PER_UNIT); j != 0; j-- ) {
+ for (window = 0; window < (8); window++) {
+ pOut = SPEC(pQuantizedSpectralCoefficientsBase, window,
+ pAacDecoderChannelInfo->granuleLength);
+ for (i = 0; i < (LINES_PER_UNIT_GROUP); i++) {
+ pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) +
+ i * 32; /* distance of lines between unit groups has to be
+ constant for every framelength (32)! */
+ for (j = (LINES_PER_UNIT); j != 0; j--) {
*pOut++ = *pTeVa++;
}
}
}
/* short blocks only */
- /* derive global scaling-value for every sfb and every window (as it is done in plain-huffman-decoder at short blocks) */
+ /* derive global scaling-value for every sfb and every window (as it is done
+ * in plain-huffman-decoder at short blocks) */
groupoffset = 0;
numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
- numSfbTransm = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
+ numSfbTransm =
+ GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
for (group = 0; group < numWinGroup; group++) {
- winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
+ winGroupLen =
+ GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
for (band = 0; band < numSfbTransm; band++) {
interm = group * 16 + band;
msb = pScaleFacHcr[interm] >> 2;
lsb = pScaleFacHcr[interm] & 3;
for (groupwin = 0; groupwin < winGroupLen; groupwin++) {
window = groupoffset + groupwin;
- pBak = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength);
+ pBak = SPEC(pQuantizedSpectralCoefficientsBase, window,
+ pAacDecoderChannelInfo->granuleLength);
locMax = FL2FXCONST_DBL(0.0f);
- for (index = BandOffsets[band]; index < BandOffsets[band+1]; index += LINES_PER_UNIT) {
+ for (index = BandOffsets[band]; index < BandOffsets[band + 1];
+ index += LINES_PER_UNIT) {
pTeVa = &pBak[index];
- for ( i = LINES_PER_UNIT; i != 0; i --) {
- tmp = (*pTeVa < FL2FXCONST_DBL(0.0f))? -*pTeVa++ : *pTeVa++;
- locMax = fixMax(tmp,locMax);
+ for (i = LINES_PER_UNIT; i != 0; i--) {
+ tmp = (*pTeVa < FL2FXCONST_DBL(0.0f)) ? -*pTeVa++ : *pTeVa++;
+ locMax = fixMax(tmp, locMax);
}
}
- if ( fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE ) {
+ if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) {
locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE;
}
- pSfbSclHcr[window*16+band] = msb - GetScaleFromValue(locMax, lsb); /* save global scale maxima in this sfb */
+ pSfbSclHcr[window * 16 + band] =
+ msb - GetScaleFromValue(
+ locMax, lsb); /* save global scale maxima in this sfb */
}
}
- groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
+ groupoffset +=
+ GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
}
- } else
- {
+ } else {
/* copy straight for long-blocks */
- pQuantizedSpectralCoefficients = SPEC_LONG(pQuantizedSpectralCoefficientsBase);
- for ( i = 1024; i != 0; i-- ) {
+ pQuantizedSpectralCoefficients =
+ SPEC_LONG(pQuantizedSpectralCoefficientsBase);
+ for (i = 1024; i != 0; i--) {
*pQuantizedSpectralCoefficients++ = *pBak++;
}
}
- if ( lavErrorCnt != 0 ) {
+ if (lavErrorCnt != 0) {
pHcr->decInOut.errorLog |= LAV_VIOLATION;
}
}
-
/*---------------------------------------------------------------------------------------------
description: This function calculates the number of codewords
- for each section (numCodewordInSection) and the number of codewords
- for all sections (numCodeword).
- For zero and intensity codebooks a entry is also done in the variable
- numCodewordInSection. It is assumed that the codebook is a two tuples
- codebook. This is needed later for the calculation of the base addresses
- for the reordering of the quantize spectral coefficients at the end of the
- hcr tool.
- The variable numCodeword contain the number of codewords which are really
- in the bitstream. Zero or intensity codebooks does not increase the
- variable numCodewords.
+ for each section (numCodewordInSection) and the number of
+codewords for all sections (numCodeword). For zero and intensity codebooks a
+entry is also done in the variable numCodewordInSection. It is assumed that the
+codebook is a two tuples codebook. This is needed later for the calculation of
+the base addresses for the reordering of the quantize spectral coefficients at
+the end of the hcr tool. The variable numCodeword contain the number of
+codewords which are really in the bitstream. Zero or intensity codebooks does
+not increase the variable numCodewords.
-----------------------------------------------------------------------------------------------
return: -
--------------------------------------------------------------------------------------------- */
+--------------------------------------------------------------------------------------------
+*/
+
+static void HcrCalcNumCodeword(H_HCR_INFO pHcr) {
+ int hcrSection;
+ UINT numCodeword;
-static void HcrCalcNumCodeword(H_HCR_INFO pHcr)
-{
- int hcrSection;
- UINT numCodeword;
+ UINT numSection = pHcr->decInOut.numSection;
+ UCHAR *pCodebook = pHcr->decInOut.pCodebook;
+ SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect;
+ const UCHAR *pCbDimShift = aDimCbShift;
- UINT numSection = pHcr->decInOut.numSection;
- UCHAR *pCodebook = pHcr->decInOut.pCodebook;
- SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect;
- const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift;
- USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
+ USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
numCodeword = 0;
- for ( hcrSection = numSection; hcrSection != 0; hcrSection-- ) {
+ for (hcrSection = numSection; hcrSection != 0; hcrSection--) {
*pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook];
- if ( *pCodebook != 0 ) {
+ if (*pCodebook != 0) {
numCodeword += *pNumCodewordInSection;
}
pNumCodewordInSection++;
@@ -736,61 +688,63 @@ static void HcrCalcNumCodeword(H_HCR_INFO pHcr)
pHcr->sectionInfo.numCodeword = numCodeword;
}
-
/*---------------------------------------------------------------------------------------------
description: This function calculates the number
- of sorted codebooks and sorts the codebooks and the numCodewordInSection
- according to the priority.
--------------------------------------------------------------------------------------------- */
-
-static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr)
-{
-
- UINT i,j,k;
- UCHAR temp;
- UINT counter;
- UINT startOffset;
- UINT numZeroSection;
- UCHAR *pDest;
- UINT numSectionDec;
-
- UINT numSection = pHcr->decInOut.numSection;
- UCHAR *pCodebook = pHcr->decInOut.pCodebook;
- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
- USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
- USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
- UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
- USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
- const UCHAR *pCbPriority = pHcr->tableInfo.pCbPriority;
- const UCHAR *pMinOfCbPair = pHcr->cbPairs.pMinOfCbPair;
- const UCHAR *pMaxOfCbPair = pHcr->cbPairs.pMaxOfCbPair;
- const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift;
+ of sorted codebooks and sorts the codebooks and the
+numCodewordInSection according to the priority.
+--------------------------------------------------------------------------------------------
+*/
+
+static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr) {
+ UINT i, j, k;
+ UCHAR temp;
+ UINT counter;
+ UINT startOffset;
+ UINT numZeroSection;
+ UCHAR *pDest;
+ UINT numSectionDec;
+
+ UINT numSection = pHcr->decInOut.numSection;
+ UCHAR *pCodebook = pHcr->decInOut.pCodebook;
+ UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
+ USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
+ USHORT *pNumSortedCodewordInSection =
+ pHcr->sectionInfo.pNumSortedCodewordInSection;
+ UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
+ USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
+ const UCHAR *pCbPriority = aCbPriority;
+ const UCHAR *pMinOfCbPair = aMinOfCbPair;
+ const UCHAR *pMaxOfCbPair = aMaxOfCbPair;
+ const UCHAR *pCbDimShift = aDimCbShift;
UINT searchStart = 0;
- /* calculate *pNumSortedSection and store the priorities in array pSortedCdebook */
+ /* calculate *pNumSortedSection and store the priorities in array
+ * pSortedCdebook */
pDest = pSortedCodebook;
numZeroSection = 0;
- for ( i=numSection; i != 0; i-- ) {
- if ( pCbPriority[*pCodebook] == 0 ) {
+ for (i = numSection; i != 0; i--) {
+ if (pCbPriority[*pCodebook] == 0) {
numZeroSection += 1;
}
*pDest++ = pCbPriority[*pCodebook++];
}
- pHcr->sectionInfo.numSortedSection = numSection - numZeroSection; /* numSortedSection contains no zero or intensity section */
+ pHcr->sectionInfo.numSortedSection =
+ numSection - numZeroSection; /* numSortedSection contains no zero or
+ intensity section */
pCodebook = pHcr->decInOut.pCodebook;
/* sort priorities of the codebooks in array pSortedCdebook[] */
numSectionDec = numSection - 1;
- if ( numSectionDec > 0 ) {
+ if (numSectionDec > 0) {
counter = numSectionDec;
- for ( j=numSectionDec; j != 0; j-- ) {
- for ( i=0; i < counter; i++ ) {
+ for (j = numSectionDec; j != 0; j--) {
+ for (i = 0; i < counter; i++) {
/* swap priorities */
- if ( pSortedCodebook[i+1] > pSortedCodebook[i] ) {
- temp = pSortedCodebook[i];
- pSortedCodebook[i] = pSortedCodebook[i+1];
- pSortedCodebook[i+1] = temp;
+ if (pSortedCodebook[i + 1] > pSortedCodebook[i]) {
+ temp = pSortedCodebook[i];
+ pSortedCodebook[i] = pSortedCodebook[i + 1];
+ pSortedCodebook[i + 1] = temp;
}
}
counter -= 1;
@@ -798,28 +752,33 @@ static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr)
}
/* clear codebookSwitch array */
- for ( i = numSection; i != 0; i--) {
+ for (i = numSection; i != 0; i--) {
*pCodebookSwitch++ = 0;
}
pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
- /* sort sectionCodebooks and numCodwordsInSection and calculate pReorderOffst[j] */
- for ( j = 0; j < numSection; j++ ) {
- for ( i = searchStart; i < numSection; i++ ) {
- if ( pCodebookSwitch[i] == 0 && ( pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] || pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i] )) {
+ /* sort sectionCodebooks and numCodwordsInSection and calculate
+ * pReorderOffst[j] */
+ for (j = 0; j < numSection; j++) {
+ for (i = searchStart; i < numSection; i++) {
+ if (pCodebookSwitch[i] == 0 &&
+ (pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] ||
+ pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i])) {
pCodebookSwitch[i] = 1;
- pSortedCodebook[j] = pCodebook[i]; /* sort codebook */
- pNumSortedCodewordInSection[j] = pNumCodewordInSection[i]; /* sort NumCodewordInSection */
+ pSortedCodebook[j] = pCodebook[i]; /* sort codebook */
+ pNumSortedCodewordInSection[j] =
+ pNumCodewordInSection[i]; /* sort NumCodewordInSection */
startOffset = 0;
- for ( k = 0; k < i; k++ ) { /* make entry in pReorderOffst */
+ for (k = 0; k < i; k++) { /* make entry in pReorderOffst */
startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]];
}
- pReorderOffset[j] = startOffset; /* offset for reordering the codewords */
+ pReorderOffset[j] =
+ startOffset; /* offset for reordering the codewords */
- if(i == searchStart) {
- UINT k = i;
- while(pCodebookSwitch[k++] == 1) searchStart++;
+ if (i == searchStart) {
+ k = i;
+ while (pCodebookSwitch[k++] == 1) searchStart++;
}
break;
}
@@ -827,45 +786,49 @@ static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr)
}
}
-
/*---------------------------------------------------------------------------------------------
- description: This function calculates the segmentation, which includes numSegment,
- leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment.
- The segmentation could be visualized a as kind of 'overlay-grid' for the
- bitstream-block holding the HCR-encoded quantized-spectral-coefficients.
--------------------------------------------------------------------------------------------- */
-
-static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr)
-{
- USHORT i,j;
- USHORT numSegment = 0;
- USHORT segmentStart = 0;
- UCHAR segmentWidth;
- UCHAR lastSegmentWidth;
- UCHAR sortedCodebook;
- UCHAR endFlag = 0;
- USHORT intermediateResult;
-
- SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
- SHORT lengthOfReorderedSpectralData = pHcr->decInOut.lengthOfReorderedSpectralData;
- UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
- USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
- USHORT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
- USHORT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
- SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
- USHORT bitstreamIndex = pHcr->decInOut.bitstreamIndex;
- const UCHAR *pMaxCwLength = pHcr->tableInfo.pMaxCwLength;
-
- for ( i=numSortedSection; i != 0; i-- ) {
+ description: This function calculates the segmentation, which includes
+numSegment, leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment.
+ The segmentation could be visualized a as kind of
+'overlay-grid' for the bitstream-block holding the HCR-encoded
+quantized-spectral-coefficients.
+--------------------------------------------------------------------------------------------
+*/
+
+static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr) {
+ USHORT i, j;
+ USHORT numSegment = 0;
+ INT segmentStart = 0;
+ UCHAR segmentWidth;
+ UCHAR lastSegmentWidth;
+ UCHAR sortedCodebook;
+ UCHAR endFlag = 0;
+ INT intermediateResult;
+
+ SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
+ SHORT lengthOfReorderedSpectralData =
+ pHcr->decInOut.lengthOfReorderedSpectralData;
+ UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
+ UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
+ USHORT *pNumSortedCodewordInSection =
+ pHcr->sectionInfo.pNumSortedCodewordInSection;
+ INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
+ INT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
+ SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
+ INT bitstreamIndex = pHcr->decInOut.bitstreamIndex;
+ const UCHAR *pMaxCwLength = aMaxCwLen;
+
+ for (i = numSortedSection; i != 0; i--) {
sortedCodebook = *pSortedCodebook++;
- segmentWidth = FDKmin(pMaxCwLength[sortedCodebook],lengthOfLongestCodeword);
+ segmentWidth =
+ fMin((INT)pMaxCwLength[sortedCodebook], (INT)lengthOfLongestCodeword);
- for ( j = *pNumSortedCodewordInSection; j != 0 ; j-- ) {
+ for (j = *pNumSortedCodewordInSection; j != 0; j--) {
/* width allows a new segment */
intermediateResult = bitstreamIndex + segmentStart;
- if ( (segmentStart + segmentWidth) <= lengthOfReorderedSpectralData ) {
- /* store segment start, segment length and increment the number of segments */
+ if ((segmentStart + segmentWidth) <= lengthOfReorderedSpectralData) {
+ /* store segment start, segment length and increment the number of
+ * segments */
*pLeftStartOfSegment++ = intermediateResult;
*pRightStartOfSegment++ = intermediateResult + segmentWidth - 1;
*pRemainingBitsInSegment++ = segmentWidth;
@@ -882,7 +845,8 @@ static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr)
lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart;
*pRemainingBitsInSegment = lastSegmentWidth;
- *pRightStartOfSegment = bitstreamIndex + segmentStart + lastSegmentWidth - 1;
+ *pRightStartOfSegment =
+ bitstreamIndex + segmentStart + lastSegmentWidth - 1;
endFlag = 1;
break;
}
@@ -893,52 +857,50 @@ static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr)
}
}
pHcr->segmentInfo.numSegment = numSegment;
-
}
-
/*---------------------------------------------------------------------------------------------
- description: This function adapts the sorted section boundaries to the boundaries of
- segmentation. If the section lengths does not fit completely into the
- current segment, the section is spitted into two so called 'extended
- sections'. The extended-section-info (pNumExtendedSortedCodewordInSectin
- and pExtendedSortedCodebook) is updated in this case.
-
--------------------------------------------------------------------------------------------- */
-
-static void HcrExtendedSectionInfo(H_HCR_INFO pHcr)
-{
- UINT srtSecCnt = 0; /* counter for sorted sections */
- UINT xSrtScCnt = 0; /* counter for extended sorted sections */
- UINT remainNumCwInSortSec;
- UINT inSegmentRemainNumCW;
-
- UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
- UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
- USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
- UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook;
- USHORT *pNumExtSortCwInSect = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
- UINT numSegment = pHcr->segmentInfo.numSegment;
-#if DETECT_TOO_LONG_CW_READS
- UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
- SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
- const UCHAR *pMaxCwLength = pHcr->tableInfo.pMaxCwLength;
-#endif
+ description: This function adapts the sorted section boundaries to the
+boundaries of segmentation. If the section lengths does not fit completely into
+the current segment, the section is spitted into two so called 'extended
+ sections'. The extended-section-info
+(pNumExtendedSortedCodewordInSectin and pExtendedSortedCodebook) is updated in
+this case.
+
+--------------------------------------------------------------------------------------------
+*/
+
+static void HcrExtendedSectionInfo(H_HCR_INFO pHcr) {
+ UINT srtSecCnt = 0; /* counter for sorted sections */
+ UINT xSrtScCnt = 0; /* counter for extended sorted sections */
+ UINT remainNumCwInSortSec;
+ UINT inSegmentRemainNumCW;
+
+ UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
+ UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
+ USHORT *pNumSortedCodewordInSection =
+ pHcr->sectionInfo.pNumSortedCodewordInSection;
+ UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook;
+ USHORT *pNumExtSortCwInSect =
+ pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
+ UINT numSegment = pHcr->segmentInfo.numSegment;
+ UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
+ SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
+ const UCHAR *pMaxCwLength = aMaxCwLen;
remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
inSegmentRemainNumCW = numSegment;
while (srtSecCnt < numSortedSection) {
if (inSegmentRemainNumCW < remainNumCwInSortSec) {
-
pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
remainNumCwInSortSec -= inSegmentRemainNumCW;
inSegmentRemainNumCW = numSegment;
- /* data of a sorted section was not integrated in extended sorted section */
- }
- else if (inSegmentRemainNumCW == remainNumCwInSortSec) {
+ /* data of a sorted section was not integrated in extended sorted section
+ */
+ } else if (inSegmentRemainNumCW == remainNumCwInSortSec) {
pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
@@ -946,74 +908,66 @@ static void HcrExtendedSectionInfo(H_HCR_INFO pHcr)
remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
inSegmentRemainNumCW = numSegment;
/* data of a sorted section was integrated in extended sorted section */
- }
- else { /* inSegmentRemainNumCW > remainNumCwInSortSec */
+ } else { /* inSegmentRemainNumCW > remainNumCwInSortSec */
pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec;
pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
-
inSegmentRemainNumCW -= remainNumCwInSortSec;
srtSecCnt++;
remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
/* data of a sorted section was integrated in extended sorted section */
}
-#if DETECT_TOO_LONG_CW_READS
- pMaxLenOfCbInExtSrtSec[xSrtScCnt] = FDKmin(pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],lengthOfLongestCodeword);
-#endif
-
-
+ pMaxLenOfCbInExtSrtSec[xSrtScCnt] =
+ fMin((INT)pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],
+ (INT)lengthOfLongestCodeword);
xSrtScCnt += 1;
- if ( xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS) ) {
+ if (xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW;
return;
}
-
}
pNumExtSortCwInSect[xSrtScCnt] = 0;
-
}
-
/*---------------------------------------------------------------------------------------------
- description: This function calculates the number of extended sorted sections which
- belong to the sets. Each set from set 0 (one and only set for the PCWs)
- till to the last set gets a entry in the array to which
+ description: This function calculates the number of extended sorted
+sections which belong to the sets. Each set from set 0 (one and only set for the
+PCWs) till to the last set gets a entry in the array to which
'pNumExtendedSortedSectinsInSets' points to.
- Calculation: The entrys in pNumExtendedSortedCodewordInSectin are added
- untill the value numSegment is reached. Then the sum_variable is cleared
- and the calculation starts from the beginning. As much extended sorted
- Sections are summed up to reach the value numSegment, as much is the
- current entry in *pNumExtendedSortedCodewordInSectin.
--------------------------------------------------------------------------------------------- */
-static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment,
- USHORT *pNumExtendedSortedCodewordInSection,
- int numExtendedSortedCodewordInSectionIdx,
- USHORT *pNumExtendedSortedSectionsInSets,
- int numExtendedSortedSectionsInSetsIdx)
-{
- USHORT counter = 0;
- UINT cwSum = 0;
- USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection;
+ Calculation: The entrys in
+pNumExtendedSortedCodewordInSectin are added untill the value numSegment is
+reached. Then the sum_variable is cleared and the calculation starts from the
+beginning. As much extended sorted Sections are summed up to reach the value
+numSegment, as much is the current entry in *pNumExtendedSortedCodewordInSectin.
+--------------------------------------------------------------------------------------------
+*/
+static void DeriveNumberOfExtendedSortedSectionsInSets(
+ UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection,
+ int numExtendedSortedCodewordInSectionIdx,
+ USHORT *pNumExtendedSortedSectionsInSets,
+ int numExtendedSortedSectionsInSetsIdx) {
+ USHORT counter = 0;
+ UINT cwSum = 0;
+ USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection;
USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets;
- while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0)
- {
+ while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0) {
cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx];
numExtendedSortedCodewordInSectionIdx++;
- if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
+ if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
return;
}
if (cwSum > numSegment) {
return;
}
counter++;
- if (counter > 1024/4) {
+ if (counter > 1024 / 4) {
return;
}
- if ( cwSum == numSegment ) {
+ if (cwSum == numSegment) {
pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter;
numExtendedSortedSectionsInSetsIdx++;
if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
@@ -1023,99 +977,109 @@ static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment,
cwSum = 0;
}
}
- pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter; /* save last entry for the last - probably shorter - set */
+ pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] =
+ counter; /* save last entry for the last - probably shorter - set */
}
-
/*---------------------------------------------------------------------------------------------
- description: This function decodes all priority codewords (PCWs) in a spectrum (within
- set 0). The calculation of the PCWs is managed in two loops. The
- loopcounter of the outer loop is set to the first value pointer
- pNumExtendedSortedSectionsInSets points to. This value represents the
- number of extended sorted sections within set 0.
- The loopcounter of the inner loop is set to the first value pointer
- pNumExtendedSortedCodewordInSectin points to. The value represents the
- number of extended sorted codewords in sections (the original sections have
- been splitted to go along with the borders of the sets).
- Each time the number of the extended sorted codewords in sections are de-
- coded, the pointer 'pNumExtendedSortedCodewordInSectin' is incremented by
- one.
--------------------------------------------------------------------------------------------- */
-static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
-{
- UINT i;
- USHORT extSortSec;
- USHORT curExtSortCwInSec;
- UCHAR codebook;
- UCHAR dimension;
- const UINT *pCurrentTree;
+ description: This function decodes all priority codewords (PCWs) in a
+spectrum (within set 0). The calculation of the PCWs is managed in two loops.
+The loopcounter of the outer loop is set to the first value pointer
+ pNumExtendedSortedSectionsInSets points to. This value
+represents the number of extended sorted sections within set 0. The loopcounter
+of the inner loop is set to the first value pointer
+ pNumExtendedSortedCodewordInSectin points to. The value
+represents the number of extended sorted codewords in sections (the original
+sections have been splitted to go along with the borders of the sets). Each time
+the number of the extended sorted codewords in sections are de- coded, the
+pointer 'pNumExtendedSortedCodewordInSectin' is incremented by one.
+--------------------------------------------------------------------------------------------
+*/
+static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) {
+ UINT i;
+ USHORT extSortSec;
+ USHORT curExtSortCwInSec;
+ UCHAR codebook;
+ UCHAR dimension;
+ const UINT *pCurrentTree;
const SCHAR *pQuantValBase;
const SCHAR *pQuantVal;
- USHORT *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
- int numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
- UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
- int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
- USHORT *pNumExtendedSortedSectionsInSets = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
- int numExtendedSortedSectionsInSetsIdx = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
- FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
- int quantizedSpectralCoefficientsIdx = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
- USHORT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
- SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
-#if DETECT_TOO_LONG_CW_READS
- UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
- int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
- UCHAR maxAllowedCwLen;
- int numDecodedBits;
-#endif
- const UCHAR *pCbDimension = pHcr->tableInfo.pCbDimension;
- const UCHAR *pCbSign = pHcr->tableInfo.pCbSign;
+ USHORT *pNumExtendedSortedCodewordInSection =
+ pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
+ int numExtendedSortedCodewordInSectionIdx =
+ pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
+ UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
+ int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
+ USHORT *pNumExtendedSortedSectionsInSets =
+ pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
+ int numExtendedSortedSectionsInSetsIdx =
+ pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
+ FIXP_DBL *pQuantizedSpectralCoefficients =
+ SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
+ int quantizedSpectralCoefficientsIdx =
+ pHcr->decInOut.quantizedSpectralCoefficientsIdx;
+ INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
+ SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
+ UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
+ int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
+ UCHAR maxAllowedCwLen;
+ int numDecodedBits;
+ const UCHAR *pCbDimension = aDimCb;
+ const UCHAR *pCbSign = aSignCb;
/* clear result array */
- //pQSC = &pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx];
- //pQSC = *pQuantizedSpectralCoefficients;
-
- FDKmemclear(pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx,1024*sizeof(FIXP_DBL));
+ FDKmemclear(pQuantizedSpectralCoefficients + quantizedSpectralCoefficientsIdx,
+ 1024 * sizeof(FIXP_DBL));
/* decode all PCWs in the extended sorted section(s) belonging to set 0 */
- for ( extSortSec = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; extSortSec != 0; extSortSec-- ) {
-
- codebook = pExtendedSortedCodebook[extendedSortedCodebookIdx]; /* get codebook for this extended sorted section and increment ptr to cb of next ext. sort sec */
+ for (extSortSec =
+ pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx];
+ extSortSec != 0; extSortSec--) {
+ codebook =
+ pExtendedSortedCodebook[extendedSortedCodebookIdx]; /* get codebook for
+ this extended
+ sorted section
+ and increment ptr
+ to cb of next
+ ext. sort sec */
extendedSortedCodebookIdx++;
- if (extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
+ if (extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
return;
}
- dimension = pCbDimension[codebook]; /* get dimension of codebook of this extended sort. sec. */
- pCurrentTree = aHuffTable [codebook]; /* convert codebook to pointer to QSCs */
- pQuantValBase = aQuantTable [codebook]; /* convert codebook to index to table of QSCs */
-#if DETECT_TOO_LONG_CW_READS
+ dimension = pCbDimension[codebook]; /* get dimension of codebook of this
+ extended sort. sec. */
+ pCurrentTree =
+ aHuffTable[codebook]; /* convert codebook to pointer to QSCs */
+ pQuantValBase =
+ aQuantTable[codebook]; /* convert codebook to index to table of QSCs */
maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx];
maxLenOfCbInExtSrtSecIdx++;
- if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
+ if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
return;
}
-#endif
/* switch for decoding with different codebooks: */
- if ( pCbSign[codebook] == 0 ) { /* no sign bits follow after the codeword-body */
+ if (pCbSign[codebook] ==
+ 0) { /* no sign bits follow after the codeword-body */
/* PCW_BodyONLY */
/*==============*/
- for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) {
+ for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
+ [numExtendedSortedCodewordInSectionIdx];
+ curExtSortCwInSec != 0; curExtSortCwInSec--) {
numDecodedBits = 0;
/* decode PCW_BODY */
- pQuantVal = DecodePCW_Body(bs,
- pCurrentTree,
- pQuantValBase,
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
+ pQuantVal =
+ DecodePCW_Body(bs, pCurrentTree, pQuantValBase, pLeftStartOfSegment,
+ pRemainingBitsInSegment, &numDecodedBits);
/* result is written out here because NO sign bits follow the body */
- for( i=dimension; i != 0 ; i-- ) {
- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) *pQuantVal++; /* write quant. spec. coef. into spectrum; sign is already valid */
+ for (i = dimension; i != 0; i--) {
+ pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
+ (FIXP_DBL)*pQuantVal++; /* write quant. spec. coef. into
+ spectrum; sign is already valid */
quantizedSpectralCoefficientsIdx++;
if (quantizedSpectralCoefficientsIdx >= 1024) {
return;
@@ -1124,94 +1088,83 @@ static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
/* one more PCW should be decoded */
-#if DETECT_TOO_LONG_CW_READS
- if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG) ) {
+ if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG)) {
pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED;
}
-#endif
-#if CHECK_SEGMENTATION_IMMEDIATELY
- if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY,pHcr,PCW_BODY,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) {
+ if (1 == errDetectPcwSegmentation(
+ *pRemainingBitsInSegment - ERROR_PCW_BODY, pHcr, PCW_BODY,
+ pQuantizedSpectralCoefficients +
+ quantizedSpectralCoefficientsIdx - dimension,
+ dimension)) {
return;
}
-#endif
- pLeftStartOfSegment++; /* update pointer for decoding the next PCW */
- pRemainingBitsInSegment++; /* update pointer for decoding the next PCW */
+ pLeftStartOfSegment++; /* update pointer for decoding the next PCW */
+ pRemainingBitsInSegment++; /* update pointer for decoding the next PCW
+ */
}
- }
- else if (( pCbSign[codebook] == 1 ) && ( codebook < 11 )) { /* possibly there follow 1,2,3 or 4 sign bits after the codeword-body */
+ } else if ((codebook < 11) && (pCbSign[codebook] ==
+ 1)) { /* possibly there follow 1,2,3 or 4
+ sign bits after the codeword-body */
/* PCW_Body and PCW_Sign */
/*=======================*/
- for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--)
- {
+ for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
+ [numExtendedSortedCodewordInSectionIdx];
+ curExtSortCwInSec != 0; curExtSortCwInSec--) {
int err;
- numDecodedBits = 0;
-
- pQuantVal = DecodePCW_Body(bs,
- pCurrentTree,
- pQuantValBase,
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
-
- err = DecodePCW_Sign( bs,
- dimension,
- pQuantVal,
- pQuantizedSpectralCoefficients,
- &quantizedSpectralCoefficientsIdx,
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
+ numDecodedBits = 0;
+
+ pQuantVal =
+ DecodePCW_Body(bs, pCurrentTree, pQuantValBase, pLeftStartOfSegment,
+ pRemainingBitsInSegment, &numDecodedBits);
+
+ err = DecodePCW_Sign(
+ bs, dimension, pQuantVal, pQuantizedSpectralCoefficients,
+ &quantizedSpectralCoefficientsIdx, pLeftStartOfSegment,
+ pRemainingBitsInSegment, &numDecodedBits);
if (err != 0) {
return;
}
/* one more PCW should be decoded */
-#if DETECT_TOO_LONG_CW_READS
- if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG) ) {
+ if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG)) {
pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED;
}
-#endif
-#if CHECK_SEGMENTATION_IMMEDIATELY
- if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN,pHcr,PCW_BODY_SIGN, pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) {
+ if (1 == errDetectPcwSegmentation(
+ *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN, pHcr,
+ PCW_BODY_SIGN,
+ pQuantizedSpectralCoefficients +
+ quantizedSpectralCoefficientsIdx - dimension,
+ dimension)) {
return;
}
-#endif
pLeftStartOfSegment++;
pRemainingBitsInSegment++;
}
- }
- else if (( pCbSign[codebook] == 1 ) && ( codebook >= 11 )) { /* possibly there follow some sign bits and maybe one or two escape sequences after the cw-body */
+ } else if ((pCbSign[codebook] == 1) &&
+ (codebook >= 11)) { /* possibly there follow some sign bits and
+ maybe one or two escape sequences after
+ the cw-body */
/* PCW_Body, PCW_Sign and maybe PCW_Escape */
/*=========================================*/
- for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--)
- {
+ for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
+ [numExtendedSortedCodewordInSectionIdx];
+ curExtSortCwInSec != 0; curExtSortCwInSec--) {
int err;
- numDecodedBits = 0;
+ numDecodedBits = 0;
/* decode PCW_BODY */
- pQuantVal = DecodePCW_Body(bs,
- pCurrentTree,
- pQuantValBase,
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
-
- err = DecodePCW_Sign( bs,
- dimension,
- pQuantVal,
- pQuantizedSpectralCoefficients,
- &quantizedSpectralCoefficientsIdx,
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
+ pQuantVal =
+ DecodePCW_Body(bs, pCurrentTree, pQuantValBase, pLeftStartOfSegment,
+ pRemainingBitsInSegment, &numDecodedBits);
+
+ err = DecodePCW_Sign(
+ bs, dimension, pQuantVal, pQuantizedSpectralCoefficients,
+ &quantizedSpectralCoefficientsIdx, pLeftStartOfSegment,
+ pRemainingBitsInSegment, &numDecodedBits);
if (err != 0) {
return;
}
@@ -1219,26 +1172,32 @@ static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
/* decode PCW_ESCAPE if present */
quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK;
- if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) {
- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs,
- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx],
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
+ if (fixp_abs(pQuantizedSpectralCoefficients
+ [quantizedSpectralCoefficientsIdx]) ==
+ (FIXP_DBL)ESCAPE_VALUE) {
+ pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
+ (FIXP_DBL)DecodeEscapeSequence(
+ bs,
+ pQuantizedSpectralCoefficients
+ [quantizedSpectralCoefficientsIdx],
+ pLeftStartOfSegment, pRemainingBitsInSegment,
+ &numDecodedBits);
}
quantizedSpectralCoefficientsIdx++;
if (quantizedSpectralCoefficientsIdx >= 1024) {
return;
}
- if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) {
- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs,
- pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx],
- pLeftStartOfSegment,
- pRemainingBitsInSegment,
- &numDecodedBits
- );
+ if (fixp_abs(pQuantizedSpectralCoefficients
+ [quantizedSpectralCoefficientsIdx]) ==
+ (FIXP_DBL)ESCAPE_VALUE) {
+ pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
+ (FIXP_DBL)DecodeEscapeSequence(
+ bs,
+ pQuantizedSpectralCoefficients
+ [quantizedSpectralCoefficientsIdx],
+ pLeftStartOfSegment, pRemainingBitsInSegment,
+ &numDecodedBits);
}
quantizedSpectralCoefficientsIdx++;
if (quantizedSpectralCoefficientsIdx >= 1024) {
@@ -1247,17 +1206,20 @@ static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
/* one more PCW should be decoded */
-#if DETECT_TOO_LONG_CW_READS
- if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG) ) {
+ if (maxAllowedCwLen <
+ (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG)) {
pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
}
-#endif
-#if CHECK_SEGMENTATION_IMMEDIATELY
- if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN_ESC,pHcr,PCW_BODY_SIGN_ESC,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-DIMENSION_OF_ESCAPE_CODEBOOK,DIMENSION_OF_ESCAPE_CODEBOOK)) {
+ if (1 == errDetectPcwSegmentation(
+ *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN_ESC, pHcr,
+ PCW_BODY_SIGN_ESC,
+ pQuantizedSpectralCoefficients +
+ quantizedSpectralCoefficientsIdx -
+ DIMENSION_OF_ESCAPE_CODEBOOK,
+ DIMENSION_OF_ESCAPE_CODEBOOK)) {
return;
}
-#endif
pLeftStartOfSegment++;
pRemainingBitsInSegment++;
}
@@ -1265,7 +1227,7 @@ static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
/* all PCWs belonging to this extended section should be decoded */
numExtendedSortedCodewordInSectionIdx++;
- if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR+MAX_HCR_SETS) {
+ if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR + MAX_HCR_SETS) {
return;
}
}
@@ -1277,66 +1239,65 @@ static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
}
/* Write back indexes into structure */
- pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx;
+ pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
+ numExtendedSortedCodewordInSectionIdx;
pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
- pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx;
- pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx;
+ pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx =
+ numExtendedSortedSectionsInSetsIdx;
+ pHcr->decInOut.quantizedSpectralCoefficientsIdx =
+ quantizedSpectralCoefficientsIdx;
pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx;
}
-#if CHECK_SEGMENTATION_IMMEDIATELY
/*---------------------------------------------------------------------------------------------
- description: This function checks immediately after every decoded PCW, whether out of
- the current segment too many bits have been read or not. If an error occurrs,
- probably the sideinfo or the HCR-bitstream block holding the huffman
- encoded quantized spectral coefficients is distorted. In this case the two
- or four quantized spectral coefficients belonging to the current codeword
+ description: This function checks immediately after every decoded PCW,
+whether out of the current segment too many bits have been read or not. If an
+error occurrs, probably the sideinfo or the HCR-bitstream block holding the
+huffman encoded quantized spectral coefficients is distorted. In this case the
+two or four quantized spectral coefficients belonging to the current codeword
are marked (for being detected by concealment later).
--------------------------------------------------------------------------------------------- */
-static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
- H_HCR_INFO pHcr,
- PCW_TYPE kind,
- FIXP_DBL *qsc_base_of_cw,
- UCHAR dimension)
-{
+--------------------------------------------------------------------------------------------
+*/
+static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
+ H_HCR_INFO pHcr, PCW_TYPE kind,
+ FIXP_DBL *qsc_base_of_cw,
+ UCHAR dimension) {
SCHAR i;
- if ( remainingBitsInSegment < 0 ) {
+ if (remainingBitsInSegment < 0) {
/* log the error */
switch (kind) {
- case PCW_BODY:
+ case PCW_BODY:
pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY;
break;
- case PCW_BODY_SIGN:
+ case PCW_BODY_SIGN:
pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN;
break;
- case PCW_BODY_SIGN_ESC:
+ case PCW_BODY_SIGN_ESC:
pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC;
break;
}
/* mark the erred lines */
- for ( i = dimension; i != 0; i-- ) {
- *qsc_base_of_cw++ = (FIXP_DBL) Q_VALUE_INVALID;
+ for (i = dimension; i != 0; i--) {
+ *qsc_base_of_cw++ = (FIXP_DBL)Q_VALUE_INVALID;
}
return 1;
}
return 0;
}
-#endif
-#if CHECK_SEGMENTATION_FINAL
/*---------------------------------------------------------------------------------------------
- description: This function checks if all segments are empty after decoding. There
- are _no lines markded_ as invalid because it could not be traced back
- where from the remaining bits are.
--------------------------------------------------------------------------------------------- */
-static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr)
-{
- UCHAR segmentationErrorFlag = 0;
- USHORT i;
- SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
- UINT numSegment = pHcr->segmentInfo.numSegment;
-
- for ( i=numSegment; i != 0 ; i--) {
+ description: This function checks if all segments are empty after
+decoding. There are _no lines markded_ as invalid because it could not be traced
+back where from the remaining bits are.
+--------------------------------------------------------------------------------------------
+*/
+static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr) {
+ UCHAR segmentationErrorFlag = 0;
+ USHORT i;
+ SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
+ UINT numSegment = pHcr->segmentInfo.numSegment;
+
+ for (i = numSegment; i != 0; i--) {
if (*pRemainingBitsInSegment++ != 0) {
segmentationErrorFlag = 1;
}
@@ -1345,125 +1306,114 @@ static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr)
pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR;
}
}
-#endif
/*---------------------------------------------------------------------------------------------
- description: This function walks one step within the decoding tree. Which branch is
- taken depends on the decoded carryBit input parameter.
--------------------------------------------------------------------------------------------- */
-void CarryBitToBranchValue(UCHAR carryBit,
- UINT treeNode,
- UINT *branchValue,
- UINT *branchNode)
-{
+ description: This function walks one step within the decoding tree. Which
+branch is taken depends on the decoded carryBit input parameter.
+--------------------------------------------------------------------------------------------
+*/
+void CarryBitToBranchValue(UCHAR carryBit, UINT treeNode, UINT *branchValue,
+ UINT *branchNode) {
if (carryBit == 0) {
- *branchNode = (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT: 00FFF000 */
- }
- else {
- *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */
+ *branchNode =
+ (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT: 00FFF000 */
+ } else {
+ *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */
}
- *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */
+ *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */
}
-
/*---------------------------------------------------------------------------------------------
description: Decodes the body of a priority codeword (PCW)
-----------------------------------------------------------------------------------------------
- return: - return value is pointer to first of two or four quantized spectral
- coefficients
--------------------------------------------------------------------------------------------- */
-static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs,
- const UINT *pCurrentTree,
- const SCHAR *pQuantValBase,
- USHORT *pLeftStartOfSegment,
- SCHAR *pRemainingBitsInSegment,
- int *pNumDecodedBits
- )
-{
+ return: - return value is pointer to first of two or four quantized
+spectral coefficients
+--------------------------------------------------------------------------------------------
+*/
+static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs,
+ const UINT *pCurrentTree,
+ const SCHAR *pQuantValBase,
+ INT *pLeftStartOfSegment,
+ SCHAR *pRemainingBitsInSegment,
+ int *pNumDecodedBits) {
UCHAR carryBit;
- UINT branchNode;
- UINT treeNode;
- UINT branchValue;
- const SCHAR *pQuantVal;
+ UINT branchNode;
+ UINT treeNode;
+ UINT branchValue;
+ const SCHAR *pQuantVal;
/* decode PCW_BODY */
- treeNode = *pCurrentTree; /* get first node of current tree belonging to current codebook */
+ treeNode = *pCurrentTree; /* get first node of current tree belonging to
+ current codebook */
/* decode whole PCW-codeword-body */
while (1) {
-
- carryBit = HcrGetABitFromBitstream(bs,
- pLeftStartOfSegment,
- pLeftStartOfSegment, /* dummy */
+ carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment,
+ pLeftStartOfSegment, /* dummy */
FROM_LEFT_TO_RIGHT);
*pRemainingBitsInSegment -= 1;
*pNumDecodedBits += 1;
- CarryBitToBranchValue(carryBit,
- treeNode,
- &branchValue,
- &branchNode);
+ CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode);
- if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */
- break; /* end of branch in tree reached i.e. a whole PCW-Body is decoded */
- }
- else {
- treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */
+ if ((branchNode & TEST_BIT_10) ==
+ TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */
+ break; /* end of branch in tree reached i.e. a whole PCW-Body is decoded
+ */
+ } else {
+ treeNode = *(
+ pCurrentTree +
+ branchValue); /* update treeNode for further step in decoding tree */
}
-
}
- pQuantVal = pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4 quantized values */
+ pQuantVal =
+ pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4
+ quantized values */
return pQuantVal;
}
-
/*---------------------------------------------------------------------------------------------
- description: This function decodes one escape sequence. In case of a escape codebook
- and in case of the absolute value of the quantized spectral value == 16,
- a escapeSequence is decoded in two steps:
+ description: This function decodes one escape sequence. In case of a
+escape codebook and in case of the absolute value of the quantized spectral
+value == 16, a escapeSequence is decoded in two steps:
1. escape prefix
2. escape word
--------------------------------------------------------------------------------------------- */
-
-static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs,
- INT quantSpecCoef,
- USHORT *pLeftStartOfSegment,
- SCHAR *pRemainingBitsInSegment,
- int *pNumDecodedBits
- )
-{
- UINT i;
- INT sign;
- UINT escapeOnesCounter = 0;
- UINT carryBit;
- INT escape_word = 0;
+--------------------------------------------------------------------------------------------
+*/
+
+static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, INT quantSpecCoef,
+ INT *pLeftStartOfSegment,
+ SCHAR *pRemainingBitsInSegment,
+ int *pNumDecodedBits) {
+ UINT i;
+ INT sign;
+ UINT escapeOnesCounter = 0;
+ UINT carryBit;
+ INT escape_word = 0;
/* decode escape prefix */
while (1) {
- carryBit = HcrGetABitFromBitstream(bs,
- pLeftStartOfSegment,
- pLeftStartOfSegment, /* dummy */
+ carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment,
+ pLeftStartOfSegment, /* dummy */
FROM_LEFT_TO_RIGHT);
*pRemainingBitsInSegment -= 1;
*pNumDecodedBits += 1;
if (carryBit != 0) {
escapeOnesCounter += 1;
- }
- else {
+ } else {
escapeOnesCounter += 4;
break;
}
}
/* decode escape word */
- for( i=escapeOnesCounter; i != 0 ; i-- ) {
- carryBit = HcrGetABitFromBitstream(bs,
- pLeftStartOfSegment,
- pLeftStartOfSegment, /* dummy */
+ for (i = escapeOnesCounter; i != 0; i--) {
+ carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment,
+ pLeftStartOfSegment, /* dummy */
FROM_LEFT_TO_RIGHT);
*pRemainingBitsInSegment -= 1;
*pNumDecodedBits += 1;
@@ -1474,61 +1424,54 @@ static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs,
sign = (quantSpecCoef >= 0) ? 1 : -1;
- quantSpecCoef = sign * (((INT ) 1 << escapeOnesCounter) + escape_word);
+ quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word);
return quantSpecCoef;
}
-
/*---------------------------------------------------------------------------------------------
- description: Decodes the Signbits of a priority codeword (PCW) and writes out the
- resulting quantized spectral values into unsorted sections
+ description: Decodes the Signbits of a priority codeword (PCW) and writes
+out the resulting quantized spectral values into unsorted sections
-----------------------------------------------------------------------------------------------
- output: - two or four lines at position in corresponding section (which are not
- located at the desired position, i.e. they must be reordered in the last
- of eight function of HCR)
+ output: - two or four lines at position in corresponding section
+(which are not located at the desired position, i.e. they must be reordered in
+the last of eight function of HCR)
-----------------------------------------------------------------------------------------------
- return: - updated pQuantSpecCoef pointer (to next empty storage for a line)
--------------------------------------------------------------------------------------------- */
-static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs,
- UINT codebookDim,
- const SCHAR *pQuantVal,
- FIXP_DBL *pQuantSpecCoef,
- int *quantSpecCoefIdx,
- USHORT *pLeftStartOfSegment,
- SCHAR *pRemainingBitsInSegment,
- int *pNumDecodedBits
- )
-{
- UINT i;
- UINT carryBit;
- INT quantSpecCoef;
-
- for( i=codebookDim; i != 0 ; i-- ) {
+ return: - updated pQuantSpecCoef pointer (to next empty storage for a
+line)
+--------------------------------------------------------------------------------------------
+*/
+static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, UINT codebookDim,
+ const SCHAR *pQuantVal, FIXP_DBL *pQuantSpecCoef,
+ int *quantSpecCoefIdx, INT *pLeftStartOfSegment,
+ SCHAR *pRemainingBitsInSegment,
+ int *pNumDecodedBits) {
+ UINT i;
+ UINT carryBit;
+ INT quantSpecCoef;
+
+ for (i = codebookDim; i != 0; i--) {
quantSpecCoef = *pQuantVal++;
if (quantSpecCoef != 0) {
- carryBit = HcrGetABitFromBitstream(bs,
- pLeftStartOfSegment,
- pLeftStartOfSegment, /* dummy */
+ carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment,
+ pLeftStartOfSegment, /* dummy */
FROM_LEFT_TO_RIGHT);
*pRemainingBitsInSegment -= 1;
*pNumDecodedBits += 1;
- if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024>>1)) {
+ if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024 >> 1)) {
return -1;
}
/* adapt sign of values according to the decoded sign bit */
if (carryBit != 0) {
pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef;
+ } else {
+ pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef;
}
- else {
- pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef;
- }
- }
- else {
+ } else {
pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f);
}
- *quantSpecCoefIdx += 1 ;
+ *quantSpecCoefIdx += 1;
if (*quantSpecCoefIdx >= 1024) {
return -1;
}
@@ -1536,56 +1479,20 @@ static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs,
return 0;
}
-
/*---------------------------------------------------------------------------------------------
- description: Mutes spectral lines which have been marked as erroneous (Q_VALUE_INVALID)
--------------------------------------------------------------------------------------------- */
-void HcrMuteErroneousLines(H_HCR_INFO hHcr)
-{
+ description: Mutes spectral lines which have been marked as erroneous
+(Q_VALUE_INVALID)
+--------------------------------------------------------------------------------------------
+*/
+void HcrMuteErroneousLines(H_HCR_INFO hHcr) {
int c;
- FIXP_DBL *RESTRICT pLong = SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase);
+ FIXP_DBL *RESTRICT pLong =
+ SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase);
/* if there is a line with value Q_VALUE_INVALID mute it */
for (c = 0; c < 1024; c++) {
if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) {
-#if HCR_LISTEN_TO_MUTED_LINES
- pLong[c] = (FIXP_DBL)HCR_DIRAC; /* marking */
-#else
- pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */
-#endif
+ pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */
}
}
}
-
-
-/*---------------------------------------------------------------------------------------------
- description: Sets global HCR type
--------------------------------------------------------------------------------------------- */
-void setHcrType(H_HCR_INFO hHcr, MP4_ELEMENT_ID type)
-{
- switch (type) {
- case ID_SCE:
- hHcr->globalHcrType = 0;
- break;
- case ID_CPE:
- hHcr->globalHcrType = 1;
- break;
- default:
- break;
- }
-}
-
-
-/*---------------------------------------------------------------------------------------------
- description: Gets HCR type from the HCR data structure
------------------------------------------------------------------------------------------------
- return: - global HCR type
--------------------------------------------------------------------------------------------- */
-INT getHcrType(H_HCR_INFO hHcr)
-{
- return hHcr->globalHcrType;
-}
-
-
-
-