Coverage Report

Created: 2025-10-10 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libAACdec/src/aacdec_hcr.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/**************************** AAC decoder library ******************************
96
97
   Author(s):   Robert Weidner (DSP Solutions)
98
99
   Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo,
100
                decode priority codewords (PCWs)
101
102
*******************************************************************************/
103
104
#include "aacdec_hcr.h"
105
106
#include "aacdec_hcr_types.h"
107
#include "aacdec_hcr_bit.h"
108
#include "aacdec_hcrs.h"
109
#include "aac_ram.h"
110
#include "aac_rom.h"
111
#include "channel.h"
112
#include "block.h"
113
114
#include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */
115
#include "FDK_bitstream.h"
116
117
extern int mlFileChCurr;
118
119
static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,
120
                                         UINT *errorWord);
121
122
static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
123
                                    SHORT lengthOfReorderedSpectralData,
124
                                    UINT *errorWord);
125
126
static void HcrCalcNumCodeword(H_HCR_INFO pHcr);
127
static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr);
128
static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr);
129
static void HcrExtendedSectionInfo(H_HCR_INFO pHcr);
130
131
static void DeriveNumberOfExtendedSortedSectionsInSets(
132
    UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection,
133
    int numExtendedSortedCodewordInSectionIdx,
134
    USHORT *pNumExtendedSortedSectionsInSets,
135
    int numExtendedSortedSectionsInSetsIdx);
136
137
static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
138
                                INT quantSpecCoef, INT *pLeftStartOfSegment,
139
                                SCHAR *pRemainingBitsInSegment,
140
                                int *pNumDecodedBits, UINT *errorWord);
141
142
static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
143
                          UINT codebookDim, const SCHAR *pQuantVal,
144
                          FIXP_DBL *pQuantSpecCoef, int *quantSpecCoefIdx,
145
                          INT *pLeftStartOfSegment,
146
                          SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits);
147
148
static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
149
                                   const UINT *pCurrentTree,
150
                                   const SCHAR *pQuantValBase,
151
                                   INT *pLeftStartOfSegment,
152
                                   SCHAR *pRemainingBitsInSegment,
153
                                   int *pNumDecodedBits);
154
155
static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr);
156
157
static void HcrReorderQuantizedSpectralCoefficients(
158
    H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
159
    const SamplingRateInfo *pSamplingRateInfo);
160
161
static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
162
                                      H_HCR_INFO pHcr, PCW_TYPE kind,
163
                                      FIXP_DBL *qsc_base_of_cw,
164
                                      UCHAR dimension);
165
166
static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr);
167
168
/*---------------------------------------------------------------------------------------------
169
     description:   Check if codebook and numSect are within allowed range
170
(short only)
171
--------------------------------------------------------------------------------------------
172
*/
173
static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,
174
115k
                                         UINT *errorWord) {
175
115k
  if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) {
176
0
    *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK;
177
0
  }
178
115k
  if (numLine < 0 || numLine > 1024) {
179
0
    *errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK;
180
0
  }
181
115k
}
182
183
/*---------------------------------------------------------------------------------------------
184
     description:   Check both HCR lengths
185
--------------------------------------------------------------------------------------------
186
*/
187
static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
188
                                    SHORT lengthOfReorderedSpectralData,
189
10.7k
                                    UINT *errorWord) {
190
10.7k
  if (lengthOfReorderedSpectralData < lengthOfLongestCodeword) {
191
6
    *errorWord |= HCR_SI_LENGTHS_FAILURE;
192
6
  }
193
10.7k
}
194
195
/*---------------------------------------------------------------------------------------------
196
     description:   Decode (and adapt if necessary) the two HCR sideinfo
197
components: 'reordered_spectral_data_length' and 'longest_codeword_length'
198
--------------------------------------------------------------------------------------------
199
*/
200
201
void CHcr_Read(HANDLE_FDK_BITSTREAM bs,
202
               CAacDecoderChannelInfo *pAacDecoderChannelInfo,
203
10.8k
               const MP4_ELEMENT_ID globalHcrType) {
204
10.8k
  SHORT lengOfReorderedSpectralData;
205
10.8k
  SCHAR lengOfLongestCodeword;
206
207
10.8k
  pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData =
208
10.8k
      0;
209
10.8k
  pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0;
210
211
  /* ------- SI-Value No 1 ------- */
212
10.8k
  lengOfReorderedSpectralData = FDKreadBits(bs, 14) + ERROR_LORSD;
213
10.8k
  if (globalHcrType == ID_CPE) {
214
9.06k
    if ((lengOfReorderedSpectralData >= 0) &&
215
9.06k
        (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) {
216
8.99k
      pAacDecoderChannelInfo->pDynData->specificTo.aac
217
8.99k
          .lenOfReorderedSpectralData =
218
8.99k
          lengOfReorderedSpectralData; /* the decoded value is within range */
219
8.99k
    } else {
220
69
      if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) {
221
69
        pAacDecoderChannelInfo->pDynData->specificTo.aac
222
69
            .lenOfReorderedSpectralData =
223
69
            CPE_TOP_LENGTH; /* use valid maximum */
224
69
      }
225
69
    }
226
9.06k
  } else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE ||
227
1.81k
             globalHcrType == ID_CCE) {
228
1.81k
    if ((lengOfReorderedSpectralData >= 0) &&
229
1.81k
        (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) {
230
1.77k
      pAacDecoderChannelInfo->pDynData->specificTo.aac
231
1.77k
          .lenOfReorderedSpectralData =
232
1.77k
          lengOfReorderedSpectralData; /* the decoded value is within range */
233
1.77k
    } else {
234
38
      if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) {
235
38
        pAacDecoderChannelInfo->pDynData->specificTo.aac
236
38
            .lenOfReorderedSpectralData =
237
38
            SCE_TOP_LENGTH; /* use valid maximum */
238
38
      }
239
38
    }
240
1.81k
  }
241
242
  /* ------- SI-Value No 2 ------- */
243
10.8k
  lengOfLongestCodeword = FDKreadBits(bs, 6) + ERROR_LOLC;
244
10.8k
  if ((lengOfLongestCodeword >= 0) &&
245
10.8k
      (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) {
246
3.15k
    pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword =
247
3.15k
        lengOfLongestCodeword; /* the decoded value is within range */
248
7.72k
  } else {
249
7.72k
    if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) {
250
7.72k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword =
251
7.72k
          LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */
252
7.72k
    }
253
7.72k
  }
