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