Coverage Report

Created: 2026-01-16 07:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fdk-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
73.1k
                                         UINT *errorWord) {
175
73.1k
  if (cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL) {
176
0
    *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK;
177
0
  }
178
73.1k
  if (numLine < 0 || numLine > 1024) {
179
0
    *errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK;
180
0
  }
181
73.1k
}
182
183
/*---------------------------------------------------------------------------------------------
184
     description:   Check both HCR lengths
185
--------------------------------------------------------------------------------------------
186
*/
187
static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword,
188
                                    SHORT lengthOfReorderedSpectralData,
189
96.0k
                                    UINT *errorWord) {
190
96.0k
  if (lengthOfReorderedSpectralData < lengthOfLongestCodeword) {
191
5.97k
    *errorWord |= HCR_SI_LENGTHS_FAILURE;
192
5.97k
  }
193
96.0k
}
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
150k
               const MP4_ELEMENT_ID globalHcrType) {
204
150k
  SHORT lengOfReorderedSpectralData;
205
150k
  SCHAR lengOfLongestCodeword;
206
207
150k
  pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData =
208
150k
      0;
209
150k
  pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0;
210
211
  /* ------- SI-Value No 1 ------- */
212
150k
  lengOfReorderedSpectralData = FDKreadBits(bs, 14) + ERROR_LORSD;
213
150k
  if (globalHcrType == ID_CPE) {
214
30.2k
    if ((lengOfReorderedSpectralData >= 0) &&
215
30.2k
        (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) {
216
26.5k
      pAacDecoderChannelInfo->pDynData->specificTo.aac
217
26.5k
          .lenOfReorderedSpectralData =
218
26.5k
          lengOfReorderedSpectralData; /* the decoded value is within range */
219
26.5k
    } else {
220
3.79k
      if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) {
221
3.79k
        pAacDecoderChannelInfo->pDynData->specificTo.aac
222
3.79k
            .lenOfReorderedSpectralData =
223
3.79k
            CPE_TOP_LENGTH; /* use valid maximum */
224
3.79k
      }
225
3.79k
    }
226
120k
  } else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE ||
227
120k
             globalHcrType == ID_CCE) {
228
120k
    if ((lengOfReorderedSpectralData >= 0) &&
229
120k
        (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) {
230
105k
      pAacDecoderChannelInfo->pDynData->specificTo.aac
231
105k
          .lenOfReorderedSpectralData =
232
105k
          lengOfReorderedSpectralData; /* the decoded value is within range */
233
105k
    } else {
234
14.9k
      if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) {
235
14.9k
        pAacDecoderChannelInfo->pDynData->specificTo.aac
236
14.9k
            .lenOfReorderedSpectralData =
237
14.9k
            SCE_TOP_LENGTH; /* use valid maximum */
238
14.9k
      }
239
14.9k
    }
240
120k
  }
241
242
  /* ------- SI-Value No 2 ------- */
243
150k
  lengOfLongestCodeword = FDKreadBits(bs, 6) + ERROR_LOLC;
244
150k
  if ((lengOfLongestCodeword >= 0) &&
245
150k
      (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) {
246
139k
    pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword =
247
139k
        lengOfLongestCodeword; /* the decoded value is within range */
248
139k
  } else {
249
11.2k
    if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) {
250
11.2k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword =
251
11.2k
          LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */
252
11.2k
    }
253
11.2k
  }
254
150k
}
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
96.0k
             HANDLE_FDK_BITSTREAM bs) {
268
96.0k
  CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo;
269
96.0k
  SHORT *pNumLinesInSec;
270
96.0k
  UCHAR *pCodeBk;
271
96.0k
  SHORT numSection;
272
96.0k
  SCHAR cb;
273
96.0k
  int numLine;
274
96.0k
  int i;
275
276
96.0k
  pHcr->decInOut.lengthOfReorderedSpectralData =
277
96.0k
      pAacDecoderChannelInfo->pDynData->specificTo.aac
278
96.0k
          .lenOfReorderedSpectralData;
279
96.0k
  pHcr->decInOut.lengthOfLongestCodeword =
280
96.0k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword;
281
96.0k
  pHcr->decInOut.pQuantizedSpectralCoefficientsBase =
282
96.0k
      pAacDecoderChannelInfo->pSpectralCoefficient;
283
96.0k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0;
284
96.0k
  pHcr->decInOut.pCodebook =
285
96.0k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
286
96.0k
  pHcr->decInOut.pNumLineInSect =
287
96.0k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
288
96.0k
  pHcr->decInOut.numSection =
289
96.0k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection;
290
96.0k
  pHcr->decInOut.errorLog = 0;
291
96.0k
  pHcr->nonPcwSideinfo.pResultBase =
292
96.0k
      SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
293
294
96.0k
  FDKsyncCache(bs);
295
96.0k
  pHcr->decInOut.bitstreamAnchor = (INT)FDKgetValidBits(bs);
296
297
96.0k
  if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */
298
12.3k
  {
299
12.3k
    SHORT band;
300
12.3k
    SHORT maxBand;
301
12.3k
    SCHAR group;
302
12.3k
    SCHAR winGroupLen;
303
12.3k
    SCHAR window;
304
12.3k
    SCHAR numUnitInBand;
305
12.3k
    SCHAR cntUnitInBand;
306
12.3k
    SCHAR groupWin;
307
12.3k
    SCHAR cb_prev;
308
309
12.3k
    UCHAR *pCodeBook;
310
12.3k
    const SHORT *BandOffsets;
311
12.3k
    SCHAR numOfGroups;
312
313
12.3k
    pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */
314
12.3k
    pNumLinesInSec = pHcr->decInOut.pNumLineInSect;          /* out */
315
12.3k
    pCodeBk = pHcr->decInOut.pCodebook;                      /* out */
316
12.3k
    BandOffsets =
317
12.3k
        GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */
318
12.3k
    numOfGroups = GetWindowGroups(pIcsInfo);
319
320
12.3k
    numLine = 0;
321
12.3k
    numSection = 0;
322
12.3k
    cb = pCodeBook[0];
323
12.3k
    cb_prev = pCodeBook[0];
324
325
    /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new
326
     * section starts */
327
328
12.3k
    *pCodeBk++ = cb_prev;
329
330
12.3k
    maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
331
25.9k
    for (band = 0; band < maxBand;
332
13.6k
         band++) { /* from low to high sfbs i.e. from low to high frequencies */
333
13.6k
      numUnitInBand =
334
13.6k
          ((BandOffsets[band + 1] - BandOffsets[band]) >>
335
13.6k
           FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */
336
30.7k
      for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0;
337
17.1k
           cntUnitInBand--) { /* for every unit in the band */
338
101k
        for (window = 0, group = 0; group < numOfGroups; group++) {
339
84.1k
          winGroupLen = (SCHAR)GetWindowGroupLength(
340
84.1k
              &pAacDecoderChannelInfo->icsInfo, group);
341
220k
          for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) {
342
136k
            cb = pCodeBook[group * 16 + band];
343
136k
            if (cb != cb_prev) {
344
60.8k
              errDetectorInHcrSideinfoShrt(cb, numLine,
345
60.8k
                                           &pHcr->decInOut.errorLog);
346
60.8k
              if (pHcr->decInOut.errorLog != 0) {
347
0
                return (pHcr->decInOut.errorLog);
348
0
              }
349
60.8k
              *pCodeBk++ = cb;
350
60.8k
              *pNumLinesInSec++ = numLine;
351
60.8k
              numSection++;
352
353
60.8k
              cb_prev = cb;
354
60.8k
              numLine = LINES_PER_UNIT;
355
75.9k
            } else {
356
75.9k
              numLine += LINES_PER_UNIT;
357
75.9k
            }
358
136k
          }
359
84.1k
        }
360
17.1k
      }
361
13.6k
    }
362
363
12.3k
    numSection++;
364
365
12.3k
    errDetectorInHcrSideinfoShrt(cb, numLine, &pHcr->decInOut.errorLog);
366
12.3k
    if (numSection <= 0 || numSection > 1024 / 2) {
367
0
      pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK;
368
0
    }
369
12.3k
    errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
370
12.3k
                            pHcr->decInOut.lengthOfReorderedSpectralData,
371
12.3k
                            &pHcr->decInOut.errorLog);
