Coverage Report

Created: 2026-09-07 07:09

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