254
10.8k
}
255
256
/*---------------------------------------------------------------------------------------------
257
     description:   Set up HCR - must be called before every call to
258
HcrDecoder(). For short block a sorting algorithm is applied to get the SI in
259
the order that HCR could assemble the qsc's as if it is a long block.
260
-----------------------------------------------------------------------------------------------
261
        return:     error log
262
--------------------------------------------------------------------------------------------
263
*/
264
265
UINT HcrInit(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
266
             const SamplingRateInfo *pSamplingRateInfo,
267
10.7k
             HANDLE_FDK_BITSTREAM bs) {
268
10.7k
  CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo;
269
10.7k
  SHORT *pNumLinesInSec;
270
10.7k
  UCHAR *pCodeBk;
271
10.7k
  SHORT numSection;
272
10.7k
  SCHAR cb;
273
10.7k
  int numLine;
274
10.7k
  int i;
275
276
10.7k
  pHcr->decInOut.lengthOfReorderedSpectralData =
277
10.7k
      pAacDecoderChannelInfo->pDynData->specificTo.aac
278
10.7k
          .lenOfReorderedSpectralData;
279
10.7k
  pHcr->decInOut.lengthOfLongestCodeword =
280
10.7k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword;
281
10.7k
  pHcr->decInOut.pQuantizedSpectralCoefficientsBase =
282
10.7k
      pAacDecoderChannelInfo->pSpectralCoefficient;
283
10.7k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0;
284
10.7k
  pHcr->decInOut.pCodebook =
285
10.7k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
286
10.7k
  pHcr->decInOut.pNumLineInSect =
287
10.7k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
288
10.7k
  pHcr->decInOut.numSection =
289
10.7k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection;
290
10.7k
  pHcr->decInOut.errorLog = 0;
291
10.7k
  pHcr->nonPcwSideinfo.pResultBase =
292
10.7k
      SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
293
294
10.7k
  FDKsyncCache(bs);
295
10.7k
  pHcr->decInOut.bitstreamAnchor = (INT)FDKgetValidBits(bs);
296
297
10.7k
  if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */
298
5.87k
  {
299
5.87k
    SHORT band;
300
5.87k
    SHORT maxBand;
301
5.87k
    SCHAR group;
302
5.87k
    SCHAR winGroupLen;
303
5.87k
    SCHAR window;
304
5.87k
    SCHAR numUnitInBand;
305
5.87k
    SCHAR cntUnitInBand;
306
5.87k
    SCHAR groupWin;
307
5.87k
    SCHAR cb_prev;
308
309
5.87k
    UCHAR *pCodeBook;
310
5.87k
    const SHORT *BandOffsets;
311
5.87k
    SCHAR numOfGroups;
312
313
5.87k
    pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */
314
5.87k
    pNumLinesInSec = pHcr->decInOut.pNumLineInSect;          /* out */
315
5.87k
    pCodeBk = pHcr->decInOut.pCodebook;                      /* out */
316
5.87k
    BandOffsets =
317
5.87k
        GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */
318
5.87k
    numOfGroups = GetWindowGroups(pIcsInfo);
319
320
5.87k
    numLine = 0;
321
5.87k
    numSection = 0;
322
5.87k
    cb = pCodeBook[0];
323
5.87k
    cb_prev = pCodeBook[0];
324
325
    /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new
326
     * section starts */
327
328
5.87k
    *pCodeBk++ = cb_prev;
329
330
5.87k
    maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
331
35.1k
    for (band = 0; band < maxBand;
332
29.2k
         band++) { /* from low to high sfbs i.e. from low to high frequencies */
333
29.2k
      numUnitInBand =
334
29.2k
          ((BandOffsets[band + 1] - BandOffsets[band]) >>
335
29.2k
           FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */
336
59.7k
      for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0;
337
30.4k
           cntUnitInBand--) { /* for every unit in the band */
338
147k
        for (window = 0, group = 0; group < numOfGroups; group++) {
339
117k
          winGroupLen = (SCHAR)GetWindowGroupLength(
340
117k
              &pAacDecoderChannelInfo->icsInfo, group);
341
360k
          for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) {
342
243k
            cb = pCodeBook[group * 16 + band];
343
243k
            if (cb != cb_prev) {
344
109k
              errDetectorInHcrSideinfoShrt(cb, numLine,
345
109k
                                           &pHcr->decInOut.errorLog);
346
109k
              if (pHcr->decInOut.errorLog != 0) {
347
0
                return (pHcr->decInOut.errorLog);
348
0
              }
349
109k
              *pCodeBk++ = cb;
350
109k
              *pNumLinesInSec++ = numLine;
351
109k
              numSection++;
352
353
109k
              cb_prev = cb;
354
109k
              numLine = LINES_PER_UNIT;
355
133k
            } else {
356
133k
              numLine += LINES_PER_UNIT;
357
133k
            }
358
243k
          }
359
117k
        }
360
30.4k
      }
361
29.2k
    }
362
363
5.87k
    numSection++;
364
365
5.87k
    errDetectorInHcrSideinfoShrt(cb, numLine, &pHcr->decInOut.errorLog);
366
5.87k
    if (numSection <= 0 || numSection > 1024 / 2) {
367
0
      pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK;
368
0
    }
369
5.87k
    errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
370
5.87k
                            pHcr->decInOut.lengthOfReorderedSpectralData,
371
5.87k
                            &pHcr->decInOut.errorLog);
372
5.87k
    if (pHcr->decInOut.errorLog != 0) {
373
4
      return (pHcr->decInOut.errorLog);
374
4
    }
375
376
5.87k
    *pCodeBk = cb;
377
5.87k
    *pNumLinesInSec = numLine;
378
5.87k
    pHcr->decInOut.numSection = numSection;
379
380
5.87k
  } else /* end short block prepare SI */
381
4.82k
  {      /* long block */
382
4.82k
    errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
383
4.82k
                            pHcr->decInOut.lengthOfReorderedSpectralData,
384
4.82k
                            &pHcr->decInOut.errorLog);
385
4.82k
    numSection = pHcr->decInOut.numSection;
386
4.82k
    pNumLinesInSec = pHcr->decInOut.pNumLineInSect;
387
4.82k
    pCodeBk = pHcr->decInOut.pCodebook;
388
4.82k
    if (numSection <= 0 || numSection > 64) {
389
20
      pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK;
390
20
      numSection = 0;
391
20
    }
392
393
9.87k
    for (i = numSection; i != 0; i--) {
394
5.05k
      cb = *pCodeBk++;
395
396
5.05k
      if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) {
397
0
        pHcr->decInOut.errorLog |= CB_OUT_OF_RANGE_LONG_BLOCK;
398
0
      }
399
400
5.05k
      numLine = *pNumLinesInSec++;
401
      /* FDK_ASSERT(numLine > 0); */
402
403
5.05k
      if ((numLine <= 0) || (numLine > 1024)) {
404
117
        pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK;
405
117
      }
406
5.05k
    }
407
4.82k
    if (pHcr->decInOut.errorLog != 0) {
408
35
      return (pHcr->decInOut.errorLog);
409
35
    }
410
4.82k
  }
411
412
10.6k
  pCodeBk = pHcr->decInOut.pCodebook;
413
131k
  for (i = 0; i < numSection; i++) {
414
120k
    if ((*pCodeBk == NOISE_HCB) || (*pCodeBk == INTENSITY_HCB2) ||
415
119k
        (*pCodeBk == INTENSITY_HCB)) {
416
15.4k
      *pCodeBk = 0;
417
15.4k
    }
418
120k
    pCodeBk++;
419
120k
  }
420
421
  /* HCR-sideinfo-input is complete and seems to be valid */
422
423
10.6k
  return (pHcr->decInOut.errorLog);
424
10.7k
}
425
426
/*---------------------------------------------------------------------------------------------
427
     description:   This function decodes the codewords of the spectral
428
coefficients from the bitstream according to the HCR algorithm and stores the
429
quantized spectral coefficients in correct order in the output buffer.
430
--------------------------------------------------------------------------------------------
431
*/
432
433
UINT HcrDecoder(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
434
                const SamplingRateInfo *pSamplingRateInfo,
435
10.6k
                HANDLE_FDK_BITSTREAM bs) {
436
10.6k
  int pTmp1, pTmp2, pTmp3, pTmp4;
437
10.6k
  int pTmp5;
438
439
10.6k
  INT bitCntOffst;
440
10.6k
  INT saveBitCnt = (INT)FDKgetValidBits(bs); /* save bitstream position */
441
442
10.6k
  HcrCalcNumCodeword(pHcr);
443
444
10.6k
  HcrSortCodebookAndNumCodewordInSection(pHcr);
445
446
10.6k
  HcrPrepareSegmentationGrid(pHcr);
447
448
10.6k
  HcrExtendedSectionInfo(pHcr);
449
450
10.6k
  if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) != 0) {
451
3
    return (pHcr->decInOut.errorLog); /* sideinfo is massively corrupt, return
452
                                         from HCR without having decoded
453
                                         anything */
454
3
  }
455
456
10.6k
  DeriveNumberOfExtendedSortedSectionsInSets(
457
10.6k
      pHcr->segmentInfo.numSegment,
458
10.6k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection,
459
10.6k
      pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx,
460
10.6k
      pHcr->sectionInfo.pNumExtendedSortedSectionsInSets,
461
10.6k
      pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx);