372
12.3k
    if (pHcr->decInOut.errorLog != 0) {
373
333
      return (pHcr->decInOut.errorLog);
374
333
    }
375
376
12.0k
    *pCodeBk = cb;
377
12.0k
    *pNumLinesInSec = numLine;
378
12.0k
    pHcr->decInOut.numSection = numSection;
379
380
12.0k
  } else /* end short block prepare SI */
381
83.6k
  {      /* long block */
382
83.6k
    errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword,
383
83.6k
                            pHcr->decInOut.lengthOfReorderedSpectralData,
384
83.6k
                            &pHcr->decInOut.errorLog);
385
83.6k
    numSection = pHcr->decInOut.numSection;
386
83.6k
    pNumLinesInSec = pHcr->decInOut.pNumLineInSect;
387
83.6k
    pCodeBk = pHcr->decInOut.pCodebook;
388
83.6k
    if (numSection <= 0 || numSection > 64) {
389
27.1k
      pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK;
390
27.1k
      numSection = 0;
391
27.1k
    }
392
393
224k
    for (i = numSection; i != 0; i--) {
394
140k
      cb = *pCodeBk++;
395
396
140k
      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
140k
      numLine = *pNumLinesInSec++;
401
      /* FDK_ASSERT(numLine > 0); */
402
403
140k
      if ((numLine <= 0) || (numLine > 1024)) {
404
15.5k
        pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK;
405
15.5k
      }
406
140k
    }
407
83.6k
    if (pHcr->decInOut.errorLog != 0) {
408
36.8k
      return (pHcr->decInOut.errorLog);
409
36.8k
    }
410
83.6k
  }
411
412
58.8k
  pCodeBk = pHcr->decInOut.pCodebook;
413
225k
  for (i = 0; i < numSection; i++) {
414
166k
    if ((*pCodeBk == NOISE_HCB) || (*pCodeBk == INTENSITY_HCB2) ||
415
161k
        (*pCodeBk == INTENSITY_HCB)) {
416
14.2k
      *pCodeBk = 0;
417
14.2k
    }
418
166k
    pCodeBk++;
419
166k
  }
420
421
  /* HCR-sideinfo-input is complete and seems to be valid */
422
423
58.8k
  return (pHcr->decInOut.errorLog);
424
96.0k
}
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
58.8k
                HANDLE_FDK_BITSTREAM bs) {
436
58.8k
  int pTmp1, pTmp2, pTmp3, pTmp4;
437
58.8k
  int pTmp5;
438
439
58.8k
  INT bitCntOffst;
440
58.8k
  INT saveBitCnt = (INT)FDKgetValidBits(bs); /* save bitstream position */
441
442
58.8k
  HcrCalcNumCodeword(pHcr);
443
444
58.8k
  HcrSortCodebookAndNumCodewordInSection(pHcr);
445
446
58.8k
  HcrPrepareSegmentationGrid(pHcr);
447
448
58.8k
  HcrExtendedSectionInfo(pHcr);
449
450
58.8k
  if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) != 0) {
451
133
    return (pHcr->decInOut.errorLog); /* sideinfo is massively corrupt, return
452
                                         from HCR without having decoded
453
                                         anything */
454
133
  }
455
456
58.7k
  DeriveNumberOfExtendedSortedSectionsInSets(
457
58.7k
      pHcr->segmentInfo.numSegment,
458
58.7k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection,
459
58.7k
      pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx,
460
58.7k
      pHcr->sectionInfo.pNumExtendedSortedSectionsInSets,
461
58.7k
      pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx);
462
463
  /* store */
464
58.7k
  pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
465
58.7k
  pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx;
466
58.7k
  pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
467
58.7k
  pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx;
468
58.7k
  pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
469
470
  /* ------- decode meaningful PCWs ------ */
471
58.7k
  DecodePCWs(bs, pHcr);
472
473
58.7k
  if ((pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK) == 0) {
474
    /* ------ decode the non-PCWs -------- */
475
52.5k
    DecodeNonPCWs(bs, pHcr);
476
52.5k
  }
477
478
58.7k
  errDetectWithinSegmentationFinal(pHcr);
479
480
  /* restore */
481
58.7k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1;
482
58.7k
  pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2;
483
58.7k
  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3;
484
58.7k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4;
485
58.7k
  pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5;
486
487
58.7k
  HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo,
488
58.7k
                                          pSamplingRateInfo);
489
490
  /* restore bitstream position */
491
58.7k
  bitCntOffst = (INT)FDKgetValidBits(bs) - saveBitCnt;
