diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 20:15:44 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 20:15:44 +0200 |
commit | 14c7b800eaa23e9da7c92c7c4df397d0c191f097 (patch) | |
tree | d840b6ec41ff74d1184ca1dcd7731d08f1e9ebbb /libAACdec/src/aacdec_hcr.cpp | |
parent | 78a801e4d716c6f2403cc56cf6c5b6f138f24b2f (diff) | |
download | ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.tar.gz ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.tar.bz2 ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.zip |
Remove FDK-AAC
Diffstat (limited to 'libAACdec/src/aacdec_hcr.cpp')
-rw-r--r-- | libAACdec/src/aacdec_hcr.cpp | 1591 |
1 files changed, 0 insertions, 1591 deletions
diff --git a/libAACdec/src/aacdec_hcr.cpp b/libAACdec/src/aacdec_hcr.cpp deleted file mode 100644 index e314e27..0000000 --- a/libAACdec/src/aacdec_hcr.cpp +++ /dev/null @@ -1,1591 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -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. - - 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. - -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: - -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 -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. - -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." - -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. - -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. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ - -/***************************** MPEG-4 AAC Decoder *************************** - - Author(s): Robert Weidner (DSP Solutions) - Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo, - decode priority codewords (PCWs) - -*******************************************************************************/ - -#include "aacdec_hcr.h" - - - -#include "aacdec_hcr_types.h" -#include "aacdec_hcr_bit.h" -#include "aacdec_hcrs.h" -#include "aac_ram.h" -#include "aac_rom.h" -#include "channel.h" -#include "block.h" - -#include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */ -#include "FDK_bitstream.h" - -extern int mlFileChCurr; - -static void errDetectorInHcrSideinfoShrt(SCHAR cb, - SHORT numLine, - UINT *errorWord); - -static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword, - SHORT lengthOfReorderedSpectralData, - UINT *errorWord); - -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 DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr); - -static void HcrReorderQuantizedSpectralCoefficients( - H_HCR_INFO pHcr, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - const SamplingRateInfo *pSamplingRateInfo - ); - - -#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 ) { - *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK; - } - 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 ) { - *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 */ - } - } - } - 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 */ - } - } -} - - -/*--------------------------------------------------------------------------------------------- - 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. ------------------------------------------------------------------------------------------------ - return: error log --------------------------------------------------------------------------------------------- */ - -UINT HcrInit(H_HCR_INFO pHcr, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, - const SamplingRateInfo *pSamplingRateInfo, - 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; - pHcr->decInOut.errorLog = 0; - pHcr->nonPcwSideinfo.pResultBase = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); - - FDKsyncCache(bs); - pHcr->decInOut.bitstreamIndex = FDKgetBitCnt(bs); - - 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; - - UCHAR *pCodeBook; - const SHORT *BandOffsets; - 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); - - numLine = 0; - numSection = 0; - cb = pCodeBook[0]; - cb_prev = pCodeBook[0]; - - /* 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 (window = 0, group = 0; group < numOfGroups; group++) { - winGroupLen = 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 ); - } -#endif - *pCodeBk++ = cb; - *pNumLinesInSec++ = numLine; - numSection++; - - cb_prev = cb; - numLine = LINES_PER_UNIT; - } - else { - numLine += LINES_PER_UNIT; - } - } - } - } - } - - numSection++; - -#if CHECK_VALID_HCR_INPUT /* short-block 2 of 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 ); - } -#endif - - *pCodeBk = cb; - *pNumLinesInSec = numLine; - pHcr->decInOut.numSection = numSection; - - } 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; - pNumLinesInSec = pHcr->decInOut.pNumLineInSect; - 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-- ) - { - cb = *pCodeBk++; - - 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) ) { - pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK; - } - } - 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)) - { - *pCodeBk = 0; - } - pCodeBk++; - } - - /* 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; -} - -#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) -{ - int pTmp1, pTmp2, pTmp3, pTmp4; -#if DETECT_TOO_LONG_CW_READS - int pTmp5; -#endif - - INT bitCntOffst; - UINT saveBitCnt = FDKgetBitCnt(bs); /* save bitstream position */ - - HcrCalcNumCodeword(pHcr); - - HcrSortCodebookAndNumCodewordInSection(pHcr); - - HcrPrepareSegmentationGrid(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 */ - } - - 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 ) { - /* ------ 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 - - HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo, pSamplingRateInfo); - - /* restore bitstream position */ - bitCntOffst = saveBitCnt - FDKgetBitCnt(bs); - if( bitCntOffst ) { - FDKpushBiDirectional(bs, bitCntOffst); - } - - 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 - detected. - 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; - 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]; - pTeVa = &pTempValues[*pReorderOffset++]; - 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; - lavErrorCnt += 1; - } - } -#else - if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) { - *pTeVa++ = qsc; - } - else { - *pTeVa++ = Q_VALUE_INVALID; - lavErrorCnt += 1; - } -#endif - } - pSortedCodebook++; - } - - 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; - /* 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-- ) { - *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) */ - groupoffset = 0; - - numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); - numSfbTransm = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); - - for (group = 0; group < numWinGroup; 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); - locMax = FL2FXCONST_DBL(0.0f); - 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); - } - } - 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 */ - } - } - groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); - } - } else - { - /* copy straight for long-blocks */ - pQuantizedSpectralCoefficients = SPEC_LONG(pQuantizedSpectralCoefficientsBase); - for ( i = 1024; i != 0; i-- ) { - *pQuantizedSpectralCoefficients++ = *pBak++; - } - } - - 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. ------------------------------------------------------------------------------------------------ - return: - --------------------------------------------------------------------------------------------- */ - -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 = pHcr->tableInfo.pCbDimShift; - USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection; - - numCodeword = 0; - for ( hcrSection = numSection; hcrSection != 0; hcrSection-- ) { - *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook]; - if ( *pCodebook != 0 ) { - numCodeword += *pNumCodewordInSection; - } - pNumCodewordInSection++; - pCodebook++; - } - 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; - - UINT searchStart = 0; - - /* calculate *pNumSortedSection and store the priorities in array pSortedCdebook */ - pDest = pSortedCodebook; - numZeroSection = 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 */ - pCodebook = pHcr->decInOut.pCodebook; - - /* sort priorities of the codebooks in array pSortedCdebook[] */ - numSectionDec = numSection - 1; - if ( numSectionDec > 0 ) { - counter = numSectionDec; - 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; - } - } - counter -= 1; - } - } - - /* clear codebookSwitch array */ - 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] )) { - pCodebookSwitch[i] = 1; - pSortedCodebook[j] = pCodebook[i]; /* sort codebook */ - pNumSortedCodewordInSection[j] = pNumCodewordInSection[i]; /* sort NumCodewordInSection */ - - startOffset = 0; - for ( k = 0; k < i; k++ ) { /* make entry in pReorderOffst */ - startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]]; - } - pReorderOffset[j] = startOffset; /* offset for reordering the codewords */ - - if(i == searchStart) { - UINT k = i; - while(pCodebookSwitch[k++] == 1) searchStart++; - } - break; - } - } - } -} - - -/*--------------------------------------------------------------------------------------------- - 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-- ) { - sortedCodebook = *pSortedCodebook++; - segmentWidth = FDKmin(pMaxCwLength[sortedCodebook],lengthOfLongestCodeword); - - 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 */ - *pLeftStartOfSegment++ = intermediateResult; - *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1; - *pRemainingBitsInSegment++ = segmentWidth; - segmentStart += segmentWidth; - numSegment += 1; - } - /* width does not allow a new segment */ - else { - /* correct the last segment length */ - pLeftStartOfSegment--; - pRightStartOfSegment--; - pRemainingBitsInSegment--; - segmentStart = *pLeftStartOfSegment - bitstreamIndex; - - lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart; - *pRemainingBitsInSegment = lastSegmentWidth; - *pRightStartOfSegment = bitstreamIndex + segmentStart + lastSegmentWidth - 1; - endFlag = 1; - break; - } - } - pNumSortedCodewordInSection++; - if (endFlag != 0) { - break; - } - } - 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 - - 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) { - pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW; - pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; - - srtSecCnt++; - remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; - inSegmentRemainNumCW = numSegment; - /* data of a sorted section was integrated in extended sorted section */ - } - 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 - - - - xSrtScCnt += 1; - - 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 - '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; - USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets; - - while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0) - { - cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx]; - numExtendedSortedCodewordInSectionIdx++; - if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { - return; - } - if (cwSum > numSegment) { - return; - } - counter++; - if (counter > 1024/4) { - return; - } - if ( cwSum == numSegment ) { - pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter; - numExtendedSortedSectionsInSetsIdx++; - if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) { - return; - } - counter = 0; - cwSum = 0; - } - } - 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; - 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; - - /* clear result array */ - //pQSC = &pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]; - //pQSC = *pQuantizedSpectralCoefficients; - - 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 */ - extendedSortedCodebookIdx++; - 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 - maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx]; - maxLenOfCbInExtSrtSecIdx++; - 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 */ - /* PCW_BodyONLY */ - /*==============*/ - - for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) { - numDecodedBits = 0; - - /* decode PCW_BODY */ - 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 */ - quantizedSpectralCoefficientsIdx++; - if (quantizedSpectralCoefficientsIdx >= 1024) { - return; - } - } - - /* one more PCW should be decoded */ - -#if DETECT_TOO_LONG_CW_READS - 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)) { - return; - } -#endif - 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 */ - /* PCW_Body and PCW_Sign */ - /*=======================*/ - - 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 - ); - 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) ) { - 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)) { - 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 */ - /* PCW_Body, PCW_Sign and maybe PCW_Escape */ - /*=========================================*/ - - for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) - { - int err; - 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 - ); - if (err != 0) { - return; - } - - /* 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 - ); - } - 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 - ); - } - quantizedSpectralCoefficientsIdx++; - if (quantizedSpectralCoefficientsIdx >= 1024) { - return; - } - - /* one more PCW should be decoded */ - -#if DETECT_TOO_LONG_CW_READS - 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)) { - return; - } -#endif - pLeftStartOfSegment++; - pRemainingBitsInSegment++; - } - } - - /* all PCWs belonging to this extended section should be decoded */ - numExtendedSortedCodewordInSectionIdx++; - if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR+MAX_HCR_SETS) { - return; - } - } - /* all PCWs should be decoded */ - - numExtendedSortedSectionsInSetsIdx++; - if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) { - return; - } - - /* Write back indexes into structure */ - pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; - pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; - 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 - 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) -{ - SCHAR i; - if ( remainingBitsInSegment < 0 ) { - /* log the error */ - switch (kind) { - case PCW_BODY: - pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY; - break; - case PCW_BODY_SIGN: - pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN; - break; - 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; - } - 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--) { - if (*pRemainingBitsInSegment++ != 0) { - segmentationErrorFlag = 1; - } - } - if (segmentationErrorFlag == 1) { - 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) -{ - if (carryBit == 0) { - *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) */ -} - - -/*--------------------------------------------------------------------------------------------- - 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 - ) -{ - UCHAR carryBit; - UINT branchNode; - UINT treeNode; - UINT branchValue; - const SCHAR *pQuantVal; - - /* decode PCW_BODY */ - 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 */ - FROM_LEFT_TO_RIGHT); - *pRemainingBitsInSegment -= 1; - *pNumDecodedBits += 1; - - 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 */ - } - - } - - 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: - 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; - - /* decode escape prefix */ - while (1) { - carryBit = HcrGetABitFromBitstream(bs, - pLeftStartOfSegment, - pLeftStartOfSegment, /* dummy */ - FROM_LEFT_TO_RIGHT); - *pRemainingBitsInSegment -= 1; - *pNumDecodedBits += 1; - - if (carryBit != 0) { - escapeOnesCounter += 1; - } - else { - escapeOnesCounter += 4; - break; - } - } - - /* decode escape word */ - for( i=escapeOnesCounter; i != 0 ; i-- ) { - carryBit = HcrGetABitFromBitstream(bs, - pLeftStartOfSegment, - pLeftStartOfSegment, /* dummy */ - FROM_LEFT_TO_RIGHT); - *pRemainingBitsInSegment -= 1; - *pNumDecodedBits += 1; - - escape_word <<= 1; - escape_word = escape_word | carryBit; - } - - sign = (quantSpecCoef >= 0) ? 1 : -1; - - 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 ------------------------------------------------------------------------------------------------ - 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-- ) { - quantSpecCoef = *pQuantVal++; - if (quantSpecCoef != 0) { - carryBit = HcrGetABitFromBitstream(bs, - pLeftStartOfSegment, - pLeftStartOfSegment, /* dummy */ - FROM_LEFT_TO_RIGHT); - *pRemainingBitsInSegment -= 1; - *pNumDecodedBits += 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] = FL2FXCONST_DBL(0.0f); - } - *quantSpecCoefIdx += 1 ; - if (*quantSpecCoefIdx >= 1024) { - return -1; - } - } - return 0; -} - - -/*--------------------------------------------------------------------------------------------- - 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); - - /* 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 - } - } -} - - -/*--------------------------------------------------------------------------------------------- - 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; -} - - - - |