462
463
  /* store */
464
10.6k
  pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
465
10.6k
  pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx;
466
10.6k
  pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
467
10.6k
  pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
468
10.6k
  pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
469
470
  /* ------- decode meaningful PCWs ------ */
471
10.6k
  DecodePCWs(bs, pHcr);
472
473
10.6k
  if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) == 0) {
474
    /* ------ decode the non-PCWs -------- */
475
7.75k
    DecodeNonPCWs(bs, pHcr);
476
7.75k
  }
477
478
10.6k
  errDetectWithinSegmentationFinal(pHcr);
479
480
  /* restore */
481
10.6k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1;
482
10.6k
  pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2;
483
10.6k
  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3;
484
10.6k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4;
485
10.6k
  pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5;
486
487
10.6k
  HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo,
488
10.6k
                                          pSamplingRateInfo);
489
490
  /* restore bitstream position */
491
10.6k
  bitCntOffst = (INT)FDKgetValidBits(bs) - saveBitCnt;
492
10.6k
  if (bitCntOffst) {
493
10.3k
    FDKpushBiDirectional(bs, bitCntOffst);
494
10.3k
  }
495
496
10.6k
  return (pHcr->decInOut.errorLog);
497
10.6k
}
498
499
/*---------------------------------------------------------------------------------------------
500
     description:   This function reorders the quantized spectral coefficients
501
sectionwise for long- and short-blocks and compares to the LAV (Largest Absolute
502
Value of the current codebook) -- a counter is incremented if there is an error
503
                    detected.
504
                    Additional for short-blocks a unit-based-deinterleaving is
505
applied. Moreover (for short blocks) the scaling is derived (compare plain
506
huffman decoder).
507
--------------------------------------------------------------------------------------------
508
*/
509
510
static void HcrReorderQuantizedSpectralCoefficients(
511
    H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
512
10.6k
    const SamplingRateInfo *pSamplingRateInfo) {
513
10.6k
  INT qsc;
514
10.6k
  UINT abs_qsc;
515
10.6k
  UINT i, j;
516
10.6k
  USHORT numSpectralValuesInSection;
517
10.6k
  FIXP_DBL *pTeVa;
518
10.6k
  USHORT lavErrorCnt = 0;
519
520
10.6k
  UINT numSection = pHcr->decInOut.numSection;
521
10.6k
  SPECTRAL_PTR pQuantizedSpectralCoefficientsBase =
522
10.6k
      pHcr->decInOut.pQuantizedSpectralCoefficientsBase;
523
10.6k
  FIXP_DBL *pQuantizedSpectralCoefficients =
524
10.6k
      SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
525
10.6k
  const UCHAR *pCbDimShift = aDimCbShift;
526
10.6k
  const USHORT *pLargestAbsVal = aLargestAbsoluteValue;
527
10.6k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
528
10.6k
  USHORT *pNumSortedCodewordInSection =
529
10.6k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
530
10.6k
  USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
531
10.6k
  FIXP_DBL pTempValues[1024];
532
10.6k
  FIXP_DBL *pBak = pTempValues;
533
534
10.6k
  FDKmemclear(pTempValues, 1024 * sizeof(FIXP_DBL));
535
536
  /* long and short: check if decoded huffman-values (quantized spectral
537
   * coefficients) are within range */
538
131k
  for (i = numSection; i != 0; i--) {
539
120k
    numSpectralValuesInSection = *pNumSortedCodewordInSection++
540
120k
                                 << pCbDimShift[*pSortedCodebook];
541
120k
    pTeVa = &pTempValues[*pReorderOffset++];
542
2.58M
    for (j = numSpectralValuesInSection; j != 0; j--) {
543
2.46M
      qsc = *pQuantizedSpectralCoefficients++;
544
2.46M
      abs_qsc = fAbs(qsc);
545
2.46M
      if (abs_qsc <= pLargestAbsVal[*pSortedCodebook]) {
546
2.46M
        *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */
547
2.46M
      } else {                    /* line is too high .. */
548
8.45k
        if (abs_qsc ==
549
8.45k
            Q_VALUE_INVALID) { /* .. because of previous marking --> dont set
550
                                  LAV flag (would be confusing), just copy out
551
                                  the already marked value */
552
6.00k
          *pTeVa++ = (FIXP_DBL)qsc;
553
6.00k
        } else { /* .. because a too high value was decoded for this cb --> set
554
                    LAV flag */
555
2.45k
          *pTeVa++ = (FIXP_DBL)Q_VALUE_INVALID;
556
2.45k
          lavErrorCnt += 1;
557
2.45k
        }
558
8.45k
      }
559
2.46M
    }
560
120k
    pSortedCodebook++;
561
120k
  }
562
563
10.6k
  if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
564
5.87k
    FIXP_DBL *pOut;
565
5.87k
    FIXP_DBL locMax;
566
5.87k
    FIXP_DBL tmp;
567
5.87k
    SCHAR groupoffset;
568
5.87k
    SCHAR group;
569
5.87k
    SCHAR band;
570
5.87k
    SCHAR groupwin;
571
5.87k
    SCHAR window;
572
5.87k
    SCHAR numWinGroup;
573
5.87k
    SHORT interm;
574
5.87k
    SCHAR numSfbTransm;
575
5.87k
    SCHAR winGroupLen;
576
5.87k
    SHORT index;
577
5.87k
    INT msb;
578
5.87k
    INT lsb;
579
580
5.87k
    SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor;
581
5.87k
    SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale;
582
5.87k
    const SHORT *BandOffsets = GetScaleFactorBandOffsets(
583
5.87k
        &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
584
585
5.87k
    pBak = pTempValues;
586
    /* deinterleave unitwise for short blocks */
587
52.8k
    for (window = 0; window < (8); window++) {
588
46.9k
      pOut = SPEC(pQuantizedSpectralCoefficientsBase, window,
589
46.9k
                  pAacDecoderChannelInfo->granuleLength);
590
1.54M
      for (i = 0; i < (LINES_PER_UNIT_GROUP); i++) {
591
1.50M
        pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) +
592
1.50M
                i * 32; /* distance of lines between unit groups has to be
593
                           constant for every framelength (32)!  */
594
7.51M
        for (j = (LINES_PER_UNIT); j != 0; j--) {
595
6.01M
          *pOut++ = *pTeVa++;
596
6.01M
        }
597
1.50M
      }
598
46.9k
    }
599
600
    /* short blocks only */
601
    /* derive global scaling-value for every sfb and every window (as it is done
602
     * in plain-huffman-decoder at short blocks) */
603
5.87k
    groupoffset = 0;
604
605
5.87k
    numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
606
5.87k
    numSfbTransm =
607
5.87k
        GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
608
609
29.2k
    for (group = 0; group < numWinGroup; group++) {
610
23.4k
      winGroupLen =
611
23.4k
          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
612
138k
      for (band = 0; band < numSfbTransm; band++) {
613
114k
        interm = group * 16 + band;
614
114k
        msb = pScaleFacHcr[interm] >> 2;
615
114k
        lsb = pScaleFacHcr[interm] & 3;
616
348k
        for (groupwin = 0; groupwin < winGroupLen; groupwin++) {
617
234k
          window = groupoffset + groupwin;
618
234k
          pBak = SPEC(pQuantizedSpectralCoefficientsBase, window,
619
234k
                      pAacDecoderChannelInfo->granuleLength);
620
234k
          locMax = FL2FXCONST_DBL(0.0f);
621
477k
          for (index = BandOffsets[band]; index < BandOffsets[band + 1];
622
243k
               index += LINES_PER_UNIT) {
623
243k
            pTeVa = &pBak[index];
624
1.21M
            for (i = LINES_PER_UNIT; i != 0; i--) {
625
972k
              tmp = (*pTeVa < FL2FXCONST_DBL(0.0f)) ? -*pTeVa++ : *pTeVa++;
626
972k
              locMax = fixMax(tmp, locMax);
627
972k
            }
628
243k
          }
629
234k
          if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) {
630
4.67k
            locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE;
631
4.67k
          }
632
234k
          pSfbSclHcr[window * 16 + band] =
633
234k
              msb - GetScaleFromValue(
634
234k
                        locMax, lsb); /* save global scale maxima in this sfb */
635
234k
        }
636
114k
      }
637
23.4k
      groupoffset +=
638
23.4k
          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
639
23.4k
    }