492
58.7k
  if (bitCntOffst) {
493
47.5k
    FDKpushBiDirectional(bs, bitCntOffst);
494
47.5k
  }
495
496
58.7k
  return (pHcr->decInOut.errorLog);
497
58.8k
}
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
58.7k
    const SamplingRateInfo *pSamplingRateInfo) {
513
58.7k
  INT qsc;
514
58.7k
  UINT abs_qsc;
515
58.7k
  UINT i, j;
516
58.7k
  USHORT numSpectralValuesInSection;
517
58.7k
  FIXP_DBL *pTeVa;
518
58.7k
  USHORT lavErrorCnt = 0;
519
520
58.7k
  UINT numSection = pHcr->decInOut.numSection;
521
58.7k
  SPECTRAL_PTR pQuantizedSpectralCoefficientsBase =
522
58.7k
      pHcr->decInOut.pQuantizedSpectralCoefficientsBase;
523
58.7k
  FIXP_DBL *pQuantizedSpectralCoefficients =
524
58.7k
      SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
525
58.7k
  const UCHAR *pCbDimShift = aDimCbShift;
526
58.7k
  const USHORT *pLargestAbsVal = aLargestAbsoluteValue;
527
58.7k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
528
58.7k
  USHORT *pNumSortedCodewordInSection =
529
58.7k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
530
58.7k
  USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
531
58.7k
  FIXP_DBL pTempValues[1024];
532
58.7k
  FIXP_DBL *pBak = pTempValues;
533
534
58.7k
  FDKmemclear(pTempValues, 1024 * sizeof(FIXP_DBL));
535
536
  /* long and short: check if decoded huffman-values (quantized spectral
537
   * coefficients) are within range */
538
225k
  for (i = numSection; i != 0; i--) {
539
166k
    numSpectralValuesInSection = *pNumSortedCodewordInSection++
540
166k
                                 << pCbDimShift[*pSortedCodebook];
541
166k
    pTeVa = &pTempValues[*pReorderOffset++];
542
13.2M
    for (j = numSpectralValuesInSection; j != 0; j--) {
543
13.1M
      qsc = *pQuantizedSpectralCoefficients++;
544
13.1M
      abs_qsc = fAbs(qsc);
545
13.1M
      if (abs_qsc <= pLargestAbsVal[*pSortedCodebook]) {
546
13.1M
        *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */
547
13.1M
      } else {                    /* line is too high .. */
548
16.0k
        if (abs_qsc ==
549
16.0k
            Q_VALUE_INVALID) { /* .. because of previous marking --> dont set
550
                                  LAV flag (would be confusing), just copy out
551
                                  the already marked value */
552
14.8k
          *pTeVa++ = (FIXP_DBL)qsc;
553
14.8k
        } else { /* .. because a too high value was decoded for this cb --> set
554
                    LAV flag */
555
1.16k
          *pTeVa++ = (FIXP_DBL)Q_VALUE_INVALID;
556
1.16k
          lavErrorCnt += 1;
557
1.16k
        }
558
16.0k
      }
559
13.1M
    }
560
166k
    pSortedCodebook++;
561
166k
  }
562
563
58.7k
  if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
564
12.0k
    FIXP_DBL *pOut;
565
12.0k
    FIXP_DBL locMax;
566
12.0k
    FIXP_DBL tmp;
567
12.0k
    SCHAR groupoffset;
568
12.0k
    SCHAR group;
569
12.0k
    SCHAR band;
570
12.0k
    SCHAR groupwin;
571
12.0k
    SCHAR window;
572
12.0k
    SCHAR numWinGroup;
573
12.0k
    SHORT interm;
574
12.0k
    SCHAR numSfbTransm;
575
12.0k
    SCHAR winGroupLen;
576
12.0k
    SHORT index;
577
12.0k
    INT msb;
578
12.0k
    INT lsb;
579
580
12.0k
    SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor;
581
12.0k
    SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale;
582
12.0k
    const SHORT *BandOffsets = GetScaleFactorBandOffsets(
583
12.0k
        &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
584
585
12.0k
    pBak = pTempValues;
586
    /* deinterleave unitwise for short blocks */
587
108k
    for (window = 0; window < (8); window++) {
588
96.1k
      pOut = SPEC(pQuantizedSpectralCoefficientsBase, window,
589
96.1k
                  pAacDecoderChannelInfo->granuleLength);
590
3.17M
      for (i = 0; i < (LINES_PER_UNIT_GROUP); i++) {
591
3.07M
        pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) +
592
3.07M
                i * 32; /* distance of lines between unit groups has to be
593
                           constant for every framelength (32)!  */
594
15.3M
        for (j = (LINES_PER_UNIT); j != 0; j--) {
595
12.3M
          *pOut++ = *pTeVa++;
596
12.3M
        }
597
3.07M
      }
598
96.1k
    }
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
12.0k
    groupoffset = 0;
604
605
12.0k
    numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
606
12.0k
    numSfbTransm =
607
12.0k
        GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
608
609
95.1k
    for (group = 0; group < numWinGroup; group++) {
610
83.0k
      winGroupLen =
611
83.0k
          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
612
150k
      for (band = 0; band < numSfbTransm; band++) {
613
67.3k
        interm = group * 16 + band;
614
67.3k
        msb = pScaleFacHcr[interm] >> 2;
615
67.3k
        lsb = pScaleFacHcr[interm] & 3;
616
175k
        for (groupwin = 0; groupwin < winGroupLen; groupwin++) {
617
108k
          window = groupoffset + groupwin;
618
108k
          pBak = SPEC(pQuantizedSpectralCoefficientsBase, window,
619
108k
                      pAacDecoderChannelInfo->granuleLength);
620
108k
          locMax = FL2FXCONST_DBL(0.0f);
621
243k
          for (index = BandOffsets[band]; index < BandOffsets[band + 1];
622
135k
               index += LINES_PER_UNIT) {
623
135k
            pTeVa = &pBak[index];
624
677k
            for (i = LINES_PER_UNIT; i != 0; i--) {
625
542k
              tmp = (*pTeVa < FL2FXCONST_DBL(0.0f)) ? -*pTeVa++ : *pTeVa++;
626
542k
              locMax = fixMax(tmp, locMax);
627
542k
            }
628
135k
          }
629
108k
          if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) {
630
545
            locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE;
631
545
          }
632
108k
          pSfbSclHcr[window * 16 + band] =
633
108k
              msb - GetScaleFromValue(
634
108k
                        locMax, lsb); /* save global scale maxima in this sfb */
635
108k
        }
636
67.3k
      }
637
83.0k
      groupoffset +=
638
83.0k
          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
639
83.0k
    }
