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