640
5.87k
  } else {
641
    /* copy straight for long-blocks */
642
4.78k
    pQuantizedSpectralCoefficients =
643
4.78k
        SPEC_LONG(pQuantizedSpectralCoefficientsBase);
644
4.90M
    for (i = 1024; i != 0; i--) {
645
4.90M
      *pQuantizedSpectralCoefficients++ = *pBak++;
646
4.90M
    }
647
4.78k
  }
648
649
10.6k
  if (lavErrorCnt != 0) {
650
1.74k
    pHcr->decInOut.errorLog |= LAV_VIOLATION;
651
1.74k
  }
652
10.6k
}
653
654
/*---------------------------------------------------------------------------------------------
655
     description:   This function calculates the number of codewords
656
                    for each section (numCodewordInSection) and the number of
657
codewords for all sections (numCodeword). For zero and intensity codebooks a
658
entry is also done in the variable numCodewordInSection. It is assumed that the
659
codebook is a two tuples codebook. This is needed later for the calculation of
660
the base addresses for the reordering of the quantize spectral coefficients at
661
the end of the hcr tool. The variable numCodeword contain the number of
662
codewords which are really in the bitstream. Zero or intensity codebooks does
663
not increase the variable numCodewords.
664
-----------------------------------------------------------------------------------------------
665
        return:   -
666
--------------------------------------------------------------------------------------------
667
*/
668
669
10.6k
static void HcrCalcNumCodeword(H_HCR_INFO pHcr) {
670
10.6k
  int hcrSection;
671
10.6k
  UINT numCodeword;
672
673
10.6k
  UINT numSection = pHcr->decInOut.numSection;
674
10.6k
  UCHAR *pCodebook = pHcr->decInOut.pCodebook;
675
10.6k
  SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect;
676
10.6k
  const UCHAR *pCbDimShift = aDimCbShift;
677
678
10.6k
  USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
679
680
10.6k
  numCodeword = 0;
681
131k
  for (hcrSection = numSection; hcrSection != 0; hcrSection--) {
682
120k
    *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook];
683
120k
    if (*pCodebook != 0) {
684
87.9k
      numCodeword += *pNumCodewordInSection;
685
87.9k
    }
686
120k
    pNumCodewordInSection++;
687
120k
    pCodebook++;
688
120k
  }
689
10.6k
  pHcr->sectionInfo.numCodeword = numCodeword;
690
10.6k
}
691
692
/*---------------------------------------------------------------------------------------------
693
     description:   This function calculates the number
694
                    of sorted codebooks and sorts the codebooks and the
695
numCodewordInSection according to the priority.
696
--------------------------------------------------------------------------------------------
697
*/
698
699
10.6k
static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr) {
700
10.6k
  UINT i, j, k;
701
10.6k
  UCHAR temp;
702
10.6k
  UINT counter;
703
10.6k
  UINT startOffset;
704
10.6k
  UINT numZeroSection;
705
10.6k
  UCHAR *pDest;
706
10.6k
  UINT numSectionDec;
707
708
10.6k
  UINT numSection = pHcr->decInOut.numSection;
709
10.6k
  UCHAR *pCodebook = pHcr->decInOut.pCodebook;
710
10.6k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
711
10.6k
  USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
712
10.6k
  USHORT *pNumSortedCodewordInSection =
713
10.6k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
714
10.6k
  UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
715
10.6k
  USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
716
10.6k
  const UCHAR *pCbPriority = aCbPriority;
717
10.6k
  const UCHAR *pMinOfCbPair = aMinOfCbPair;
718
10.6k
  const UCHAR *pMaxOfCbPair = aMaxOfCbPair;
719
10.6k
  const UCHAR *pCbDimShift = aDimCbShift;
720
721
10.6k
  UINT searchStart = 0;
722
723
  /* calculate *pNumSortedSection and store the priorities in array
724
   * pSortedCdebook */
725
10.6k
  pDest = pSortedCodebook;
726
10.6k
  numZeroSection = 0;
727
131k
  for (i = numSection; i != 0; i--) {
728
120k
    if (pCbPriority[*pCodebook] == 0) {
729
32.5k
      numZeroSection += 1;
730
32.5k
    }
731
120k
    *pDest++ = pCbPriority[*pCodebook++];
732
120k
  }
733
10.6k
  pHcr->sectionInfo.numSortedSection =
734
10.6k
      numSection - numZeroSection; /* numSortedSection contains no zero or
735
                                      intensity section */
736
10.6k
  pCodebook = pHcr->decInOut.pCodebook;
737
738
  /* sort priorities of the codebooks in array pSortedCdebook[] */
739
10.6k
  numSectionDec = numSection - 1;
740
10.6k
  if (numSectionDec > 0) {
741
5.80k
    counter = numSectionDec;
742
115k
    for (j = numSectionDec; j != 0; j--) {
743
1.31M
      for (i = 0; i < counter; i++) {
744
        /* swap priorities */
745
1.20M
        if (pSortedCodebook[i + 1] > pSortedCodebook[i]) {
746
491k
          temp = pSortedCodebook[i];
747
491k
          pSortedCodebook[i] = pSortedCodebook[i + 1];
748
491k
          pSortedCodebook[i + 1] = temp;
749
491k
        }
750
1.20M
      }
751
109k
      counter -= 1;
752
109k
    }
753
5.80k
  }
754
755
  /* clear codebookSwitch array */
756
131k
  for (i = numSection; i != 0; i--) {
757
120k
    *pCodebookSwitch++ = 0;
758
120k
  }
759
10.6k
  pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
760
761
  /* sort sectionCodebooks and numCodwordsInSection and calculate
762
   * pReorderOffst[j] */
763
131k
  for (j = 0; j < numSection; j++) {
764
1.00M
    for (i = searchStart; i < numSection; i++) {
765
1.00M
      if (pCodebookSwitch[i] == 0 &&
766
612k
          (pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] ||
767
522k
           pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i])) {
768
120k
        pCodebookSwitch[i] = 1;
769
120k
        pSortedCodebook[j] = pCodebook[i]; /* sort codebook */
770
120k
        pNumSortedCodewordInSection[j] =
771
120k
            pNumCodewordInSection[i]; /* sort NumCodewordInSection */
772
773
120k
        startOffset = 0;
774
1.32M
        for (k = 0; k < i; k++) { /* make entry in pReorderOffst */
775
1.20M
          startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]];
776
1.20M
        }
777
120k
        pReorderOffset[j] =
778
120k
            startOffset; /* offset for reordering the codewords */
779
780
120k
        if (i == searchStart) {
781
40.4k
          k = i;
782
161k
          while (pCodebookSwitch[k++] == 1) searchStart++;
783
40.4k
        }
784
120k
        break;
785
120k
      }
786
1.00M
    }
787
120k
  }