640
46.6k
  } else {
641
    /* copy straight for long-blocks */
642
46.6k
    pQuantizedSpectralCoefficients =
643
46.6k
        SPEC_LONG(pQuantizedSpectralCoefficientsBase);
644
47.8M
    for (i = 1024; i != 0; i--) {
645
47.8M
      *pQuantizedSpectralCoefficients++ = *pBak++;
646
47.8M
    }
647
46.6k
  }
648
649
58.7k
  if (lavErrorCnt != 0) {
650
832
    pHcr->decInOut.errorLog |= LAV_VIOLATION;
651
832
  }
652
58.7k
}
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
58.8k
static void HcrCalcNumCodeword(H_HCR_INFO pHcr) {
670
58.8k
  int hcrSection;
671
58.8k
  UINT numCodeword;
672
673
58.8k
  UINT numSection = pHcr->decInOut.numSection;
674
58.8k
  UCHAR *pCodebook = pHcr->decInOut.pCodebook;
675
58.8k
  SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect;
676
58.8k
  const UCHAR *pCbDimShift = aDimCbShift;
677
678
58.8k
  USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
679
680
58.8k
  numCodeword = 0;
681
225k
  for (hcrSection = numSection; hcrSection != 0; hcrSection--) {
682
166k
    *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook];
683
166k
    if (*pCodebook != 0) {
684
133k
      numCodeword += *pNumCodewordInSection;
685
133k
    }
686
166k
    pNumCodewordInSection++;
687
166k
    pCodebook++;
688
166k
  }
689
58.8k
  pHcr->sectionInfo.numCodeword = numCodeword;
690
58.8k
}
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
58.8k
static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr) {
700
58.8k
  UINT i, j, k;
701
58.8k
  UCHAR temp;
702
58.8k
  UINT counter;
703
58.8k
  UINT startOffset;
704
58.8k
  UINT numZeroSection;
705
58.8k
  UCHAR *pDest;
706
58.8k
  UINT numSectionDec;
707
708
58.8k
  UINT numSection = pHcr->decInOut.numSection;
709
58.8k
  UCHAR *pCodebook = pHcr->decInOut.pCodebook;
710
58.8k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
711
58.8k
  USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection;
712
58.8k
  USHORT *pNumSortedCodewordInSection =
713
58.8k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
714
58.8k
  UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
715
58.8k
  USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset;
716
58.8k
  const UCHAR *pCbPriority = aCbPriority;
717
58.8k
  const UCHAR *pMinOfCbPair = aMinOfCbPair;
718
58.8k
  const UCHAR *pMaxOfCbPair = aMaxOfCbPair;
719
58.8k
  const UCHAR *pCbDimShift = aDimCbShift;
720
721
58.8k
  UINT searchStart = 0;
722
723
  /* calculate *pNumSortedSection and store the priorities in array
724
   * pSortedCdebook */
725
58.8k
  pDest = pSortedCodebook;
726
58.8k
  numZeroSection = 0;
727
225k
  for (i = numSection; i != 0; i--) {
728
166k
    if (pCbPriority[*pCodebook] == 0) {
729
33.5k
      numZeroSection += 1;
730
33.5k
    }
731
166k
    *pDest++ = pCbPriority[*pCodebook++];
732
166k
  }
733
58.8k
  pHcr->sectionInfo.numSortedSection =
734
58.8k
      numSection - numZeroSection; /* numSortedSection contains no zero or
735
                                      intensity section */
736
58.8k
  pCodebook = pHcr->decInOut.pCodebook;
737
738
  /* sort priorities of the codebooks in array pSortedCdebook[] */
739
58.8k
  numSectionDec = numSection - 1;
740
58.8k
  if (numSectionDec > 0) {
741
15.7k
    counter = numSectionDec;
742
123k
    for (j = numSectionDec; j != 0; j--) {
743
1.67M
      for (i = 0; i < counter; i++) {
744
        /* swap priorities */
745
1.56M
        if (pSortedCodebook[i + 1] > pSortedCodebook[i]) {
746
616k
          temp = pSortedCodebook[i];
747
616k
          pSortedCodebook[i] = pSortedCodebook[i + 1];
748
616k
          pSortedCodebook[i + 1] = temp;
749
616k
        }
750
1.56M
      }
751
107k
      counter -= 1;
752
107k
    }
753
15.7k
  }
754
755
  /* clear codebookSwitch array */
756
225k
  for (i = numSection; i != 0; i--) {
757
166k
    *pCodebookSwitch++ = 0;
758
166k
  }
759
58.8k
  pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch;
760
761
  /* sort sectionCodebooks and numCodwordsInSection and calculate
762
   * pReorderOffst[j] */
763
225k
  for (j = 0; j < numSection; j++) {
764
1.39M
    for (i = searchStart; i < numSection; i++) {
765
1.39M
      if (pCodebookSwitch[i] == 0 &&
766
783k
          (pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] ||
767
652k
           pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i])) {
768
166k
        pCodebookSwitch[i] = 1;
769
166k
        pSortedCodebook[j] = pCodebook[i]; /* sort codebook */
770
166k
        pNumSortedCodewordInSection[j] =
771
166k
            pNumCodewordInSection[i]; /* sort NumCodewordInSection */
772
773
166k
        startOffset = 0;
774
1.73M
        for (k = 0; k < i; k++) { /* make entry in pReorderOffst */
775
1.56M
          startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]];
776
1.56M
        }
777
166k
        pReorderOffset[j] =
778
166k
            startOffset; /* offset for reordering the codewords */
779
780
166k
        if (i == searchStart) {
781
93.9k
          k = i;
782
560k
          while (pCodebookSwitch[k++] == 1) searchStart++;
783
93.9k
        }
784
166k
        break;
785
166k
      }
786
1.39M
    }
787
166k
  }
