12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*****************************  MPEG-4 AAC Decoder  ***************************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Author(s):   Robert Weidner (DSP Solutions)
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo,
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                decode priority codewords (PCWs)
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*******************************************************************************/
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcr.h"
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcr_types.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcr_bit.h"
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcrs.h"
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_ram.h"
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_rom.h"
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "channel.h"
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "block.h"
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdecoder.h"     /* for ID_CPE, ID_SCE ... */
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_bitstream.h"
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectextern int mlFileChCurr;
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void errDetectorInHcrSideinfoShrt(SCHAR cb,
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         SHORT numLine,
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         UINT *errorWord);
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void errDetectorInHcrLengths(SCHAR  lengthOfLongestCodeword,
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    SHORT  lengthOfReorderedSpectralData,
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    UINT  *errorWord);
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrCalcNumCodeword                    (H_HCR_INFO pHcr);
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr);
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrPrepareSegmentationGrid            (H_HCR_INFO pHcr);
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrExtendedSectionInfo                (H_HCR_INFO pHcr);
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void DeriveNumberOfExtendedSortedSectionsInSets(UINT   numSegment,
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       USHORT  *pNumExtendedSortedCodewordInSection,
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       int      numExtendedSortedCodewordInSectionIdx,
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       USHORT  *pNumExtendedSortedSectionsInSets,
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       int      numExtendedSortedSectionsInSetsIdx);
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT  DecodeEscapeSequence(HANDLE_FDK_BITSTREAM  bs,
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 INT                   quantSpecCoef,
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 USHORT               *pLeftStartOfSegment,
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 SCHAR                *pRemainingBitsInSegment,
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 int                  *pNumDecodedBits
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                );
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int DecodePCW_Sign(HANDLE_FDK_BITSTREAM  bs,
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          UINT                  codebookDim,
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const SCHAR          *pQuantVal,
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          FIXP_DBL             *pQuantSpecCoef,
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          int                  *quantSpecCoefIdx,
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          USHORT               *pLeftStartOfSegment,
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          SCHAR                *pRemainingBitsInSegment,
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          int                  *pNumDecodedBits
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         );
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM  bs,
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   const UINT           *pCurrentTree,
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   const SCHAR          *pQuantValBase,
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         USHORT         *pLeftStartOfSegment,
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         SCHAR          *pRemainingBitsInSegment,
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         int            *pNumDecodedBits
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  );
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr);
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrReorderQuantizedSpectralCoefficients(
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        H_HCR_INFO pHcr,
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const SamplingRateInfo *pSamplingRateInfo
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_IMMEDIATELY
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UCHAR errDetectPcwSegmentation(SCHAR       remainingBitsInSegment,
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      H_HCR_INFO  pHcr,
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      PCW_TYPE    kind,
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      FIXP_DBL   *qsc_base_of_cw,
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      UCHAR       dimension);
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_FINAL
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr);
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Check if codebook and numSect are within allowed range (short only)
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,UINT* errorWord)
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) {
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK;
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( numLine < 0 || numLine > 1024 ) {
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK;
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Check both HCR lengths
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void errDetectorInHcrLengths(SCHAR  lengthOfLongestCodeword,
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    SHORT  lengthOfReorderedSpectralData,
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                    UINT  *errorWord)
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( lengthOfReorderedSpectralData < lengthOfLongestCodeword ) {
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *errorWord |= HCR_SI_LENGTHS_FAILURE;
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Decode (and adapt if necessary) the two HCR sideinfo components:
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    'reordered_spectral_data_length' and 'longest_codeword_length'
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid CHcr_Read(HANDLE_FDK_BITSTREAM    bs,
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               CAacDecoderChannelInfo *pAacDecoderChannelInfo)
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    globalHcrType = getHcrType(&pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo);
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SHORT  lengOfReorderedSpectralData;
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR  lengOfLongestCodeword;
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = 0;
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword       = 0;
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ------- SI-Value No 1 ------- */
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    lengOfReorderedSpectralData = FDKreadBits(bs,14) + ERROR_LORSD;
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( globalHcrType == ID_CPE ) {
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) {
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) {
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = CPE_TOP_LENGTH;            /* use valid maximum */
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE || globalHcrType == ID_CCE ) {
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) {
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) {
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = SCE_TOP_LENGTH;            /* use valid maximum */
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ------- SI-Value No 2 ------- */
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    lengOfLongestCodeword = FDKreadBits(bs,6) + ERROR_LOLC;
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((lengOfLongestCodeword >= 0) && (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) {
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = lengOfLongestCodeword;                /* the decoded value is within range */
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) {
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = LEN_OF_LONGEST_CW_TOP_LENGTH;       /* use valid maximum */
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Sets up HCR ROM-Tables
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid HcrInitRom(H_HCR_INFO pHcr)
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->cbPairs.pMinOfCbPair     = aMinOfCbPair;
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->cbPairs.pMaxOfCbPair     = aMaxOfCbPair;
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->tableInfo.pMaxCwLength   = aMaxCwLen;
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->tableInfo.pCbDimension   = aDimCb;
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->tableInfo.pCbDimShift    = aDimCbShift;
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->tableInfo.pCbSign        = aSignCb;
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->tableInfo.pCbPriority    = aCbPriority;
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->tableInfo.pLargestAbsVal = aLargestAbsoluteValue;
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Set up HCR - must be called before every call to HcrDecoder().
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    For short block a sorting algorithm is applied to get the SI in the order
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    that HCR could assemble the qsc's as if it is a long block.
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-----------------------------------------------------------------------------------------------
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return:     error log
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT HcrInit(H_HCR_INFO              pHcr,
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             CAacDecoderChannelInfo *pAacDecoderChannelInfo,
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             const SamplingRateInfo *pSamplingRateInfo,
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project             HANDLE_FDK_BITSTREAM    bs)
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo;
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SHORT *pNumLinesInSec;
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR *pCodeBk;
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SHORT  numSection;
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR  cb;
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  numLine;
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int  i;
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.lengthOfReorderedSpectralData      = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData;
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.lengthOfLongestCodeword            = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword;
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.pQuantizedSpectralCoefficientsBase = pAacDecoderChannelInfo->pSpectralCoefficient;
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.quantizedSpectralCoefficientsIdx   = 0;
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.pCodebook                          = pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.pNumLineInSect                     = pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.numSection                         = pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection;
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.errorLog = 0;
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->nonPcwSideinfo.pResultBase                  = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKsyncCache(bs);
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.bitstreamIndex                     = FDKgetBitCnt(bs);
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo))   /* short block */
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SHORT  band;
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SHORT  maxBand;
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  group;
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  winGroupLen;
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  window;
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  numUnitInBand;
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  cntUnitInBand;
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  groupWin;
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  cb_prev;
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR *pCodeBook;
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const SHORT *BandOffsets;
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR  numOfGroups;
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pCodeBook      = pAacDecoderChannelInfo->pDynData->aCodeBook;             /* in */
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pNumLinesInSec = pHcr->decInOut.pNumLineInSect;                               /* out */
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pCodeBk        = pHcr->decInOut.pCodebook;                                    /* out */
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    BandOffsets    = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numOfGroups    = GetWindowGroups(pIcsInfo);
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numLine = 0;
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numSection = 0;
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cb      = pCodeBook[0];
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cb_prev = pCodeBook[0];
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new section starts */
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pCodeBk++ = cb_prev;
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (band = 0; band < maxBand; band++) {  /* from low to high sfbs i.e. from low to high frequencies  */
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numUnitInBand = ((BandOffsets[band+1] - BandOffsets[band]) >> FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (cntUnitInBand = numUnitInBand;  cntUnitInBand != 0; cntUnitInBand-- ) { /* for every unit in the band */
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (window = 0, group = 0; group < numOfGroups; group++) {
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) {
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            cb = pCodeBook[group * 16 + band];
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            if (cb != cb_prev) {
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_VALID_HCR_INPUT /* short-block  1 of 2 */
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog );
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              if (pHcr->decInOut.errorLog != 0 ) {
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                return ( pHcr->decInOut.errorLog );
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              }
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              *pCodeBk++ = cb;
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              *pNumLinesInSec++ = numLine;
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              numSection++;
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              cb_prev = cb;
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              numLine = LINES_PER_UNIT;
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            else {
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              numLine += LINES_PER_UNIT;
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numSection++;
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_VALID_HCR_INPUT /* short-block  2 of 2 */
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog );
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( numSection <= 0 || numSection > 1024/2 ) {
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK;
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            pHcr->decInOut.lengthOfReorderedSpectralData,
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &pHcr->decInOut.errorLog);
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pHcr->decInOut.errorLog != 0 ) {
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return ( pHcr->decInOut.errorLog );
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pCodeBk = cb;
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pNumLinesInSec = numLine;
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pHcr->decInOut.numSection = numSection;
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else /* end short block prepare SI */
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {      /* long block */
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_VALID_HCR_INPUT /* long-block  1 of 1 */
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            pHcr->decInOut.lengthOfReorderedSpectralData,
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &pHcr->decInOut.errorLog);
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numSection     = pHcr->decInOut.numSection;
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pNumLinesInSec = pHcr->decInOut.pNumLineInSect;
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pCodeBk        = pHcr->decInOut.pCodebook;
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( numSection <= 0 || numSection > 64 ) {
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK;
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numSection = 0;
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i = numSection; i != 0; i-- )
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cb = *pCodeBk++;
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) {
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pHcr->decInOut.errorLog |= CB_OUT_OF_RANGE_LONG_BLOCK;
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numLine = *pNumLinesInSec++;
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* FDK_ASSERT(numLine > 0); */
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (numLine <= 0) || (numLine > 1024) ) {
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK;
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pHcr->decInOut.errorLog != 0 ) {
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return ( pHcr->decInOut.errorLog );
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif  /* CHECK_VALID_HCR_INPUT */
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pCodeBk = pHcr->decInOut.pCodebook;
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i = 0; i < numSection; i++ ) {
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (*pCodeBk == NOISE_HCB)      ||
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (*pCodeBk == INTENSITY_HCB2) ||
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project         (*pCodeBk == INTENSITY_HCB))
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pCodeBk = 0;
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pCodeBk++;
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* HCR-sideinfo-input is complete and seems to be valid */
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ( pHcr->decInOut.errorLog );
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if USE_HCR_DUMMY
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This HCR - dummy  - function writes only a dirac-sequence in output buffer
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT HcrDecoder(H_HCR_INFO              pHcr,
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                const CAacDecoderChannelInfo *pAacDecoderChannelInfo,
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                HANDLE_FDK_BITSTREAM    bs)
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (SHORT i=0; i < 1024; i++ ) {
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = FL2FXCONST_DBL(0.0f);
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( i % 30 == 0) {
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = (FIXP_DBL)HCR_DIRAC;
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else /* USE_HCR_DUMMY */
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function decodes the codewords of the spectral coefficients from the
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    bitstream according to the HCR algorithm and stores the quantized spectral
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    coefficients in correct order in the output buffer.
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT HcrDecoder(H_HCR_INFO              pHcr,
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                CAacDecoderChannelInfo *pAacDecoderChannelInfo,
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                const SamplingRateInfo       *pSamplingRateInfo,
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                HANDLE_FDK_BITSTREAM    bs)
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int pTmp1, pTmp2, pTmp3, pTmp4;
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int        pTmp5;
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT        bitCntOffst;
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT       saveBitCnt = FDKgetBitCnt(bs);   /* save bitstream position */
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HcrCalcNumCodeword(pHcr);
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HcrSortCodebookAndNumCodewordInSection(pHcr);
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HcrPrepareSegmentationGrid(pHcr);
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HcrExtendedSectionInfo(pHcr);
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) != 0 ) {
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ( pHcr->decInOut.errorLog );  /* sideinfo is massively corrupt, return from HCR without having decoded anything */
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  DeriveNumberOfExtendedSortedSectionsInSets(pHcr->segmentInfo.numSegment,
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             pHcr->sectionInfo.pNumExtendedSortedCodewordInSection,
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx,
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             pHcr->sectionInfo.pNumExtendedSortedSectionsInSets,
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx);
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* store */
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx;
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ------- decode meaningful PCWs ------ */
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  DecodePCWs(bs, pHcr);
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) == 0 ) {
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ------ decode the non-PCWs -------- */
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    DecodeNonPCWs(bs, pHcr);
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_FINAL
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  errDetectWithinSegmentationFinal(pHcr);
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* restore */
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.extendedSortedCodebookIdx             = pTmp2;
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx    = pTmp3;
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.quantizedSpectralCoefficientsIdx         = pTmp4;
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx              = pTmp5;
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo, pSamplingRateInfo);
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* restore bitstream position */
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  bitCntOffst = saveBitCnt - FDKgetBitCnt(bs);
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if( bitCntOffst ) {
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKpushBiDirectional(bs, bitCntOffst);
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return ( pHcr->decInOut.errorLog );
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif  /* USE_HCR_DUMMY */
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function reorders the quantized spectral coefficients sectionwise for
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    long- and short-blocks and compares to the LAV (Largest Absolute Value of
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    the current codebook) -- a counter is incremented if there is an error
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    detected.
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    Additional for short-blocks a unit-based-deinterleaving is applied.
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    Moreover (for short blocks) the scaling is derived (compare plain huffman
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    decoder).
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrReorderQuantizedSpectralCoefficients(
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const SamplingRateInfo *pSamplingRateInfo
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT       qsc;
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT      abs_qsc;
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT      i,j;
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT    numSpectralValuesInSection;
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *pTeVa;
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT    lavErrorCnt = 0;
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT      numSection                         = pHcr->decInOut.numSection;
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SPECTRAL_PTR  pQuantizedSpectralCoefficientsBase = pHcr->decInOut.pQuantizedSpectralCoefficientsBase;
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *pQuantizedSpectralCoefficients     = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR    *pCbDimShift                  = pHcr->tableInfo.pCbDimShift;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const USHORT   *pLargestAbsVal               = pHcr->tableInfo.pLargestAbsVal;
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR    *pSortedCodebook                    = pHcr->sectionInfo.pSortedCodebook;
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   *pNumSortedCodewordInSection        = pHcr->sectionInfo.pNumSortedCodewordInSection;
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   *pReorderOffset                     = pHcr->sectionInfo.pReorderOffset;
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *pTempValues                        = pHcr->segmentInfo.pTempValues;
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *pBak                               = pHcr->segmentInfo.pTempValues;
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(pTempValues,1024*sizeof(FIXP_DBL));
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* long and short: check if decoded huffman-values (quantized spectral coefficients) are within range */
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i=numSection; i != 0; i-- ) {
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numSpectralValuesInSection = *pNumSortedCodewordInSection++ << pCbDimShift[*pSortedCodebook];
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pTeVa = &pTempValues[*pReorderOffset++];
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for( j = numSpectralValuesInSection; j != 0; j-- ) {
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      qsc = *pQuantizedSpectralCoefficients++;
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      abs_qsc = FDKabs(qsc);
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if VALID_LAV_ERROR_TRIGGER
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) {
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pTeVa++ = (FIXP_DBL)qsc;  /* the qsc value is within range */
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else { /* line is too high .. */
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( abs_qsc == Q_VALUE_INVALID ) { /* .. because of previous marking --> dont set LAV flag (would be confusing), just copy out the already marked value */
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *pTeVa++ = (FIXP_DBL) qsc;
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {                              /* .. because a too high value was decoded for this cb --> set LAV flag */
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *pTeVa++ = (FIXP_DBL) Q_VALUE_INVALID;
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          lavErrorCnt += 1;
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) {
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pTeVa++ = qsc;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pTeVa++ = Q_VALUE_INVALID;
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        lavErrorCnt += 1;
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pSortedCodebook++;
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo))
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL *pOut;
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL  locMax;
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FIXP_DBL  tmp;
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     groupoffset;
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     group;
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     band;
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     groupwin;
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     window;
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     numWinGroup;
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SHORT     interm;
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     numSfbTransm;
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR     winGroupLen;
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SHORT     index;
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT       msb;
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT       lsb;
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SHORT   *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor;
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SHORT   *pSfbSclHcr   = pAacDecoderChannelInfo->pDynData->aSfbScale;
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const SHORT *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pBak = pHcr->segmentInfo.pTempValues;
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* deinterleave unitwise for short blocks */
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( window = 0; window < (8); window++ ) {
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pOut = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength);
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( i=0; i < (LINES_PER_UNIT_GROUP); i++ ) {
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) + i * 32;	/* distance of lines between unit groups has to be constant for every framelength (32)!  */
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for ( j=(LINES_PER_UNIT); j != 0; j-- ) {
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          *pOut++ = *pTeVa++;
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* short blocks only */
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* derive global scaling-value for every sfb and every window (as it is done in plain-huffman-decoder at short blocks) */
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    groupoffset = 0;
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numSfbTransm = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (group = 0; group < numWinGroup; group++) {
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (band = 0; band < numSfbTransm; band++) {
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        interm = group * 16 + band;
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        msb = pScaleFacHcr[interm] >> 2;
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        lsb = pScaleFacHcr[interm] & 3;
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (groupwin = 0; groupwin < winGroupLen; groupwin++) {
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          window = groupoffset + groupwin;
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pBak = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength);
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          locMax = FL2FXCONST_DBL(0.0f);
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          for (index = BandOffsets[band]; index < BandOffsets[band+1]; index += LINES_PER_UNIT) {
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pTeVa = &pBak[index];
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            for ( i = LINES_PER_UNIT; i != 0; i --) {
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              tmp = (*pTeVa < FL2FXCONST_DBL(0.0f))? -*pTeVa++ : *pTeVa++;
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              locMax = fixMax(tmp,locMax);
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            }
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if ( fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE ) {
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE;
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pSfbSclHcr[window*16+band] = msb - GetScaleFromValue(locMax, lsb);  /* save global scale maxima in this sfb */
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* copy straight for long-blocks */
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pQuantizedSpectralCoefficients = SPEC_LONG(pQuantizedSpectralCoefficientsBase);
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i = 1024; i != 0; i-- ) {
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pQuantizedSpectralCoefficients++ = *pBak++;
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( lavErrorCnt != 0 ) {
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pHcr->decInOut.errorLog |= LAV_VIOLATION;
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function calculates the number of codewords
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    for each section (numCodewordInSection) and the number of codewords
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    for all sections (numCodeword).
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    For zero and intensity codebooks a entry is also done in the variable
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    numCodewordInSection. It is assumed that the codebook is a two tuples
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    codebook. This is needed later for the calculation of the base addresses
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    for the reordering of the quantize spectral coefficients at the end of the
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    hcr tool.
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    The variable numCodeword contain the number of codewords which are really
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    in the bitstream. Zero or intensity codebooks does not increase the
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    variable numCodewords.
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-----------------------------------------------------------------------------------------------
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return:   -
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrCalcNumCodeword(H_HCR_INFO pHcr)
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int     hcrSection;
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numCodeword;
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numSection            =   pHcr->decInOut.numSection;
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pCodebook             =   pHcr->decInOut.pCodebook;
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SHORT  *pNumLineInSection     =   pHcr->decInOut.pNumLineInSect;
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR  *pCbDimShift     =   pHcr->tableInfo.pCbDimShift;
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumCodewordInSection =   pHcr->sectionInfo.pNumCodewordInSection;
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  numCodeword = 0;
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( hcrSection = numSection; hcrSection != 0; hcrSection-- ) {
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook];
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( *pCodebook != 0 ) {
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numCodeword += *pNumCodewordInSection;
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pNumCodewordInSection++;
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pCodebook++;
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.numCodeword = numCodeword;
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function calculates the number
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    of sorted codebooks and sorts the codebooks and the numCodewordInSection
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    according to the priority.
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr)
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    i,j,k;
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR   temp;
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    counter;
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    startOffset;
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numZeroSection;
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pDest;
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numSectionDec;
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numSection                  =   pHcr->decInOut.numSection;
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pCodebook                   =   pHcr->decInOut.pCodebook;
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pSortedCodebook             =   pHcr->sectionInfo.pSortedCodebook;
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumCodewordInSection       =   pHcr->sectionInfo.pNumCodewordInSection;
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumSortedCodewordInSection =   pHcr->sectionInfo.pNumSortedCodewordInSection;
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pCodebookSwitch             =   pHcr->sectionInfo.pCodebookSwitch;
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pReorderOffset              =   pHcr->sectionInfo.pReorderOffset;
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR   *pCbPriority          =   pHcr->tableInfo.pCbPriority;
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR   *pMinOfCbPair         =   pHcr->cbPairs.pMinOfCbPair;
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR   *pMaxOfCbPair         =   pHcr->cbPairs.pMaxOfCbPair;
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR   *pCbDimShift          =   pHcr->tableInfo.pCbDimShift;
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT searchStart = 0;
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* calculate *pNumSortedSection and store the priorities in array pSortedCdebook */
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pDest = pSortedCodebook;
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  numZeroSection = 0;
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i=numSection; i != 0; i-- ) {
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( pCbPriority[*pCodebook] == 0 ) {
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numZeroSection += 1;
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pDest++ = pCbPriority[*pCodebook++];
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.numSortedSection = numSection - numZeroSection;    /* numSortedSection contains no zero or intensity section */
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pCodebook = pHcr->decInOut.pCodebook;
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* sort priorities of the codebooks in array pSortedCdebook[] */
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  numSectionDec = numSection - 1;
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( numSectionDec > 0 ) {
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    counter = numSectionDec;
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( j=numSectionDec; j != 0; j-- ) {
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( i=0; i < counter; i++ ) {
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* swap priorities */
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( pSortedCodebook[i+1] > pSortedCodebook[i] ) {
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          temp                 = pSortedCodebook[i];
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pSortedCodebook[i]   = pSortedCodebook[i+1];
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pSortedCodebook[i+1] = temp;
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      counter -= 1;
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* clear codebookSwitch array */
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i = numSection; i != 0; i--) {
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pCodebookSwitch++ = 0;
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* sort sectionCodebooks and numCodwordsInSection and calculate pReorderOffst[j] */
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( j = 0; j < numSection; j++ ) {
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i = searchStart; i < numSection; i++ ) {
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( pCodebookSwitch[i] == 0 && ( pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i]  ||  pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i] )) {
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pCodebookSwitch[i] = 1;
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pSortedCodebook[j] = pCodebook[i];                              /* sort codebook */
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pNumSortedCodewordInSection[j] = pNumCodewordInSection[i];      /* sort NumCodewordInSection */
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        startOffset = 0;
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for ( k = 0; k < i; k++ ) {                                     /* make entry in pReorderOffst */
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]];
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pReorderOffset[j] = startOffset;                                /* offset for reordering the codewords */
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(i == searchStart) {
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          UINT k = i;
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          while(pCodebookSwitch[k++] == 1) searchStart++;
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function calculates the segmentation, which includes numSegment,
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment.
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    The segmentation could be visualized a as kind of 'overlay-grid' for the
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    bitstream-block holding the HCR-encoded quantized-spectral-coefficients.
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr)
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   i,j;
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   numSegment = 0;
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   segmentStart = 0;
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR    segmentWidth;
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR    lastSegmentWidth;
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR    sortedCodebook;
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR    endFlag = 0;
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   intermediateResult;
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR    lengthOfLongestCodeword       =   pHcr->decInOut.lengthOfLongestCodeword;
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SHORT    lengthOfReorderedSpectralData =   pHcr->decInOut.lengthOfReorderedSpectralData;
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT     numSortedSection              =   pHcr->sectionInfo.numSortedSection;
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR   *pSortedCodebook               =   pHcr->sectionInfo.pSortedCodebook;
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT  *pNumSortedCodewordInSection   =   pHcr->sectionInfo.pNumSortedCodewordInSection;
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT  *pLeftStartOfSegment           =   pHcr->segmentInfo.pLeftStartOfSegment;
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT  *pRightStartOfSegment          =   pHcr->segmentInfo.pRightStartOfSegment;
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR   *pRemainingBitsInSegment       =   pHcr->segmentInfo.pRemainingBitsInSegment;
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT   bitstreamIndex                =   pHcr->decInOut.bitstreamIndex;
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR *pMaxCwLength              =   pHcr->tableInfo.pMaxCwLength;
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i=numSortedSection; i != 0; i-- ) {
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sortedCodebook = *pSortedCodebook++;
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    segmentWidth = FDKmin(pMaxCwLength[sortedCodebook],lengthOfLongestCodeword);
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( j = *pNumSortedCodewordInSection; j != 0 ; j-- ) {
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* width allows a new segment */
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      intermediateResult = bitstreamIndex + segmentStart;
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (segmentStart + segmentWidth) <= lengthOfReorderedSpectralData ) {
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* store segment start, segment length and increment the number of segments */
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pLeftStartOfSegment++ = intermediateResult;
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1;
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pRemainingBitsInSegment++ = segmentWidth;
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        segmentStart += segmentWidth;
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numSegment += 1;
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* width does not allow a new segment */
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* correct the last segment length */
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pLeftStartOfSegment--;
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pRightStartOfSegment--;
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pRemainingBitsInSegment--;
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        segmentStart = *pLeftStartOfSegment - bitstreamIndex;
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart;
8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pRemainingBitsInSegment = lastSegmentWidth;
8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *pRightStartOfSegment = bitstreamIndex + segmentStart + lastSegmentWidth - 1;
8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        endFlag = 1;
8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pNumSortedCodewordInSection++;
8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (endFlag != 0) {
8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->segmentInfo.numSegment = numSegment;
8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function adapts the sorted section boundaries to the boundaries of
9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    segmentation. If the section lengths does not fit completely into the
9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    current segment, the section is spitted into two so called 'extended
9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    sections'. The extended-section-info (pNumExtendedSortedCodewordInSectin
9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    and pExtendedSortedCodebook) is updated in this case.
9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void HcrExtendedSectionInfo(H_HCR_INFO pHcr)
9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    srtSecCnt = 0;         /* counter for sorted sections */
9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    xSrtScCnt = 0;         /* counter for extended sorted sections */
9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    remainNumCwInSortSec;
9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    inSegmentRemainNumCW;
9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numSortedSection            = pHcr->sectionInfo.numSortedSection;
9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pSortedCodebook             = pHcr->sectionInfo.pSortedCodebook;
9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pExtendedSortedCoBo         = pHcr->sectionInfo.pExtendedSortedCodebook;
9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumExtSortCwInSect         = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numSegment                  = pHcr->segmentInfo.numSegment;
9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR  *pMaxLenOfCbInExtSrtSec      = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR   lengthOfLongestCodeword     = pHcr->decInOut.lengthOfLongestCodeword;
9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR   *pMaxCwLength         = pHcr->tableInfo.pMaxCwLength;
9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  inSegmentRemainNumCW = numSegment;
9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while (srtSecCnt < numSortedSection) {
9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (inSegmentRemainNumCW < remainNumCwInSortSec) {
9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      remainNumCwInSortSec -= inSegmentRemainNumCW;
9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      inSegmentRemainNumCW = numSegment;
9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* data of a sorted section was not integrated in extended sorted section */
9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (inSegmentRemainNumCW == remainNumCwInSortSec) {
9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      srtSecCnt++;
9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      inSegmentRemainNumCW = numSegment;
9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* data of a sorted section was integrated in extended sorted section */
9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else { /* inSegmentRemainNumCW > remainNumCwInSortSec */
9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec;
9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      inSegmentRemainNumCW -= remainNumCwInSortSec;
9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      srtSecCnt++;
9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* data of a sorted section was integrated in extended sorted section */
9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pMaxLenOfCbInExtSrtSec[xSrtScCnt] = FDKmin(pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],lengthOfLongestCodeword);
9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    xSrtScCnt += 1;
9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS) ) {
9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW;
9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pNumExtSortCwInSect[xSrtScCnt] = 0;
9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function calculates the number of extended sorted sections which
9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    belong to the sets. Each set from set 0 (one and only set for the PCWs)
9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    till to the last set gets a entry in the array to which
9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    'pNumExtendedSortedSectinsInSets' points to.
9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    Calculation: The entrys in pNumExtendedSortedCodewordInSectin are added
9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    untill the value numSegment is reached. Then the sum_variable is cleared
9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    and the calculation starts from the beginning. As much extended sorted
9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    Sections are summed up to reach the value numSegment, as much is the
9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    current entry in *pNumExtendedSortedCodewordInSectin.
9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void DeriveNumberOfExtendedSortedSectionsInSets(UINT    numSegment,
9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       USHORT *pNumExtendedSortedCodewordInSection,
9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       int     numExtendedSortedCodewordInSectionIdx,
9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       USHORT *pNumExtendedSortedSectionsInSets,
9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                       int     numExtendedSortedSectionsInSetsIdx)
9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT  counter = 0;
9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    cwSum   = 0;
9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumExSortCwInSec   = pNumExtendedSortedCodewordInSection;
10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets;
10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0)
10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx];
10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numExtendedSortedCodewordInSectionIdx++;
10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (cwSum > numSegment) {
10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    counter++;
10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (counter > 1024/4) {
10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( cwSum == numSegment ) {
10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter;
10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numExtendedSortedSectionsInSetsIdx++;
10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return;
10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      counter = 0;
10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      cwSum = 0;
10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter;   /* save last entry for the last - probably shorter - set */
10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function decodes all priority codewords (PCWs) in a spectrum (within
10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    set 0). The calculation of the PCWs is managed in two loops. The
10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    loopcounter of the outer loop is set to the first value pointer
10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    pNumExtendedSortedSectionsInSets points to. This value represents the
10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    number of extended sorted sections within set 0.
10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    The loopcounter of the inner loop is set to the first value pointer
10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    pNumExtendedSortedCodewordInSectin points to. The value represents the
10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    number of extended sorted codewords in sections (the original sections have
10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    been splitted to go along with the borders of the sets).
10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    Each time the number of the extended sorted codewords in sections are de-
10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    coded, the pointer 'pNumExtendedSortedCodewordInSectin' is incremented by
10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    one.
10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT         i;
10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT       extSortSec;
10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT       curExtSortCwInSec;
10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR        codebook;
10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR        dimension;
10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UINT  *pCurrentTree;
10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const SCHAR *pQuantValBase;
10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const SCHAR *pQuantVal;
10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT      *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int          numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR       *pExtendedSortedCodebook             = pHcr->sectionInfo.pExtendedSortedCodebook;
10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int          extendedSortedCodebookIdx           = pHcr->sectionInfo.extendedSortedCodebookIdx;
10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT      *pNumExtendedSortedSectionsInSets    = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int          numExtendedSortedSectionsInSetsIdx  = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL    *pQuantizedSpectralCoefficients      = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int          quantizedSpectralCoefficientsIdx    = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT      *pLeftStartOfSegment                 = pHcr->segmentInfo.pLeftStartOfSegment;
10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR       *pRemainingBitsInSegment             = pHcr->segmentInfo.pRemainingBitsInSegment;
10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR       *pMaxLenOfCbInExtSrtSec              = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int          maxLenOfCbInExtSrtSecIdx            = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR        maxAllowedCwLen;
10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int          numDecodedBits;
10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR *pCbDimension =  pHcr->tableInfo.pCbDimension;
10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const UCHAR *pCbSign      =  pHcr->tableInfo.pCbSign;
10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* clear result array */
10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  //pQSC = &pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx];
10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  //pQSC = *pQuantizedSpectralCoefficients;
10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx,1024*sizeof(FIXP_DBL));
10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* decode all PCWs in the extended sorted section(s) belonging to set 0 */
10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( extSortSec = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; extSortSec != 0; extSortSec-- ) {
10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    codebook        =  pExtendedSortedCodebook[extendedSortedCodebookIdx];   /* get codebook for this extended sorted section and increment ptr to cb of next ext. sort sec */
10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    extendedSortedCodebookIdx++;
10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    dimension       =  pCbDimension[codebook];         /* get dimension of codebook of this extended sort. sec. */
10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pCurrentTree    =  aHuffTable  [codebook];         /* convert codebook to pointer to QSCs */
10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pQuantValBase   =  aQuantTable [codebook];         /* convert codebook to index to table of QSCs */
10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx];
10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    maxLenOfCbInExtSrtSecIdx++;
10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* switch for decoding with different codebooks: */
11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( pCbSign[codebook] == 0 ) {                    /* no sign bits follow after the codeword-body */
11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* PCW_BodyONLY */
11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*==============*/
11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) {
11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numDecodedBits = 0;
11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* decode PCW_BODY */
11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQuantVal = DecodePCW_Body(bs,
11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pCurrentTree,
11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pQuantValBase,
11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pLeftStartOfSegment,
11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pRemainingBitsInSegment,
11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &numDecodedBits
11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  );
11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* result is written out here because NO sign bits follow the body */
11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for( i=dimension; i != 0 ; i-- ) {
11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) *pQuantVal++;                               /* write quant. spec. coef. into spectrum; sign is already valid */
11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          quantizedSpectralCoefficientsIdx++;
11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (quantizedSpectralCoefficientsIdx >= 1024) {
11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            return;
11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* one more PCW should be decoded */
11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG) ) {
11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED;
11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_IMMEDIATELY
11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY,pHcr,PCW_BODY,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) {
11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pLeftStartOfSegment++;                                             /* update pointer for decoding the next PCW */
11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pRemainingBitsInSegment++;                                         /* update pointer for decoding the next PCW */
11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (( pCbSign[codebook] == 1 ) && ( codebook < 11 )) {  /* possibly there follow 1,2,3 or 4 sign bits after the codeword-body */
11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* PCW_Body and PCW_Sign */
11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*=======================*/
11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--)
11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int err;
11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numDecodedBits  = 0;
11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQuantVal = DecodePCW_Body(bs,
11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pCurrentTree,
11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pQuantValBase,
11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pLeftStartOfSegment,
11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pRemainingBitsInSegment,
11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &numDecodedBits
11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  );
11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = DecodePCW_Sign( bs,
11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              dimension,
11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pQuantVal,
11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pQuantizedSpectralCoefficients,
11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             &quantizedSpectralCoefficientsIdx,
11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pLeftStartOfSegment,
11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pRemainingBitsInSegment,
11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             &numDecodedBits
11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             );
11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err != 0) {
11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* one more PCW should be decoded */
11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG) ) {
11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED;
11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_IMMEDIATELY
11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN,pHcr,PCW_BODY_SIGN, pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) {
11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pLeftStartOfSegment++;
11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pRemainingBitsInSegment++;
11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (( pCbSign[codebook] == 1 ) && ( codebook >= 11 )) { /* possibly there follow some sign bits and maybe one or two escape sequences after the cw-body */
11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* PCW_Body, PCW_Sign and maybe PCW_Escape */
11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /*=========================================*/
11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--)
11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int err;
11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numDecodedBits  = 0;
11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* decode PCW_BODY */
11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQuantVal = DecodePCW_Body(bs,
11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pCurrentTree,
12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pQuantValBase,
12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pLeftStartOfSegment,
12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   pRemainingBitsInSegment,
12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  &numDecodedBits
12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  );
12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = DecodePCW_Sign( bs,
12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              dimension,
12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pQuantVal,
12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pQuantizedSpectralCoefficients,
12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             &quantizedSpectralCoefficientsIdx,
12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pLeftStartOfSegment,
12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                              pRemainingBitsInSegment,
12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             &numDecodedBits
12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                             );
12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (err != 0) {
12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* decode PCW_ESCAPE if present */
12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK;
12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) {
12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs,
12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx],
12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   pLeftStartOfSegment,
12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   pRemainingBitsInSegment,
12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  &numDecodedBits
12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                 );
12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        quantizedSpectralCoefficientsIdx++;
12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (quantizedSpectralCoefficientsIdx >= 1024) {
12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) {
12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs,
12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx],
12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   pLeftStartOfSegment,
12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                   pRemainingBitsInSegment,
12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                  &numDecodedBits
12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                 );
12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        quantizedSpectralCoefficientsIdx++;
12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (quantizedSpectralCoefficientsIdx >= 1024) {
12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* one more PCW should be decoded */
12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if DETECT_TOO_LONG_CW_READS
12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG) ) {
12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_IMMEDIATELY
12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN_ESC,pHcr,PCW_BODY_SIGN_ESC,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-DIMENSION_OF_ESCAPE_CODEBOOK,DIMENSION_OF_ESCAPE_CODEBOOK)) {
12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          return;
12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pLeftStartOfSegment++;
12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pRemainingBitsInSegment++;
12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* all PCWs belonging to this extended section should be decoded */
12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numExtendedSortedCodewordInSectionIdx++;
12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR+MAX_HCR_SETS) {
12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return;
12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* all PCWs should be decoded */
12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  numExtendedSortedSectionsInSetsIdx++;
12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return;
12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Write back indexes into structure */
12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx;
12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx;
12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx;
12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx;
12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_IMMEDIATELY
12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function checks immediately after every decoded PCW, whether out of
12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    the current segment too many bits have been read or not. If an error occurrs,
12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    probably the sideinfo or the HCR-bitstream block holding the huffman
12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    encoded quantized spectral coefficients is distorted. In this case the two
12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    or four quantized spectral coefficients belonging to the current codeword
12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    are marked (for being detected by concealment later).
12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UCHAR errDetectPcwSegmentation(SCHAR       remainingBitsInSegment,
12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      H_HCR_INFO  pHcr,
12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      PCW_TYPE    kind,
12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      FIXP_DBL   *qsc_base_of_cw,
13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                      UCHAR       dimension)
13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR i;
13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( remainingBitsInSegment < 0 ) {
13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* log the error */
13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (kind) {
13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case PCW_BODY:
13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY;
13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case PCW_BODY_SIGN:
13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN;
13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case PCW_BODY_SIGN_ESC:
13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC;
13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* mark the erred lines */
13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for ( i = dimension; i != 0; i-- ) {
13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *qsc_base_of_cw++ = (FIXP_DBL) Q_VALUE_INVALID;
13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 1;
13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if CHECK_SEGMENTATION_FINAL
13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function checks if all segments are empty after decoding. There
13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    are _no lines markded_ as invalid because it could not be traced back
13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    where from the remaining bits are.
13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr)
13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR   segmentationErrorFlag   = 0;
13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  USHORT  i;
13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR  *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT    numSegment              = pHcr->segmentInfo.numSegment;
13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for ( i=numSegment; i != 0 ; i--) {
13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*pRemainingBitsInSegment++ != 0) {
13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      segmentationErrorFlag = 1;
13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (segmentationErrorFlag == 1) {
13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR;
13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function walks one step within the decoding tree. Which branch is
13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    taken depends on the decoded carryBit input parameter.
13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid  CarryBitToBranchValue(UCHAR  carryBit,
13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            UINT   treeNode,
13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            UINT  *branchValue,
13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            UINT  *branchNode)
13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (carryBit == 0) {
13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *branchNode = (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT:  00FFF000 */
13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *branchNode = treeNode & MASK_RIGHT;                 /* MASK_RIGHT: 00000FFF */
13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *branchValue = *branchNode & CLR_BIT_10;               /* clear bit 10 (if set) */
13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Decodes the body of a priority codeword (PCW)
13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-----------------------------------------------------------------------------------------------
13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return:   - return value is pointer to first of two or four quantized spectral
13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    coefficients
13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM  bs,
13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   const UINT           *pCurrentTree,
13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   const SCHAR          *pQuantValBase,
13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         USHORT         *pLeftStartOfSegment,
13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         SCHAR          *pRemainingBitsInSegment,
13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         int            *pNumDecodedBits
13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                  )
13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR carryBit;
13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  branchNode;
13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  treeNode;
13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  branchValue;
13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  const  SCHAR *pQuantVal;
13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* decode PCW_BODY */
13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  treeNode = *pCurrentTree;                                                 /* get first node of current tree belonging to current codebook */
13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* decode whole PCW-codeword-body */
13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while (1) {
13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    carryBit = HcrGetABitFromBitstream(bs,
13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       pLeftStartOfSegment,
13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       pLeftStartOfSegment,                 /* dummy */
13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       FROM_LEFT_TO_RIGHT);
14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pRemainingBitsInSegment -= 1;
14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pNumDecodedBits += 1;
14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CarryBitToBranchValue(carryBit,
14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          treeNode,
14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          &branchValue,
14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          &branchNode);
14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ((branchNode & TEST_BIT_10) == TEST_BIT_10) {                        /* test bit 10 ; if set --> codeword-body is complete */
14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;                                                                /* end of branch in tree reached  i.e. a whole PCW-Body is decoded */
14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      treeNode = *(pCurrentTree + branchValue);                             /* update treeNode for further step in decoding tree */
14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  pQuantVal = pQuantValBase + branchValue;                                  /* update pointer to valid first of 2 or 4 quantized values */
14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return pQuantVal;
14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   This function decodes one escape sequence. In case of a escape codebook
14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    and in case of the absolute value of the quantized spectral value == 16,
14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    a escapeSequence is decoded in two steps:
14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      1. escape prefix
14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      2. escape word
14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT  DecodeEscapeSequence(HANDLE_FDK_BITSTREAM  bs,
14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 INT                   quantSpecCoef,
14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 USHORT               *pLeftStartOfSegment,
14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 SCHAR                *pRemainingBitsInSegment,
14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 int                  *pNumDecodedBits
14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                )
14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  i;
14392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT   sign;
14402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  escapeOnesCounter = 0;
14412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT  carryBit;
14422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT   escape_word = 0;
14432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* decode escape prefix */
14452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while (1) {
14462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    carryBit = HcrGetABitFromBitstream(bs,
14472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       pLeftStartOfSegment,
14482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       pLeftStartOfSegment,                /* dummy */
14492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       FROM_LEFT_TO_RIGHT);
14502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pRemainingBitsInSegment -= 1;
14512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pNumDecodedBits += 1;
14522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (carryBit != 0) {
14542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      escapeOnesCounter += 1;
14552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
14572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      escapeOnesCounter += 4;
14582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
14592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
14602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* decode escape word */
14632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for( i=escapeOnesCounter; i != 0 ; i-- ) {
14642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    carryBit = HcrGetABitFromBitstream(bs,
14652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       pLeftStartOfSegment,
14662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       pLeftStartOfSegment,                /* dummy */
14672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       FROM_LEFT_TO_RIGHT);
14682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pRemainingBitsInSegment -= 1;
14692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *pNumDecodedBits += 1;
14702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    escape_word <<= 1;
14722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    escape_word = escape_word | carryBit;
14732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
14742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sign = (quantSpecCoef >= 0) ? 1 : -1;
14762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  quantSpecCoef = sign * (((INT ) 1 << escapeOnesCounter) + escape_word);
14782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return quantSpecCoef;
14802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
14812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
14832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
14842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Decodes the Signbits of a priority codeword (PCW) and writes out the
14852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    resulting quantized spectral values into unsorted sections
14862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-----------------------------------------------------------------------------------------------
14872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        output:   - two or four lines at position in corresponding section (which are not
14882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    located at the desired position, i.e. they must be reordered in the last
14892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                    of eight function of HCR)
14902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-----------------------------------------------------------------------------------------------
14912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return:   - updated pQuantSpecCoef pointer (to next empty storage for a line)
14922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
14932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic int DecodePCW_Sign(HANDLE_FDK_BITSTREAM  bs,
14942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          UINT                  codebookDim,
14952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          const SCHAR          *pQuantVal,
14962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          FIXP_DBL             *pQuantSpecCoef,
14972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          int                  *quantSpecCoefIdx,
14982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          USHORT               *pLeftStartOfSegment,
14992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          SCHAR                *pRemainingBitsInSegment,
15002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                          int                  *pNumDecodedBits
15012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         )
15022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT     i;
15042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UINT     carryBit;
15052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT      quantSpecCoef;
15062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for( i=codebookDim; i != 0 ; i-- ) {
15082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    quantSpecCoef = *pQuantVal++;
15092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (quantSpecCoef != 0) {
15102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      carryBit = HcrGetABitFromBitstream(bs,
15112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         pLeftStartOfSegment,
15122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         pLeftStartOfSegment,    /* dummy */
15132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                         FROM_LEFT_TO_RIGHT);
15142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pRemainingBitsInSegment -= 1;
15152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *pNumDecodedBits += 1;
15162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024>>1)) {
15172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return -1;
15182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* adapt sign of values according to the decoded sign bit */
15212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (carryBit != 0) {
15222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef;
15232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
15252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pQuantSpecCoef[*quantSpecCoefIdx] =  (FIXP_DBL)quantSpecCoef;
15262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
15272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
15292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f);
15302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *quantSpecCoefIdx += 1 ;
15322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*quantSpecCoefIdx >= 1024) {
15332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return -1;
15342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
15372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
15412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Mutes spectral lines which have been marked as erroneous (Q_VALUE_INVALID)
15422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
15432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid HcrMuteErroneousLines(H_HCR_INFO hHcr)
15442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int c;
15462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *RESTRICT pLong = SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase);
15472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* if there is a line with value Q_VALUE_INVALID mute it */
15492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (c = 0; c < 1024; c++) {
15502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) {
15512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if HCR_LISTEN_TO_MUTED_LINES
15522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pLong[c] = (FIXP_DBL)HCR_DIRAC;   /* marking */
15532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else
15542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pLong[c] = FL2FXCONST_DBL(0.0f);  /* muting */
15552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
15562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
15572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
15622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Sets global HCR type
15632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
15642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid setHcrType(H_HCR_INFO hHcr, MP4_ELEMENT_ID type)
15652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (type) {
15672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case ID_SCE:
15682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hHcr->globalHcrType = 0;
15692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
15702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case ID_CPE:
15712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hHcr->globalHcrType = 1;
15722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
15732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
15742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
15752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
15762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------------------------------------------------------------------------------------
15802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     description:   Gets HCR type from the HCR data structure
15812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-----------------------------------------------------------------------------------------------
15822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return:   - global HCR type
15832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */
15842228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT getHcrType(H_HCR_INFO hHcr)
15852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
15862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return hHcr->globalHcrType;
15872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
15882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
15912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1592