788
10.6k
}
789
790
/*---------------------------------------------------------------------------------------------
791
     description:   This function calculates the segmentation, which includes
792
numSegment, leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment.
793
                    The segmentation could be visualized a as kind of
794
'overlay-grid' for the bitstream-block holding the HCR-encoded
795
quantized-spectral-coefficients.
796
--------------------------------------------------------------------------------------------
797
*/
798
799
10.6k
static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr) {
800
10.6k
  USHORT i, j;
801
10.6k
  USHORT numSegment = 0;
802
10.6k
  INT segmentStart = 0;
803
10.6k
  UCHAR segmentWidth;
804
10.6k
  UCHAR lastSegmentWidth;
805
10.6k
  UCHAR sortedCodebook;
806
10.6k
  UCHAR endFlag = 0;
807
10.6k
  INT intermediateResult;
808
809
10.6k
  SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
810
10.6k
  SHORT lengthOfReorderedSpectralData =
811
10.6k
      pHcr->decInOut.lengthOfReorderedSpectralData;
812
10.6k
  UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
813
10.6k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
814
10.6k
  USHORT *pNumSortedCodewordInSection =
815
10.6k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
816
10.6k
  INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
817
10.6k
  INT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
818
10.6k
  SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
819
10.6k
  const UCHAR *pMaxCwLength = aMaxCwLen;
820
821
39.4k
  for (i = numSortedSection; i != 0; i--) {
822
38.2k
    sortedCodebook = *pSortedCodebook++;
823
38.2k
    segmentWidth =
824
38.2k
        fMin((INT)pMaxCwLength[sortedCodebook], (INT)lengthOfLongestCodeword);
825
826
450k
    for (j = *pNumSortedCodewordInSection; j != 0; j--) {
827
      /* width allows a new segment */
828
421k
      intermediateResult = segmentStart;
829
421k
      if ((segmentStart + segmentWidth) <= lengthOfReorderedSpectralData) {
830
        /* store segment start, segment length and increment the number of
831
         * segments */
832
412k
        *pLeftStartOfSegment++ = intermediateResult;
833
412k
        *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1;
834
412k
        *pRemainingBitsInSegment++ = segmentWidth;
835
412k
        segmentStart += segmentWidth;
836
412k
        numSegment += 1;
837
412k
      }
838
      /* width does not allow a new segment */
839
9.47k
      else {
840
        /* correct the last segment length */
841
9.47k
        pLeftStartOfSegment--;
842
9.47k
        pRightStartOfSegment--;
843
9.47k
        pRemainingBitsInSegment--;
844
9.47k
        segmentStart = *pLeftStartOfSegment;
845
846
9.47k
        lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart;
847
9.47k
        *pRemainingBitsInSegment = lastSegmentWidth;
848
9.47k
        *pRightStartOfSegment = segmentStart + lastSegmentWidth - 1;
849
9.47k
        endFlag = 1;
850
9.47k
        break;
851
9.47k
      }
852
421k
    }
853
38.2k
    pNumSortedCodewordInSection++;
854
38.2k
    if (endFlag != 0) {
855
9.47k
      break;
856
9.47k
    }
857
38.2k
  }
858
10.6k
  pHcr->segmentInfo.numSegment = numSegment;
859
10.6k
}
860
861
/*---------------------------------------------------------------------------------------------
862
     description:   This function adapts the sorted section boundaries to the
863
boundaries of segmentation. If the section lengths does not fit completely into
864
the current segment, the section is spitted into two so called 'extended
865
                    sections'. The extended-section-info
866
(pNumExtendedSortedCodewordInSectin and pExtendedSortedCodebook) is updated in
867
this case.
868
869
--------------------------------------------------------------------------------------------
870
*/
871
872
10.6k
static void HcrExtendedSectionInfo(H_HCR_INFO pHcr) {
873
10.6k
  UINT srtSecCnt = 0; /* counter for sorted sections */
874
10.6k
  UINT xSrtScCnt = 0; /* counter for extended sorted sections */
875
10.6k
  UINT remainNumCwInSortSec;
876
10.6k
  UINT inSegmentRemainNumCW;
877
878
10.6k
  UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
879
10.6k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
880
10.6k
  USHORT *pNumSortedCodewordInSection =
881
10.6k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
882
10.6k
  UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook;
883
10.6k
  USHORT *pNumExtSortCwInSect =
884
10.6k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
885
10.6k
  UINT numSegment = pHcr->segmentInfo.numSegment;
886
10.6k
  UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
887
10.6k
  SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
888
10.6k
  const UCHAR *pMaxCwLength = aMaxCwLen;
889
890
10.6k
  remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
891
10.6k
  inSegmentRemainNumCW = numSegment;
892
893
142k
  while (srtSecCnt < numSortedSection) {
894
132k
    if (inSegmentRemainNumCW < remainNumCwInSortSec) {
895
44.3k
      pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
896
44.3k
      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
897
898
44.3k
      remainNumCwInSortSec -= inSegmentRemainNumCW;
899
44.3k
      inSegmentRemainNumCW = numSegment;
900
      /* data of a sorted section was not integrated in extended sorted section
901
       */
902
87.9k
    } else if (inSegmentRemainNumCW == remainNumCwInSortSec) {
903
6.87k
      pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
904
6.87k
      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
905
906
6.87k
      srtSecCnt++;
907
6.87k
      remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
908
6.87k
      inSegmentRemainNumCW = numSegment;
909
      /* data of a sorted section was integrated in extended sorted section */
910
81.0k
    } else { /* inSegmentRemainNumCW > remainNumCwInSortSec */
911
81.0k
      pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec;
912
81.0k
      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
913
914
81.0k
      inSegmentRemainNumCW -= remainNumCwInSortSec;
915
81.0k
      srtSecCnt++;
916
81.0k
      remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
917
      /* data of a sorted section was integrated in extended sorted section */
918
81.0k
    }
919
132k
    pMaxLenOfCbInExtSrtSec[xSrtScCnt] =
920
132k
        fMin((INT)pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],
921
132k
             (INT)lengthOfLongestCodeword);
922
923
132k
    xSrtScCnt += 1;
924
925
132k
    if (xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
926
3
      pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW;
927
3
      return;
928
3
    }
929
132k
  }
930
10.6k
  pNumExtSortCwInSect[xSrtScCnt] = 0;
931
10.6k
}
932
933
/*---------------------------------------------------------------------------------------------
934
     description:   This function calculates the number of extended sorted
935
sections which belong to the sets. Each set from set 0 (one and only set for the
936
PCWs) till to the last set gets a entry in the array to which
937
                    'pNumExtendedSortedSectinsInSets' points to.
938
939
                    Calculation: The entrys in
940
pNumExtendedSortedCodewordInSectin are added untill the value numSegment is
941
reached. Then the sum_variable is cleared and the calculation starts from the
942
beginning. As much extended sorted Sections are summed up to reach the value
943
numSegment, as much is the current entry in *pNumExtendedSortedCodewordInSectin.
944
--------------------------------------------------------------------------------------------
945
*/
946
static void DeriveNumberOfExtendedSortedSectionsInSets(
947
    UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection,
948
    int numExtendedSortedCodewordInSectionIdx,
949
    USHORT *pNumExtendedSortedSectionsInSets,
950
10.6k
    int numExtendedSortedSectionsInSetsIdx) {
951
10.6k
  USHORT counter = 0;
952
10.6k
  UINT cwSum = 0;
953
10.6k
  USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection;
954
10.6k
  USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets;
955
956
137k
  while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0) {
957
128k
    cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx];
958
128k
    numExtendedSortedCodewordInSectionIdx++;
959
128k
    if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
960
0
      return;
961
0
    }
962
128k
    if (cwSum > numSegment) {
963
0
      return;
964
0
    }
965
128k
    counter++;
966
128k
    if (counter > 1024 / 4) {
967
0
      return;
968
0
    }
969
128k
    if (cwSum == numSegment) {
970
48.4k
      pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter;
971
48.4k
      numExtendedSortedSectionsInSetsIdx++;
972
48.4k
      if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
973
1.23k
        return;
974
1.23k
      }
975
47.2k
      counter = 0;
976
47.2k
      cwSum = 0;
977
47.2k
    }
978
128k
  }
979
9.42k
  pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] =
980
9.42k
      counter; /* save last entry for the last - probably shorter - set */