788
58.8k
}
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
58.8k
static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr) {
800
58.8k
  USHORT i, j;
801
58.8k
  USHORT numSegment = 0;
802
58.8k
  INT segmentStart = 0;
803
58.8k
  UCHAR segmentWidth;
804
58.8k
  UCHAR lastSegmentWidth;
805
58.8k
  UCHAR sortedCodebook;
806
58.8k
  UCHAR endFlag = 0;
807
58.8k
  INT intermediateResult;
808
809
58.8k
  SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
810
58.8k
  SHORT lengthOfReorderedSpectralData =
811
58.8k
      pHcr->decInOut.lengthOfReorderedSpectralData;
812
58.8k
  UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
813
58.8k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
814
58.8k
  USHORT *pNumSortedCodewordInSection =
815
58.8k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
816
58.8k
  INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
817
58.8k
  INT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
818
58.8k
  SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
819
58.8k
  const UCHAR *pMaxCwLength = aMaxCwLen;
820
821
175k
  for (i = numSortedSection; i != 0; i--) {
822
120k
    sortedCodebook = *pSortedCodebook++;
823
120k
    segmentWidth =
824
120k
        fMin((INT)pMaxCwLength[sortedCodebook], (INT)lengthOfLongestCodeword);
825
826
4.83M
    for (j = *pNumSortedCodewordInSection; j != 0; j--) {
827
      /* width allows a new segment */
828
4.71M
      intermediateResult = segmentStart;
829
4.71M
      if ((segmentStart + segmentWidth) <= lengthOfReorderedSpectralData) {
830
        /* store segment start, segment length and increment the number of
831
         * segments */
832
4.70M
        *pLeftStartOfSegment++ = intermediateResult;
833
4.70M
        *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1;
834
4.70M
        *pRemainingBitsInSegment++ = segmentWidth;
835
4.70M
        segmentStart += segmentWidth;
836
4.70M
        numSegment += 1;
837
4.70M
      }
838
      /* width does not allow a new segment */
839
4.50k
      else {
840
        /* correct the last segment length */
841
4.50k
        pLeftStartOfSegment--;
842
4.50k
        pRightStartOfSegment--;
843
4.50k
        pRemainingBitsInSegment--;
844
4.50k
        segmentStart = *pLeftStartOfSegment;
845
846
4.50k
        lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart;
847
4.50k
        *pRemainingBitsInSegment = lastSegmentWidth;
848
4.50k
        *pRightStartOfSegment = segmentStart + lastSegmentWidth - 1;
849
4.50k
        endFlag = 1;
850
4.50k
        break;
851
4.50k
      }
852
4.71M
    }
853
120k
    pNumSortedCodewordInSection++;
854
120k
    if (endFlag != 0) {
855
4.50k
      break;
856
4.50k
    }
857
120k
  }
858
58.8k
  pHcr->segmentInfo.numSegment = numSegment;
859
58.8k
}
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
58.8k
static void HcrExtendedSectionInfo(H_HCR_INFO pHcr) {
873
58.8k
  UINT srtSecCnt = 0; /* counter for sorted sections */
874
58.8k
  UINT xSrtScCnt = 0; /* counter for extended sorted sections */
875
58.8k
  UINT remainNumCwInSortSec;
876
58.8k
  UINT inSegmentRemainNumCW;
877
878
58.8k
  UINT numSortedSection = pHcr->sectionInfo.numSortedSection;
879
58.8k
  UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook;
880
58.8k
  USHORT *pNumSortedCodewordInSection =
881
58.8k
      pHcr->sectionInfo.pNumSortedCodewordInSection;
882
58.8k
  UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook;
883
58.8k
  USHORT *pNumExtSortCwInSect =
884
58.8k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
885
58.8k
  UINT numSegment = pHcr->segmentInfo.numSegment;
886
58.8k
  UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
887
58.8k
  SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword;
888
58.8k
  const UCHAR *pMaxCwLength = aMaxCwLen;
889
890
58.8k
  remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
891
58.8k
  inSegmentRemainNumCW = numSegment;
892
893
298k
  while (srtSecCnt < numSortedSection) {
894
239k
    if (inSegmentRemainNumCW < remainNumCwInSortSec) {
895
106k
      pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
896
106k
      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
897
898
106k
      remainNumCwInSortSec -= inSegmentRemainNumCW;
899
106k
      inSegmentRemainNumCW = numSegment;
900
      /* data of a sorted section was not integrated in extended sorted section
901
       */
902
133k
    } else if (inSegmentRemainNumCW == remainNumCwInSortSec) {
903
47.8k
      pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW;
904
47.8k
      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
905
906
47.8k
      srtSecCnt++;
907
47.8k
      remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
908
47.8k
      inSegmentRemainNumCW = numSegment;
909
      /* data of a sorted section was integrated in extended sorted section */
910
85.2k
    } else { /* inSegmentRemainNumCW > remainNumCwInSortSec */
911
85.2k
      pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec;
912
85.2k
      pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt];
913
914
85.2k
      inSegmentRemainNumCW -= remainNumCwInSortSec;
915
85.2k
      srtSecCnt++;
916
85.2k
      remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt];
917
      /* data of a sorted section was integrated in extended sorted section */
918
85.2k
    }
919
239k
    pMaxLenOfCbInExtSrtSec[xSrtScCnt] =
920
239k
        fMin((INT)pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],
921
239k
             (INT)lengthOfLongestCodeword);
922
923
239k
    xSrtScCnt += 1;
924
925
239k
    if (xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
926
133
      pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW;
927
133
      return;
928
133
    }
929
239k
  }
930
58.7k
  pNumExtSortCwInSect[xSrtScCnt] = 0;
931
58.7k
}
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
58.7k
    int numExtendedSortedSectionsInSetsIdx) {
951
58.7k
  USHORT counter = 0;
952
58.7k
  UINT cwSum = 0;
953
58.7k
  USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection;
954
58.7k
  USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets;
955
956
206k
  while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0) {
957
148k
    cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx];
958
148k
    numExtendedSortedCodewordInSectionIdx++;
959
148k
    if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
960
0
      return;
961
0
    }
962
148k
    if (cwSum > numSegment) {
963
0
      return;
964
0
    }
965
148k
    counter++;
966
148k
    if (counter > 1024 / 4) {
967
0
      return;
968
0
    }
969
148k
    if (cwSum == numSegment) {
970
64.0k
      pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter;
971
64.0k
      numExtendedSortedSectionsInSetsIdx++;
972
64.0k
      if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
973
821
        return;
974
821
      }
975
63.1k
      counter = 0;
976
63.1k
      cwSum = 0;
977
63.1k
    }
978
148k
  }
979
57.8k
  pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] =
980
57.8k
      counter; /* save last entry for the last - probably shorter - set */
