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: Prepare decoding of non-PCWs, segmentation- and 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitfield-handling, HCR-Statemachine 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*******************************************************************************/ 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcrs.h" 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcr.h" 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aacdec_hcr_bit.h" 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_rom.h" 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "aac_ram.h" 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UINT InitSegmentBitfield(UINT *pNumSegment, 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment, 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield, 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pNumWordForBitfield, 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pNumBitValidInLastWord); 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr); 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT ModuloValue(INT input, INT bufferlength); 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void ClearBitFromBitfield(STATEFUNC *ptrState, 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT offset, 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pBitfield); 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This function decodes all non-priority codewords (non-PCWs) by using a 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project state-machine. 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT numValidSegment; 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT segmentOffset; 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT codewordOffsetBase; 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT codewordOffset; 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT trial; 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pNumSegment; 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pNumWordForBitfield; 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pNumBitValidInLastWord; 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitfieldWord; 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bitInWord; 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT tempWord; 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT interMediateWord; 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT tempBit; 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT carry; 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT numCodeword; 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR numSet; 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR currentSet; 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordInSet; 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT remainingCodewordsInSet; 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta; 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT ret; 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNumSegment = &(pHcr->segmentInfo.numSegment); 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNumWordForBitfield = &(pHcr->segmentInfo.numWordForBitfield); 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNumBitValidInLastWord = &(pHcr->segmentInfo.pNumBitValidInLastWord); 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta = pHcr->nonPcwSideinfo.pSta; 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numValidSegment = InitSegmentBitfield(pNumSegment, 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment, 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield, 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNumWordForBitfield, 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNumBitValidInLastWord); 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( numValidSegment != 0 ) { 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numCodeword = pHcr->sectionInfo.numCodeword; 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numSet = ((numCodeword - 1) / *pNumSegment) + 1; 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->segmentInfo.readDirection = FROM_RIGHT_TO_LEFT; 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Process sets subsequently */ 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( currentSet = 1; currentSet < numSet ; currentSet++ ) { 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 1 */ 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numCodeword -= *pNumSegment; /* number of remaining non PCWs [for all sets] */ 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( numCodeword < *pNumSegment ) { 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordInSet = numCodeword; /* for last set */ 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordInSet = *pNumSegment; /* for all sets except last set */ 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 2 */ 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* prepare array 'CodewordBitfield'; as much ones are written from left in all words, as much decodedCodewordInSetCounter nonPCWs exist in this set */ 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = 0xFFFFFFFF; 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( bitfieldWord = *pNumWordForBitfield; bitfieldWord !=0; bitfieldWord-- ) { /* loop over all used words */ 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( codewordInSet > NUMBER_OF_BIT_IN_WORD ) { /* more codewords than number of bits => fill ones */ 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* fill a whole word with ones */ 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pCodewordBitfield++ = tempWord; 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordInSet -= NUMBER_OF_BIT_IN_WORD; /* subtract number of bits */ 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* prepare last tempWord */ 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (remainingCodewordsInSet = codewordInSet; remainingCodewordsInSet < NUMBER_OF_BIT_IN_WORD ; remainingCodewordsInSet++ ) { 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD-1-remainingCodewordsInSet)); /* set a zero at bit number (NUMBER_OF_BIT_IN_WORD-1-i) in tempWord */ 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pCodewordBitfield++ = tempWord; 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = 0x00000000; 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 3 */ 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* build non-PCW sideinfo for each non-PCW of the current set */ 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project InitNonPCWSideInformationForCurrentSet(pHcr); 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 4 */ 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decode all non-PCWs belonging to this set */ 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop over trials */ 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffsetBase = 0; 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( trial = *pNumSegment; trial > 0; trial-- ) { 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop over number of words in bitfields */ 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = 0; /* start at zero in every segment */ 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->segmentInfo.segmentOffset = segmentOffset; /* store in structure for states */ 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = codewordOffsetBase; 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; /* store in structure for states */ 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( bitfieldWord=0; bitfieldWord < *pNumWordForBitfield; bitfieldWord++ ) { 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* derive tempWord with bitwise and */ 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = pSegmentBitfield[bitfieldWord] & pCodewordBitfield[bitfieldWord]; 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if tempWord is not zero, decode something */ 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( tempWord != 0 ) { 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop over all bits in tempWord; start state machine if & is true */ 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( bitInWord = NUMBER_OF_BIT_IN_WORD; bitInWord > 0; bitInWord-- ) { 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project interMediateWord = ((UINT)1 << (bitInWord-1) ); 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ( tempWord & interMediateWord ) == interMediateWord ) { 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get state and start state machine */ 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while(pHcr->nonPcwSideinfo.pState) { 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ret = ((STATEFUNC) pHcr->nonPcwSideinfo.pState)(bs, pHcr); 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ret != 0 ) { 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* update both offsets */ 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->segmentInfo.segmentOffset = segmentOffset; 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = ModuloValue(codewordOffset,*pNumSegment); /* index of the current codeword lies within modulo range */ 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset += NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->segmentInfo.segmentOffset = segmentOffset; 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset += NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = ModuloValue(codewordOffset,*pNumSegment); /* index of the current codeword lies within modulo range */ 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* end of bitfield word loop */ 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decrement codeword - pointer */ 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffsetBase -= 1; 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffsetBase = ModuloValue(codewordOffsetBase,*pNumSegment); /* index of the current codeword base lies within modulo range */ 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* rotate numSegment bits in codewordBitfield */ 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* rotation of *numSegment bits in bitfield of codewords (circle-rotation) */ 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get last valid bit */ 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempBit = pCodewordBitfield[*pNumWordForBitfield-1] & (1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempBit = tempBit >> (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* write zero into place where tempBit was fetched from */ 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield[*pNumWordForBitfield-1] = pCodewordBitfield[*pNumWordForBitfield-1] & ~(1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* rotate last valid word */ 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield[*pNumWordForBitfield-1] = pCodewordBitfield[*pNumWordForBitfield-1] >> 1; 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* transfare carry bit 0 from current word into bitposition 31 from next word and rotate current word */ 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( bitfieldWord = *pNumWordForBitfield-2; bitfieldWord > -1 ; bitfieldWord-- ) { 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get carry (=bit at position 0) from current word */ 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carry = pCodewordBitfield[bitfieldWord] & 1; 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* put the carry bit at position 31 into word right from current word */ 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield[bitfieldWord+1] = pCodewordBitfield[bitfieldWord+1] | (carry << (NUMBER_OF_BIT_IN_WORD-1)); 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* shift current word */ 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield[bitfieldWord] = pCodewordBitfield[bitfieldWord] >> 1; 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* put tempBit into free bit-position 31 from first word */ 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield[0] = pCodewordBitfield[0] | (tempBit << (NUMBER_OF_BIT_IN_WORD-1)); 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* end of trial loop */ 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* toggle read direction */ 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->segmentInfo.readDirection = ToggleReadDirection(pHcr->segmentInfo.readDirection); 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* end of set loop */ 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* all non-PCWs of this spectrum are decoded */ 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* all PCWs and all non PCWs are decoded. They are unbacksorted in output buffer. Here is the Interface with comparing QSCs to asm decoding */ 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This function prepares the bitfield used for the 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segments. The list is set up once to be used in all following sets. If a 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segment is decoded empty, the according bit from the Bitfield is removed. 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: numValidSegment = the number of valid segments 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UINT InitSegmentBitfield(UINT *pNumSegment, 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment, 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield, 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pNumWordForBitfield, 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pNumBitValidInLastWord) 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SHORT i; 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT r; 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR bitfieldWord; 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT tempWord; 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT numValidSegment; 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pNumWordForBitfield = ((*pNumSegment-1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1; 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop over all words, which are completely used or only partial */ 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* bit in pSegmentBitfield is zero if segment is empty; bit in pSegmentBitfield is one if segment is not empty */ 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numValidSegment = 0; 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pNumBitValidInLastWord = *pNumSegment; 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop over words */ 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( bitfieldWord=0; bitfieldWord < *pNumWordForBitfield - 1; bitfieldWord++ ) { 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = 0xFFFFFFFF; /* set ones */ 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i=0; i < NUMBER_OF_BIT_IN_WORD; i++) { 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[r + i] == 0 ) { 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD-1-i)); /* set a zero at bit number (NUMBER_OF_BIT_IN_WORD-1-i) in tempWord */ 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numValidSegment += 1; /* count segments which are not empty */ 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pNumBitValidInLastWord -= NUMBER_OF_BIT_IN_WORD; /* calculate number of zeros on LSB side in the last word */ 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate last word: prepare special tempWord */ 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = 0xFFFFFFFF; 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i=0; i < ( NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord ); i++ ) { 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = tempWord & ~(1 << i); /* clear bit i in tempWord */ 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate last word */ 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i=0; i<*pNumBitValidInLastWord; i++) { 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[r + i] == 0 ) { 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD-1-i)); /* set a zero at bit number (NUMBER_OF_BIT_IN_WORD-1-i) in tempWord */ 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numValidSegment += 1; /* count segments which are not empty */ 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return numValidSegment; 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This function sets up sideinfo for the non-PCW decoder (for the current set). 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project---------------------------------------------------------------------------------------------*/ 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr) 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT i,k; 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR codebookDim; 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT startNode; 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCodebook = pHcr->nonPcwSideinfo.pCodebook; 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *iNode = pHcr->nonPcwSideinfo.iNode; 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCntSign = pHcr->nonPcwSideinfo.pCntSign; 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta = pHcr->nonPcwSideinfo.pSta; 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook; 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx; 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pNumExtendedSortedSectionsInSets = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets; 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int numExtendedSortedSectionsInSetsIdx = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int quantizedSpectralCoefficientsIdx = pHcr->decInOut.quantizedSpectralCoefficientsIdx; 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *pCbDimension = pHcr->tableInfo.pCbDimension; 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int iterationCounter = 0; 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop over number of extended sorted sections in the current set so all codewords sideinfo variables within this set can be prepared for decoding */ 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i=pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; i != 0; i-- ) { 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codebookDim = pCbDimension[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project startNode = *aHuffTable[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( k = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx]; k != 0; k-- ) { 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iterationCounter++; 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (iterationCounter > (1024>>2)) { 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pSta++ = aCodebook2StartInt[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pCodebook++ = pExtendedSortedCodebook[extendedSortedCodebookIdx]; 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *iNode++ = startNode; 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pCntSign++ = 0; 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *iResultPointer++ = quantizedSpectralCoefficientsIdx; 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pEscapeSequenceInfo++ = 0; 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project quantizedSpectralCoefficientsIdx += codebookDim; /* update pointer by codebookDim --> point to next starting value for writing out */ 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (quantizedSpectralCoefficientsIdx >= 1024) { 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numExtendedSortedCodewordInSectionIdx++; /* inc ptr for next ext sort sec in current set */ 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project extendedSortedCodebookIdx++; /* inc ptr for next ext sort sec in current set */ 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS) || extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numExtendedSortedSectionsInSetsIdx++; /* inc ptr for next set of non-PCWs */ 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return; 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Write back indexes */ 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx; 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx; 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This function returns the input value if the value is in the 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project range of bufferlength. If <input> is smaller, one bufferlength is added, 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if <input> is bigger one bufferlength is subtracted. 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: modulo result 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT ModuloValue(INT input, INT bufferlength) 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( input > (bufferlength - 1) ) { 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return (input - bufferlength); 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( input < 0 ) { 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return (input + bufferlength); 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return input; 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This function clears a bit from current bitfield and 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switches off the statemachine. 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project A bit is cleared in two cases: 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project a) a codeword is decoded, then a bit is cleared in codeword bitfield 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project b) a segment is decoded empty, then a bit is cleared in segment bitfield 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void ClearBitFromBitfield(STATEFUNC *ptrState, 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT offset, 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pBitfield) 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT numBitfieldWord; 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT numBitfieldBit; 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get both values needed for clearing the bit */ 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numBitfieldWord = offset >> THIRTYTWO_LOG_DIV_TWO_LOG; /* int = wordNr */ 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project numBitfieldBit = offset - (numBitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG); /* fract = bitNr */ 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* clear a bit in bitfield */ 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pBitfield[numBitfieldWord] = pBitfield[numBitfieldWord] & ~(1 << (NUMBER_OF_BIT_IN_WORD-1 - numBitfieldBit)); 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* switch off state machine because codeword is decoded and/or because segment is empty */ 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *ptrState = NULL; 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* ========================================================================================= 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the states of the statemachine 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ========================================================================================= */ 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: Decodes the body of a codeword. This State is used for codebooks 1,2,5 and 6. 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project No sign bits are decoded, because the table of the quantized spectral values 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project has got a valid sign at the quantized spectral lines. 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Two or four quantizes spectral values written at position where pResultPointr 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project points to 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM bs, void *ptr) 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pResultBase; 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *iNode; 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer; 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT branchNode; 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT branchValue; 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT iQSC; 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT treeNode; 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCodebook; 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR dimCntr; 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT *pCurrentTree; 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *pCbDimension; 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SCHAR *pQuantVal; 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SCHAR *pQuantValBase; 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodebook = pHcr->nonPcwSideinfo.pCodebook; 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode = pHcr->nonPcwSideinfo.iNode; 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase = pHcr->nonPcwSideinfo.pResultBase; 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCbDimension = pHcr->tableInfo.pCbDimension; 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode = iNode[codewordOffset]; 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode, 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &branchValue, 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &branchNode); 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; ==> body is complete */ 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base address of quantized values belonging to current codebook */ 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; /* get position of first line for writing out result */ 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; dimCntr-- ) { 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal++; /* write out 2 or 4 lines into spectrum; no Sign bits available in this state */ 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { /* body is not decoded completely: */ 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe decoding of codeword body not finished yet */ 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_ONLY; 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_ONLY; 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: Decodes the codeword body, writes out result and counts the number of quantized 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project spectral values, which are different form zero. For those values sign bits are 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project needed. 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If sign bit counter cntSign is different from zero, switch to next state to 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project decode sign Bits there. 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If sign bit counter cntSign is zero, no sign bits are needed and codeword is 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project decoded. 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Two or four written quantizes spectral values written at position where 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultPointr points to. The signs of those lines may be wrong. If the signs 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project [on just one signle sign] is wrong, the next state will correct it. 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCodebook; 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *iNode; 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCntSign; 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pResultBase; 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer; 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT iQSC; 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT cntSign; 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR dimCntr; 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta; 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT treeNode; 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT branchValue; 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT branchNode; 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *pCbDimension; 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT *pCurrentTree; 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SCHAR *pQuantValBase; 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SCHAR *pQuantVal; 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodebook = pHcr->nonPcwSideinfo.pCodebook; 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode = pHcr->nonPcwSideinfo.iNode; 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign = pHcr->nonPcwSideinfo.pCntSign; 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase = pHcr->nonPcwSideinfo.pResultBase; 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta = pHcr->nonPcwSideinfo.pSta; 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCbDimension = pHcr->tableInfo.pCbDimension; 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode = iNode[codewordOffset]; 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode, 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &branchValue, 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &branchNode); 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set body complete */ 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* body completely decoded; branchValue is valid, set pQuantVal to first (of two or four) quantized spectral coefficients */ 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base address of quantized values belonging to current codebook */ 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; /* get position of first line for writing result */ 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* codeword decoding result is written out here: Write out 2 or 4 quantized spectral values with probably */ 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* wrong sign and count number of values which are different from zero for sign bit decoding [which happens in next state] */ 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign = 0; 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; dimCntr-- ) { 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( *pQuantVal++ != 0 ) { 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign += 1; 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( cntSign == 0 ) { 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign[codewordOffset] = cntSign; /* write sign count result into codewordsideinfo of current codeword */ 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta[codewordOffset] = BODY_SIGN__SIGN; /* change state */ 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else {/* body is not decoded completely: */ 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe decoding of codeword body not finished yet */ 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__BODY; 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN__BODY; 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This state decodes the sign bits belonging to a codeword. The state is called 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project as often in different "trials" until pCntSgn[codewordOffset] is zero. 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: The two or four quantizes spectral values (written in previous state) have 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project now the correct sign. 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCntSign; 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pResultBase; 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer; 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT iQSC; 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR cntSign; 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign = pHcr->nonPcwSideinfo.pCntSign; 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase = pHcr->nonPcwSideinfo.pResultBase; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign = pCntSign[codewordOffset]; 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop for sign bit decoding */ 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign -= 1; /* decrement sign counter because one sign bit has been read */ 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* search for a line (which was decoded in previous state) which is not zero. [This value will get a sign] */ 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while ( pResultBase[iQSC] == (FIXP_DBL)0 ) { 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC++; /* points to current value different from zero */ 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (iQSC >= 1024) { 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN__SIGN; 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* put sign together with line; if carryBit is zero, the sign is ok already; no write operation necessary in this case */ 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( carryBit != 0 ) { 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */ 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC++; /* update pointer to next (maybe valid) value */ 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( cntSign == 0 ) { /* if (cntSign==0) ==> set state CODEWORD_DECODED */ 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; /* whole nonPCW-Body and according sign bits are decoded */ 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign[codewordOffset] = cntSign; 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer[codewordOffset] = iQSC; /* store updated pResultPointer */ 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__SIGN; 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN__SIGN; 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: Decodes the codeword body in case of codebook is 11. Writes out resulting 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project two or four lines [with probably wrong sign] and counts the number of 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lines, which are different form zero. This information is needed in next 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project state where sign bits will be decoded, if necessary. 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If sign bit counter cntSign is zero, no sign bits are needed and codeword is 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project decoded completely. 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Two lines (quantizes spectral coefficients) which are probably wrong. The 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sign may be wrong and if one or two values is/are 16, the following states 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project will decode the escape sequence to correct the values which are wirtten here. 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *iNode; 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCntSign; 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pResultBase; 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer; 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT iQSC; 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT cntSign; 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT dimCntr; 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT treeNode; 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta; 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT branchNode; 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT branchValue; 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UINT *pCurrentTree; 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SCHAR *pQuantValBase; 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SCHAR *pQuantVal; 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode = pHcr->nonPcwSideinfo.iNode; 8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign = pHcr->nonPcwSideinfo.pCntSign; 8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase = pHcr->nonPcwSideinfo.pResultBase; 8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta = pHcr->nonPcwSideinfo.pSta; 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode = iNode[codewordOffset]; 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCurrentTree = aHuffTable[ESCAPE_CODEBOOK]; 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* make a step in tree */ 9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CarryBitToBranchValue(carryBit, 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode, 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &branchValue, 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &branchNode); 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ 9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set body complete */ 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* body completely decoded; branchValue is valid */ 9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set pQuantVol to first (of two or four) quantized spectral coefficients */ 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuantValBase = aQuantTable[ESCAPE_CODEBOOK]; /* get base address of quantized values belonging to current codebook */ 9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ 9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* make backup from original resultPointer in node storage for state BODY_SIGN_ESC__SIGN */ 9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode[codewordOffset] = iResultPointer[codewordOffset]; 9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get position of first line for writing result */ 9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; 9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* codeword decoding result is written out here: Write out 2 or 4 quantized spectral values with probably */ 9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* wrong sign and count number of values which are different from zero for sign bit decoding [which happens in next state] */ 9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign = 0; 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( dimCntr = DIMENSION_OF_ESCAPE_CODEBOOK; dimCntr != 0; dimCntr-- ) { 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( *pQuantVal++ != 0 ) { 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign += 1; 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( cntSign == 0 ) { 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* codeword decoded */ 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* write sign count result into codewordsideinfo of current codeword */ 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign[codewordOffset] = cntSign; 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta[codewordOffset] = BODY_SIGN_ESC__SIGN; /* change state */ 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* the last reinitialzation of for loop counter (see above) is done here */ 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { /* body is not decoded completely: */ 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* update treeNode for further step in decoding tree and store updated treeNode because maybe no more bits left in segment */ 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project treeNode = *(pCurrentTree + branchValue); 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode[codewordOffset] = treeNode; 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__BODY; 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN_ESC__BODY; 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: This state decodes the sign bits, if a codeword of codebook 11 needs some. 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project A flag named 'flagB' in codeword sideinfo is set, if the second line of 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project quantized spectral values is 16. The 'flagB' is used in case of decoding 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of a escape sequence is necessary as far as the second line is concerned. 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If only the first line needs an escape sequence, the flagB is cleared. 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If only the second line needs an escape sequence, the flagB is not used. 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project For storing sideinfo in case of escape sequence decoding one single word 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project can be used for both escape sequences because they are decoded not at the 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project same time: 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bit 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ===== == == =========== =========== =================================== 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ^ ^ ^ ^ ^ ^ 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project | | | | | | 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project res. flagA flagB escapePrefixUp escapePrefixDown escapeWord 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Two lines with correct sign. If one or two values is/are 16, the lines are 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project not valid, otherwise they are. 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *iNode; 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pCntSign; 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pResultBase; 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer; 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pEscapeSequenceInfo; 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT iQSC; 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR cntSign; 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flagA; 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flagB; 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flags; 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta; 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iNode = pHcr->nonPcwSideinfo.iNode; 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign = pHcr->nonPcwSideinfo.pCntSign; 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase = pHcr->nonPcwSideinfo.pResultBase; 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta = pHcr->nonPcwSideinfo.pSta; 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign = pCntSign[codewordOffset]; 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* loop for sign bit decoding */ 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decrement sign counter because one sign bit has been read */ 10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cntSign -= 1; 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCntSign[codewordOffset] = cntSign; 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get a quantized spectral value (which was decoded in previous state) which is not zero. [This value will get a sign] */ 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while ( pResultBase[iQSC] == (FIXP_DBL)0 ) { 10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC++; 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer[codewordOffset] = iQSC; 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* put negative sign together with quantized spectral value; if carryBit is zero, the sign is ok already; no write operation necessary in this case */ 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( carryBit != 0 ) { 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase[iQSC] = - pResultBase[iQSC]; /* carryBit = 1 --> minus */ 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC++; /* update index to next (maybe valid) value */ 10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer[codewordOffset] = iQSC; 10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( cntSign == 0 ) { 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* all sign bits are decoded now */ 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* check decoded values if codeword is decoded: Check if one or two escape sequences 16 follow */ 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 0 */ 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* restore pointer to first decoded quantized value [ = original pResultPointr] from index iNode prepared in State_BODY_SIGN_ESC__BODY */ 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iNode[codewordOffset]; 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 1 */ 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* test first value if escape sequence follows */ 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagA = 0; /* for first possible escape sequence */ 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( fixp_abs(pResultBase[iQSC++]) == (FIXP_DBL)ESCAPE_VALUE ) { 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagA = 1; 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 2 */ 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* test second value if escape sequence follows */ 10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagB = 0; /* for second possible escape sequence */ 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( fixp_abs(pResultBase[iQSC]) == (FIXP_DBL)ESCAPE_VALUE ) { 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagB = 1; 10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 3 */ 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* evaluate flag result and go on if necessary */ 11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !flagA && !flagB ) { 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* at least one of two lines is 16 */ 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* store both flags at correct positions in non PCW codeword sideinfo pEscapeSequenceInfo[codewordOffset] */ 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flags = 0; 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flags = flagA << POSITION_OF_FLAG_A; 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flags |= (flagB << POSITION_OF_FLAG_B); 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] = flags; 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set next state */ 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* set result pointer to the first line of the two decoded lines */ 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer[codewordOffset] = iNode[codewordOffset]; 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !flagA && flagB ) { 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* update pResultPointr ==> state Stat_BODY_SIGN_ESC__ESC_WORD writes to correct position. Second value is the one and only escape value */ 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC++; 11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer[codewordOffset] = iQSC; 11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* at least one of two lines is 16 */ 11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; /* nonPCW-Body at cb 11 and according sign bits are decoded */ 11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* if ( cntSign == 0 ) */ 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } /* loop over remaining Bits in segment */ 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__SIGN; 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN_ESC__SIGN; 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: Decode escape prefix of first or second escape sequence. The escape prefix 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project consists of ones. The following zero is also decoded here. 11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: If the single separator-zero which follows the escape-prefix-ones is not yet decoded: 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The value 'escapePrefixUp' in word pEscapeSequenceInfo[codewordOffset] is updated. 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project If the single separator-zero which follows the escape-prefix-ones is decoded: 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Two updated values 'escapePrefixUp' and 'escapePrefixDown' in word 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset]. This State is finished. Switch to next state. 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM bs, void *ptr) 11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pEscapeSequenceInfo; 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT escapePrefixUp; 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta; 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta = pHcr->nonPcwSideinfo.pSta; 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> LSB_ESCAPE_PREFIX_UP; 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decode escape prefix */ 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* count ones and store sum in escapePrefixUp */ 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( carryBit == 1 ) { 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp += 1; /* update conter for ones */ 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* store updated counter in sideinfo of current codeword */ 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixUp */ 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { /* separator [zero] reached */ 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp += 4; /* if escape_separator '0' appears, add 4 and ==> break */ 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit position escapePrefixUp */ 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixUp */ 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit position escapePrefixDown */ 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixDown */ 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back down */ 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta[codewordOffset] = BODY_SIGN_ESC__ESC_WORD; /* set next state */ 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX; 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN_ESC__ESC_PREFIX; 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------------------------------------------------------------------------------------- 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project description: Decode escapeWord of escape sequence. If the escape sequence is decoded 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project completely, assemble quantized-spectral-escape-coefficient and replace the 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project previous decoded 16 by the new value. 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Test flagB. If flagB is set, the second escape sequence must be decoded. If 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagB is not set, the codeword is decoded and the state machine is switched 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project off. 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output: Two lines with valid sign. At least one of both lines has got the correct 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project value. 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------- 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return: 0 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project-------------------------------------------------------------------------------------------- */ 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM bs, void *ptr) 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pRemainingBitsInSegment; 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pLeftStartOfSegment; 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *pRightStartOfSegment; 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR readDirection; 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pSegmentBitfield; 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pCodewordBitfield; 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT segmentOffset; 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pResultBase; 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT *iResultPointer; 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT *pEscapeSequenceInfo; 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT codewordOffset; 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT escapeWord; 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT escapePrefixDown; 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT escapePrefixUp; 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR carryBit; 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT iQSC; 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sign; 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flagA; 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT flagB; 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *pSta; 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection = pHcr->segmentInfo.readDirection; 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset = pHcr->segmentInfo.segmentOffset; 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase = pHcr->nonPcwSideinfo.pResultBase; 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta = pHcr->nonPcwSideinfo.pSta; 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapeWord = pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_WORD; 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixDown = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_DOWN) >> LSB_ESCAPE_PREFIX_DOWN; 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decode escape word */ 13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project carryBit = HcrGetABitFromBitstream( bs, 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pLeftStartOfSegment[segmentOffset], 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &pRightStartOfSegment[segmentOffset], 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project readDirection); 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* build escape word */ 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapeWord <<= 1; /* left shift previous decoded part of escapeWord by on bit */ 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapeWord = escapeWord | carryBit; /* assemble escape word by bitwise or */ 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* decrement counter for length of escape word because one more bit was decoded */ 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixDown -= 1; 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* store updated escapePrefixDown */ 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ 13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixDown <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] |= escapePrefixDown; /* insert new escapePrefixDown */ 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixDown >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back */ 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* store updated escapeWord */ 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_WORD; /* delete old escapeWord */ 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] |= escapeWord; /* insert new escapeWord */ 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( escapePrefixDown == 0 ) { 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* escape sequence decoded. Assemble escape-line and replace original line */ 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 0 */ 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* derive sign */ 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC = iResultPointer[codewordOffset]; 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sign = (pResultBase[iQSC] >= (FIXP_DBL)0) ? 1 : -1; /* get sign of escape value 16 */ 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 1 */ 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get escapePrefixUp */ 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escapePrefixUp = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> LSB_ESCAPE_PREFIX_UP; 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 2 */ 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* calculate escape value */ 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pResultBase[iQSC] = (FIXP_DBL)(sign * (((INT) 1 << escapePrefixUp) + escapeWord)); 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* get both flags from sideinfo (flags are not shifted to the lsb-position) */ 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagA = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_A; 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project flagB = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_B; 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* step 3 */ 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* clear the whole escape sideinfo word */ 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] = 0; 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* change state in dependence of flag flagB */ 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( flagA != 0 ) { 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* first escape sequence decoded; previous decoded 16 has been replaced by valid line */ 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* clear flagA in sideinfo word because this escape sequence has already beed decoded */ 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEscapeSequenceInfo[codewordOffset] &= ~MASK_FLAG_A; 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( flagB == 0 ) { 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* updated pointer to next and last 16 */ 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iQSC++; 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project iResultPointer[codewordOffset] = iQSC; 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* change state */ 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project segmentOffset, 13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#if STATE_MACHINE_ERROR_CHECK 14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_WORD; 14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return BODY_SIGN_ESC__ESC_WORD; 14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return STOP_THIS_STATE; 14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1410