981
9.42k
}
982
983
/*---------------------------------------------------------------------------------------------
984
     description:   This function decodes all priority codewords (PCWs) in a
985
spectrum (within set 0). The calculation of the PCWs is managed in two loops.
986
The loopcounter of the outer loop is set to the first value pointer
987
                    pNumExtendedSortedSectionsInSets points to. This value
988
represents the number of extended sorted sections within set 0. The loopcounter
989
of the inner loop is set to the first value pointer
990
                    pNumExtendedSortedCodewordInSectin points to. The value
991
represents the number of extended sorted codewords in sections (the original
992
sections have been splitted to go along with the borders of the sets). Each time
993
the number of the extended sorted codewords in sections are de- coded, the
994
pointer 'pNumExtendedSortedCodewordInSectin' is incremented by one.
995
--------------------------------------------------------------------------------------------
996
*/
997
10.6k
static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) {
998
10.6k
  UINT i;
999
10.6k
  USHORT extSortSec;
1000
10.6k
  USHORT curExtSortCwInSec;
1001
10.6k
  UCHAR codebook;
1002
10.6k
  UCHAR dimension;
1003
10.6k
  const UINT *pCurrentTree;
1004
10.6k
  const SCHAR *pQuantValBase;
1005
10.6k
  const SCHAR *pQuantVal;
1006
1007
10.6k
  USHORT *pNumExtendedSortedCodewordInSection =
1008
10.6k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
1009
10.6k
  int numExtendedSortedCodewordInSectionIdx =
1010
10.6k
      pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
1011
10.6k
  UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
1012
10.6k
  int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
1013
10.6k
  USHORT *pNumExtendedSortedSectionsInSets =
1014
10.6k
      pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
1015
10.6k
  int numExtendedSortedSectionsInSetsIdx =
1016
10.6k
      pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
1017
10.6k
  FIXP_DBL *pQuantizedSpectralCoefficients =
1018
10.6k
      SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
1019
10.6k
  int quantizedSpectralCoefficientsIdx =
1020
10.6k
      pHcr->decInOut.quantizedSpectralCoefficientsIdx;
1021
10.6k
  INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1022
10.6k
  SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1023
10.6k
  UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
1024
10.6k
  int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
1025
10.6k
  UCHAR maxAllowedCwLen;
1026
10.6k
  int numDecodedBits;
1027
10.6k
  const UCHAR *pCbDimension = aDimCb;
1028
10.6k
  const UCHAR *pCbSign = aSignCb;
1029
1030
  /* clear result array */
1031
10.6k
  FDKmemclear(pQuantizedSpectralCoefficients + quantizedSpectralCoefficientsIdx,
1032
10.6k
              1024 * sizeof(FIXP_DBL));
1033
1034
  /* decode all PCWs in the extended sorted section(s) belonging to set 0 */
1035
10.6k
  for (extSortSec =
1036
10.6k
           pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx];
1037
29.1k
       extSortSec != 0; extSortSec--) {
1038
22.8k
    codebook =
1039
22.8k
        pExtendedSortedCodebook[extendedSortedCodebookIdx]; /* get codebook for
1040
                                                               this extended
1041
                                                               sorted section
1042
                                                               and increment ptr
1043
                                                               to cb of next
1044
                                                               ext. sort sec */
1045
22.8k
    extendedSortedCodebookIdx++;
1046
22.8k
    if (extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
1047
0
      return;
1048
0
    }
1049
22.8k
    dimension = pCbDimension[codebook]; /* get dimension of codebook of this
1050
                                           extended sort. sec. */
1051
22.8k
    pCurrentTree =
1052
22.8k
        aHuffTable[codebook]; /* convert codebook to pointer to QSCs */
1053
22.8k
    pQuantValBase =
1054
22.8k
        aQuantTable[codebook]; /* convert codebook to index to table of QSCs */
1055
22.8k
    maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx];
1056
22.8k
    maxLenOfCbInExtSrtSecIdx++;
1057
22.8k
    if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
1058
0
      return;
1059
0
    }
1060
1061
    /* switch for decoding with different codebooks: */
1062
22.8k
    if (pCbSign[codebook] ==
1063
22.8k
        0) { /* no sign bits follow after the codeword-body */
1064
      /* PCW_BodyONLY */
1065
      /*==============*/
1066
1067
695
      for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
1068
695
               [numExtendedSortedCodewordInSectionIdx];
1069
6.57k
           curExtSortCwInSec != 0; curExtSortCwInSec--) {
1070
5.98k
        numDecodedBits = 0;
1071
1072
        /* decode PCW_BODY */
1073
5.98k
        pQuantVal = DecodePCW_Body(
1074
5.98k
            bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase,
1075
5.98k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1076
1077
        /* result is written out here because NO sign bits follow the body */
1078
22.4k
        for (i = dimension; i != 0; i--) {
1079
16.4k
          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
1080
16.4k
              (FIXP_DBL)*pQuantVal++; /* write quant. spec. coef. into
1081
                                         spectrum; sign is already valid */
1082
16.4k
          quantizedSpectralCoefficientsIdx++;
1083
16.4k
          if (quantizedSpectralCoefficientsIdx >= 1024) {
1084
5
            return;
1085
5
          }
1086
16.4k
        }
1087
1088
        /* one more PCW should be decoded */
1089
1090
5.98k
        if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG)) {
1091
99
          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED;
1092
99
        }
1093
1094
5.98k
        if (1 == errDetectPcwSegmentation(
1095
5.98k
                     *pRemainingBitsInSegment - ERROR_PCW_BODY, pHcr, PCW_BODY,
1096
5.98k
                     pQuantizedSpectralCoefficients +
1097
5.98k
                         quantizedSpectralCoefficientsIdx - dimension,
1098
5.98k
                     dimension)) {
1099
98
          return;
1100
98
        }
1101
5.88k
        pLeftStartOfSegment++; /* update pointer for decoding the next PCW */
1102
5.88k
        pRemainingBitsInSegment++; /* update pointer for decoding the next PCW
1103
                                    */
1104
5.88k
      }
1105
22.1k
    } else if ((codebook < 11) && (pCbSign[codebook] ==
1106
5.68k
                                   1)) { /* possibly there follow 1,2,3 or 4
1107
                                            sign bits after the codeword-body */
1108
      /* PCW_Body and PCW_Sign */
1109
      /*=======================*/
1110
1111
5.68k
      for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
1112
5.68k
               [numExtendedSortedCodewordInSectionIdx];
1113
132k
           curExtSortCwInSec != 0; curExtSortCwInSec--) {
1114
127k
        int err;
1115
127k
        numDecodedBits = 0;
1116
1117
127k
        pQuantVal = DecodePCW_Body(
1118
127k
            bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase,
1119
127k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1120
1121
127k
        err = DecodePCW_Sign(
1122
127k
            bs, pHcr->decInOut.bitstreamAnchor, dimension, pQuantVal,
1123
127k
            pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx,
1124
127k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1125
127k
        if (err != 0) {
1126
186
          return;
1127
186
        }
1128
        /* one more PCW should be decoded */
1129
1130
127k
        if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG)) {
1131
23
          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED;
1132
23
        }
1133
1134
127k
        if (1 == errDetectPcwSegmentation(
1135
127k
                     *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN, pHcr,
1136
127k
                     PCW_BODY_SIGN,
1137
127k
                     pQuantizedSpectralCoefficients +
1138
127k
                         quantizedSpectralCoefficientsIdx - dimension,
1139
127k
                     dimension)) {
1140
23
          return;
1141
23
        }
1142
127k
        pLeftStartOfSegment++;
1143
127k
        pRemainingBitsInSegment++;
1144
127k
      }