981
57.8k
}
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
58.7k
static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) {
998
58.7k
  UINT i;
999
58.7k
  USHORT extSortSec;
1000
58.7k
  USHORT curExtSortCwInSec;
1001
58.7k
  UCHAR codebook;
1002
58.7k
  UCHAR dimension;
1003
58.7k
  const UINT *pCurrentTree;
1004
58.7k
  const SCHAR *pQuantValBase;
1005
58.7k
  const SCHAR *pQuantVal;
1006
1007
58.7k
  USHORT *pNumExtendedSortedCodewordInSection =
1008
58.7k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
1009
58.7k
  int numExtendedSortedCodewordInSectionIdx =
1010
58.7k
      pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
1011
58.7k
  UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
1012
58.7k
  int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
1013
58.7k
  USHORT *pNumExtendedSortedSectionsInSets =
1014
58.7k
      pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
1015
58.7k
  int numExtendedSortedSectionsInSetsIdx =
1016
58.7k
      pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
1017
58.7k
  FIXP_DBL *pQuantizedSpectralCoefficients =
1018
58.7k
      SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase);
1019
58.7k
  int quantizedSpectralCoefficientsIdx =
1020
58.7k
      pHcr->decInOut.quantizedSpectralCoefficientsIdx;
1021
58.7k
  INT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1022
58.7k
  SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1023
58.7k
  UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec;
1024
58.7k
  int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx;
1025
58.7k
  UCHAR maxAllowedCwLen;
1026
58.7k
  int numDecodedBits;
1027
58.7k
  const UCHAR *pCbDimension = aDimCb;
1028
58.7k
  const UCHAR *pCbSign = aSignCb;
1029
1030
  /* clear result array */
1031
58.7k
  FDKmemclear(pQuantizedSpectralCoefficients + quantizedSpectralCoefficientsIdx,
1032
58.7k
              1024 * sizeof(FIXP_DBL));
1033
1034
  /* decode all PCWs in the extended sorted section(s) belonging to set 0 */
1035
58.7k
  for (extSortSec =
1036
58.7k
           pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx];
1037
106k
       extSortSec != 0; extSortSec--) {
1038
82.1k
    codebook =
1039
82.1k
        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
82.1k
    extendedSortedCodebookIdx++;
1046
82.1k
    if (extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
1047
0
      return;
1048
0
    }
1049
82.1k
    dimension = pCbDimension[codebook]; /* get dimension of codebook of this
1050
                                           extended sort. sec. */
1051
82.1k
    pCurrentTree =
1052
82.1k
        aHuffTable[codebook]; /* convert codebook to pointer to QSCs */
1053
82.1k
    pQuantValBase =
1054
82.1k
        aQuantTable[codebook]; /* convert codebook to index to table of QSCs */
1055
82.1k
    maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx];
1056
82.1k
    maxLenOfCbInExtSrtSecIdx++;
1057
82.1k
    if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
1058
0
      return;
1059
0
    }
1060
1061
    /* switch for decoding with different codebooks: */
1062
82.1k
    if (pCbSign[codebook] ==
1063
82.1k
        0) { /* no sign bits follow after the codeword-body */
1064
      /* PCW_BodyONLY */
1065
      /*==============*/
1066
1067
12.7k
      for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
1068
12.7k
               [numExtendedSortedCodewordInSectionIdx];
1069
188k
           curExtSortCwInSec != 0; curExtSortCwInSec--) {
1070
178k
        numDecodedBits = 0;
1071
1072
        /* decode PCW_BODY */
1073
178k
        pQuantVal = DecodePCW_Body(
1074
178k
            bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase,
1075
178k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1076
1077
        /* result is written out here because NO sign bits follow the body */
1078
822k
        for (i = dimension; i != 0; i--) {
1079
644k
          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
1080
644k
              (FIXP_DBL)*pQuantVal++; /* write quant. spec. coef. into
1081
                                         spectrum; sign is already valid */
1082
644k
          quantizedSpectralCoefficientsIdx++;
1083
644k
          if (quantizedSpectralCoefficientsIdx >= 1024) {
1084
1
            return;
1085
1
          }
1086
644k
        }
1087
1088
        /* one more PCW should be decoded */
1089
1090
178k
        if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG)) {
1091
2.62k
          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED;
1092
2.62k
        }
1093
1094
178k
        if (1 == errDetectPcwSegmentation(
1095
178k
                     *pRemainingBitsInSegment - ERROR_PCW_BODY, pHcr, PCW_BODY,
1096
178k
                     pQuantizedSpectralCoefficients +
1097
178k
                         quantizedSpectralCoefficientsIdx - dimension,
1098
178k
                     dimension)) {
1099
2.62k
          return;
1100
2.62k
        }
1101
175k
        pLeftStartOfSegment++; /* update pointer for decoding the next PCW */
1102
175k
        pRemainingBitsInSegment++; /* update pointer for decoding the next PCW
1103
                                    */
1104
175k
      }
