Imported Debian version 0.1.3.1
[deb_fdk-aac.git] / libAACdec / src / aacdec_hcr.cpp
1
2 /* -----------------------------------------------------------------------------------------------------------
3 Software 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
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@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
83
84 /***************************** MPEG-4 AAC Decoder ***************************
85
86 Author(s): Robert Weidner (DSP Solutions)
87 Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo,
88 decode priority codewords (PCWs)
89
90 *******************************************************************************/
91
92 #include "aacdec_hcr.h"
93
94
95
96 #include "aacdec_hcr_types.h"
97 #include "aacdec_hcr_bit.h"
98 #include "aacdec_hcrs.h"
99 #include "aac_ram.h"
100 #include "aac_rom.h"
101 #include "channel.h"
102 #include "block.h"
103
104 #include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */
105 #include "FDK_bitstream.h"
106
107 extern int mlFileChCurr;
108
109 static void errDetectorInHcrSideinfoShrt(SCHAR cb,
110 SHORT numLine,
111 UINT *errorWord);
112
113 static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
114 SHORT lengthOfReorderedSpectralData,
115 UINT *errorWord);
116
117 static void HcrCalcNumCodeword (H_HCR_INFO pHcr);
118 static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr);
119 static void HcrPrepareSegmentationGrid (H_HCR_INFO pHcr);
120 static void HcrExtendedSectionInfo (H_HCR_INFO pHcr);
121
122 static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment,
123 USHORT *pNumExtendedSortedCodewordInSection,
124 int numExtendedSortedCodewordInSectionIdx,
125 USHORT *pNumExtendedSortedSectionsInSets,
126 int numExtendedSortedSectionsInSetsIdx);
127
128 static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs,
129 INT quantSpecCoef,
130 USHORT *pLeftStartOfSegment,
131 SCHAR *pRemainingBitsInSegment,
132 int *pNumDecodedBits
133 );
134
135 static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs,
136 UINT codebookDim,
137 const SCHAR *pQuantVal,
138 FIXP_DBL *pQuantSpecCoef,
139 int *quantSpecCoefIdx,
140 USHORT *pLeftStartOfSegment,
141 SCHAR *pRemainingBitsInSegment,
142 int *pNumDecodedBits
143 );
144
145 static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs,
146 const UINT *pCurrentTree,
147 const SCHAR *pQuantValBase,
148 USHORT *pLeftStartOfSegment,
149 SCHAR *pRemainingBitsInSegment,
150 int *pNumDecodedBits
151 );
152
153 static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr);
154
155 static void HcrReorderQuantizedSpectralCoefficients(
156 H_HCR_INFO pHcr,
157 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
158 const SamplingRateInfo *pSamplingRateInfo
159 );
160
161
162 #if CHECK_SEGMENTATION_IMMEDIATELY
163 static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
164 H_HCR_INFO pHcr,
165 PCW_TYPE kind,
166 FIXP_DBL *qsc_base_of_cw,
167 UCHAR dimension);
168 #endif
169
170 #if CHECK_SEGMENTATION_FINAL
171 static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr);
172 #endif
173
174 /*---------------------------------------------------------------------------------------------
175 description: Check if codebook and numSect are within allowed range (short only)
176 -------------------------------------------------------------------------------------------- */
177 static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,UINT* errorWord)
178 {
179
180
181
182 if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) {
183 *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK;
184 }
185 if ( numLine < 0 || numLine > 1024 ) {
186 *errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK;
187 }
188 }
189
190 /*---------------------------------------------------------------------------------------------
191 description: Check both HCR lengths
192 -------------------------------------------------------------------------------------------- */
193 static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
194 SHORT lengthOfReorderedSpectralData,
195 UINT *errorWord)
196 {
197 if ( lengthOfReorderedSpectralData < lengthOfLongestCodeword ) {
198 *errorWord |= HCR_SI_LENGTHS_FAILURE;
199 }
200 }
201
202 /*---------------------------------------------------------------------------------------------
203 description: Decode (and adapt if necessary) the two HCR sideinfo components:
204 'reordered_spectral_data_length' and 'longest_codeword_length'
205 -------------------------------------------------------------------------------------------- */
206
207 void CHcr_Read(HANDLE_FDK_BITSTREAM bs,
208 CAacDecoderChannelInfo *pAacDecoderChannelInfo)
209 {
210 INT globalHcrType = getHcrType(&pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo);
211 SHORT lengOfReorderedSpectralData;
212 SCHAR lengOfLongestCodeword;
213
214 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = 0;
215 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0;
216
217
218
219 /* ------- SI-Value No 1 ------- */
220 lengOfReorderedSpectralData = FDKreadBits(bs,14) + ERROR_LORSD;
221 if ( globalHcrType == ID_CPE ) {
222 if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) {
223 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */
224 }
225 else {
226 if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) {
227 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = CPE_TOP_LENGTH; /* use valid maximum */
228 }
229 }
230 }
231 else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE || globalHcrType == ID_CCE ) {
232 if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) {
233 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */
234 }
235 else {
236 if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) {
237 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = SCE_TOP_LENGTH; /* use valid maximum */
238 }
239 }
240 }
241
242 /* ------- SI-Value No 2 ------- */
243 lengOfLongestCodeword = FDKreadBits(bs,6) + ERROR_LOLC;
244 if ((lengOfLongestCodeword >= 0) && (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) {
245 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = lengOfLongestCodeword; /* the decoded value is within range */
246 }
247 else {
248 if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) {
249 pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */
250 }
251 }
252 }
253
254
255 /*---------------------------------------------------------------------------------------------
256 description: Sets up HCR ROM-Tables
257 -------------------------------------------------------------------------------------------- */
258
259 void HcrInitRom(H_HCR_INFO pHcr)
260 {
261 pHcr->cbPairs.pMinOfCbPair = aMinOfCbPair;
262 pHcr->cbPairs.pMaxOfCbPair = aMaxOfCbPair;
263
264 pHcr->tableInfo.pMaxCwLength = aMaxCwLen;
265 pHcr->tableInfo.pCbDimension = aDimCb;
266 pHcr->tableInfo.pCbDimShift = aDimCbShift;
267 pHcr->tableInfo.pCbSign = aSignCb;
268 pHcr->tableInfo.pCbPriority = aCbPriority;
269 pHcr->tableInfo.pLargestAbsVal = aLargestAbsoluteValue;
270 }
271
272 /*---------------------------------------------------------------------------------------------
273 description: Set up HCR - must be called before every call to HcrDecoder().
274 For short block a sorting algorithm is applied to get the SI in the order
275 that HCR could assemble the qsc's as if it is a long block.
276 -----------------------------------------------------------------------------------------------
277 return: error log
278 -------------------------------------------------------------------------------------------- */
279
280 UINT HcrInit(H_HCR_INFO pHcr,
281 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
282 const SamplingRateInfo *pSamplingRateInfo,
283 HANDLE_FDK_BITSTREAM bs)
284 {
285 CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo;
286 SHORT *pNumLinesInSec;
287 UCHAR *pCodeBk;
288 SHORT numSection;
289 SCHAR cb;
290 int numLine;
291 int i;
292
293 pHcr->decInOut.lengthOfReorderedSpectralData = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData;
294 pHcr->decInOut.lengthOfLongestCodeword = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword;
295 pHcr->decInOut.pQuantizedSpectralCoefficientsBase = pAacDecoderChannelInfo->pSpectralCoefficient;
296 pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0;
297 pHcr->decInOut.pCodebook = pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
298 pHcr->decInOut.pNumLineInSect = pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
299 pHcr->decInOut.numSection = pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection;
300 pHcr->decInOut.errorLog = 0;
301 pHcr->nonPcwSideinfo.pResultBase = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
302
303 FDKsyncCache(bs);
304 pHcr->decInOut.bitstreamIndex = FDKgetBitCnt(bs);
305
306 if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */
307 {
308 SHORT band;
309 SHORT maxBand;
310 SCHAR group;
311 SCHAR winGroupLen;
312 SCHAR window;
313 SCHAR numUnitInBand;
314 SCHAR cntUnitInBand;
315 SCHAR groupWin;
316 SCHAR cb_prev;
317
318 UCHAR *pCodeBook;
319 const SHORT *BandOffsets;
320 SCHAR numOfGroups;
321
322
323 pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */
324 pNumLinesInSec = pHcr->decInOut.pNumLineInSect; /* out */
325 pCodeBk = pHcr->decInOut.pCodebook; /* out */
326 BandOffsets = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */
327 numOfGroups = GetWindowGroups(pIcsInfo);
328
329 numLine = 0;
330 numSection = 0;
331 cb = pCodeBook[0];
332 cb_prev = pCodeBook[0];
333
334 /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new section starts */
335
336 *pCodeBk++ = cb_prev;
337
338 maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
339 for (band = 0; band < maxBand; band++) { /* from low to high sfbs i.e. from low to high frequencies */
340 numUnitInBand = ((BandOffsets[band+1] - BandOffsets[band]) >> FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */
341 for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0; cntUnitInBand-- ) { /* for every unit in the band */
342 for (window = 0, group = 0; group < numOfGroups; group++) {
343 winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
344 for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) {
345 cb = pCodeBook[group * 16 + band];
346 if (cb != cb_prev) {
347 #if CHECK_VALID_HCR_INPUT /* short-block 1 of 2 */
348 errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog );
349 if (pHcr->decInOut.errorLog != 0 ) {
350 return ( pHcr->decInOut.errorLog );
351 }
352 #endif
353 *pCodeBk++ = cb;
354 *pNumLinesInSec++ = numLine;
355 numSection++;
356
357 cb_prev = cb;
358 numLine = LINES_PER_UNIT;
359 }
360 else {
361 numLine += LINES_PER_UNIT;
362 }
363 }
364 }
365 }
366 }
367
368 numSection++;
369
370 #if CHECK_VALID_HCR_INPUT /* short-block 2 of 2 */
371 errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog );
372 if ( numSection <= 0 || numSection > 1024/2 ) {
373 pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK;
374 }
375 errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
376 pHcr->decInOut.lengthOfReorderedSpectralData,
377 &pHcr->decInOut.errorLog);
378 if (pHcr->decInOut.errorLog != 0 ) {
379 return ( pHcr->decInOut.errorLog );
380 }
381 #endif
382
383 *pCodeBk = cb;
384 *pNumLinesInSec = numLine;
385 pHcr->decInOut.numSection = numSection;
386
387 } else /* end short block prepare SI */
388 { /* long block */
389 #if CHECK_VALID_HCR_INPUT /* long-block 1 of 1 */
390 errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
391 pHcr->decInOut.lengthOfReorderedSpectralData,
392 &pHcr->decInOut.errorLog);
393 numSection = pHcr->decInOut.numSection;
394 pNumLinesInSec = pHcr->decInOut.pNumLineInSect;
395 pCodeBk = pHcr->decInOut.pCodebook;
396 if ( numSection <= 0 || numSection > 64 ) {
397 pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK;
398 numSection = 0;
399 }
400
401 for ( i = numSection; i != 0; i-- )
402 {
403 cb = *pCodeBk++;
404
405 if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) {
406 pHcr->decInOut.errorLog |= CB_OUT_OF_RANGE_LONG_BLOCK;
407 }
408
409 numLine = *pNumLinesInSec++;
410 /* FDK_ASSERT(numLine > 0); */
411
412 if ( (numLine <= 0) || (numLine > 1024) ) {
413 pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK;
414 }
415 }
416 if (pHcr->decInOut.errorLog != 0 ) {
417 return ( pHcr->decInOut.errorLog );
418 }
419 #endif /* CHECK_VALID_HCR_INPUT */
420 }
421
422 pCodeBk = pHcr->decInOut.pCodebook;
423 for ( i = 0; i < numSection; i++ ) {
424 if (
425 (*pCodeBk == NOISE_HCB) ||
426 (*pCodeBk == INTENSITY_HCB2) ||
427 (*pCodeBk == INTENSITY_HCB))
428 {
429 *pCodeBk = 0;
430 }
431 pCodeBk++;
432 }
433
434 /* HCR-sideinfo-input is complete and seems to be valid */
435
436
437
438 return ( pHcr->decInOut.errorLog );
439 }
440
441
442
443
444 #if USE_HCR_DUMMY
445
446 /*---------------------------------------------------------------------------------------------
447
448 description: This HCR - dummy - function writes only a dirac-sequence in output buffer
449
450 -------------------------------------------------------------------------------------------- */
451 UINT HcrDecoder(H_HCR_INFO pHcr,
452 const CAacDecoderChannelInfo *pAacDecoderChannelInfo,
453 HANDLE_FDK_BITSTREAM bs)
454 {
455 for (SHORT i=0; i < 1024; i++ ) {
456 pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = FL2FXCONST_DBL(0.0f);
457 if ( i % 30 == 0) {
458 pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = (FIXP_DBL)HCR_DIRAC;
459 }
460 }
461 return 0;
462 }
463
464 #else /* USE_HCR_DUMMY */
465
466 /*---------------------------------------------------------------------------------------------
467 description: This function decodes the codewords of the spectral coefficients from the
468 bitstream according to the HCR algorithm and stores the quantized spectral
469 coefficients in correct order in the output buffer.
470 -------------------------------------------------------------------------------------------- */
471
472 UINT HcrDecoder(H_HCR_INFO pHcr,
473 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
474 const SamplingRateInfo *pSamplingRateInfo,
475 HANDLE_FDK_BITSTREAM bs)
476 {
477 int pTmp1, pTmp2, pTmp3, pTmp4;
478 #if DETECT_TOO_LONG_CW_READS
479 int pTmp5;
480 #endif
481
482 INT bitCntOffst;
483 UINT saveBitCnt = FDKgetBitCnt(bs); /* save bitstream position */
484
485 HcrCalcNumCodeword(pHcr);
486
487 HcrSortCodebookAndNumCodewordInSection(pHcr);
488
489 HcrPrepareSegmentationGrid(pHcr);
490
491 HcrExtendedSectionInfo(pHcr);
492
493 if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) != 0 ) {
494 return ( pHcr->decInOut.errorLog ); /* sideinfo is massively corrupt, return from HCR without having decoded anything */
495 }
496
497 DeriveNumberOfExtendedSortedSectionsInSets(pHcr->segmentInfo.numSegment,
498 pHcr->sectionInfo.pNumExtendedSortedCodewordInSection,
499 pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx,
500 pHcr->sectionInfo.pNumExtendedSortedSectionsInSets,
501 pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx);
502
503 /* store */
504 pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
505 pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx;
506 pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
507 pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
508 #if DETECT_TOO_LONG_CW_READS
509 pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
510 #endif
511
512 /* ------- decode meaningful PCWs ------ */
513 DecodePCWs(bs, pHcr);
514
515 if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) == 0 ) {
516 /* ------ decode the non-PCWs -------- */
517 DecodeNonPCWs(bs, pHcr);
518 }
519
520
521 #if CHECK_SEGMENTATION_FINAL
522 errDetectWithinSegmentationFinal(pHcr);
523 #endif
524
525 /* restore */
526 pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1;
527 pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2;
528 pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3;
529 pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4;
530 #if DETECT_TOO_LONG_CW_READS
531 pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5;
532 #endif
533
534 HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo, pSamplingRateInfo);
535
536 /* restore bitstream position */
537 bitCntOffst = saveBitCnt - FDKgetBitCnt(bs);
538 if( bitCntOffst ) {
539 FDKpushBiDirectional(bs, bitCntOffst);
540 }
541
542 return ( pHcr->decInOut.errorLog );
543 }
544
545
546 #endif /* USE_HCR_DUMMY */
547
548
549
550
551 /*---------------------------------------------------------------------------------------------
552 description: This function reorders the quantized spectral coefficients sectionwise for
553 long- and short-blocks and compares to the LAV (Largest Absolute Value of
554 the current codebook) -- a counter is incremented if there is an error
555 detected.
556 Additional for short-blocks a unit-based-deinterleaving is applied.
557 Moreover (for short blocks) the scaling is derived (compare plain huffman
558 decoder).
559 -------------------------------------------------------------------------------------------- */
560
561 static void HcrReorderQuantizedSpectralCoefficients(
562 H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
563 const SamplingRateInfo *pSamplingRateInfo
564 )
565 {
566 INT qsc;
567 UINT abs_qsc;
568 UINT i,j;
569 USHORT numSpectralValuesInSection;
570 FIXP_DBL *pTeVa;
571 USHORT lavErrorCnt = 0;
572
573 UINT numSection = pHcr->decInOut.numSection;
574 SPECTRAL_PTR pQuantizedSpectralCoefficientsBase = pHcr->decInOut.pQuantizedSpectralCoefficientsBase;
575 FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
576 const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift;
577 const USHORT *pLargestAbsVal = pHcr->tableInfo.pLargestAbsVal;
578 UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
579 USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
580 USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
581 FIXP_DBL *pTempValues = pHcr->segmentInfo.pTempValues;
582 FIXP_DBL *pBak = pHcr->segmentInfo.pTempValues;
583
584 FDKmemclear(pTempValues,1024*sizeof(FIXP_DBL));
585
586 /* long and short: check if decoded huffman-values (quantized spectral coefficients) are within range */
587 for ( i=numSection; i != 0; i-- ) {
588 numSpectralValuesInSection = *pNumSortedCodewordInSection++ << pCbDimShift[*pSortedCodebook];
589 pTeVa = &pTempValues[*pReorderOffset++];
590 for( j = numSpectralValuesInSection; j != 0; j-- ) {
591 qsc = *pQuantizedSpectralCoefficients++;
592 abs_qsc = FDKabs(qsc);
593 #if VALID_LAV_ERROR_TRIGGER
594 if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) {
595 *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */
596 }
597 else { /* line is too high .. */
598 if ( abs_qsc == Q_VALUE_INVALID ) { /* .. because of previous marking --> dont set LAV flag (would be confusing), just copy out the already marked value */
599 *pTeVa++ = (FIXP_DBL) qsc;
600 }
601 else { /* .. because a too high value was decoded for this cb --> set LAV flag */
602 *pTeVa++ = (FIXP_DBL) Q_VALUE_INVALID;
603 lavErrorCnt += 1;
604 }
605 }
606 #else
607 if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) {
608 *pTeVa++ = qsc;
609 }
610 else {
611 *pTeVa++ = Q_VALUE_INVALID;
612 lavErrorCnt += 1;
613 }
614 #endif
615 }
616 pSortedCodebook++;
617 }
618
619 if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo))
620 {
621 FIXP_DBL *pOut;
622 FIXP_DBL locMax;
623 FIXP_DBL tmp;
624 SCHAR groupoffset;
625 SCHAR group;
626 SCHAR band;
627 SCHAR groupwin;
628 SCHAR window;
629 SCHAR numWinGroup;
630 SHORT interm;
631 SCHAR numSfbTransm;
632 SCHAR winGroupLen;
633 SHORT index;
634 INT msb;
635 INT lsb;
636
637 SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor;
638 SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale;
639 const SHORT *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
640
641 pBak = pHcr->segmentInfo.pTempValues;
642 /* deinterleave unitwise for short blocks */
643 for ( window = 0; window < (8); window++ ) {
644 pOut = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength);
645 for ( i=0; i < (LINES_PER_UNIT_GROUP); i++ ) {
646 pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) + i * 32; /* distance of lines between unit groups has to be constant for every framelength (32)! */
647 for ( j=(LINES_PER_UNIT); j != 0; j-- ) {
648 *pOut++ = *pTeVa++;
649 }
650 }
651 }
652
653 /* short blocks only */
654 /* derive global scaling-value for every sfb and every window (as it is done in plain-huffman-decoder at short blocks) */
655 groupoffset = 0;
656
657 numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
658 numSfbTransm = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
659
660 for (group = 0; group < numWinGroup; group++) {
661 winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
662 for (band = 0; band < numSfbTransm; band++) {
663 interm = group * 16 + band;
664 msb = pScaleFacHcr[interm] >> 2;
665 lsb = pScaleFacHcr[interm] & 3;
666 for (groupwin = 0; groupwin < winGroupLen; groupwin++) {
667 window = groupoffset + groupwin;
668 pBak = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength);
669 locMax = FL2FXCONST_DBL(0.0f);
670 for (index = BandOffsets[band]; index < BandOffsets[band+1]; index += LINES_PER_UNIT) {
671 pTeVa = &pBak[index];
672 for ( i = LINES_PER_UNIT; i != 0; i --) {
673 tmp = (*pTeVa < FL2FXCONST_DBL(0.0f))? -*pTeVa++ : *pTeVa++;
674 locMax = fixMax(tmp,locMax);
675 }
676 }
677 if ( fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE ) {
678 locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE;
679 }
680 pSfbSclHcr[window*16+band] = msb - GetScaleFromValue(locMax, lsb); /* save global scale maxima in this sfb */
681 }
682 }
683 groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
684 }
685 } else
686 {
687 /* copy straight for long-blocks */
688 pQuantizedSpectralCoefficients = SPEC_LONG(pQuantizedSpectralCoefficientsBase);
689 for ( i = 1024; i != 0; i-- ) {
690 *pQuantizedSpectralCoefficients++ = *pBak++;
691 }
692 }
693
694 if ( lavErrorCnt != 0 ) {
695 pHcr->decInOut.errorLog |= LAV_VIOLATION;
696 }
697 }
698
699
700 /*---------------------------------------------------------------------------------------------
701 description: This function calculates the number of codewords
702 for each section (numCodewordInSection) and the number of codewords
703 for all sections (numCodeword).
704 For zero and intensity codebooks a entry is also done in the variable
705 numCodewordInSection. It is assumed that the codebook is a two tuples
706 codebook. This is needed later for the calculation of the base addresses
707 for the reordering of the quantize spectral coefficients at the end of the
708 hcr tool.
709 The variable numCodeword contain the number of codewords which are really
710 in the bitstream. Zero or intensity codebooks does not increase the
711 variable numCodewords.
712 -----------------------------------------------------------------------------------------------
713 return: -
714 -------------------------------------------------------------------------------------------- */
715
716 static void HcrCalcNumCodeword(H_HCR_INFO pHcr)
717 {
718 int hcrSection;
719 UINT numCodeword;
720
721 UINT numSection = pHcr->decInOut.numSection;
722 UCHAR *pCodebook = pHcr->decInOut.pCodebook;
723 SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect;
724 const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift;
725 USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
726
727 numCodeword = 0;
728 for ( hcrSection = numSection; hcrSection != 0; hcrSection-- ) {
729 *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook];
730 if ( *pCodebook != 0 ) {
731 numCodeword += *pNumCodewordInSection;
732 }
733 pNumCodewordInSection++;
734 pCodebook++;
735 }
736 pHcr->sectionInfo.numCodeword = numCodeword;
737 }
738
739
740 /*---------------------------------------------------------------------------------------------
741 description: This function calculates the number
742 of sorted codebooks and sorts the codebooks and the numCodewordInSection
743 according to the priority.
744 -------------------------------------------------------------------------------------------- */
745
746 static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr)
747 {
748
749 UINT i,j,k;
750 UCHAR temp;
751 UINT counter;
752 UINT startOffset;
753 UINT numZeroSection;
754 UCHAR *pDest;
755 UINT numSectionDec;
756
757 UINT numSection = pHcr->decInOut.numSection;
758 UCHAR *pCodebook = pHcr->decInOut.pCodebook;
759 UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
760 USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
761 USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
762 UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
763 USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
764 const UCHAR *pCbPriority = pHcr->tableInfo.pCbPriority;
765 const UCHAR *pMinOfCbPair = pHcr->cbPairs.pMinOfCbPair;
766 const UCHAR *pMaxOfCbPair = pHcr->cbPairs.pMaxOfCbPair;
767 const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift;
768
769 UINT searchStart = 0;
770
771 /* calculate *pNumSortedSection and store the priorities in array pSortedCdebook */
772 pDest = pSortedCodebook;
773 numZeroSection = 0;
774 for ( i=numSection; i != 0; i-- ) {
775 if ( pCbPriority[*pCodebook] == 0 ) {
776 numZeroSection += 1;
777 }
778 *pDest++ = pCbPriority[*pCodebook++];
779 }
780 pHcr->sectionInfo.numSortedSection = numSection - numZeroSection; /* numSortedSection contains no zero or intensity section */
781 pCodebook = pHcr->decInOut.pCodebook;
782
783 /* sort priorities of the codebooks in array pSortedCdebook[] */
784 numSectionDec = numSection - 1;
785 if ( numSectionDec > 0 ) {
786 counter = numSectionDec;
787 for ( j=numSectionDec; j != 0; j-- ) {
788 for ( i=0; i < counter; i++ ) {
789 /* swap priorities */
790 if ( pSortedCodebook[i+1] > pSortedCodebook[i] ) {
791 temp = pSortedCodebook[i];
792 pSortedCodebook[i] = pSortedCodebook[i+1];
793 pSortedCodebook[i+1] = temp;
794 }
795 }
796 counter -= 1;
797 }
798 }
799
800 /* clear codebookSwitch array */
801 for ( i = numSection; i != 0; i--) {
802 *pCodebookSwitch++ = 0;
803 }
804 pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
805
806 /* sort sectionCodebooks and numCodwordsInSection and calculate pReorderOffst[j] */
807 for ( j = 0; j < numSection; j++ ) {
808 for ( i = searchStart; i < numSection; i++ ) {
809 if ( pCodebookSwitch[i] == 0 && ( pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] || pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i] )) {
810 pCodebookSwitch[i] = 1;
811 pSortedCodebook[j] = pCodebook[i]; /* sort codebook */
812 pNumSortedCodewordInSection[j] = pNumCodewordInSection[i]; /* sort NumCodewordInSection */
813
814 startOffset = 0;
815 for ( k = 0; k < i; k++ ) { /* make entry in pReorderOffst */
816 startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]];
817 }
818 pReorderOffset[j] = startOffset; /* offset for reordering the codewords */
819
820 if(i == searchStart) {
821 UINT k = i;
822 while(pCodebookSwitch[k++] == 1) searchStart++;
823 }
824 break;
825 }
826 }
827 }
828 }
829
830
831 /*---------------------------------------------------------------------------------------------
832 description: This function calculates the segmentation, which includes numSegment,
833 leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment.
834 The segmentation could be visualized a as kind of 'overlay-grid' for the
835 bitstream-block holding the HCR-encoded quantized-spectral-coefficients.
836 -------------------------------------------------------------------------------------------- */
837
838 static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr)
839 {
840 USHORT i,j;
841 USHORT numSegment = 0;
842 USHORT segmentStart = 0;
843 UCHAR segmentWidth;
844 UCHAR lastSegmentWidth;
845 UCHAR sortedCodebook;
846 UCHAR endFlag = 0;
847 USHORT intermediateResult;
848
849 SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
850 SHORT lengthOfReorderedSpectralData = pHcr->decInOut.lengthOfReorderedSpectralData;
851 UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
852 UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
853 USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
854 USHORT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
855 USHORT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
856 SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
857 USHORT bitstreamIndex = pHcr->decInOut.bitstreamIndex;
858 const UCHAR *pMaxCwLength = pHcr->tableInfo.pMaxCwLength;
859
860 for ( i=numSortedSection; i != 0; i-- ) {
861 sortedCodebook = *pSortedCodebook++;
862 segmentWidth = FDKmin(pMaxCwLength[sortedCodebook],lengthOfLongestCodeword);
863
864 for ( j = *pNumSortedCodewordInSection; j != 0 ; j-- ) {
865 /* width allows a new segment */
866 intermediateResult = bitstreamIndex + segmentStart;
867 if ( (segmentStart + segmentWidth) <= lengthOfReorderedSpectralData ) {
868 /* store segment start, segment length and increment the number of segments */
869 *pLeftStartOfSegment++ = intermediateResult;
870 *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1;
871 *pRemainingBitsInSegment++ = segmentWidth;
872 segmentStart += segmentWidth;
873 numSegment += 1;
874 }
875 /* width does not allow a new segment */
876 else {
877 /* correct the last segment length */
878 pLeftStartOfSegment--;
879 pRightStartOfSegment--;
880 pRemainingBitsInSegment--;
881 segmentStart = *pLeftStartOfSegment - bitstreamIndex;
882
883 lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart;
884 *pRemainingBitsInSegment = lastSegmentWidth;
885 *pRightStartOfSegment = bitstreamIndex + segmentStart + lastSegmentWidth - 1;
886 endFlag = 1;
887 break;
888 }
889 }
890 pNumSortedCodewordInSection++;
891 if (endFlag != 0) {
892 break;
893 }
894 }
895 pHcr->segmentInfo.numSegment = numSegment;
896
897 }
898
899
900 /*---------------------------------------------------------------------------------------------
901 description: This function adapts the sorted section boundaries to the boundaries of
902 segmentation. If the section lengths does not fit completely into the
903 current segment, the section is spitted into two so called 'extended
904 sections'. The extended-section-info (pNumExtendedSortedCodewordInSectin
905 and pExtendedSortedCodebook) is updated in this case.
906
907 -------------------------------------------------------------------------------------------- */
908
909 static void HcrExtendedSectionInfo(H_HCR_INFO pHcr)
910 {
911 UINT srtSecCnt = 0; /* counter for sorted sections */
912 UINT xSrtScCnt = 0; /* counter for extended sorted sections */
913 UINT remainNumCwInSortSec;
914 UINT inSegmentRemainNumCW;
915
916 UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
917 UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
918 USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection;
919 UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook;
920 USHORT *pNumExtSortCwInSect = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
921 UINT numSegment = pHcr->segmentInfo.numSegment;
922 #if DETECT_TOO_LONG_CW_READS
923 UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
924 SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
925 const UCHAR *pMaxCwLength = pHcr->tableInfo.pMaxCwLength;
926 #endif
927
928 remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
929 inSegmentRemainNumCW = numSegment;
930
931 while (srtSecCnt < numSortedSection) {
932 if (inSegmentRemainNumCW < remainNumCwInSortSec) {
933
934 pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
935 pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
936
937 remainNumCwInSortSec -= inSegmentRemainNumCW;
938 inSegmentRemainNumCW = numSegment;
939 /* data of a sorted section was not integrated in extended sorted section */
940 }
941 else if (inSegmentRemainNumCW == remainNumCwInSortSec) {
942 pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
943 pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
944
945 srtSecCnt++;
946 remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
947 inSegmentRemainNumCW = numSegment;
948 /* data of a sorted section was integrated in extended sorted section */
949 }
950 else { /* inSegmentRemainNumCW > remainNumCwInSortSec */
951 pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec;
952 pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
953
954
955 inSegmentRemainNumCW -= remainNumCwInSortSec;
956 srtSecCnt++;
957 remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
958 /* data of a sorted section was integrated in extended sorted section */
959 }
960 #if DETECT_TOO_LONG_CW_READS
961 pMaxLenOfCbInExtSrtSec[xSrtScCnt] = FDKmin(pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],lengthOfLongestCodeword);
962 #endif
963
964
965
966 xSrtScCnt += 1;
967
968 if ( xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS) ) {
969 pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW;
970 return;
971 }
972
973 }
974 pNumExtSortCwInSect[xSrtScCnt] = 0;
975
976 }
977
978
979 /*---------------------------------------------------------------------------------------------
980 description: This function calculates the number of extended sorted sections which
981 belong to the sets. Each set from set 0 (one and only set for the PCWs)
982 till to the last set gets a entry in the array to which
983 'pNumExtendedSortedSectinsInSets' points to.
984
985 Calculation: The entrys in pNumExtendedSortedCodewordInSectin are added
986 untill the value numSegment is reached. Then the sum_variable is cleared
987 and the calculation starts from the beginning. As much extended sorted
988 Sections are summed up to reach the value numSegment, as much is the
989 current entry in *pNumExtendedSortedCodewordInSectin.
990 -------------------------------------------------------------------------------------------- */
991 static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment,
992 USHORT *pNumExtendedSortedCodewordInSection,
993 int numExtendedSortedCodewordInSectionIdx,
994 USHORT *pNumExtendedSortedSectionsInSets,
995 int numExtendedSortedSectionsInSetsIdx)
996 {
997 USHORT counter = 0;
998 UINT cwSum = 0;
999 USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection;
1000 USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets;
1001
1002 while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0)
1003 {
1004 cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx];
1005 numExtendedSortedCodewordInSectionIdx++;
1006 if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
1007 return;
1008 }
1009 if (cwSum > numSegment) {
1010 return;
1011 }
1012 counter++;
1013 if (counter > 1024/4) {
1014 return;
1015 }
1016 if ( cwSum == numSegment ) {
1017 pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter;
1018 numExtendedSortedSectionsInSetsIdx++;
1019 if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
1020 return;
1021 }
1022 counter = 0;
1023 cwSum = 0;
1024 }
1025 }
1026 pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter; /* save last entry for the last - probably shorter - set */
1027 }
1028
1029
1030 /*---------------------------------------------------------------------------------------------
1031 description: This function decodes all priority codewords (PCWs) in a spectrum (within
1032 set 0). The calculation of the PCWs is managed in two loops. The
1033 loopcounter of the outer loop is set to the first value pointer
1034 pNumExtendedSortedSectionsInSets points to. This value represents the
1035 number of extended sorted sections within set 0.
1036 The loopcounter of the inner loop is set to the first value pointer
1037 pNumExtendedSortedCodewordInSectin points to. The value represents the
1038 number of extended sorted codewords in sections (the original sections have
1039 been splitted to go along with the borders of the sets).
1040 Each time the number of the extended sorted codewords in sections are de-
1041 coded, the pointer 'pNumExtendedSortedCodewordInSectin' is incremented by
1042 one.
1043 -------------------------------------------------------------------------------------------- */
1044 static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr)
1045 {
1046 UINT i;
1047 USHORT extSortSec;
1048 USHORT curExtSortCwInSec;
1049 UCHAR codebook;
1050 UCHAR dimension;
1051 const UINT *pCurrentTree;
1052 const SCHAR *pQuantValBase;
1053 const SCHAR *pQuantVal;
1054
1055 USHORT *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
1056 int numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
1057 UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
1058 int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
1059 USHORT *pNumExtendedSortedSectionsInSets = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
1060 int numExtendedSortedSectionsInSetsIdx = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
1061 FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
1062 int quantizedSpectralCoefficientsIdx = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
1063 USHORT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1064 SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1065 #if DETECT_TOO_LONG_CW_READS
1066 UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
1067 int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
1068 UCHAR maxAllowedCwLen;
1069 int numDecodedBits;
1070 #endif
1071 const UCHAR *pCbDimension = pHcr->tableInfo.pCbDimension;
1072 const UCHAR *pCbSign = pHcr->tableInfo.pCbSign;
1073
1074 /* clear result array */
1075 //pQSC = &pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx];
1076 //pQSC = *pQuantizedSpectralCoefficients;
1077
1078 FDKmemclear(pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx,1024*sizeof(FIXP_DBL));
1079
1080 /* decode all PCWs in the extended sorted section(s) belonging to set 0 */
1081 for ( extSortSec = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; extSortSec != 0; extSortSec-- ) {
1082
1083 codebook = pExtendedSortedCodebook[extendedSortedCodebookIdx]; /* get codebook for this extended sorted section and increment ptr to cb of next ext. sort sec */
1084 extendedSortedCodebookIdx++;
1085 if (extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
1086 return;
1087 }
1088 dimension = pCbDimension[codebook]; /* get dimension of codebook of this extended sort. sec. */
1089 pCurrentTree = aHuffTable [codebook]; /* convert codebook to pointer to QSCs */
1090 pQuantValBase = aQuantTable [codebook]; /* convert codebook to index to table of QSCs */
1091 #if DETECT_TOO_LONG_CW_READS
1092 maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx];
1093 maxLenOfCbInExtSrtSecIdx++;
1094 if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) {
1095 return;
1096 }
1097 #endif
1098
1099 /* switch for decoding with different codebooks: */
1100 if ( pCbSign[codebook] == 0 ) { /* no sign bits follow after the codeword-body */
1101 /* PCW_BodyONLY */
1102 /*==============*/
1103
1104 for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) {
1105 numDecodedBits = 0;
1106
1107 /* decode PCW_BODY */
1108 pQuantVal = DecodePCW_Body(bs,
1109 pCurrentTree,
1110 pQuantValBase,
1111 pLeftStartOfSegment,
1112 pRemainingBitsInSegment,
1113 &numDecodedBits
1114 );
1115
1116 /* result is written out here because NO sign bits follow the body */
1117 for( i=dimension; i != 0 ; i-- ) {
1118 pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) *pQuantVal++; /* write quant. spec. coef. into spectrum; sign is already valid */
1119 quantizedSpectralCoefficientsIdx++;
1120 if (quantizedSpectralCoefficientsIdx >= 1024) {
1121 return;
1122 }
1123 }
1124
1125 /* one more PCW should be decoded */
1126
1127 #if DETECT_TOO_LONG_CW_READS
1128 if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG) ) {
1129 pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED;
1130 }
1131 #endif
1132
1133 #if CHECK_SEGMENTATION_IMMEDIATELY
1134 if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY,pHcr,PCW_BODY,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) {
1135 return;
1136 }
1137 #endif
1138 pLeftStartOfSegment++; /* update pointer for decoding the next PCW */
1139 pRemainingBitsInSegment++; /* update pointer for decoding the next PCW */
1140 }
1141 }
1142 else if (( pCbSign[codebook] == 1 ) && ( codebook < 11 )) { /* possibly there follow 1,2,3 or 4 sign bits after the codeword-body */
1143 /* PCW_Body and PCW_Sign */
1144 /*=======================*/
1145
1146 for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--)
1147 {
1148 int err;
1149 numDecodedBits = 0;
1150
1151 pQuantVal = DecodePCW_Body(bs,
1152 pCurrentTree,
1153 pQuantValBase,
1154 pLeftStartOfSegment,
1155 pRemainingBitsInSegment,
1156 &numDecodedBits
1157 );
1158
1159 err = DecodePCW_Sign( bs,
1160 dimension,
1161 pQuantVal,
1162 pQuantizedSpectralCoefficients,
1163 &quantizedSpectralCoefficientsIdx,
1164 pLeftStartOfSegment,
1165 pRemainingBitsInSegment,
1166 &numDecodedBits
1167 );
1168 if (err != 0) {
1169 return;
1170 }
1171 /* one more PCW should be decoded */
1172
1173 #if DETECT_TOO_LONG_CW_READS
1174 if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG) ) {
1175 pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED;
1176 }
1177 #endif
1178
1179 #if CHECK_SEGMENTATION_IMMEDIATELY
1180 if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN,pHcr,PCW_BODY_SIGN, pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) {
1181 return;
1182 }
1183 #endif
1184 pLeftStartOfSegment++;
1185 pRemainingBitsInSegment++;
1186 }
1187 }
1188 else if (( pCbSign[codebook] == 1 ) && ( codebook >= 11 )) { /* possibly there follow some sign bits and maybe one or two escape sequences after the cw-body */
1189 /* PCW_Body, PCW_Sign and maybe PCW_Escape */
1190 /*=========================================*/
1191
1192 for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--)
1193 {
1194 int err;
1195 numDecodedBits = 0;
1196
1197 /* decode PCW_BODY */
1198 pQuantVal = DecodePCW_Body(bs,
1199 pCurrentTree,
1200 pQuantValBase,
1201 pLeftStartOfSegment,
1202 pRemainingBitsInSegment,
1203 &numDecodedBits
1204 );
1205
1206 err = DecodePCW_Sign( bs,
1207 dimension,
1208 pQuantVal,
1209 pQuantizedSpectralCoefficients,
1210 &quantizedSpectralCoefficientsIdx,
1211 pLeftStartOfSegment,
1212 pRemainingBitsInSegment,
1213 &numDecodedBits
1214 );
1215 if (err != 0) {
1216 return;
1217 }
1218
1219 /* decode PCW_ESCAPE if present */
1220 quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK;
1221
1222 if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) {
1223 pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs,
1224 pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx],
1225 pLeftStartOfSegment,
1226 pRemainingBitsInSegment,
1227 &numDecodedBits
1228 );
1229 }
1230 quantizedSpectralCoefficientsIdx++;
1231 if (quantizedSpectralCoefficientsIdx >= 1024) {
1232 return;
1233 }
1234
1235 if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) {
1236 pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs,
1237 pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx],
1238 pLeftStartOfSegment,
1239 pRemainingBitsInSegment,
1240 &numDecodedBits
1241 );
1242 }
1243 quantizedSpectralCoefficientsIdx++;
1244 if (quantizedSpectralCoefficientsIdx >= 1024) {
1245 return;
1246 }
1247
1248 /* one more PCW should be decoded */
1249
1250 #if DETECT_TOO_LONG_CW_READS
1251 if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG) ) {
1252 pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
1253 }
1254 #endif
1255
1256 #if CHECK_SEGMENTATION_IMMEDIATELY
1257 if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN_ESC,pHcr,PCW_BODY_SIGN_ESC,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-DIMENSION_OF_ESCAPE_CODEBOOK,DIMENSION_OF_ESCAPE_CODEBOOK)) {
1258 return;
1259 }
1260 #endif
1261 pLeftStartOfSegment++;
1262 pRemainingBitsInSegment++;
1263 }
1264 }
1265
1266 /* all PCWs belonging to this extended section should be decoded */
1267 numExtendedSortedCodewordInSectionIdx++;
1268 if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR+MAX_HCR_SETS) {
1269 return;
1270 }
1271 }
1272 /* all PCWs should be decoded */
1273
1274 numExtendedSortedSectionsInSetsIdx++;
1275 if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
1276 return;
1277 }
1278
1279 /* Write back indexes into structure */
1280 pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx;
1281 pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
1282 pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx;
1283 pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx;
1284 pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx;
1285 }
1286
1287 #if CHECK_SEGMENTATION_IMMEDIATELY
1288 /*---------------------------------------------------------------------------------------------
1289 description: This function checks immediately after every decoded PCW, whether out of
1290 the current segment too many bits have been read or not. If an error occurrs,
1291 probably the sideinfo or the HCR-bitstream block holding the huffman
1292 encoded quantized spectral coefficients is distorted. In this case the two
1293 or four quantized spectral coefficients belonging to the current codeword
1294 are marked (for being detected by concealment later).
1295 -------------------------------------------------------------------------------------------- */
1296 static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
1297 H_HCR_INFO pHcr,
1298 PCW_TYPE kind,
1299 FIXP_DBL *qsc_base_of_cw,
1300 UCHAR dimension)
1301 {
1302 SCHAR i;
1303 if ( remainingBitsInSegment < 0 ) {
1304 /* log the error */
1305 switch (kind) {
1306 case PCW_BODY:
1307 pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY;
1308 break;
1309 case PCW_BODY_SIGN:
1310 pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN;
1311 break;
1312 case PCW_BODY_SIGN_ESC:
1313 pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC;
1314 break;
1315 }
1316 /* mark the erred lines */
1317 for ( i = dimension; i != 0; i-- ) {
1318 *qsc_base_of_cw++ = (FIXP_DBL) Q_VALUE_INVALID;
1319 }
1320 return 1;
1321 }
1322 return 0;
1323 }
1324 #endif
1325
1326 #if CHECK_SEGMENTATION_FINAL
1327 /*---------------------------------------------------------------------------------------------
1328 description: This function checks if all segments are empty after decoding. There
1329 are _no lines markded_ as invalid because it could not be traced back
1330 where from the remaining bits are.
1331 -------------------------------------------------------------------------------------------- */
1332 static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr)
1333 {
1334 UCHAR segmentationErrorFlag = 0;
1335 USHORT i;
1336 SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1337 UINT numSegment = pHcr->segmentInfo.numSegment;
1338
1339 for ( i=numSegment; i != 0 ; i--) {
1340 if (*pRemainingBitsInSegment++ != 0) {
1341 segmentationErrorFlag = 1;
1342 }
1343 }
1344 if (segmentationErrorFlag == 1) {
1345 pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR;
1346 }
1347 }
1348 #endif
1349
1350 /*---------------------------------------------------------------------------------------------
1351 description: This function walks one step within the decoding tree. Which branch is
1352 taken depends on the decoded carryBit input parameter.
1353 -------------------------------------------------------------------------------------------- */
1354 void CarryBitToBranchValue(UCHAR carryBit,
1355 UINT treeNode,
1356 UINT *branchValue,
1357 UINT *branchNode)
1358 {
1359 if (carryBit == 0) {
1360 *branchNode = (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT: 00FFF000 */
1361 }
1362 else {
1363 *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */
1364 }
1365
1366 *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */
1367 }
1368
1369
1370 /*---------------------------------------------------------------------------------------------
1371 description: Decodes the body of a priority codeword (PCW)
1372 -----------------------------------------------------------------------------------------------
1373 return: - return value is pointer to first of two or four quantized spectral
1374 coefficients
1375 -------------------------------------------------------------------------------------------- */
1376 static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs,
1377 const UINT *pCurrentTree,
1378 const SCHAR *pQuantValBase,
1379 USHORT *pLeftStartOfSegment,
1380 SCHAR *pRemainingBitsInSegment,
1381 int *pNumDecodedBits
1382 )
1383 {
1384 UCHAR carryBit;
1385 UINT branchNode;
1386 UINT treeNode;
1387 UINT branchValue;
1388 const SCHAR *pQuantVal;
1389
1390 /* decode PCW_BODY */
1391 treeNode = *pCurrentTree; /* get first node of current tree belonging to current codebook */
1392
1393 /* decode whole PCW-codeword-body */
1394 while (1) {
1395
1396 carryBit = HcrGetABitFromBitstream(bs,
1397 pLeftStartOfSegment,
1398 pLeftStartOfSegment, /* dummy */
1399 FROM_LEFT_TO_RIGHT);
1400 *pRemainingBitsInSegment -= 1;
1401 *pNumDecodedBits += 1;
1402
1403 CarryBitToBranchValue(carryBit,
1404 treeNode,
1405 &branchValue,
1406 &branchNode);
1407
1408 if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */
1409 break; /* end of branch in tree reached i.e. a whole PCW-Body is decoded */
1410 }
1411 else {
1412 treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */
1413 }
1414
1415 }
1416
1417 pQuantVal = pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4 quantized values */
1418
1419 return pQuantVal;
1420 }
1421
1422
1423 /*---------------------------------------------------------------------------------------------
1424 description: This function decodes one escape sequence. In case of a escape codebook
1425 and in case of the absolute value of the quantized spectral value == 16,
1426 a escapeSequence is decoded in two steps:
1427 1. escape prefix
1428 2. escape word
1429 -------------------------------------------------------------------------------------------- */
1430
1431 static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs,
1432 INT quantSpecCoef,
1433 USHORT *pLeftStartOfSegment,
1434 SCHAR *pRemainingBitsInSegment,
1435 int *pNumDecodedBits
1436 )
1437 {
1438 UINT i;
1439 INT sign;
1440 UINT escapeOnesCounter = 0;
1441 UINT carryBit;
1442 INT escape_word = 0;
1443
1444 /* decode escape prefix */
1445 while (1) {
1446 carryBit = HcrGetABitFromBitstream(bs,
1447 pLeftStartOfSegment,
1448 pLeftStartOfSegment, /* dummy */
1449 FROM_LEFT_TO_RIGHT);
1450 *pRemainingBitsInSegment -= 1;
1451 *pNumDecodedBits += 1;
1452
1453 if (carryBit != 0) {
1454 escapeOnesCounter += 1;
1455 }
1456 else {
1457 escapeOnesCounter += 4;
1458 break;
1459 }
1460 }
1461
1462 /* decode escape word */
1463 for( i=escapeOnesCounter; i != 0 ; i-- ) {
1464 carryBit = HcrGetABitFromBitstream(bs,
1465 pLeftStartOfSegment,
1466 pLeftStartOfSegment, /* dummy */
1467 FROM_LEFT_TO_RIGHT);
1468 *pRemainingBitsInSegment -= 1;
1469 *pNumDecodedBits += 1;
1470
1471 escape_word <<= 1;
1472 escape_word = escape_word | carryBit;
1473 }
1474
1475 sign = (quantSpecCoef >= 0) ? 1 : -1;
1476
1477 quantSpecCoef = sign * (((INT ) 1 << escapeOnesCounter) + escape_word);
1478
1479 return quantSpecCoef;
1480 }
1481
1482
1483 /*---------------------------------------------------------------------------------------------
1484 description: Decodes the Signbits of a priority codeword (PCW) and writes out the
1485 resulting quantized spectral values into unsorted sections
1486 -----------------------------------------------------------------------------------------------
1487 output: - two or four lines at position in corresponding section (which are not
1488 located at the desired position, i.e. they must be reordered in the last
1489 of eight function of HCR)
1490 -----------------------------------------------------------------------------------------------
1491 return: - updated pQuantSpecCoef pointer (to next empty storage for a line)
1492 -------------------------------------------------------------------------------------------- */
1493 static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs,
1494 UINT codebookDim,
1495 const SCHAR *pQuantVal,
1496 FIXP_DBL *pQuantSpecCoef,
1497 int *quantSpecCoefIdx,
1498 USHORT *pLeftStartOfSegment,
1499 SCHAR *pRemainingBitsInSegment,
1500 int *pNumDecodedBits
1501 )
1502 {
1503 UINT i;
1504 UINT carryBit;
1505 INT quantSpecCoef;
1506
1507 for( i=codebookDim; i != 0 ; i-- ) {
1508 quantSpecCoef = *pQuantVal++;
1509 if (quantSpecCoef != 0) {
1510 carryBit = HcrGetABitFromBitstream(bs,
1511 pLeftStartOfSegment,
1512 pLeftStartOfSegment, /* dummy */
1513 FROM_LEFT_TO_RIGHT);
1514 *pRemainingBitsInSegment -= 1;
1515 *pNumDecodedBits += 1;
1516 if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024>>1)) {
1517 return -1;
1518 }
1519
1520 /* adapt sign of values according to the decoded sign bit */
1521 if (carryBit != 0) {
1522 pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef;
1523 }
1524 else {
1525 pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef;
1526 }
1527 }
1528 else {
1529 pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f);
1530 }
1531 *quantSpecCoefIdx += 1 ;
1532 if (*quantSpecCoefIdx >= 1024) {
1533 return -1;
1534 }
1535 }
1536 return 0;
1537 }
1538
1539
1540 /*---------------------------------------------------------------------------------------------
1541 description: Mutes spectral lines which have been marked as erroneous (Q_VALUE_INVALID)
1542 -------------------------------------------------------------------------------------------- */
1543 void HcrMuteErroneousLines(H_HCR_INFO hHcr)
1544 {
1545 int c;
1546 FIXP_DBL *RESTRICT pLong = SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase);
1547
1548 /* if there is a line with value Q_VALUE_INVALID mute it */
1549 for (c = 0; c < 1024; c++) {
1550 if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) {
1551 #if HCR_LISTEN_TO_MUTED_LINES
1552 pLong[c] = (FIXP_DBL)HCR_DIRAC; /* marking */
1553 #else
1554 pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */
1555 #endif
1556 }
1557 }
1558 }
1559
1560
1561 /*---------------------------------------------------------------------------------------------
1562 description: Sets global HCR type
1563 -------------------------------------------------------------------------------------------- */
1564 void setHcrType(H_HCR_INFO hHcr, MP4_ELEMENT_ID type)
1565 {
1566 switch (type) {
1567 case ID_SCE:
1568 hHcr->globalHcrType = 0;
1569 break;
1570 case ID_CPE:
1571 hHcr->globalHcrType = 1;
1572 break;
1573 default:
1574 break;
1575 }
1576 }
1577
1578
1579 /*---------------------------------------------------------------------------------------------
1580 description: Gets HCR type from the HCR data structure
1581 -----------------------------------------------------------------------------------------------
1582 return: - global HCR type
1583 -------------------------------------------------------------------------------------------- */
1584 INT getHcrType(H_HCR_INFO hHcr)
1585 {
1586 return hHcr->globalHcrType;
1587 }
1588
1589
1590
1591