1145
16.5k
    } else if ((pCbSign[codebook] == 1) &&
1146
16.5k
               (codebook >= 11)) { /* possibly there follow some sign bits and
1147
                                      maybe one or two escape sequences after
1148
                                      the cw-body */
1149
      /* PCW_Body, PCW_Sign and maybe PCW_Escape */
1150
      /*=========================================*/
1151
1152
16.5k
      for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
1153
16.5k
               [numExtendedSortedCodewordInSectionIdx];
1154
82.8k
           curExtSortCwInSec != 0; curExtSortCwInSec--) {
1155
70.4k
        int err;
1156
70.4k
        numDecodedBits = 0;
1157
1158
        /* decode PCW_BODY */
1159
70.4k
        pQuantVal = DecodePCW_Body(
1160
70.4k
            bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase,
1161
70.4k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1162
1163
70.4k
        err = DecodePCW_Sign(
1164
70.4k
            bs, pHcr->decInOut.bitstreamAnchor, dimension, pQuantVal,
1165
70.4k
            pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx,
1166
70.4k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1167
70.4k
        if (err != 0) {
1168
1.34k
          return;
1169
1.34k
        }
1170
1171
        /* decode PCW_ESCAPE if present */
1172
69.1k
        quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK;
1173
1174
69.1k
        if (fixp_abs(pQuantizedSpectralCoefficients
1175
69.1k
                         [quantizedSpectralCoefficientsIdx]) ==
1176
69.1k
            (FIXP_DBL)ESCAPE_VALUE) {
1177
1.13k
          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
1178
1.13k
              (FIXP_DBL)DecodeEscapeSequence(
1179
1.13k
                  bs, pHcr->decInOut.bitstreamAnchor,
1180
1.13k
                  pQuantizedSpectralCoefficients
1181
1.13k
                      [quantizedSpectralCoefficientsIdx],
1182
1.13k
                  pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits,
1183
1.13k
                  &pHcr->decInOut.errorLog);
1184
1.13k
        }
1185
69.1k
        quantizedSpectralCoefficientsIdx++;
1186
69.1k
        if (quantizedSpectralCoefficientsIdx >= 1024) {
1187
0
          return;
1188
0
        }
1189
1190
69.1k
        if (fixp_abs(pQuantizedSpectralCoefficients
1191
69.1k
                         [quantizedSpectralCoefficientsIdx]) ==
1192
69.1k
            (FIXP_DBL)ESCAPE_VALUE) {
1193
3.60k
          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
1194
3.60k
              (FIXP_DBL)DecodeEscapeSequence(
1195
3.60k
                  bs, pHcr->decInOut.bitstreamAnchor,
1196
3.60k
                  pQuantizedSpectralCoefficients
1197
3.60k
                      [quantizedSpectralCoefficientsIdx],
1198
3.60k
                  pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits,
1199
3.60k
                  &pHcr->decInOut.errorLog);
1200
3.60k
        }
1201
69.1k
        quantizedSpectralCoefficientsIdx++;
1202
69.1k
        if (quantizedSpectralCoefficientsIdx >= 1024) {
1203
0
          return;
1204
0
        }
1205
1206
        /* one more PCW should be decoded */
1207
1208
69.1k
        if (maxAllowedCwLen <
1209
69.1k
            (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG)) {
1210
2.77k
          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
1211
2.77k
        }
1212
1213
69.1k
        if (1 == errDetectPcwSegmentation(
1214
69.1k
                     *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN_ESC, pHcr,
1215
69.1k
                     PCW_BODY_SIGN_ESC,
1216
69.1k
                     pQuantizedSpectralCoefficients +
1217
69.1k
                         quantizedSpectralCoefficientsIdx -
1218
69.1k
                         DIMENSION_OF_ESCAPE_CODEBOOK,
1219
69.1k
                     DIMENSION_OF_ESCAPE_CODEBOOK)) {
1220
2.77k
          return;
1221
2.77k
        }
1222
66.3k
        pLeftStartOfSegment++;
1223
66.3k
        pRemainingBitsInSegment++;
1224
66.3k
      }
1225
16.5k
    }
1226
1227
    /* all PCWs belonging to this extended section should be decoded */
1228
18.4k
    numExtendedSortedCodewordInSectionIdx++;
1229
18.4k
    if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR + MAX_HCR_SETS) {
1230
0
      return;
1231
0
    }
1232
18.4k
  }
1233
  /* all PCWs should be decoded */
1234
1235
6.22k
  numExtendedSortedSectionsInSetsIdx++;
1236
6.22k
  if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
1237
0
    return;
1238
0
  }
1239
1240
  /* Write back indexes into structure */
1241
6.22k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
1242
6.22k
      numExtendedSortedCodewordInSectionIdx;
1243
6.22k
  pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
1244
6.22k
  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx =
1245
6.22k
      numExtendedSortedSectionsInSetsIdx;
1246
6.22k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx =
1247
6.22k
      quantizedSpectralCoefficientsIdx;
1248
6.22k
  pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx;
1249
6.22k
}
1250
1251
/*---------------------------------------------------------------------------------------------
1252
     description:   This function checks immediately after every decoded PCW,
1253
whether out of the current segment too many bits have been read or not. If an
1254
error occurrs, probably the sideinfo or the HCR-bitstream block holding the
1255
huffman encoded quantized spectral coefficients is distorted. In this case the
1256
two or four quantized spectral coefficients belonging to the current codeword
1257
                    are marked (for being detected by concealment later).
1258
--------------------------------------------------------------------------------------------
1259
*/
1260
static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment,
1261
                                      H_HCR_INFO pHcr, PCW_TYPE kind,
1262
                                      FIXP_DBL *qsc_base_of_cw,
1263
202k
                                      UCHAR dimension) {
1264
202k
  SCHAR i;
1265
202k
  if (remainingBitsInSegment < 0) {
1266
    /* log the error */
1267
2.89k
    switch (kind) {
1268
98
      case PCW_BODY:
1269
98
        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY;
1270
98
        break;
1271
23
      case PCW_BODY_SIGN:
1272
23
        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN;
1273
23
        break;
1274
2.77k
      case PCW_BODY_SIGN_ESC:
1275
2.77k
        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC;
1276
2.77k
        break;
1277
2.89k
    }
1278
    /* mark the erred lines */
1279
8.88k
    for (i = dimension; i != 0; i--) {
1280
5.98k
      *qsc_base_of_cw++ = (FIXP_DBL)Q_VALUE_INVALID;
1281
5.98k
    }
1282
2.89k
    return 1;
1283
2.89k
  }
1284
199k
  return 0;
1285
202k
}
1286
1287
/*---------------------------------------------------------------------------------------------
1288
     description:   This function checks if all segments are empty after
1289
decoding. There are _no lines markded_ as invalid because it could not be traced
1290
back where from the remaining bits are.
1291
--------------------------------------------------------------------------------------------
1292
*/
1293
10.6k
static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr) {
1294
10.6k
  UCHAR segmentationErrorFlag = 0;
1295
10.6k
  USHORT i;
1296
10.6k
  SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1297
10.6k
  UINT numSegment = pHcr->segmentInfo.numSegment;
1298
1299
423k
  for (i = numSegment; i != 0; i--) {
1300
412k
    if (*pRemainingBitsInSegment++ != 0) {
1301
252k
      segmentationErrorFlag = 1;
1302
252k
    }
1303
412k
  }
1304
10.6k
  if (segmentationErrorFlag == 1) {
1305
7.59k
    pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR;
1306
7.59k
  }
1307
10.6k
}
1308
1309
/*---------------------------------------------------------------------------------------------
1310
     description:   This function walks one step within the decoding tree. Which
1311
branch is taken depends on the decoded carryBit input parameter.
1312
--------------------------------------------------------------------------------------------
1313
*/
1314
void CarryBitToBranchValue(UCHAR carryBit, UINT treeNode, UINT *branchValue,
1315
6.01M
                           UINT *branchNode) {
1316
6.01M
  if (carryBit == 0) {
1317
4.24M
    *branchNode =
1318
4.24M
        (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT:  00FFF000 */
1319
4.24M
  } else {
1320
1.77M
    *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */
1321
1.77M
  }
1322
1323
6.01M
  *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */
1324
6.01M
}
1325
1326
/*---------------------------------------------------------------------------------------------
1327
     description:   Decodes the body of a priority codeword (PCW)
1328
-----------------------------------------------------------------------------------------------
1329
        return:   - return value is pointer to first of two or four quantized
1330
spectral coefficients
1331
--------------------------------------------------------------------------------------------
1332
*/
1333
static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
1334
                                   const UINT *pCurrentTree,
1335
                                   const SCHAR *pQuantValBase,
1336
                                   INT *pLeftStartOfSegment,
1337
                                   SCHAR *pRemainingBitsInSegment,
1338
203k
                                   int *pNumDecodedBits) {
1339
203k
  UCHAR carryBit;
1340
203k
  UINT branchNode;
1341
203k
  UINT treeNode;
1342
203k
  UINT branchValue;
1343
203k
  const SCHAR *pQuantVal;
1344
1345
  /* decode PCW_BODY */
1346
203k
  treeNode = *pCurrentTree; /* get first node of current tree belonging to
1347
                               current codebook */
1348
1349
  /* decode whole PCW-codeword-body */
1350
913k
  while (1) {
1351
913k
    carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1352
913k
                                       pLeftStartOfSegment, /* dummy */
1353
913k
                                       FROM_LEFT_TO_RIGHT);
1354
913k
    *pRemainingBitsInSegment -= 1;
1355
913k
    *pNumDecodedBits += 1;
1356
1357
913k
    CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode);