1105
69.4k
    } else if ((codebook < 11) && (pCbSign[codebook] ==
1106
46.7k
                                   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
46.7k
      for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
1112
46.7k
               [numExtendedSortedCodewordInSectionIdx];
1113
850k
           curExtSortCwInSec != 0; curExtSortCwInSec--) {
1114
829k
        int err;
1115
829k
        numDecodedBits = 0;
1116
1117
829k
        pQuantVal = DecodePCW_Body(
1118
829k
            bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase,
1119
829k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1120
1121
829k
        err = DecodePCW_Sign(
1122
829k
            bs, pHcr->decInOut.bitstreamAnchor, dimension, pQuantVal,
1123
829k
            pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx,
1124
829k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1125
829k
        if (err != 0) {
1126
23.9k
          return;
1127
23.9k
        }
1128
        /* one more PCW should be decoded */
1129
1130
805k
        if (maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG)) {
1131
1.32k
          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED;
1132
1.32k
        }
1133
1134
805k
        if (1 == errDetectPcwSegmentation(
1135
805k
                     *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN, pHcr,
1136
805k
                     PCW_BODY_SIGN,
1137
805k
                     pQuantizedSpectralCoefficients +
1138
805k
                         quantizedSpectralCoefficientsIdx - dimension,
1139
805k
                     dimension)) {
1140
1.32k
          return;
1141
1.32k
        }
1142
804k
        pLeftStartOfSegment++;
1143
804k
        pRemainingBitsInSegment++;
1144
804k
      }
1145
46.7k
    } else if ((pCbSign[codebook] == 1) &&
1146
22.6k
               (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
22.6k
      for (curExtSortCwInSec = pNumExtendedSortedCodewordInSection
1153
22.6k
               [numExtendedSortedCodewordInSectionIdx];
1154
242k
           curExtSortCwInSec != 0; curExtSortCwInSec--) {
1155
226k
        int err;
1156
226k
        numDecodedBits = 0;
1157
1158
        /* decode PCW_BODY */
1159
226k
        pQuantVal = DecodePCW_Body(
1160
226k
            bs, pHcr->decInOut.bitstreamAnchor, pCurrentTree, pQuantValBase,
1161
226k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1162
1163
226k
        err = DecodePCW_Sign(
1164
226k
            bs, pHcr->decInOut.bitstreamAnchor, dimension, pQuantVal,
1165
226k
            pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx,
1166
226k
            pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits);
1167
226k
        if (err != 0) {
1168
4.50k
          return;
1169
4.50k
        }
1170
1171
        /* decode PCW_ESCAPE if present */
1172
222k
        quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK;
1173
1174
222k
        if (fixp_abs(pQuantizedSpectralCoefficients
1175
222k
                         [quantizedSpectralCoefficientsIdx]) ==
1176
222k
            (FIXP_DBL)ESCAPE_VALUE) {
1177
11.9k
          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
1178
11.9k
              (FIXP_DBL)DecodeEscapeSequence(
1179
11.9k
                  bs, pHcr->decInOut.bitstreamAnchor,
1180
11.9k
                  pQuantizedSpectralCoefficients
1181
11.9k
                      [quantizedSpectralCoefficientsIdx],
1182
11.9k
                  pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits,
1183
11.9k
                  &pHcr->decInOut.errorLog);
1184
11.9k
        }
1185
222k
        quantizedSpectralCoefficientsIdx++;
1186
222k
        if (quantizedSpectralCoefficientsIdx >= 1024) {
1187
0
          return;
1188
0
        }
1189
1190
222k
        if (fixp_abs(pQuantizedSpectralCoefficients
1191
222k
                         [quantizedSpectralCoefficientsIdx]) ==
1192
222k
            (FIXP_DBL)ESCAPE_VALUE) {
1193
23.5k
          pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] =
1194
23.5k
              (FIXP_DBL)DecodeEscapeSequence(
1195
23.5k
                  bs, pHcr->decInOut.bitstreamAnchor,
1196
23.5k
                  pQuantizedSpectralCoefficients
1197
23.5k
                      [quantizedSpectralCoefficientsIdx],
1198
23.5k
                  pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits,
1199
23.5k
                  &pHcr->decInOut.errorLog);
1200
23.5k
        }
1201
222k
        quantizedSpectralCoefficientsIdx++;
1202
222k
        if (quantizedSpectralCoefficientsIdx >= 1024) {
1203
0
          return;
1204
0
        }
1205
1206
        /* one more PCW should be decoded */
1207
1208
222k
        if (maxAllowedCwLen <
1209
222k
            (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG)) {
1210
2.07k
          pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
1211
2.07k
        }
1212
1213
222k
        if (1 == errDetectPcwSegmentation(
1214
222k
                     *pRemainingBitsInSegment - ERROR_PCW_BODY_SIGN_ESC, pHcr,
1215
222k
                     PCW_BODY_SIGN_ESC,
1216
222k
                     pQuantizedSpectralCoefficients +
1217
222k
                         quantizedSpectralCoefficientsIdx -
1218
222k
                         DIMENSION_OF_ESCAPE_CODEBOOK,
1219
222k
                     DIMENSION_OF_ESCAPE_CODEBOOK)) {
1220
2.07k
          return;
1221
2.07k
        }
1222
220k
        pLeftStartOfSegment++;
1223
220k
        pRemainingBitsInSegment++;
1224
220k
      }
1225
22.6k
    }
1226
1227
    /* all PCWs belonging to this extended section should be decoded */
1228
47.7k
    numExtendedSortedCodewordInSectionIdx++;
1229
47.7k
    if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR + MAX_HCR_SETS) {
1230
0
      return;
1231
0
    }
1232
47.7k
  }
1233
  /* all PCWs should be decoded */
1234
1235
24.2k
  numExtendedSortedSectionsInSetsIdx++;
1236
24.2k
  if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) {
1237
0
    return;
1238
0
  }
1239
1240
  /* Write back indexes into structure */
1241
24.2k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
1242
24.2k
      numExtendedSortedCodewordInSectionIdx;
1243
24.2k
  pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
1244
24.2k
  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx =
1245
24.2k
      numExtendedSortedSectionsInSetsIdx;
1246
24.2k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx =
1247
24.2k
      quantizedSpectralCoefficientsIdx;
1248
24.2k
  pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx;
1249
24.2k
}
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
1.20M
                                      UCHAR dimension) {
1264
1.20M
  SCHAR i;
1265
1.20M
  if (remainingBitsInSegment < 0) {
1266
    /* log the error */
1267
6.02k
    switch (kind) {
1268
2.62k
      case PCW_BODY:
1269
2.62k
        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY;
1270
2.62k
        break;
1271
1.32k
      case PCW_BODY_SIGN:
1272
1.32k
        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN;
1273
1.32k
        break;
1274
2.07k
      case PCW_BODY_SIGN_ESC:
1275
2.07k
        pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC;
1276
2.07k
        break;
1277
6.02k
    }
1278
    /* mark the erred lines */
1279
20.5k
    for (i = dimension; i != 0; i--) {
1280
14.5k
      *qsc_base_of_cw++ = (FIXP_DBL)Q_VALUE_INVALID;
1281
14.5k
    }
1282
6.02k
    return 1;
1283
6.02k
  }
1284
1.19M
  return 0;
1285
1.20M
}
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
58.7k
static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr) {
1294
58.7k
  UCHAR segmentationErrorFlag = 0;
1295
58.7k
  USHORT i;
1296
58.7k
  SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1297
58.7k
  UINT numSegment = pHcr->segmentInfo.numSegment;
1298
1299
4.76M
  for (i = numSegment; i != 0; i--) {
1300
4.70M
    if (*pRemainingBitsInSegment++ != 0) {
1301
3.84M
      segmentationErrorFlag = 1;
1302
3.84M
    }
1303
4.70M
  }
1304
58.7k
  if (segmentationErrorFlag == 1) {
1305
46.7k
    pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR;
1306
46.7k
  }
1307
58.7k
}
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
30.6M
                           UINT *branchNode) {
1316
30.6M
  if (carryBit == 0) {
1317
18.4M
    *branchNode =
1318
18.4M
        (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT:  00FFF000 */
1319
18.4M
  } else {
1320
12.1M
    *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */
1321
12.1M
  }
1322
1323
30.6M
  *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */
1324
30.6M
}
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
1.23M
                                   int *pNumDecodedBits) {
1339
1.23M
  UCHAR carryBit;
1340
1.23M
  UINT branchNode;
1341
1.23M
  UINT treeNode;
1342
1.23M
  UINT branchValue;
1343
1.23M
  const SCHAR *pQuantVal;
1344
1345
  /* decode PCW_BODY */
1346
1.23M
  treeNode = *pCurrentTree; /* get first node of current tree belonging to
1347
                               current codebook */
1348
1349
  /* decode whole PCW-codeword-body */
1350
4.86M
  while (1) {
1351
4.86M
    carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1352
4.86M
                                       pLeftStartOfSegment, /* dummy */
1353
4.86M
                                       FROM_LEFT_TO_RIGHT);
1354
4.86M
    *pRemainingBitsInSegment -= 1;
1355
4.86M
    *pNumDecodedBits += 1;
1356
1357
4.86M
    CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode);
