1 2/* ----------------------------------------------------------------------------------------------------------- 3Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5� Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V. 6 All rights reserved. 7 8 1. INTRODUCTION 9The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16of the MPEG specifications. 17 18Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20individually for the purpose of encoding or decoding bit streams in products that are compliant with 21the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27applications information and documentation. 28 292. COPYRIGHT LICENSE 30 31Redistribution and use in source and binary forms, with or without modification, are permitted without 32payment of copyright license fees provided that you satisfy the following conditions: 33 34You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35your modifications thereto in source code form. 36 37You must retain the complete text of this software license in the documentation and/or other materials 38provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40modifications thereto to recipients of copies in binary form. 41 42The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43prior written permission. 44 45You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46software or your modifications thereto. 47 48Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49and the date of any change. For modified versions of the FDK AAC Codec, the term 50"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 51"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 52 533. NO PATENT LICENSE 54 55NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57respect to this software. 58 59You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60by appropriate patent licenses. 61 624. DISCLAIMER 63 64This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 65"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 66of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69or business interruption, however caused and on any theory of liability, whether in contract, strict 70liability, or tort (including negligence), arising in any way out of the use of this software, even if 71advised of the possibility of such damage. 72 735. CONTACT INFORMATION 74 75Fraunhofer Institute for Integrated Circuits IIS 76Attention: Audio and Multimedia Departments - FDK AAC LL 77Am Wolfsmantel 33 7891058 Erlangen, Germany 79 80www.iis.fraunhofer.de/amm 81amm-info@iis.fraunhofer.de 82----------------------------------------------------------------------------------------------------------- */ 83 84/***************************** MPEG-4 AAC Decoder *************************** 85 86 Author(s): Robert Weidner (DSP Solutions) 87 Description: HCR Decoder: Prepare decoding of non-PCWs, segmentation- and 88 bitfield-handling, HCR-Statemachine 89 90*******************************************************************************/ 91 92#include "aacdec_hcrs.h" 93 94 95#include "aacdec_hcr.h" 96 97#include "aacdec_hcr_bit.h" 98#include "aac_rom.h" 99#include "aac_ram.h" 100 101 102static UINT InitSegmentBitfield(UINT *pNumSegment, 103 SCHAR *pRemainingBitsInSegment, 104 UINT *pSegmentBitfield, 105 UCHAR *pNumWordForBitfield, 106 USHORT *pNumBitValidInLastWord); 107 108static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr); 109 110static INT ModuloValue(INT input, INT bufferlength); 111 112static void ClearBitFromBitfield(STATEFUNC *ptrState, 113 UINT offset, 114 UINT *pBitfield); 115 116 117/*--------------------------------------------------------------------------------------------- 118 description: This function decodes all non-priority codewords (non-PCWs) by using a 119 state-machine. 120-------------------------------------------------------------------------------------------- */ 121void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) 122{ 123 UINT numValidSegment; 124 INT segmentOffset; 125 INT codewordOffsetBase; 126 INT codewordOffset; 127 UINT trial; 128 129 UINT *pNumSegment; 130 SCHAR *pRemainingBitsInSegment; 131 UINT *pSegmentBitfield; 132 UCHAR *pNumWordForBitfield; 133 USHORT *pNumBitValidInLastWord; 134 UINT *pCodewordBitfield; 135 INT bitfieldWord; 136 INT bitInWord; 137 UINT tempWord; 138 UINT interMediateWord; 139 INT tempBit; 140 INT carry; 141 142 UINT numCodeword; 143 UCHAR numSet; 144 UCHAR currentSet; 145 UINT codewordInSet; 146 UINT remainingCodewordsInSet; 147 SCHAR *pSta; 148 UINT ret; 149 150 pNumSegment = &(pHcr->segmentInfo.numSegment); 151 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 152 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 153 pNumWordForBitfield = &(pHcr->segmentInfo.numWordForBitfield); 154 pNumBitValidInLastWord = &(pHcr->segmentInfo.pNumBitValidInLastWord); 155 pSta = pHcr->nonPcwSideinfo.pSta; 156 157 numValidSegment = InitSegmentBitfield(pNumSegment, 158 pRemainingBitsInSegment, 159 pSegmentBitfield, 160 pNumWordForBitfield, 161 pNumBitValidInLastWord); 162 163 if ( numValidSegment != 0 ) { 164 numCodeword = pHcr->sectionInfo.numCodeword; 165 numSet = ((numCodeword - 1) / *pNumSegment) + 1; 166 167 168 pHcr->segmentInfo.readDirection = FROM_RIGHT_TO_LEFT; 169 170 /* Process sets subsequently */ 171 for ( currentSet = 1; currentSet < numSet ; currentSet++ ) { 172 173 174 175 /* step 1 */ 176 numCodeword -= *pNumSegment; /* number of remaining non PCWs [for all sets] */ 177 if ( numCodeword < *pNumSegment ) { 178 codewordInSet = numCodeword; /* for last set */ 179 } 180 else { 181 codewordInSet = *pNumSegment; /* for all sets except last set */ 182 } 183 184 /* step 2 */ 185 /* prepare array 'CodewordBitfield'; as much ones are written from left in all words, as much decodedCodewordInSetCounter nonPCWs exist in this set */ 186 tempWord = 0xFFFFFFFF; 187 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 188 189 for ( bitfieldWord = *pNumWordForBitfield; bitfieldWord !=0; bitfieldWord-- ) { /* loop over all used words */ 190 if ( codewordInSet > NUMBER_OF_BIT_IN_WORD ) { /* more codewords than number of bits => fill ones */ 191 /* fill a whole word with ones */ 192 *pCodewordBitfield++ = tempWord; 193 codewordInSet -= NUMBER_OF_BIT_IN_WORD; /* subtract number of bits */ 194 } 195 else { 196 /* prepare last tempWord */ 197 for (remainingCodewordsInSet = codewordInSet; remainingCodewordsInSet < NUMBER_OF_BIT_IN_WORD ; remainingCodewordsInSet++ ) { 198 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 */ 199 } 200 *pCodewordBitfield++ = tempWord; 201 tempWord = 0x00000000; 202 } 203 } 204 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 205 206 /* step 3 */ 207 /* build non-PCW sideinfo for each non-PCW of the current set */ 208 InitNonPCWSideInformationForCurrentSet(pHcr); 209 210 /* step 4 */ 211 /* decode all non-PCWs belonging to this set */ 212 213 /* loop over trials */ 214 codewordOffsetBase = 0; 215 for ( trial = *pNumSegment; trial > 0; trial-- ) { 216 217 /* loop over number of words in bitfields */ 218 segmentOffset = 0; /* start at zero in every segment */ 219 pHcr->segmentInfo.segmentOffset = segmentOffset; /* store in structure for states */ 220 codewordOffset = codewordOffsetBase; 221 pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; /* store in structure for states */ 222 223 for ( bitfieldWord=0; bitfieldWord < *pNumWordForBitfield; bitfieldWord++ ) { 224 225 /* derive tempWord with bitwise and */ 226 tempWord = pSegmentBitfield[bitfieldWord] & pCodewordBitfield[bitfieldWord]; 227 228 /* if tempWord is not zero, decode something */ 229 if ( tempWord != 0 ) { 230 231 232 /* loop over all bits in tempWord; start state machine if & is true */ 233 for ( bitInWord = NUMBER_OF_BIT_IN_WORD; bitInWord > 0; bitInWord-- ) { 234 235 interMediateWord = ((UINT)1 << (bitInWord-1) ); 236 if ( ( tempWord & interMediateWord ) == interMediateWord ) { 237 238 /* get state and start state machine */ 239 pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; 240 241 while(pHcr->nonPcwSideinfo.pState) { 242 ret = ((STATEFUNC) pHcr->nonPcwSideinfo.pState)(bs, pHcr); 243#if STATE_MACHINE_ERROR_CHECK 244 if ( ret != 0 ) { 245 return; 246 } 247#endif 248 } 249 } 250 251 /* update both offsets */ 252 segmentOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ 253 pHcr->segmentInfo.segmentOffset = segmentOffset; 254 codewordOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ 255 codewordOffset = ModuloValue(codewordOffset,*pNumSegment); /* index of the current codeword lies within modulo range */ 256 pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; 257 } 258 } 259 else { 260 segmentOffset += NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ 261 pHcr->segmentInfo.segmentOffset = segmentOffset; 262 codewordOffset += NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ 263 codewordOffset = ModuloValue(codewordOffset,*pNumSegment); /* index of the current codeword lies within modulo range */ 264 pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; 265 } 266 } /* end of bitfield word loop */ 267 268 /* decrement codeword - pointer */ 269 codewordOffsetBase -= 1; 270 codewordOffsetBase = ModuloValue(codewordOffsetBase,*pNumSegment); /* index of the current codeword base lies within modulo range */ 271 272 /* rotate numSegment bits in codewordBitfield */ 273 /* rotation of *numSegment bits in bitfield of codewords (circle-rotation) */ 274 /* get last valid bit */ 275 tempBit = pCodewordBitfield[*pNumWordForBitfield-1] & (1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); 276 tempBit = tempBit >> (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); 277 278 /* write zero into place where tempBit was fetched from */ 279 pCodewordBitfield[*pNumWordForBitfield-1] = pCodewordBitfield[*pNumWordForBitfield-1] & ~(1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); 280 281 /* rotate last valid word */ 282 pCodewordBitfield[*pNumWordForBitfield-1] = pCodewordBitfield[*pNumWordForBitfield-1] >> 1; 283 284 /* transfare carry bit 0 from current word into bitposition 31 from next word and rotate current word */ 285 for ( bitfieldWord = *pNumWordForBitfield-2; bitfieldWord > -1 ; bitfieldWord-- ) { 286 /* get carry (=bit at position 0) from current word */ 287 carry = pCodewordBitfield[bitfieldWord] & 1; 288 289 /* put the carry bit at position 31 into word right from current word */ 290 pCodewordBitfield[bitfieldWord+1] = pCodewordBitfield[bitfieldWord+1] | (carry << (NUMBER_OF_BIT_IN_WORD-1)); 291 292 /* shift current word */ 293 pCodewordBitfield[bitfieldWord] = pCodewordBitfield[bitfieldWord] >> 1; 294 } 295 296 /* put tempBit into free bit-position 31 from first word */ 297 pCodewordBitfield[0] = pCodewordBitfield[0] | (tempBit << (NUMBER_OF_BIT_IN_WORD-1)); 298 299 } /* end of trial loop */ 300 301 /* toggle read direction */ 302 pHcr->segmentInfo.readDirection = ToggleReadDirection(pHcr->segmentInfo.readDirection); 303 304 } 305 /* end of set loop */ 306 307 /* all non-PCWs of this spectrum are decoded */ 308 } 309 310 /* all PCWs and all non PCWs are decoded. They are unbacksorted in output buffer. Here is the Interface with comparing QSCs to asm decoding */ 311} 312 313 314/*--------------------------------------------------------------------------------------------- 315 description: This function prepares the bitfield used for the 316 segments. The list is set up once to be used in all following sets. If a 317 segment is decoded empty, the according bit from the Bitfield is removed. 318----------------------------------------------------------------------------------------------- 319 return: numValidSegment = the number of valid segments 320-------------------------------------------------------------------------------------------- */ 321static UINT InitSegmentBitfield(UINT *pNumSegment, 322 SCHAR *pRemainingBitsInSegment, 323 UINT *pSegmentBitfield, 324 UCHAR *pNumWordForBitfield, 325 USHORT *pNumBitValidInLastWord) 326{ 327 SHORT i; 328 USHORT r; 329 UCHAR bitfieldWord; 330 UINT tempWord; 331 USHORT numValidSegment; 332 333 *pNumWordForBitfield = ((*pNumSegment-1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1; 334 335 /* loop over all words, which are completely used or only partial */ 336 /* bit in pSegmentBitfield is zero if segment is empty; bit in pSegmentBitfield is one if segment is not empty */ 337 numValidSegment = 0; 338 *pNumBitValidInLastWord = *pNumSegment; 339 340 /* loop over words */ 341 for ( bitfieldWord=0; bitfieldWord < *pNumWordForBitfield - 1; bitfieldWord++ ) { 342 tempWord = 0xFFFFFFFF; /* set ones */ 343 r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; 344 for ( i=0; i < NUMBER_OF_BIT_IN_WORD; i++) { 345 if ( pRemainingBitsInSegment[r + i] == 0 ) { 346 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 */ 347 } 348 else { 349 numValidSegment += 1; /* count segments which are not empty */ 350 } 351 } 352 pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ 353 *pNumBitValidInLastWord -= NUMBER_OF_BIT_IN_WORD; /* calculate number of zeros on LSB side in the last word */ 354 } 355 356 357 /* calculate last word: prepare special tempWord */ 358 tempWord = 0xFFFFFFFF; 359 for ( i=0; i < ( NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord ); i++ ) { 360 tempWord = tempWord & ~(1 << i); /* clear bit i in tempWord */ 361 } 362 363 /* calculate last word */ 364 r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; 365 for ( i=0; i<*pNumBitValidInLastWord; i++) { 366 if ( pRemainingBitsInSegment[r + i] == 0 ) { 367 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 */ 368 } 369 else { 370 numValidSegment += 1; /* count segments which are not empty */ 371 } 372 } 373 pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ 374 375 376 377 return numValidSegment; 378} 379 380 381/*--------------------------------------------------------------------------------------------- 382 description: This function sets up sideinfo for the non-PCW decoder (for the current set). 383---------------------------------------------------------------------------------------------*/ 384static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr) 385{ 386 USHORT i,k; 387 UCHAR codebookDim; 388 UINT startNode; 389 390 UCHAR *pCodebook = pHcr->nonPcwSideinfo.pCodebook; 391 UINT *iNode = pHcr->nonPcwSideinfo.iNode; 392 UCHAR *pCntSign = pHcr->nonPcwSideinfo.pCntSign; 393 USHORT *iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 394 UINT *pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 395 SCHAR *pSta = pHcr->nonPcwSideinfo.pSta; 396 USHORT *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; 397 int numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; 398 UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook; 399 int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx; 400 USHORT *pNumExtendedSortedSectionsInSets = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets; 401 int numExtendedSortedSectionsInSetsIdx = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; 402 FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); 403 int quantizedSpectralCoefficientsIdx = pHcr->decInOut.quantizedSpectralCoefficientsIdx; 404 const UCHAR *pCbDimension = pHcr->tableInfo.pCbDimension; 405 int iterationCounter = 0; 406 407 /* loop over number of extended sorted sections in the current set so all codewords sideinfo variables within this set can be prepared for decoding */ 408 for ( i=pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; i != 0; i-- ) { 409 410 codebookDim = pCbDimension[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; 411 startNode = *aHuffTable[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; 412 413 for ( k = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx]; k != 0; k-- ) { 414 iterationCounter++; 415 if (iterationCounter > (1024>>2)) { 416 return; 417 } 418 *pSta++ = aCodebook2StartInt[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; 419 *pCodebook++ = pExtendedSortedCodebook[extendedSortedCodebookIdx]; 420 *iNode++ = startNode; 421 *pCntSign++ = 0; 422 *iResultPointer++ = quantizedSpectralCoefficientsIdx; 423 *pEscapeSequenceInfo++ = 0; 424 quantizedSpectralCoefficientsIdx += codebookDim; /* update pointer by codebookDim --> point to next starting value for writing out */ 425 if (quantizedSpectralCoefficientsIdx >= 1024) { 426 return; 427 } 428 } 429 numExtendedSortedCodewordInSectionIdx++; /* inc ptr for next ext sort sec in current set */ 430 extendedSortedCodebookIdx++; /* inc ptr for next ext sort sec in current set */ 431 if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS) || extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { 432 return; 433 } 434 } 435 numExtendedSortedSectionsInSetsIdx++; /* inc ptr for next set of non-PCWs */ 436 if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { 437 return; 438 } 439 440 /* Write back indexes */ 441 pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; 442 pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; 443 pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx; 444 pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; 445 pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx; 446} 447 448 449/*--------------------------------------------------------------------------------------------- 450 description: This function returns the input value if the value is in the 451 range of bufferlength. If <input> is smaller, one bufferlength is added, 452 if <input> is bigger one bufferlength is subtracted. 453----------------------------------------------------------------------------------------------- 454 return: modulo result 455-------------------------------------------------------------------------------------------- */ 456static INT ModuloValue(INT input, INT bufferlength) 457{ 458 if ( input > (bufferlength - 1) ) { 459 return (input - bufferlength); 460 } 461 if ( input < 0 ) { 462 return (input + bufferlength); 463 } 464 return input; 465} 466 467 468/*--------------------------------------------------------------------------------------------- 469 description: This function clears a bit from current bitfield and 470 switches off the statemachine. 471 472 A bit is cleared in two cases: 473 a) a codeword is decoded, then a bit is cleared in codeword bitfield 474 b) a segment is decoded empty, then a bit is cleared in segment bitfield 475-------------------------------------------------------------------------------------------- */ 476static void ClearBitFromBitfield(STATEFUNC *ptrState, 477 UINT offset, 478 UINT *pBitfield) 479{ 480 UINT numBitfieldWord; 481 UINT numBitfieldBit; 482 483 /* get both values needed for clearing the bit */ 484 numBitfieldWord = offset >> THIRTYTWO_LOG_DIV_TWO_LOG; /* int = wordNr */ 485 numBitfieldBit = offset - (numBitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG); /* fract = bitNr */ 486 487 /* clear a bit in bitfield */ 488 pBitfield[numBitfieldWord] = pBitfield[numBitfieldWord] & ~(1 << (NUMBER_OF_BIT_IN_WORD-1 - numBitfieldBit)); 489 490 /* switch off state machine because codeword is decoded and/or because segment is empty */ 491 *ptrState = NULL; 492} 493 494 495 496/* ========================================================================================= 497 the states of the statemachine 498 ========================================================================================= */ 499 500 501/*--------------------------------------------------------------------------------------------- 502 description: Decodes the body of a codeword. This State is used for codebooks 1,2,5 and 6. 503 No sign bits are decoded, because the table of the quantized spectral values 504 has got a valid sign at the quantized spectral lines. 505----------------------------------------------------------------------------------------------- 506 output: Two or four quantizes spectral values written at position where pResultPointr 507 points to 508----------------------------------------------------------------------------------------------- 509 return: 0 510-------------------------------------------------------------------------------------------- */ 511UINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM bs, void *ptr) 512{ 513 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 514 UINT *pSegmentBitfield; 515 UINT *pCodewordBitfield; 516 UINT segmentOffset; 517 FIXP_DBL *pResultBase; 518 UINT *iNode; 519 USHORT *iResultPointer; 520 UINT codewordOffset; 521 UINT branchNode; 522 UINT branchValue; 523 UINT iQSC; 524 UINT treeNode; 525 UCHAR carryBit; 526 USHORT *pLeftStartOfSegment; 527 USHORT *pRightStartOfSegment; 528 SCHAR *pRemainingBitsInSegment; 529 UCHAR readDirection; 530 UCHAR *pCodebook; 531 UCHAR dimCntr; 532 const UINT *pCurrentTree; 533 const UCHAR *pCbDimension; 534 const SCHAR *pQuantVal; 535 const SCHAR *pQuantValBase; 536 537 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 538 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 539 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 540 readDirection = pHcr->segmentInfo.readDirection; 541 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 542 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 543 segmentOffset = pHcr->segmentInfo.segmentOffset; 544 545 pCodebook = pHcr->nonPcwSideinfo.pCodebook; 546 iNode = pHcr->nonPcwSideinfo.iNode; 547 pResultBase = pHcr->nonPcwSideinfo.pResultBase; 548 iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 549 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 550 551 pCbDimension = pHcr->tableInfo.pCbDimension; 552 553 treeNode = iNode[codewordOffset]; 554 pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; 555 556 557 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 558 559 carryBit = HcrGetABitFromBitstream( bs, 560 &pLeftStartOfSegment[segmentOffset], 561 &pRightStartOfSegment[segmentOffset], 562 readDirection); 563 564 CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ 565 treeNode, 566 &branchValue, 567 &branchNode); 568 569 /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ 570 if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; ==> body is complete */ 571 pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base address of quantized values belonging to current codebook */ 572 pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ 573 574 iQSC = iResultPointer[codewordOffset]; /* get position of first line for writing out result */ 575 576 for ( dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; dimCntr-- ) { 577 pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal++; /* write out 2 or 4 lines into spectrum; no Sign bits available in this state */ 578 } 579 580 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 581 segmentOffset, 582 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 583 pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 584 break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ 585 } 586 else { /* body is not decoded completely: */ 587 treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ 588 } 589 } 590 iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe decoding of codeword body not finished yet */ 591 592 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 593 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 594 segmentOffset, 595 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 596 597#if STATE_MACHINE_ERROR_CHECK 598 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 599 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_ONLY; 600 return BODY_ONLY; 601 } 602#endif 603 } 604 605 return STOP_THIS_STATE; 606} 607 608 609/*--------------------------------------------------------------------------------------------- 610 description: Decodes the codeword body, writes out result and counts the number of quantized 611 spectral values, which are different form zero. For those values sign bits are 612 needed. 613 614 If sign bit counter cntSign is different from zero, switch to next state to 615 decode sign Bits there. 616 If sign bit counter cntSign is zero, no sign bits are needed and codeword is 617 decoded. 618----------------------------------------------------------------------------------------------- 619 output: Two or four written quantizes spectral values written at position where 620 pResultPointr points to. The signs of those lines may be wrong. If the signs 621 [on just one signle sign] is wrong, the next state will correct it. 622----------------------------------------------------------------------------------------------- 623 return: 0 624-------------------------------------------------------------------------------------------- */ 625UINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) 626{ 627 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 628 SCHAR *pRemainingBitsInSegment; 629 USHORT *pLeftStartOfSegment; 630 USHORT *pRightStartOfSegment; 631 UCHAR readDirection; 632 UINT *pSegmentBitfield; 633 UINT *pCodewordBitfield; 634 UINT segmentOffset; 635 636 UCHAR *pCodebook; 637 UINT *iNode; 638 UCHAR *pCntSign; 639 FIXP_DBL *pResultBase; 640 USHORT *iResultPointer; 641 UINT codewordOffset; 642 643 UINT iQSC; 644 UINT cntSign; 645 UCHAR dimCntr; 646 UCHAR carryBit; 647 SCHAR *pSta; 648 UINT treeNode; 649 UINT branchValue; 650 UINT branchNode; 651 const UCHAR *pCbDimension; 652 const UINT *pCurrentTree; 653 const SCHAR *pQuantValBase; 654 const SCHAR *pQuantVal; 655 656 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 657 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 658 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 659 readDirection = pHcr->segmentInfo.readDirection; 660 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 661 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 662 segmentOffset = pHcr->segmentInfo.segmentOffset; 663 664 pCodebook = pHcr->nonPcwSideinfo.pCodebook; 665 iNode = pHcr->nonPcwSideinfo.iNode; 666 pCntSign = pHcr->nonPcwSideinfo.pCntSign; 667 pResultBase = pHcr->nonPcwSideinfo.pResultBase; 668 iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 669 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 670 pSta = pHcr->nonPcwSideinfo.pSta; 671 672 pCbDimension = pHcr->tableInfo.pCbDimension; 673 674 treeNode = iNode[codewordOffset]; 675 pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; 676 677 678 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 679 680 carryBit = HcrGetABitFromBitstream( bs, 681 &pLeftStartOfSegment[segmentOffset], 682 &pRightStartOfSegment[segmentOffset], 683 readDirection); 684 685 CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ 686 treeNode, 687 &branchValue, 688 &branchNode); 689 690 /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ 691 if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set body complete */ 692 /* body completely decoded; branchValue is valid, set pQuantVal to first (of two or four) quantized spectral coefficients */ 693 pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base address of quantized values belonging to current codebook */ 694 pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ 695 696 iQSC = iResultPointer[codewordOffset]; /* get position of first line for writing result */ 697 698 /* codeword decoding result is written out here: Write out 2 or 4 quantized spectral values with probably */ 699 /* wrong sign and count number of values which are different from zero for sign bit decoding [which happens in next state] */ 700 cntSign = 0; 701 for ( dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; dimCntr-- ) { 702 pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ 703 if ( *pQuantVal++ != 0 ) { 704 cntSign += 1; 705 } 706 } 707 708 if ( cntSign == 0 ) { 709 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 710 segmentOffset, 711 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 712 } 713 else { 714 pCntSign[codewordOffset] = cntSign; /* write sign count result into codewordsideinfo of current codeword */ 715 pSta[codewordOffset] = BODY_SIGN__SIGN; /* change state */ 716 pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 717 } 718 pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 719 break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ 720 } 721 else {/* body is not decoded completely: */ 722 treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ 723 } 724 } 725 iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe decoding of codeword body not finished yet */ 726 727 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 728 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 729 segmentOffset, 730 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 731 732#if STATE_MACHINE_ERROR_CHECK 733 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 734 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__BODY; 735 return BODY_SIGN__BODY; 736 } 737#endif 738 } 739 740 return STOP_THIS_STATE; 741} 742 743 744/*--------------------------------------------------------------------------------------------- 745 description: This state decodes the sign bits belonging to a codeword. The state is called 746 as often in different "trials" until pCntSgn[codewordOffset] is zero. 747----------------------------------------------------------------------------------------------- 748 output: The two or four quantizes spectral values (written in previous state) have 749 now the correct sign. 750----------------------------------------------------------------------------------------------- 751 return: 0 752-------------------------------------------------------------------------------------------- */ 753UINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) 754{ 755 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 756 SCHAR *pRemainingBitsInSegment; 757 USHORT *pLeftStartOfSegment; 758 USHORT *pRightStartOfSegment; 759 UCHAR readDirection; 760 UINT *pSegmentBitfield; 761 UINT *pCodewordBitfield; 762 UINT segmentOffset; 763 764 UCHAR *pCntSign; 765 FIXP_DBL *pResultBase; 766 USHORT *iResultPointer; 767 UINT codewordOffset; 768 UCHAR carryBit; 769 UINT iQSC; 770 UCHAR cntSign; 771 772 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 773 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 774 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 775 readDirection = pHcr->segmentInfo.readDirection; 776 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 777 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 778 segmentOffset = pHcr->segmentInfo.segmentOffset; 779 780 pCntSign = pHcr->nonPcwSideinfo.pCntSign; 781 pResultBase = pHcr->nonPcwSideinfo.pResultBase; 782 iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 783 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 784 iQSC = iResultPointer[codewordOffset]; 785 cntSign = pCntSign[codewordOffset]; 786 787 788 789 /* loop for sign bit decoding */ 790 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 791 792 carryBit = HcrGetABitFromBitstream( bs, 793 &pLeftStartOfSegment[segmentOffset], 794 &pRightStartOfSegment[segmentOffset], 795 readDirection); 796 cntSign -= 1; /* decrement sign counter because one sign bit has been read */ 797 798 /* search for a line (which was decoded in previous state) which is not zero. [This value will get a sign] */ 799 while ( pResultBase[iQSC] == (FIXP_DBL)0 ) { 800 iQSC++; /* points to current value different from zero */ 801 if (iQSC >= 1024) { 802 return BODY_SIGN__SIGN; 803 } 804 } 805 806 /* put sign together with line; if carryBit is zero, the sign is ok already; no write operation necessary in this case */ 807 if ( carryBit != 0 ) { 808 pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */ 809 } 810 811 iQSC++; /* update pointer to next (maybe valid) value */ 812 813 if ( cntSign == 0 ) { /* if (cntSign==0) ==> set state CODEWORD_DECODED */ 814 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 815 segmentOffset, 816 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 817 pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 818 break; /* whole nonPCW-Body and according sign bits are decoded */ 819 } 820 } 821 pCntSign[codewordOffset] = cntSign; 822 iResultPointer[codewordOffset] = iQSC; /* store updated pResultPointer */ 823 824 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 825 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 826 segmentOffset, 827 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 828 829#if STATE_MACHINE_ERROR_CHECK 830 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 831 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__SIGN; 832 return BODY_SIGN__SIGN; 833 } 834#endif 835 } 836 837 return STOP_THIS_STATE; 838} 839 840 841/*--------------------------------------------------------------------------------------------- 842 description: Decodes the codeword body in case of codebook is 11. Writes out resulting 843 two or four lines [with probably wrong sign] and counts the number of 844 lines, which are different form zero. This information is needed in next 845 state where sign bits will be decoded, if necessary. 846 If sign bit counter cntSign is zero, no sign bits are needed and codeword is 847 decoded completely. 848----------------------------------------------------------------------------------------------- 849 output: Two lines (quantizes spectral coefficients) which are probably wrong. The 850 sign may be wrong and if one or two values is/are 16, the following states 851 will decode the escape sequence to correct the values which are wirtten here. 852----------------------------------------------------------------------------------------------- 853 return: 0 854-------------------------------------------------------------------------------------------- */ 855UINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) 856{ 857 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 858 SCHAR *pRemainingBitsInSegment; 859 USHORT *pLeftStartOfSegment; 860 USHORT *pRightStartOfSegment; 861 UCHAR readDirection; 862 UINT *pSegmentBitfield; 863 UINT *pCodewordBitfield; 864 UINT segmentOffset; 865 866 UINT *iNode; 867 UCHAR *pCntSign; 868 FIXP_DBL *pResultBase; 869 USHORT *iResultPointer; 870 UINT codewordOffset; 871 872 UCHAR carryBit; 873 UINT iQSC; 874 UINT cntSign; 875 UINT dimCntr; 876 UINT treeNode; 877 SCHAR *pSta; 878 UINT branchNode; 879 UINT branchValue; 880 const UINT *pCurrentTree; 881 const SCHAR *pQuantValBase; 882 const SCHAR *pQuantVal; 883 884 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 885 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 886 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 887 readDirection = pHcr->segmentInfo.readDirection; 888 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 889 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 890 segmentOffset = pHcr->segmentInfo.segmentOffset; 891 892 iNode = pHcr->nonPcwSideinfo.iNode; 893 pCntSign = pHcr->nonPcwSideinfo.pCntSign; 894 pResultBase = pHcr->nonPcwSideinfo.pResultBase; 895 iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 896 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 897 pSta = pHcr->nonPcwSideinfo.pSta; 898 899 treeNode = iNode[codewordOffset]; 900 pCurrentTree = aHuffTable[ESCAPE_CODEBOOK]; 901 902 903 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 904 905 carryBit = HcrGetABitFromBitstream( bs, 906 &pLeftStartOfSegment[segmentOffset], 907 &pRightStartOfSegment[segmentOffset], 908 readDirection); 909 910 /* make a step in tree */ 911 CarryBitToBranchValue(carryBit, 912 treeNode, 913 &branchValue, 914 &branchNode); 915 916 /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ 917 if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set body complete */ 918 919 /* body completely decoded; branchValue is valid */ 920 /* set pQuantVol to first (of two or four) quantized spectral coefficients */ 921 pQuantValBase = aQuantTable[ESCAPE_CODEBOOK]; /* get base address of quantized values belonging to current codebook */ 922 pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ 923 924 /* make backup from original resultPointer in node storage for state BODY_SIGN_ESC__SIGN */ 925 iNode[codewordOffset] = iResultPointer[codewordOffset]; 926 927 /* get position of first line for writing result */ 928 iQSC = iResultPointer[codewordOffset]; 929 930 /* codeword decoding result is written out here: Write out 2 or 4 quantized spectral values with probably */ 931 /* wrong sign and count number of values which are different from zero for sign bit decoding [which happens in next state] */ 932 cntSign = 0; 933 934 for ( dimCntr = DIMENSION_OF_ESCAPE_CODEBOOK; dimCntr != 0; dimCntr-- ) { 935 pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ 936 if ( *pQuantVal++ != 0 ) { 937 cntSign += 1; 938 } 939 } 940 941 if ( cntSign == 0 ) { 942 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 943 segmentOffset, 944 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 945 /* codeword decoded */ 946 } 947 else { 948 /* write sign count result into codewordsideinfo of current codeword */ 949 pCntSign[codewordOffset] = cntSign; 950 pSta[codewordOffset] = BODY_SIGN_ESC__SIGN; /* change state */ 951 pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 952 } 953 pRemainingBitsInSegment[segmentOffset] -= 1; /* the last reinitialzation of for loop counter (see above) is done here */ 954 break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ 955 } 956 else { /* body is not decoded completely: */ 957 /* update treeNode for further step in decoding tree and store updated treeNode because maybe no more bits left in segment */ 958 treeNode = *(pCurrentTree + branchValue); 959 iNode[codewordOffset] = treeNode; 960 } 961 } 962 963 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 964 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 965 segmentOffset, 966 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 967 968#if STATE_MACHINE_ERROR_CHECK 969 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 970 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__BODY; 971 return BODY_SIGN_ESC__BODY; 972 } 973#endif 974 } 975 976 return STOP_THIS_STATE; 977} 978 979 980/*--------------------------------------------------------------------------------------------- 981 description: This state decodes the sign bits, if a codeword of codebook 11 needs some. 982 A flag named 'flagB' in codeword sideinfo is set, if the second line of 983 quantized spectral values is 16. The 'flagB' is used in case of decoding 984 of a escape sequence is necessary as far as the second line is concerned. 985 986 If only the first line needs an escape sequence, the flagB is cleared. 987 If only the second line needs an escape sequence, the flagB is not used. 988 989 For storing sideinfo in case of escape sequence decoding one single word 990 can be used for both escape sequences because they are decoded not at the 991 same time: 992 993 994 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 995 ===== == == =========== =========== =================================== 996 ^ ^ ^ ^ ^ ^ 997 | | | | | | 998 res. flagA flagB escapePrefixUp escapePrefixDown escapeWord 999 1000----------------------------------------------------------------------------------------------- 1001 output: Two lines with correct sign. If one or two values is/are 16, the lines are 1002 not valid, otherwise they are. 1003----------------------------------------------------------------------------------------------- 1004 return: 0 1005-------------------------------------------------------------------------------------------- */ 1006UINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) 1007{ 1008 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 1009 SCHAR *pRemainingBitsInSegment; 1010 USHORT *pLeftStartOfSegment; 1011 USHORT *pRightStartOfSegment; 1012 UCHAR readDirection; 1013 UINT *pSegmentBitfield; 1014 UINT *pCodewordBitfield; 1015 UINT segmentOffset; 1016 1017 UINT *iNode; 1018 UCHAR *pCntSign; 1019 FIXP_DBL *pResultBase; 1020 USHORT *iResultPointer; 1021 UINT *pEscapeSequenceInfo; 1022 UINT codewordOffset; 1023 1024 UINT iQSC; 1025 UCHAR cntSign; 1026 UINT flagA; 1027 UINT flagB; 1028 UINT flags; 1029 UCHAR carryBit; 1030 SCHAR *pSta; 1031 1032 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 1033 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 1034 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 1035 readDirection = pHcr->segmentInfo.readDirection; 1036 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 1037 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 1038 segmentOffset = pHcr->segmentInfo.segmentOffset; 1039 1040 iNode = pHcr->nonPcwSideinfo.iNode; 1041 pCntSign = pHcr->nonPcwSideinfo.pCntSign; 1042 pResultBase = pHcr->nonPcwSideinfo.pResultBase; 1043 iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 1044 pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 1045 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 1046 pSta = pHcr->nonPcwSideinfo.pSta; 1047 1048 iQSC = iResultPointer[codewordOffset]; 1049 cntSign = pCntSign[codewordOffset]; 1050 1051 1052 /* loop for sign bit decoding */ 1053 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 1054 1055 carryBit = HcrGetABitFromBitstream( bs, 1056 &pLeftStartOfSegment[segmentOffset], 1057 &pRightStartOfSegment[segmentOffset], 1058 readDirection); 1059 1060 /* decrement sign counter because one sign bit has been read */ 1061 cntSign -= 1; 1062 pCntSign[codewordOffset] = cntSign; 1063 1064 /* get a quantized spectral value (which was decoded in previous state) which is not zero. [This value will get a sign] */ 1065 while ( pResultBase[iQSC] == (FIXP_DBL)0 ) { 1066 iQSC++; 1067 } 1068 iResultPointer[codewordOffset] = iQSC; 1069 1070 /* put negative sign together with quantized spectral value; if carryBit is zero, the sign is ok already; no write operation necessary in this case */ 1071 if ( carryBit != 0 ) { 1072 pResultBase[iQSC] = - pResultBase[iQSC]; /* carryBit = 1 --> minus */ 1073 } 1074 iQSC++; /* update index to next (maybe valid) value */ 1075 iResultPointer[codewordOffset] = iQSC; 1076 1077 if ( cntSign == 0 ) { 1078 /* all sign bits are decoded now */ 1079 pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 1080 1081 /* check decoded values if codeword is decoded: Check if one or two escape sequences 16 follow */ 1082 1083 /* step 0 */ 1084 /* restore pointer to first decoded quantized value [ = original pResultPointr] from index iNode prepared in State_BODY_SIGN_ESC__BODY */ 1085 iQSC = iNode[codewordOffset]; 1086 1087 /* step 1 */ 1088 /* test first value if escape sequence follows */ 1089 flagA = 0; /* for first possible escape sequence */ 1090 if ( fixp_abs(pResultBase[iQSC++]) == (FIXP_DBL)ESCAPE_VALUE ) { 1091 flagA = 1; 1092 } 1093 1094 /* step 2 */ 1095 /* test second value if escape sequence follows */ 1096 flagB = 0; /* for second possible escape sequence */ 1097 if ( fixp_abs(pResultBase[iQSC]) == (FIXP_DBL)ESCAPE_VALUE ) { 1098 flagB = 1; 1099 } 1100 1101 1102 /* step 3 */ 1103 /* evaluate flag result and go on if necessary */ 1104 if ( !flagA && !flagB ) { 1105 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 1106 segmentOffset, 1107 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 1108 } 1109 else { 1110 /* at least one of two lines is 16 */ 1111 /* store both flags at correct positions in non PCW codeword sideinfo pEscapeSequenceInfo[codewordOffset] */ 1112 flags = 0; 1113 flags = flagA << POSITION_OF_FLAG_A; 1114 flags |= (flagB << POSITION_OF_FLAG_B); 1115 pEscapeSequenceInfo[codewordOffset] = flags; 1116 1117 1118 /* set next state */ 1119 pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; 1120 pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 1121 1122 /* set result pointer to the first line of the two decoded lines */ 1123 iResultPointer[codewordOffset] = iNode[codewordOffset]; 1124 1125 if ( !flagA && flagB ) { 1126 /* update pResultPointr ==> state Stat_BODY_SIGN_ESC__ESC_WORD writes to correct position. Second value is the one and only escape value */ 1127 iQSC = iResultPointer[codewordOffset]; 1128 iQSC++; 1129 iResultPointer[codewordOffset] = iQSC; 1130 } 1131 1132 } /* at least one of two lines is 16 */ 1133 break; /* nonPCW-Body at cb 11 and according sign bits are decoded */ 1134 1135 } /* if ( cntSign == 0 ) */ 1136 } /* loop over remaining Bits in segment */ 1137 1138 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 1139 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 1140 segmentOffset, 1141 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 1142 1143#if STATE_MACHINE_ERROR_CHECK 1144 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 1145 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__SIGN; 1146 return BODY_SIGN_ESC__SIGN; 1147 } 1148#endif 1149 1150 } 1151 return STOP_THIS_STATE; 1152} 1153 1154 1155/*--------------------------------------------------------------------------------------------- 1156 description: Decode escape prefix of first or second escape sequence. The escape prefix 1157 consists of ones. The following zero is also decoded here. 1158----------------------------------------------------------------------------------------------- 1159 output: If the single separator-zero which follows the escape-prefix-ones is not yet decoded: 1160 The value 'escapePrefixUp' in word pEscapeSequenceInfo[codewordOffset] is updated. 1161 1162 If the single separator-zero which follows the escape-prefix-ones is decoded: 1163 Two updated values 'escapePrefixUp' and 'escapePrefixDown' in word 1164 pEscapeSequenceInfo[codewordOffset]. This State is finished. Switch to next state. 1165----------------------------------------------------------------------------------------------- 1166 return: 0 1167-------------------------------------------------------------------------------------------- */ 1168UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM bs, void *ptr) 1169{ 1170 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 1171 SCHAR *pRemainingBitsInSegment; 1172 USHORT *pLeftStartOfSegment; 1173 USHORT *pRightStartOfSegment; 1174 UCHAR readDirection; 1175 UINT *pSegmentBitfield; 1176 UINT segmentOffset; 1177 UINT *pEscapeSequenceInfo; 1178 UINT codewordOffset; 1179 UCHAR carryBit; 1180 UINT escapePrefixUp; 1181 SCHAR *pSta; 1182 1183 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 1184 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 1185 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 1186 readDirection = pHcr->segmentInfo.readDirection; 1187 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 1188 segmentOffset = pHcr->segmentInfo.segmentOffset; 1189 pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 1190 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 1191 pSta = pHcr->nonPcwSideinfo.pSta; 1192 1193 escapePrefixUp = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> LSB_ESCAPE_PREFIX_UP; 1194 1195 1196 /* decode escape prefix */ 1197 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 1198 1199 carryBit = HcrGetABitFromBitstream( bs, 1200 &pLeftStartOfSegment[segmentOffset], 1201 &pRightStartOfSegment[segmentOffset], 1202 readDirection); 1203 1204 /* count ones and store sum in escapePrefixUp */ 1205 if ( carryBit == 1 ) { 1206 escapePrefixUp += 1; /* update conter for ones */ 1207 1208 /* store updated counter in sideinfo of current codeword */ 1209 pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ 1210 escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ 1211 pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixUp */ 1212 escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ 1213 } 1214 else { /* separator [zero] reached */ 1215 pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 1216 escapePrefixUp += 4; /* if escape_separator '0' appears, add 4 and ==> break */ 1217 1218 /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit position escapePrefixUp */ 1219 pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ 1220 escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ 1221 pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixUp */ 1222 escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ 1223 1224 /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit position escapePrefixDown */ 1225 pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ 1226 escapePrefixUp <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ 1227 pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixDown */ 1228 escapePrefixUp >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back down */ 1229 1230 pSta[codewordOffset] = BODY_SIGN_ESC__ESC_WORD; /* set next state */ 1231 pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 1232 break; 1233 } 1234 } 1235 1236 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 1237 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 1238 segmentOffset, 1239 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 1240 1241#if STATE_MACHINE_ERROR_CHECK 1242 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 1243 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX; 1244 return BODY_SIGN_ESC__ESC_PREFIX; 1245 } 1246#endif 1247 } 1248 1249 return STOP_THIS_STATE; 1250} 1251 1252 1253/*--------------------------------------------------------------------------------------------- 1254 description: Decode escapeWord of escape sequence. If the escape sequence is decoded 1255 completely, assemble quantized-spectral-escape-coefficient and replace the 1256 previous decoded 16 by the new value. 1257 Test flagB. If flagB is set, the second escape sequence must be decoded. If 1258 flagB is not set, the codeword is decoded and the state machine is switched 1259 off. 1260----------------------------------------------------------------------------------------------- 1261 output: Two lines with valid sign. At least one of both lines has got the correct 1262 value. 1263----------------------------------------------------------------------------------------------- 1264 return: 0 1265-------------------------------------------------------------------------------------------- */ 1266UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM bs, void *ptr) 1267{ 1268 H_HCR_INFO pHcr = (H_HCR_INFO)ptr; 1269 SCHAR *pRemainingBitsInSegment; 1270 USHORT *pLeftStartOfSegment; 1271 USHORT *pRightStartOfSegment; 1272 UCHAR readDirection; 1273 UINT *pSegmentBitfield; 1274 UINT *pCodewordBitfield; 1275 UINT segmentOffset; 1276 1277 FIXP_DBL *pResultBase; 1278 USHORT *iResultPointer; 1279 UINT *pEscapeSequenceInfo; 1280 UINT codewordOffset; 1281 1282 UINT escapeWord; 1283 UINT escapePrefixDown; 1284 UINT escapePrefixUp; 1285 UCHAR carryBit; 1286 UINT iQSC; 1287 INT sign; 1288 UINT flagA; 1289 UINT flagB; 1290 SCHAR *pSta; 1291 1292 pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; 1293 pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; 1294 pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; 1295 readDirection = pHcr->segmentInfo.readDirection; 1296 pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; 1297 pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; 1298 segmentOffset = pHcr->segmentInfo.segmentOffset; 1299 1300 pResultBase = pHcr->nonPcwSideinfo.pResultBase; 1301 iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; 1302 pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; 1303 codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; 1304 pSta = pHcr->nonPcwSideinfo.pSta; 1305 1306 escapeWord = pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_WORD; 1307 escapePrefixDown = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_DOWN) >> LSB_ESCAPE_PREFIX_DOWN; 1308 1309 1310 /* decode escape word */ 1311 for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { 1312 1313 carryBit = HcrGetABitFromBitstream( bs, 1314 &pLeftStartOfSegment[segmentOffset], 1315 &pRightStartOfSegment[segmentOffset], 1316 readDirection); 1317 1318 /* build escape word */ 1319 escapeWord <<= 1; /* left shift previous decoded part of escapeWord by on bit */ 1320 escapeWord = escapeWord | carryBit; /* assemble escape word by bitwise or */ 1321 1322 /* decrement counter for length of escape word because one more bit was decoded */ 1323 escapePrefixDown -= 1; 1324 1325 /* store updated escapePrefixDown */ 1326 pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ 1327 escapePrefixDown <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ 1328 pEscapeSequenceInfo[codewordOffset] |= escapePrefixDown; /* insert new escapePrefixDown */ 1329 escapePrefixDown >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back */ 1330 1331 1332 /* store updated escapeWord */ 1333 pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_WORD; /* delete old escapeWord */ 1334 pEscapeSequenceInfo[codewordOffset] |= escapeWord; /* insert new escapeWord */ 1335 1336 1337 if ( escapePrefixDown == 0 ) { 1338 pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ 1339 1340 /* escape sequence decoded. Assemble escape-line and replace original line */ 1341 1342 /* step 0 */ 1343 /* derive sign */ 1344 iQSC = iResultPointer[codewordOffset]; 1345 sign = (pResultBase[iQSC] >= (FIXP_DBL)0) ? 1 : -1; /* get sign of escape value 16 */ 1346 1347 /* step 1 */ 1348 /* get escapePrefixUp */ 1349 escapePrefixUp = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> LSB_ESCAPE_PREFIX_UP; 1350 1351 /* step 2 */ 1352 /* calculate escape value */ 1353 pResultBase[iQSC] = (FIXP_DBL)(sign * (((INT) 1 << escapePrefixUp) + escapeWord)); 1354 1355 /* get both flags from sideinfo (flags are not shifted to the lsb-position) */ 1356 flagA = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_A; 1357 flagB = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_B; 1358 1359 /* step 3 */ 1360 /* clear the whole escape sideinfo word */ 1361 pEscapeSequenceInfo[codewordOffset] = 0; 1362 1363 /* change state in dependence of flag flagB */ 1364 if ( flagA != 0 ) { 1365 /* first escape sequence decoded; previous decoded 16 has been replaced by valid line */ 1366 1367 /* clear flagA in sideinfo word because this escape sequence has already beed decoded */ 1368 pEscapeSequenceInfo[codewordOffset] &= ~MASK_FLAG_A; 1369 1370 if ( flagB == 0 ) { 1371 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 1372 segmentOffset, 1373 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 1374 } 1375 else { 1376 /* updated pointer to next and last 16 */ 1377 iQSC++; 1378 iResultPointer[codewordOffset] = iQSC; 1379 1380 /* change state */ 1381 pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; 1382 pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ 1383 } 1384 } 1385 else { 1386 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 1387 segmentOffset, 1388 pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ 1389 } 1390 break; 1391 } 1392 } 1393 1394 if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { 1395 ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), 1396 segmentOffset, 1397 pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ 1398 1399#if STATE_MACHINE_ERROR_CHECK 1400 if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { 1401 pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_WORD; 1402 return BODY_SIGN_ESC__ESC_WORD; 1403 } 1404#endif 1405 } 1406 1407 return STOP_THIS_STATE; 1408} 1409 1410