1358
1359
913k
    if ((branchNode & TEST_BIT_10) ==
1360
913k
        TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */
1361
203k
      break; /* end of branch in tree reached  i.e. a whole PCW-Body is decoded
1362
              */
1363
709k
    } else {
1364
709k
      treeNode = *(
1365
709k
          pCurrentTree +
1366
709k
          branchValue); /* update treeNode for further step in decoding tree */
1367
709k
    }
1368
913k
  }
1369
1370
203k
  pQuantVal =
1371
203k
      pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4
1372
                                      quantized values */
1373
1374
203k
  return pQuantVal;
1375
203k
}
1376
1377
/*---------------------------------------------------------------------------------------------
1378
     description:   This function decodes one escape sequence. In case of a
1379
escape codebook and in case of the absolute value of the quantized spectral
1380
value == 16, a escapeSequence is decoded in two steps:
1381
                      1. escape prefix
1382
                      2. escape word
1383
--------------------------------------------------------------------------------------------
1384
*/
1385
1386
static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
1387
                                INT quantSpecCoef, INT *pLeftStartOfSegment,
1388
                                SCHAR *pRemainingBitsInSegment,
1389
4.74k
                                int *pNumDecodedBits, UINT *errorWord) {
1390
4.74k
  UINT i;
1391
4.74k
  INT sign;
1392
4.74k
  UINT escapeOnesCounter = 0;
1393
4.74k
  UINT carryBit;
1394
4.74k
  INT escape_word = 0;
1395
1396
  /* decode escape prefix */
1397
7.36k
  while (1) {
1398
7.36k
    carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1399
7.36k
                                       pLeftStartOfSegment, /* dummy */
1400
7.36k
                                       FROM_LEFT_TO_RIGHT);
1401
7.36k
    *pRemainingBitsInSegment -= 1;
1402
7.36k
    *pNumDecodedBits += 1;
1403
7.36k
    if (*pRemainingBitsInSegment < 0) {
1404
111
      return Q_VALUE_INVALID;
1405
111
    }
1406
1407
7.25k
    if (carryBit != 0) {
1408
2.62k
      escapeOnesCounter += 1;
1409
4.63k
    } else {
1410
4.63k
      escapeOnesCounter += 4;
1411
4.63k
      break;
1412
4.63k
    }
1413
7.25k
  }
1414
1415
  /* decode escape word */
1416
22.7k
  for (i = escapeOnesCounter; i != 0; i--) {
1417
20.7k
    carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1418
20.7k
                                       pLeftStartOfSegment, /* dummy */
1419
20.7k
                                       FROM_LEFT_TO_RIGHT);
1420
20.7k
    *pRemainingBitsInSegment -= 1;
1421
20.7k
    *pNumDecodedBits += 1;
1422
20.7k
    if (*pRemainingBitsInSegment < 0) {
1423
2.64k
      return Q_VALUE_INVALID;
1424
2.64k
    }
1425
1426
18.0k
    escape_word <<= 1;
1427
18.0k
    escape_word = escape_word | carryBit;
1428
18.0k
  }
1429
1430
1.98k
  sign = (quantSpecCoef >= 0) ? 1 : -1;
1431
1432
1.98k
  if (escapeOnesCounter < 13) {
1433
1.97k
    quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word);
1434
1.97k
  } else {
1435
19
    *errorWord |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
1436
19
    quantSpecCoef = Q_VALUE_INVALID;
1437
19
  }
1438
1.98k
  return quantSpecCoef;
1439
4.63k
}
1440
1441
/*---------------------------------------------------------------------------------------------
1442
     description:   Decodes the Signbits of a priority codeword (PCW) and writes
1443
out the resulting quantized spectral values into unsorted sections
1444
-----------------------------------------------------------------------------------------------
1445
        output:   - two or four lines at position in corresponding section
1446
(which are not located at the desired position, i.e. they must be reordered in
1447
the last of eight function of HCR)
1448
-----------------------------------------------------------------------------------------------
1449
        return:   - updated pQuantSpecCoef pointer (to next empty storage for a
1450
line)
1451
--------------------------------------------------------------------------------------------
1452
*/
1453
static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor,
1454
                          UINT codebookDim, const SCHAR *pQuantVal,
1455
                          FIXP_DBL *pQuantSpecCoef, int *quantSpecCoefIdx,
1456
                          INT *pLeftStartOfSegment,
1457
                          SCHAR *pRemainingBitsInSegment,
1458
197k
                          int *pNumDecodedBits) {
1459
197k
  UINT i;
1460
197k
  UINT carryBit;
1461
197k
  INT quantSpecCoef;
1462
1463
593k
  for (i = codebookDim; i != 0; i--) {
1464
396k
    quantSpecCoef = *pQuantVal++;
1465
396k
    if (quantSpecCoef != 0) {
1466
296k
      carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1467
296k
                                         pLeftStartOfSegment, /* dummy */
1468
296k
                                         FROM_LEFT_TO_RIGHT);
1469
296k
      *pRemainingBitsInSegment -= 1;
1470
296k
      *pNumDecodedBits += 1;
1471
296k
      if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024 >> 1)) {
1472
1.52k
        return -1;
1473
1.52k
      }
1474
1475
      /* adapt sign of values according to the decoded sign bit */
1476
295k
      if (carryBit != 0) {
1477
77.4k
        pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef;
1478
217k
      } else {
1479
217k
        pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef;
1480
217k
      }
1481
295k
    } else {
1482
100k
      pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f);
1483
100k
    }
1484
395k
    *quantSpecCoefIdx += 1;
1485
395k
    if (*quantSpecCoefIdx >= 1024) {
1486
6
      return -1;
1487
6
    }
1488
395k
  }
1489
196k
  return 0;
1490
197k
}
1491
1492
/*---------------------------------------------------------------------------------------------
1493
     description:   Mutes spectral lines which have been marked as erroneous
1494
(Q_VALUE_INVALID)
1495
--------------------------------------------------------------------------------------------
1496
*/
1497
7.60k
void HcrMuteErroneousLines(H_HCR_INFO hHcr) {
1498
7.60k
  int c;
1499
7.60k
  FIXP_DBL *RESTRICT pLong =
1500
7.60k
      SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase);
1501
1502
  /* if there is a line with value Q_VALUE_INVALID mute it */
1503
7.79M
  for (c = 0; c < 1024; c++) {
1504
7.78M
    if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) {
1505
8.45k
      pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */
1506
8.45k
    }
1507
7.78M
  }
1508
7.60k
}