1358
1359
4.86M
    if ((branchNode & TEST_BIT_10) ==
1360
4.86M
        TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */
1361
1.23M
      break; /* end of branch in tree reached  i.e. a whole PCW-Body is decoded
1362
              */
1363
3.63M
    } else {
1364
3.63M
      treeNode = *(
1365
3.63M
          pCurrentTree +
1366
3.63M
          branchValue); /* update treeNode for further step in decoding tree */
1367
3.63M
    }
1368
4.86M
  }
1369
1370
1.23M
  pQuantVal =
1371
1.23M
      pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4
1372
                                      quantized values */
1373
1374
1.23M
  return pQuantVal;
1375
1.23M
}
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
35.4k
                                int *pNumDecodedBits, UINT *errorWord) {
1390
35.4k
  UINT i;
1391
35.4k
  INT sign;
1392
35.4k
  UINT escapeOnesCounter = 0;
1393
35.4k
  UINT carryBit;
1394
35.4k
  INT escape_word = 0;
1395
1396
  /* decode escape prefix */
1397
76.3k
  while (1) {
1398
76.3k
    carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1399
76.3k
                                       pLeftStartOfSegment, /* dummy */
1400
76.3k
                                       FROM_LEFT_TO_RIGHT);
1401
76.3k
    *pRemainingBitsInSegment -= 1;
1402
76.3k
    *pNumDecodedBits += 1;
1403
76.3k
    if (*pRemainingBitsInSegment < 0) {
1404
652
      return Q_VALUE_INVALID;
1405
652
    }
1406
1407
75.6k
    if (carryBit != 0) {
1408
40.8k
      escapeOnesCounter += 1;
1409
40.8k
    } else {
1410
34.8k
      escapeOnesCounter += 4;
1411
34.8k
      break;
1412
34.8k
    }
1413
75.6k
  }
1414
1415
  /* decode escape word */
1416
212k
  for (i = escapeOnesCounter; i != 0; i--) {
1417
178k
    carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1418
178k
                                       pLeftStartOfSegment, /* dummy */
1419
178k
                                       FROM_LEFT_TO_RIGHT);
1420
178k
    *pRemainingBitsInSegment -= 1;
1421
178k
    *pNumDecodedBits += 1;
1422
178k
    if (*pRemainingBitsInSegment < 0) {
1423
1.13k
      return Q_VALUE_INVALID;
1424
1.13k
    }
1425
1426
177k
    escape_word <<= 1;
1427
177k
    escape_word = escape_word | carryBit;
1428
177k
  }
1429
1430
33.7k
  sign = (quantSpecCoef >= 0) ? 1 : -1;
1431
1432
33.7k
  if (escapeOnesCounter < 13) {
1433
33.3k
    quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word);
1434
33.3k
  } else {
1435
313
    *errorWord |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED;
1436
313
    quantSpecCoef = Q_VALUE_INVALID;
1437
313
  }
1438
33.7k
  return quantSpecCoef;
1439
34.8k
}
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
1.05M
                          int *pNumDecodedBits) {
1459
1.05M
  UINT i;
1460
1.05M
  UINT carryBit;
1461
1.05M
  INT quantSpecCoef;
1462
1463
3.21M
  for (i = codebookDim; i != 0; i--) {
1464
2.19M
    quantSpecCoef = *pQuantVal++;
1465
2.19M
    if (quantSpecCoef != 0) {
1466
1.02M
      carryBit = HcrGetABitFromBitstream(bs, bsAnchor, pLeftStartOfSegment,
1467
1.02M
                                         pLeftStartOfSegment, /* dummy */
1468
1.02M
                                         FROM_LEFT_TO_RIGHT);
1469
1.02M
      *pRemainingBitsInSegment -= 1;
1470
1.02M
      *pNumDecodedBits += 1;
1471
1.02M
      if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024 >> 1)) {
1472
28.4k
        return -1;
1473
28.4k
      }
1474
1475
      /* adapt sign of values according to the decoded sign bit */
1476
994k
      if (carryBit != 0) {
1477
436k
        pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef;
1478
557k
      } else {
1479
557k
        pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef;
1480
557k
      }
1481
1.16M
    } else {
1482
1.16M
      pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f);
1483
1.16M
    }
1484
2.16M
    *quantSpecCoefIdx += 1;
1485
2.16M
    if (*quantSpecCoefIdx >= 1024) {
1486
3
      return -1;
1487
3
    }
1488
2.16M
  }
1489
1.02M
  return 0;
1490
1.05M
}
1491
1492
/*---------------------------------------------------------------------------------------------
1493
     description:   Mutes spectral lines which have been marked as erroneous
1494
(Q_VALUE_INVALID)
1495
--------------------------------------------------------------------------------------------
1496
*/
1497
46.8k
void HcrMuteErroneousLines(H_HCR_INFO hHcr) {
1498
46.8k
  int c;
1499
46.8k
  FIXP_DBL *RESTRICT pLong =
1500
46.8k
      SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase);
1501
1502
  /* if there is a line with value Q_VALUE_INVALID mute it */
1503
48.0M
  for (c = 0; c < 1024; c++) {
1504
47.9M
    if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) {
1505
16.0k
      pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */
1506
16.0k
    }
1507
47.9M
  }
1508
46.8k
}