1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. 6 All rights reserved. 7 8 1. INTRODUCTION 9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16 of the MPEG specifications. 17 18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20 individually for the purpose of encoding or decoding bit streams in products that are compliant with 21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23 software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27 applications information and documentation. 28 29 2. COPYRIGHT LICENSE 30 31 Redistribution and use in source and binary forms, with or without modification, are permitted without 32 payment of copyright license fees provided that you satisfy the following conditions: 33 34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35 your modifications thereto in source code form. 36 37 You must retain the complete text of this software license in the documentation and/or other materials 38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40 modifications thereto to recipients of copies in binary form. 41 42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43 prior written permission. 44 45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46 software or your modifications thereto. 47 48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49 and 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 53 3. NO PATENT LICENSE 54 55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57 respect to this software. 58 59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60 by appropriate patent licenses. 61 62 4. DISCLAIMER 63 64 This 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 66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69 or business interruption, however caused and on any theory of liability, whether in contract, strict 70 liability, or tort (including negligence), arising in any way out of the use of this software, even if 71 advised of the possibility of such damage. 72 73 5. CONTACT INFORMATION 74 75 Fraunhofer Institute for Integrated Circuits IIS 76 Attention: Audio and Multimedia Departments - FDK AAC LL 77 Am Wolfsmantel 33 78 91058 Erlangen, Germany 79 80 www.iis.fraunhofer.de/amm 81 amm-info (at) iis.fraunhofer.de 82 ----------------------------------------------------------------------------------------------------------- */ 83 84 #include "psbitdec.h" 85 86 87 #include "sbr_rom.h" 88 #include "huff_dec.h" 89 90 /* PS dec privat functions */ 91 SBR_ERROR ResetPsDec(HANDLE_PS_DEC h_ps_d); 92 void ResetPsDeCor (HANDLE_PS_DEC h_ps_d); 93 94 /***************************************************************************/ 95 /*! 96 \brief huffman decoding by codebook table 97 98 \return index of huffman codebook table 99 100 ****************************************************************************/ 101 static SCHAR 102 decode_huff_cw (Huffman h, /*!< pointer to huffman codebook table */ 103 HANDLE_FDK_BITSTREAM hBitBuf, /*!< Handle to Bitbuffer */ 104 int *length) /*!< length of huffman codeword (or NULL) */ 105 { 106 UCHAR bit = 0; 107 SCHAR index = 0; 108 UCHAR bitCount = 0; 109 110 while (index >= 0) { 111 bit = FDKreadBits (hBitBuf, 1); 112 bitCount++; 113 index = h[index][bit]; 114 } 115 if (length) { 116 *length = bitCount; 117 } 118 return( index+64 ); /* Add offset */ 119 } 120 121 /***************************************************************************/ 122 /*! 123 \brief helper function - limiting of value to min/max values 124 125 \return limited value 126 127 ****************************************************************************/ 128 129 static SCHAR 130 limitMinMax(SCHAR i, 131 SCHAR min, 132 SCHAR max) 133 { 134 if (i<min) 135 return min; 136 else if (i>max) 137 return max; 138 else 139 return i; 140 } 141 142 /***************************************************************************/ 143 /*! 144 \brief Decodes delta values in-place and updates 145 data buffers according to quantization classes. 146 147 When delta coded in frequency the first element is deltacode from zero. 148 aIndex buffer is decoded from delta values to actual values. 149 150 \return none 151 152 ****************************************************************************/ 153 static void 154 deltaDecodeArray(SCHAR enable, 155 SCHAR *aIndex, /*!< ICC/IID parameters */ 156 SCHAR *aPrevFrameIndex, /*!< ICC/IID parameters of previous frame */ 157 SCHAR DtDf, 158 UCHAR nrElements, /*!< as conveyed in bitstream */ 159 /*!< output array size: nrElements*stride */ 160 UCHAR stride, /*!< 1=dflt, 2=half freq. resolution */ 161 SCHAR minIdx, 162 SCHAR maxIdx) 163 { 164 int i; 165 166 /* Delta decode */ 167 if ( enable==1 ) { 168 if (DtDf == 0) { /* Delta coded in freq */ 169 aIndex[0] = 0 + aIndex[0]; 170 aIndex[0] = limitMinMax(aIndex[0],minIdx,maxIdx); 171 for (i = 1; i < nrElements; i++) { 172 aIndex[i] = aIndex[i-1] + aIndex[i]; 173 aIndex[i] = limitMinMax(aIndex[i],minIdx,maxIdx); 174 } 175 } 176 else { /* Delta time */ 177 for (i = 0; i < nrElements; i++) { 178 aIndex[i] = aPrevFrameIndex[i*stride] + aIndex[i]; 179 aIndex[i] = limitMinMax(aIndex[i],minIdx,maxIdx); 180 } 181 } 182 } 183 else { /* No data is sent, set index to zero */ 184 for (i = 0; i < nrElements; i++) { 185 aIndex[i] = 0; 186 } 187 } 188 if (stride==2) { 189 for (i=nrElements*stride-1; i>0; i--) { 190 aIndex[i] = aIndex[i>>1]; 191 } 192 } 193 } 194 195 /***************************************************************************/ 196 /*! 197 \brief Mapping of ICC/IID parameters to 20 stereo bands 198 199 \return none 200 201 ****************************************************************************/ 202 static void map34IndexTo20 (SCHAR *aIndex, /*!< decoded ICC/IID parameters */ 203 UCHAR noBins) /*!< number of stereo bands */ 204 { 205 aIndex[0] = (2*aIndex[0]+aIndex[1])/3; 206 aIndex[1] = (aIndex[1]+2*aIndex[2])/3; 207 aIndex[2] = (2*aIndex[3]+aIndex[4])/3; 208 aIndex[3] = (aIndex[4]+2*aIndex[5])/3; 209 aIndex[4] = (aIndex[6]+aIndex[7])/2; 210 aIndex[5] = (aIndex[8]+aIndex[9])/2; 211 aIndex[6] = aIndex[10]; 212 aIndex[7] = aIndex[11]; 213 aIndex[8] = (aIndex[12]+aIndex[13])/2; 214 aIndex[9] = (aIndex[14]+aIndex[15])/2; 215 aIndex[10] = aIndex[16]; 216 /* For IPD/OPD it stops here */ 217 218 if (noBins == NO_HI_RES_BINS) 219 { 220 aIndex[11] = aIndex[17]; 221 aIndex[12] = aIndex[18]; 222 aIndex[13] = aIndex[19]; 223 aIndex[14] = (aIndex[20]+aIndex[21])/2; 224 aIndex[15] = (aIndex[22]+aIndex[23])/2; 225 aIndex[16] = (aIndex[24]+aIndex[25])/2; 226 aIndex[17] = (aIndex[26]+aIndex[27])/2; 227 aIndex[18] = (aIndex[28]+aIndex[29]+aIndex[30]+aIndex[31])/4; 228 aIndex[19] = (aIndex[32]+aIndex[33])/2; 229 } 230 } 231 232 /***************************************************************************/ 233 /*! 234 \brief Decodes delta coded IID, ICC, IPD and OPD indices 235 236 \return PS processing flag. If set to 1 237 238 ****************************************************************************/ 239 int 240 DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ 241 const UCHAR frameError ) /*!< Flag telling that frame had errors */ 242 { 243 MPEG_PS_BS_DATA *pBsData; 244 UCHAR gr, env; 245 int bPsHeaderValid, bPsDataAvail; 246 247 /* Shortcuts to avoid deferencing and keep the code readable */ 248 pBsData = &h_ps_d->bsData[h_ps_d->processSlot].mpeg; 249 bPsHeaderValid = pBsData->bPsHeaderValid; 250 bPsDataAvail = (h_ps_d->bPsDataAvail[h_ps_d->processSlot] == ppt_mpeg) ? 1 : 0; 251 252 /*************************************************************************************** 253 * Decide whether to process or to conceal PS data or not. */ 254 255 if ( ( h_ps_d->psDecodedPrv && !frameError && !bPsDataAvail) 256 || (!h_ps_d->psDecodedPrv && (frameError || !bPsDataAvail || !bPsHeaderValid)) ) { 257 /* Don't apply PS processing. 258 * Declare current PS header and bitstream data invalid. */ 259 pBsData->bPsHeaderValid = 0; 260 h_ps_d->bPsDataAvail[h_ps_d->processSlot] = ppt_none; 261 return (0); 262 } 263 264 if (frameError || !bPsHeaderValid) 265 { /* no new PS data available (e.g. frame loss) */ 266 /* => keep latest data constant (i.e. FIX with noEnv=0) */ 267 pBsData->noEnv = 0; 268 } 269 270 /*************************************************************************************** 271 * Decode bitstream payload or prepare parameter for concealment: 272 */ 273 for (env=0; env<pBsData->noEnv; env++) { 274 SCHAR *aPrevIidIndex; 275 SCHAR *aPrevIccIndex; 276 277 UCHAR noIidSteps = pBsData->bFineIidQ?NO_IID_STEPS_FINE:NO_IID_STEPS; 278 279 if (env==0) { 280 aPrevIidIndex = h_ps_d->specificTo.mpeg.aIidPrevFrameIndex; 281 aPrevIccIndex = h_ps_d->specificTo.mpeg.aIccPrevFrameIndex; 282 } 283 else { 284 aPrevIidIndex = pBsData->aaIidIndex[env-1]; 285 aPrevIccIndex = pBsData->aaIccIndex[env-1]; 286 } 287 288 deltaDecodeArray(pBsData->bEnableIid, 289 pBsData->aaIidIndex[env], 290 aPrevIidIndex, 291 pBsData->abIidDtFlag[env], 292 FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid], 293 (pBsData->freqResIid)?1:2, 294 -noIidSteps, 295 noIidSteps); 296 297 deltaDecodeArray(pBsData->bEnableIcc, 298 pBsData->aaIccIndex[env], 299 aPrevIccIndex, 300 pBsData->abIccDtFlag[env], 301 FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc], 302 (pBsData->freqResIcc)?1:2, 303 0, 304 NO_ICC_STEPS-1); 305 } /* for (env=0; env<pBsData->noEnv; env++) */ 306 307 /* handling of FIX noEnv=0 */ 308 if (pBsData->noEnv==0) { 309 /* set noEnv=1, keep last parameters or force 0 if not enabled */ 310 pBsData->noEnv = 1; 311 312 if (pBsData->bEnableIid) { 313 for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { 314 pBsData->aaIidIndex[pBsData->noEnv-1][gr] = 315 h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr]; 316 } 317 } 318 else { 319 for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { 320 pBsData->aaIidIndex[pBsData->noEnv-1][gr] = 0; 321 } 322 } 323 324 if (pBsData->bEnableIcc) { 325 for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { 326 pBsData->aaIccIndex[pBsData->noEnv-1][gr] = 327 h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr]; 328 } 329 } 330 else { 331 for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { 332 pBsData->aaIccIndex[pBsData->noEnv-1][gr] = 0; 333 } 334 } 335 } 336 337 /* Update previous frame index buffers */ 338 for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { 339 h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr] = 340 pBsData->aaIidIndex[pBsData->noEnv-1][gr]; 341 } 342 for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { 343 h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr] = 344 pBsData->aaIccIndex[pBsData->noEnv-1][gr]; 345 } 346 347 /* PS data from bitstream (if avail) was decoded now */ 348 h_ps_d->bPsDataAvail[h_ps_d->processSlot] = ppt_none; 349 350 /* handling of env borders for FIX & VAR */ 351 if (pBsData->bFrameClass == 0) { 352 /* FIX_BORDERS NoEnv=0,1,2,4 */ 353 pBsData->aEnvStartStop[0] = 0; 354 for (env=1; env<pBsData->noEnv; env++) { 355 pBsData->aEnvStartStop[env] = 356 (env * h_ps_d->noSubSamples) / pBsData->noEnv; 357 } 358 pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; 359 /* 1024 (32 slots) env borders: 0, 8, 16, 24, 32 */ 360 /* 960 (30 slots) env borders: 0, 7, 15, 22, 30 */ 361 } 362 else { /* if (h_ps_d->bFrameClass == 0) */ 363 /* VAR_BORDERS NoEnv=1,2,3,4 */ 364 pBsData->aEnvStartStop[0] = 0; 365 366 /* handle case aEnvStartStop[noEnv]<noSubSample for VAR_BORDERS by 367 duplicating last PS parameters and incrementing noEnv */ 368 if (pBsData->aEnvStartStop[pBsData->noEnv] < h_ps_d->noSubSamples) { 369 for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { 370 pBsData->aaIidIndex[pBsData->noEnv][gr] = 371 pBsData->aaIidIndex[pBsData->noEnv-1][gr]; 372 } 373 for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { 374 pBsData->aaIccIndex[pBsData->noEnv][gr] = 375 pBsData->aaIccIndex[pBsData->noEnv-1][gr]; 376 } 377 pBsData->noEnv++; 378 pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; 379 } 380 381 /* enforce strictly monotonic increasing borders */ 382 for (env=1; env<pBsData->noEnv; env++) { 383 UCHAR thr; 384 thr = (UCHAR)h_ps_d->noSubSamples - (pBsData->noEnv - env); 385 if (pBsData->aEnvStartStop[env] > thr) { 386 pBsData->aEnvStartStop[env] = thr; 387 } 388 else { 389 thr = pBsData->aEnvStartStop[env-1]+1; 390 if (pBsData->aEnvStartStop[env] < thr) { 391 pBsData->aEnvStartStop[env] = thr; 392 } 393 } 394 } 395 } /* if (h_ps_d->bFrameClass == 0) ... else */ 396 397 /* copy data prior to possible 20<->34 in-place mapping */ 398 for (env=0; env<pBsData->noEnv; env++) { 399 UCHAR i; 400 for (i=0; i<NO_HI_RES_IID_BINS; i++) { 401 h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env][i] = pBsData->aaIidIndex[env][i]; 402 } 403 for (i=0; i<NO_HI_RES_ICC_BINS; i++) { 404 h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env][i] = pBsData->aaIccIndex[env][i]; 405 } 406 } 407 408 409 /* MPEG baseline PS */ 410 /* Baseline version of PS always uses the hybrid filter structure with 20 stereo bands. */ 411 /* If ICC/IID parameters for 34 stereo bands are decoded they have to be mapped to 20 */ 412 /* stereo bands. */ 413 /* Additionaly the IPD/OPD parameters won't be used. */ 414 415 for (env=0; env<pBsData->noEnv; env++) { 416 if (pBsData->freqResIid == 2) 417 map34IndexTo20 (h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env], NO_HI_RES_IID_BINS); 418 if (pBsData->freqResIcc == 2) 419 map34IndexTo20 (h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env], NO_HI_RES_ICC_BINS); 420 421 /* IPD/OPD is disabled in baseline version and thus was removed here */ 422 } 423 424 return (1); 425 } 426 427 428 /***************************************************************************/ 429 /*! 430 431 \brief Reads parametric stereo data from bitstream 432 433 \return 434 435 ****************************************************************************/ 436 unsigned int 437 ReadPsData (HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ 438 HANDLE_FDK_BITSTREAM hBitBuf, /*!< handle to struct BIT_BUF */ 439 int nBitsLeft /*!< max number of bits available */ 440 ) 441 { 442 MPEG_PS_BS_DATA *pBsData; 443 444 UCHAR gr, env; 445 SCHAR dtFlag; 446 INT startbits; 447 Huffman CurrentTable; 448 SCHAR bEnableHeader; 449 450 if (!h_ps_d) 451 return 0; 452 453 pBsData = &h_ps_d->bsData[h_ps_d->bsReadSlot].mpeg; 454 455 if (h_ps_d->bsReadSlot != h_ps_d->bsLastSlot) { 456 /* Copy last header data */ 457 FDKmemcpy(pBsData, &h_ps_d->bsData[h_ps_d->bsLastSlot].mpeg, sizeof(MPEG_PS_BS_DATA)); 458 } 459 460 461 startbits = (INT) FDKgetValidBits(hBitBuf); 462 463 bEnableHeader = (SCHAR) FDKreadBits (hBitBuf, 1); 464 465 /* Read header */ 466 if (bEnableHeader) { 467 pBsData->bPsHeaderValid = 1; 468 pBsData->bEnableIid = (UCHAR) FDKreadBits (hBitBuf, 1); 469 if (pBsData->bEnableIid) { 470 pBsData->modeIid = (UCHAR) FDKreadBits (hBitBuf, 3); 471 } 472 473 pBsData->bEnableIcc = (UCHAR) FDKreadBits (hBitBuf, 1); 474 if (pBsData->bEnableIcc) { 475 pBsData->modeIcc = (UCHAR) FDKreadBits (hBitBuf, 3); 476 } 477 478 pBsData->bEnableExt = (UCHAR) FDKreadBits (hBitBuf, 1); 479 } 480 481 pBsData->bFrameClass = (UCHAR) FDKreadBits (hBitBuf, 1); 482 if (pBsData->bFrameClass == 0) { 483 /* FIX_BORDERS NoEnv=0,1,2,4 */ 484 pBsData->noEnv = FDK_sbrDecoder_aFixNoEnvDecode[(UCHAR) FDKreadBits (hBitBuf, 2)]; 485 /* all additional handling of env borders is now in DecodePs() */ 486 } 487 else { 488 /* VAR_BORDERS NoEnv=1,2,3,4 */ 489 pBsData->noEnv = 1+(UCHAR) FDKreadBits (hBitBuf, 2); 490 for (env=1; env<pBsData->noEnv+1; env++) 491 pBsData->aEnvStartStop[env] = ((UCHAR) FDKreadBits (hBitBuf, 5)) + 1; 492 /* all additional handling of env borders is now in DecodePs() */ 493 } 494 495 /* verify that IID & ICC modes (quant grid, freq res) are supported */ 496 if ((pBsData->modeIid > 5) || (pBsData->modeIcc > 5)) { 497 /* no useful PS data could be read from bitstream */ 498 h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_none; 499 /* discard all remaining bits */ 500 nBitsLeft -= startbits - FDKgetValidBits(hBitBuf); 501 while (nBitsLeft) { 502 int i = nBitsLeft; 503 if (i>8) { 504 i = 8; 505 } 506 FDKreadBits (hBitBuf, i); 507 nBitsLeft -= i; 508 } 509 return (startbits - FDKgetValidBits(hBitBuf)); 510 } 511 512 if (pBsData->modeIid > 2){ 513 pBsData->freqResIid = pBsData->modeIid-3; 514 pBsData->bFineIidQ = 1; 515 } 516 else{ 517 pBsData->freqResIid = pBsData->modeIid; 518 pBsData->bFineIidQ = 0; 519 } 520 521 if (pBsData->modeIcc > 2){ 522 pBsData->freqResIcc = pBsData->modeIcc-3; 523 } 524 else{ 525 pBsData->freqResIcc = pBsData->modeIcc; 526 } 527 528 529 /* Extract IID data */ 530 if (pBsData->bEnableIid) { 531 for (env=0; env<pBsData->noEnv; env++) { 532 dtFlag = (SCHAR)FDKreadBits (hBitBuf, 1); 533 if (!dtFlag) 534 { 535 if (pBsData->bFineIidQ) 536 CurrentTable = (Huffman)&aBookPsIidFineFreqDecode; 537 else 538 CurrentTable = (Huffman)&aBookPsIidFreqDecode; 539 } 540 else 541 { 542 if (pBsData->bFineIidQ) 543 CurrentTable = (Huffman)&aBookPsIidFineTimeDecode; 544 else 545 CurrentTable = (Huffman)&aBookPsIidTimeDecode; 546 } 547 548 for (gr = 0; gr < FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid]; gr++) 549 pBsData->aaIidIndex[env][gr] = decode_huff_cw(CurrentTable,hBitBuf,NULL); 550 pBsData->abIidDtFlag[env] = dtFlag; 551 } 552 } 553 554 /* Extract ICC data */ 555 if (pBsData->bEnableIcc) { 556 for (env=0; env<pBsData->noEnv; env++) { 557 dtFlag = (SCHAR)FDKreadBits (hBitBuf, 1); 558 if (!dtFlag) 559 CurrentTable = (Huffman)&aBookPsIccFreqDecode; 560 else 561 CurrentTable = (Huffman)&aBookPsIccTimeDecode; 562 563 for (gr = 0; gr < FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc]; gr++) 564 pBsData->aaIccIndex[env][gr] = decode_huff_cw(CurrentTable,hBitBuf,NULL); 565 pBsData->abIccDtFlag[env] = dtFlag; 566 } 567 } 568 569 if (pBsData->bEnableExt) { 570 571 /*! 572 Decoders that support only the baseline version of the PS tool are allowed 573 to ignore the IPD/OPD data, but according header data has to be parsed. 574 ISO/IEC 14496-3 Subpart 8 Annex 4 575 */ 576 577 int cnt = FDKreadBits(hBitBuf, PS_EXTENSION_SIZE_BITS); 578 if (cnt == (1<<PS_EXTENSION_SIZE_BITS)-1) { 579 cnt += FDKreadBits(hBitBuf, PS_EXTENSION_ESC_COUNT_BITS); 580 } 581 while (cnt--) 582 FDKreadBits(hBitBuf, 8); 583 } 584 585 586 /* new PS data was read from bitstream */ 587 h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_mpeg; 588 589 590 591 return (startbits - FDKgetValidBits(hBitBuf)); 592 } 593 594