Coverage Report

Created: 2025-11-16 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fdk-aac/libAACdec/src/aacdec_hcrs.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 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: Prepare decoding of non-PCWs, segmentation- and
100
                bitfield-handling, HCR-Statemachine
101
102
*******************************************************************************/
103
104
#include "aacdec_hcrs.h"
105
106
#include "aacdec_hcr.h"
107
108
#include "aacdec_hcr_bit.h"
109
#include "aac_rom.h"
110
#include "aac_ram.h"
111
112
static UINT InitSegmentBitfield(UINT *pNumSegment,
113
                                SCHAR *pRemainingBitsInSegment,
114
                                UINT *pSegmentBitfield,
115
                                UCHAR *pNumWordForBitfield,
116
                                USHORT *pNumBitValidInLastWord);
117
118
static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr);
119
120
static INT ModuloValue(INT input, INT bufferlength);
121
122
static void ClearBitFromBitfield(STATEFUNC *ptrState, UINT offset,
123
                                 UINT *pBitfield);
124
125
/*---------------------------------------------------------------------------------------------
126
     description: This function decodes all non-priority codewords (non-PCWs) by
127
using a state-machine.
128
--------------------------------------------------------------------------------------------
129
*/
130
52.5k
void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) {
131
52.5k
  UINT numValidSegment;
132
52.5k
  INT segmentOffset;
133
52.5k
  INT codewordOffsetBase;
134
52.5k
  INT codewordOffset;
135
52.5k
  UINT trial;
136
137
52.5k
  UINT *pNumSegment;
138
52.5k
  SCHAR *pRemainingBitsInSegment;
139
52.5k
  UINT *pSegmentBitfield;
140
52.5k
  UCHAR *pNumWordForBitfield;
141
52.5k
  USHORT *pNumBitValidInLastWord;
142
52.5k
  UINT *pCodewordBitfield;
143
52.5k
  INT bitfieldWord;
144
52.5k
  INT bitInWord;
145
52.5k
  UINT tempWord;
146
52.5k
  UINT interMediateWord;
147
52.5k
  INT tempBit;
148
52.5k
  INT carry;
149
150
52.5k
  UINT numCodeword;
151
52.5k
  UCHAR numSet;
152
52.5k
  UCHAR currentSet;
153
52.5k
  UINT codewordInSet;
154
52.5k
  UINT remainingCodewordsInSet;
155
52.5k
  SCHAR *pSta;
156
52.5k
  UINT ret;
157
158
52.5k
  pNumSegment = &(pHcr->segmentInfo.numSegment);
159
52.5k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
160
52.5k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
161
52.5k
  pNumWordForBitfield = &(pHcr->segmentInfo.numWordForBitfield);
162
52.5k
  pNumBitValidInLastWord = &(pHcr->segmentInfo.pNumBitValidInLastWord);
163
52.5k
  pSta = pHcr->nonPcwSideinfo.pSta;
164
165
52.5k
  numValidSegment = InitSegmentBitfield(pNumSegment, pRemainingBitsInSegment,
166
52.5k
                                        pSegmentBitfield, pNumWordForBitfield,
167
52.5k
                                        pNumBitValidInLastWord);
168
169
52.5k
  if (numValidSegment != 0) {
170
41.4k
    numCodeword = pHcr->sectionInfo.numCodeword;
171
41.4k
    numSet = ((numCodeword - 1) / *pNumSegment) + 1;
172
173
41.4k
    pHcr->segmentInfo.readDirection = FROM_RIGHT_TO_LEFT;
174
175
    /* Process sets subsequently */
176
41.4k
    numSet = fMin(numSet, (UCHAR)MAX_HCR_SETS);
177
50.4k
    for (currentSet = 1; currentSet < numSet; currentSet++) {
178
179
      /* step 1 */
180
10.4k
      numCodeword -=
181
10.4k
          *pNumSegment; /* number of remaining non PCWs [for all sets] */
182
10.4k
      if (numCodeword < *pNumSegment) {
183
2.45k
        codewordInSet = numCodeword; /* for last set */
184
8.01k
      } else {
185
8.01k
        codewordInSet = *pNumSegment; /* for all sets except last set */
186
8.01k
      }
187
188
      /* step 2 */
189
      /* prepare array 'CodewordBitfield'; as much ones are written from left in
190
       * all words, as much decodedCodewordInSetCounter nonPCWs exist in this
191
       * set */
192
10.4k
      tempWord = 0xFFFFFFFF;
193
10.4k
      pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
194
195
34.4k
      for (bitfieldWord = *pNumWordForBitfield; bitfieldWord != 0;
196
23.9k
           bitfieldWord--) { /* loop over all used words */
197
23.9k
        if (codewordInSet > NUMBER_OF_BIT_IN_WORD) { /* more codewords than
198
                                                        number of bits => fill
199
                                                        ones */
200
          /* fill a whole word with ones */
201
5.63k
          *pCodewordBitfield++ = tempWord;
202
5.63k
          codewordInSet -= NUMBER_OF_BIT_IN_WORD; /* subtract number of bits */
203
18.3k
        } else {
204
          /* prepare last tempWord */
205
18.3k
          for (remainingCodewordsInSet = codewordInSet;
206
285k
               remainingCodewordsInSet < NUMBER_OF_BIT_IN_WORD;
207
266k
               remainingCodewordsInSet++) {
208
266k
            tempWord =
209
266k
                tempWord &
210
266k
                ~(1
211
266k
                  << (NUMBER_OF_BIT_IN_WORD - 1 -
212
266k
                      remainingCodewordsInSet)); /* set a zero at bit number
213
                                                    (NUMBER_OF_BIT_IN_WORD-1-i)
214
                                                    in tempWord */
215
266k
          }
216
18.3k
          *pCodewordBitfield++ = tempWord;
217
18.3k
          tempWord = 0x00000000;
218
18.3k
        }
219
23.9k
      }
220
10.4k
      pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
221
222
      /* step 3 */
223
      /* build non-PCW sideinfo for each non-PCW of the current set */
224
10.4k
      InitNonPCWSideInformationForCurrentSet(pHcr);
225
226
      /* step 4 */
227
      /* decode all non-PCWs belonging to this set */
228
229
      /* loop over trials */
230
10.4k
      codewordOffsetBase = 0;
231
465k
      for (trial = *pNumSegment; trial > 0; trial--) {
232
        /* loop over number of words in bitfields */
233
456k
        segmentOffset = 0; /* start at zero in every segment */
234
456k
        pHcr->segmentInfo.segmentOffset =
235
456k
            segmentOffset; /* store in structure for states */
236
456k
        codewordOffset = codewordOffsetBase;
237
456k
        pHcr->nonPcwSideinfo.codewordOffset =
238
456k
            codewordOffset; /* store in structure for states */
239
240
3.05M
        for (bitfieldWord = 0; bitfieldWord < *pNumWordForBitfield;
241
2.59M
             bitfieldWord++) {
242
          /* derive tempWord with bitwise and */
243
2.59M
          tempWord =
244
2.59M
              pSegmentBitfield[bitfieldWord] & pCodewordBitfield[bitfieldWord];
245
246
          /* if tempWord is not zero, decode something */
247
2.59M
          if (tempWord != 0) {
248
            /* loop over all bits in tempWord; start state machine if & is true
249
             */
250
1.11M
            for (bitInWord = NUMBER_OF_BIT_IN_WORD; bitInWord > 0;
251
1.08M
                 bitInWord--) {
252
1.08M
              interMediateWord = ((UINT)1 << (bitInWord - 1));
253
1.08M
              if ((tempWord & interMediateWord) == interMediateWord) {
254
                /* get state and start state machine */
255
275k
                pHcr->nonPcwSideinfo.pState =
256
275k
                    aStateConstant2State[pSta[codewordOffset]];
257
258
721k
                while (pHcr->nonPcwSideinfo.pState) {
259
447k
                  ret = ((STATEFUNC)pHcr->nonPcwSideinfo.pState)(bs, pHcr);
260
447k
                  if (ret != 0) {
261
1.47k
                    return;
262
1.47k
                  }
263
447k
                }
264
275k
              }
265
266
              /* update both offsets */
267
1.08M
              segmentOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */
268
1.08M
              pHcr->segmentInfo.segmentOffset = segmentOffset;
269
1.08M
              codewordOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */
270
1.08M
              codewordOffset =
271
1.08M
                  ModuloValue(codewordOffset,
272
1.08M
                              *pNumSegment); /* index of the current codeword
273
                                                lies within modulo range */
274
1.08M
              pHcr->nonPcwSideinfo.codewordOffset = codewordOffset;
275
1.08M
            }
276
2.56M
          } else {
277
2.56M
            segmentOffset +=
278
2.56M
                NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */
279
2.56M
            pHcr->segmentInfo.segmentOffset = segmentOffset;
280
2.56M
            codewordOffset +=
281
2.56M
                NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */
282
2.56M
            codewordOffset = ModuloValue(
283
2.56M
                codewordOffset,
284
2.56M
                *pNumSegment); /* index of the current codeword lies within
285
                                  modulo range */
286
2.56M
            pHcr->nonPcwSideinfo.codewordOffset = codewordOffset;
287
2.56M
          }
288
2.59M
        } /* end of bitfield word loop */
289
290
        /* decrement codeword - pointer */
291
455k
        codewordOffsetBase -= 1;
292
455k
        codewordOffsetBase =
293
455k
            ModuloValue(codewordOffsetBase, *pNumSegment); /* index of the
294
                                                              current codeword
295
                                                              base lies within
296
                                                              modulo range */
297
298
        /* rotate numSegment bits in codewordBitfield */
299
        /* rotation of *numSegment bits in bitfield of codewords
300
         * (circle-rotation) */
301
        /* get last valid bit */
302
455k
        tempBit = pCodewordBitfield[*pNumWordForBitfield - 1] &
303
455k
                  (1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord));
304
455k
        tempBit = tempBit >> (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord);
305
306
        /* write zero into place where tempBit was fetched from */
307
455k
        pCodewordBitfield[*pNumWordForBitfield - 1] =
308
455k
            pCodewordBitfield[*pNumWordForBitfield - 1] &
309
455k
            ~(1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord));
310
311
        /* rotate last valid word */
312
455k
        pCodewordBitfield[*pNumWordForBitfield - 1] =
313
455k
            pCodewordBitfield[*pNumWordForBitfield - 1] >> 1;
314
315
        /* transfare carry bit 0 from current word into bitposition 31 from next
316
         * word and rotate current word */
317
2.59M
        for (bitfieldWord = *pNumWordForBitfield - 2; bitfieldWord > -1;
318
2.14M
             bitfieldWord--) {
319
          /* get carry (=bit at position 0) from current word */
320
2.14M
          carry = pCodewordBitfield[bitfieldWord] & 1;
321
322
          /* put the carry bit at position 31 into word right from current word
323
           */
324
2.14M
          pCodewordBitfield[bitfieldWord + 1] =
325
2.14M
              pCodewordBitfield[bitfieldWord + 1] |
326
2.14M
              (carry << (NUMBER_OF_BIT_IN_WORD - 1));
327
328
          /* shift current word */
329
2.14M
          pCodewordBitfield[bitfieldWord] =
330
2.14M
              pCodewordBitfield[bitfieldWord] >> 1;
331
2.14M
        }
332
333
        /* put tempBit into free bit-position 31 from first word */
334
455k
        pCodewordBitfield[0] =
335
455k
            pCodewordBitfield[0] | (tempBit << (NUMBER_OF_BIT_IN_WORD - 1));
336
337
455k
      } /* end of trial loop */
338
339
      /* toggle read direction */
340
9.00k
      pHcr->segmentInfo.readDirection =
341
9.00k
          ToggleReadDirection(pHcr->segmentInfo.readDirection);
342
9.00k
    }
343
    /* end of set loop */
344
345
    /* all non-PCWs of this spectrum are decoded */
346
41.4k
  }
347
348
  /* all PCWs and all non PCWs are decoded. They are unbacksorted in output
349
   * buffer. Here is the Interface with comparing QSCs to asm decoding */
350
52.5k
}
351
352
/*---------------------------------------------------------------------------------------------
353
     description:   This function prepares the bitfield used for the
354
                    segments. The list is set up once to be used in all
355
following sets. If a segment is decoded empty, the according bit from the
356
Bitfield is removed.
357
-----------------------------------------------------------------------------------------------
358
        return:     numValidSegment = the number of valid segments
359
--------------------------------------------------------------------------------------------
360
*/
361
static UINT InitSegmentBitfield(UINT *pNumSegment,
362
                                SCHAR *pRemainingBitsInSegment,
363
                                UINT *pSegmentBitfield,
364
                                UCHAR *pNumWordForBitfield,
365
52.5k
                                USHORT *pNumBitValidInLastWord) {
366
52.5k
  SHORT i;
367
52.5k
  USHORT r;
368
52.5k
  UCHAR bitfieldWord;
369
52.5k
  UINT tempWord;
370
52.5k
  USHORT numValidSegment;
371
372
52.5k
  *pNumWordForBitfield =
373
52.5k
      (*pNumSegment == 0)
374
52.5k
          ? 0
375
52.5k
          : ((*pNumSegment - 1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1;
376
377
  /* loop over all words, which are completely used or only partial */
378
  /* bit in pSegmentBitfield is zero if segment is empty; bit in
379
   * pSegmentBitfield is one if segment is not empty */
380
52.5k
  numValidSegment = 0;
381
52.5k
  *pNumBitValidInLastWord = *pNumSegment;
382
383
  /* loop over words */
384
157k
  for (bitfieldWord = 0; bitfieldWord < *pNumWordForBitfield - 1;
385
104k
       bitfieldWord++) {
386
104k
    tempWord = 0xFFFFFFFF; /* set ones */
387
104k
    r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG;
388
3.46M
    for (i = 0; i < NUMBER_OF_BIT_IN_WORD; i++) {
389
3.35M
      if (pRemainingBitsInSegment[r + i] == 0) {
390
296k
        tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 -
391
296k
                                      i)); /* set a zero at bit number
392
                                              (NUMBER_OF_BIT_IN_WORD-1-i) in
393
                                              tempWord */
394
3.05M
      } else {
395
3.05M
        numValidSegment += 1; /* count segments which are not empty */
396
3.05M
      }
397
3.35M
    }
398
104k
    pSegmentBitfield[bitfieldWord] = tempWord;        /* store result */
399
104k
    *pNumBitValidInLastWord -= NUMBER_OF_BIT_IN_WORD; /* calculate number of
400
                                                         zeros on LSB side in
401
                                                         the last word */
402
104k
  }
403
404
  /* calculate last word: prepare special tempWord */
405
52.5k
  tempWord = 0xFFFFFFFF;
406
1.09M
  for (i = 0; i < (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); i++) {
407
1.03M
    tempWord = tempWord & ~(1 << i); /* clear bit i in tempWord */
408
1.03M
  }
409
410
  /* calculate last word */
411
52.5k
  r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG;
412
694k
  for (i = 0; i < *pNumBitValidInLastWord; i++) {
413
641k
    if (pRemainingBitsInSegment[r + i] == 0) {
414
63.7k
      tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 -
415
63.7k
                                    i)); /* set a zero at bit number
416
                                            (NUMBER_OF_BIT_IN_WORD-1-i) in
417
                                            tempWord */
418
577k
    } else {
419
577k
      numValidSegment += 1; /* count segments which are not empty */
420
577k
    }
421
641k
  }
422
52.5k
  pSegmentBitfield[bitfieldWord] = tempWord; /* store result */
423
424
52.5k
  return numValidSegment;
425
52.5k
}
426
427
/*---------------------------------------------------------------------------------------------
428
  description:  This function sets up sideinfo for the non-PCW decoder (for the
429
current set).
430
---------------------------------------------------------------------------------------------*/
431
10.4k
static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr) {
432
10.4k
  USHORT i, k;
433
10.4k
  UCHAR codebookDim;
434
10.4k
  UINT startNode;
435
436
10.4k
  UCHAR *pCodebook = pHcr->nonPcwSideinfo.pCodebook;
437
10.4k
  UINT *iNode = pHcr->nonPcwSideinfo.iNode;
438
10.4k
  UCHAR *pCntSign = pHcr->nonPcwSideinfo.pCntSign;
439
10.4k
  USHORT *iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
440
10.4k
  UINT *pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
441
10.4k
  SCHAR *pSta = pHcr->nonPcwSideinfo.pSta;
442
10.4k
  USHORT *pNumExtendedSortedCodewordInSection =
443
10.4k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
444
10.4k
  int numExtendedSortedCodewordInSectionIdx =
445
10.4k
      pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
446
10.4k
  UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
447
10.4k
  int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
448
10.4k
  USHORT *pNumExtendedSortedSectionsInSets =
449
10.4k
      pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
450
10.4k
  int numExtendedSortedSectionsInSetsIdx =
451
10.4k
      pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
452
10.4k
  int quantizedSpectralCoefficientsIdx =
453
10.4k
      pHcr->decInOut.quantizedSpectralCoefficientsIdx;
454
10.4k
  const UCHAR *pCbDimension = aDimCb;
455
10.4k
  int iterationCounter = 0;
456
457
  /* loop over number of extended sorted sections in the current set so all
458
   * codewords sideinfo variables within this set can be prepared for decoding
459
   */
460
10.4k
  for (i = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx];
461
25.7k
       i != 0; i--) {
462
15.4k
    codebookDim =
463
15.4k
        pCbDimension[pExtendedSortedCodebook[extendedSortedCodebookIdx]];
464
15.4k
    startNode = *aHuffTable[pExtendedSortedCodebook[extendedSortedCodebookIdx]];
465
466
15.4k
    for (k = pNumExtendedSortedCodewordInSection
467
15.4k
             [numExtendedSortedCodewordInSectionIdx];
468
375k
         k != 0; k--) {
469
360k
      iterationCounter++;
470
360k
      if (iterationCounter > (1024 >> 2)) {
471
202
        return;
472
202
      }
473
360k
      *pSta++ = aCodebook2StartInt
474
360k
          [pExtendedSortedCodebook[extendedSortedCodebookIdx]];
475
360k
      *pCodebook++ = pExtendedSortedCodebook[extendedSortedCodebookIdx];
476
360k
      *iNode++ = startNode;
477
360k
      *pCntSign++ = 0;
478
360k
      *iResultPointer++ = quantizedSpectralCoefficientsIdx;
479
360k
      *pEscapeSequenceInfo++ = 0;
480
360k
      quantizedSpectralCoefficientsIdx +=
481
360k
          codebookDim; /* update pointer by codebookDim --> point to next
482
                          starting value for writing out */
483
360k
      if (quantizedSpectralCoefficientsIdx >= 1024) {
484
6
        return;
485
6
      }
486
360k
    }
487
15.2k
    numExtendedSortedCodewordInSectionIdx++; /* inc ptr for next ext sort sec in
488
                                                current set */
489
15.2k
    extendedSortedCodebookIdx++; /* inc ptr for next ext sort sec in current set
490
                                  */
491
15.2k
    if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS) ||
492
15.2k
        extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
493
0
      return;
494
0
    }
495
15.2k
  }
496
10.2k
  numExtendedSortedSectionsInSetsIdx++; /* inc ptr for next set of non-PCWs */
497
10.2k
  if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
498
0
    return;
499
0
  }
500
501
  /* Write back indexes */
502
10.2k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
503
10.2k
      numExtendedSortedCodewordInSectionIdx;
504
10.2k
  pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
505
10.2k
  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx =
506
10.2k
      numExtendedSortedSectionsInSetsIdx;
507
10.2k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
508
10.2k
      numExtendedSortedCodewordInSectionIdx;
509
10.2k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx =
510
10.2k
      quantizedSpectralCoefficientsIdx;
511
10.2k
}
512
513
/*---------------------------------------------------------------------------------------------
514
     description: This function returns the input value if the value is in the
515
                  range of bufferlength. If <input> is smaller, one bufferlength
516
is added, if <input> is bigger one bufferlength is subtracted.
517
-----------------------------------------------------------------------------------------------
518
        return:   modulo result
519
--------------------------------------------------------------------------------------------
520
*/
521
4.10M
static INT ModuloValue(INT input, INT bufferlength) {
522
4.10M
  if (input > (bufferlength - 1)) {
523
542k
    return (input - bufferlength);
524
542k
  }
525
3.55M
  if (input < 0) {
526
9.05k
    return (input + bufferlength);
527
9.05k
  }
528
3.55M
  return input;
529
3.55M
}
530
531
/*---------------------------------------------------------------------------------------------
532
     description: This function clears a bit from current bitfield and
533
                  switches off the statemachine.
534
535
                  A bit is cleared in two cases:
536
                  a) a codeword is decoded, then a bit is cleared in codeword
537
bitfield b) a segment is decoded empty, then a bit is cleared in segment
538
bitfield
539
--------------------------------------------------------------------------------------------
540
*/
541
static void ClearBitFromBitfield(STATEFUNC *ptrState, UINT offset,
542
282k
                                 UINT *pBitfield) {
543
282k
  UINT numBitfieldWord;
544
282k
  UINT numBitfieldBit;
545
546
  /* get both values needed for clearing the bit */
547
282k
  numBitfieldWord = offset >> THIRTYTWO_LOG_DIV_TWO_LOG; /* int   = wordNr */
548
282k
  numBitfieldBit = offset - (numBitfieldWord
549
282k
                             << THIRTYTWO_LOG_DIV_TWO_LOG); /* fract = bitNr  */
550
551
  /* clear a bit in bitfield */
552
282k
  pBitfield[numBitfieldWord] =
553
282k
      pBitfield[numBitfieldWord] &
554
282k
      ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 - numBitfieldBit));
555
556
  /* switch off state machine because codeword is decoded and/or because segment
557
   * is empty */
558
282k
  *ptrState = NULL;
559
282k
}
560
561
/* =========================================================================================
562
                              the states of the statemachine
563
   =========================================================================================
564
 */
565
566
/*---------------------------------------------------------------------------------------------
567
     description:  Decodes the body of a codeword. This State is used for
568
codebooks 1,2,5 and 6. No sign bits are decoded, because the table of the
569
quantized spectral values has got a valid sign at the quantized spectral lines.
570
-----------------------------------------------------------------------------------------------
571
        output:   Two or four quantizes spectral values written at position
572
where pResultPointr points to
573
-----------------------------------------------------------------------------------------------
574
        return:   0
575
--------------------------------------------------------------------------------------------
576
*/
577
16.8k
UINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM bs, void *ptr) {
578
16.8k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
579
16.8k
  UINT *pSegmentBitfield;
580
16.8k
  UINT *pCodewordBitfield;
581
16.8k
  UINT segmentOffset;
582
16.8k
  FIXP_DBL *pResultBase;
583
16.8k
  UINT *iNode;
584
16.8k
  USHORT *iResultPointer;
585
16.8k
  UINT codewordOffset;
586
16.8k
  UINT branchNode;
587
16.8k
  UINT branchValue;
588
16.8k
  UINT iQSC;
589
16.8k
  UINT treeNode;
590
16.8k
  UCHAR carryBit;
591
16.8k
  INT *pLeftStartOfSegment;
592
16.8k
  INT *pRightStartOfSegment;
593
16.8k
  SCHAR *pRemainingBitsInSegment;
594
16.8k
  UCHAR readDirection;
595
16.8k
  UCHAR *pCodebook;
596
16.8k
  UCHAR dimCntr;
597
16.8k
  const UINT *pCurrentTree;
598
16.8k
  const UCHAR *pCbDimension;
599
16.8k
  const SCHAR *pQuantVal;
600
16.8k
  const SCHAR *pQuantValBase;
601
602
16.8k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
603
16.8k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
604
16.8k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
605
16.8k
  readDirection = pHcr->segmentInfo.readDirection;
606
16.8k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
607
16.8k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
608
16.8k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
609
610
16.8k
  pCodebook = pHcr->nonPcwSideinfo.pCodebook;
611
16.8k
  iNode = pHcr->nonPcwSideinfo.iNode;
612
16.8k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
613
16.8k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
614
16.8k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
615
616
16.8k
  pCbDimension = aDimCb;
617
618
16.8k
  treeNode = iNode[codewordOffset];
619
16.8k
  pCurrentTree = aHuffTable[pCodebook[codewordOffset]];
620
621
71.7k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
622
69.2k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
623
69.2k
    carryBit = HcrGetABitFromBitstream(
624
69.2k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
625
69.2k
        &pRightStartOfSegment[segmentOffset], readDirection);
626
627
69.2k
    CarryBitToBranchValue(carryBit, /* make a step in decoding tree */
628
69.2k
                          treeNode, &branchValue, &branchNode);
629
630
    /* if end of branch reached write out lines and count bits needed for sign,
631
     * otherwise store node in codeword sideinfo */
632
69.2k
    if ((branchNode & TEST_BIT_10) ==
633
69.2k
        TEST_BIT_10) { /* test bit 10 ; ==> body is complete */
634
14.3k
      pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base
635
                                                                 address of
636
                                                                 quantized
637
                                                                 values
638
                                                                 belonging to
639
                                                                 current
640
                                                                 codebook */
641
14.3k
      pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid
642
                                                  line [of 2 or 4 quantized
643
                                                  values] */
644
645
14.3k
      iQSC = iResultPointer[codewordOffset]; /* get position of first line for
646
                                                writing out result */
647
648
64.5k
      for (dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0;
649
50.1k
           dimCntr--) {
650
50.1k
        pResultBase[iQSC++] =
651
50.1k
            (FIXP_DBL)*pQuantVal++; /* write out 2 or 4 lines into
652
                                       spectrum; no Sign bits
653
                                       available in this state */
654
50.1k
      }
655
656
14.3k
      ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
657
14.3k
                           pCodewordBitfield); /* clear a bit in bitfield and
658
                                                  switch off statemachine */
659
14.3k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
660
                                                      for loop counter (see
661
                                                      above) is done here */
662
14.3k
      break; /* end of branch in tree reached  i.e. a whole nonPCW-Body is
663
                decoded */
664
54.8k
    } else { /* body is not decoded completely: */
665
54.8k
      treeNode = *(
666
54.8k
          pCurrentTree +
667
54.8k
          branchValue); /* update treeNode for further step in decoding tree */
668
54.8k
    }
669
69.2k
  }
670
16.8k
  iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe
671
                                       decoding of codeword body not finished
672
                                       yet */
673
674
16.8k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
675
3.04k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
676
3.04k
                         pSegmentBitfield); /* clear a bit in bitfield and
677
                                               switch off statemachine */
678
679
3.04k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
680
3
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_ONLY;
681
3
      return BODY_ONLY;
682
3
    }
683
3.04k
  }
684
685
16.8k
  return STOP_THIS_STATE;
686
16.8k
}
687
688
/*---------------------------------------------------------------------------------------------
689
     description: Decodes the codeword body, writes out result and counts the
690
number of quantized spectral values, which are different form zero. For those
691
values sign bits are needed.
692
693
                  If sign bit counter cntSign is different from zero, switch to
694
next state to decode sign Bits there. If sign bit counter cntSign is zero, no
695
sign bits are needed and codeword is decoded.
696
-----------------------------------------------------------------------------------------------
697
        output:   Two or four written quantizes spectral values written at
698
position where pResultPointr points to. The signs of those lines may be wrong.
699
If the signs [on just one signle sign] is wrong, the next state will correct it.
700
-----------------------------------------------------------------------------------------------
701
        return:   0
702
--------------------------------------------------------------------------------------------
703
*/
704
125k
UINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) {
705
125k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
706
125k
  SCHAR *pRemainingBitsInSegment;
707
125k
  INT *pLeftStartOfSegment;
708
125k
  INT *pRightStartOfSegment;
709
125k
  UCHAR readDirection;
710
125k
  UINT *pSegmentBitfield;
711
125k
  UINT *pCodewordBitfield;
712
125k
  UINT segmentOffset;
713
714
125k
  UCHAR *pCodebook;
715
125k
  UINT *iNode;
716
125k
  UCHAR *pCntSign;
717
125k
  FIXP_DBL *pResultBase;
718
125k
  USHORT *iResultPointer;
719
125k
  UINT codewordOffset;
720
721
125k
  UINT iQSC;
722
125k
  UINT cntSign;
723
125k
  UCHAR dimCntr;
724
125k
  UCHAR carryBit;
725
125k
  SCHAR *pSta;
726
125k
  UINT treeNode;
727
125k
  UINT branchValue;
728
125k
  UINT branchNode;
729
125k
  const UCHAR *pCbDimension;
730
125k
  const UINT *pCurrentTree;
731
125k
  const SCHAR *pQuantValBase;
732
125k
  const SCHAR *pQuantVal;
733
734
125k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
735
125k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
736
125k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
737
125k
  readDirection = pHcr->segmentInfo.readDirection;
738
125k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
739
125k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
740
125k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
741
742
125k
  pCodebook = pHcr->nonPcwSideinfo.pCodebook;
743
125k
  iNode = pHcr->nonPcwSideinfo.iNode;
744
125k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
745
125k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
746
125k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
747
125k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
748
125k
  pSta = pHcr->nonPcwSideinfo.pSta;
749
750
125k
  pCbDimension = aDimCb;
751
752
125k
  treeNode = iNode[codewordOffset];
753
125k
  pCurrentTree = aHuffTable[pCodebook[codewordOffset]];
754
755
385k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
756
375k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
757
375k
    carryBit = HcrGetABitFromBitstream(
758
375k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
759
375k
        &pRightStartOfSegment[segmentOffset], readDirection);
760
761
375k
    CarryBitToBranchValue(carryBit, /* make a step in decoding tree */
762
375k
                          treeNode, &branchValue, &branchNode);
763
764
    /* if end of branch reached write out lines and count bits needed for sign,
765
     * otherwise store node in codeword sideinfo */
766
375k
    if ((branchNode & TEST_BIT_10) ==
767
375k
        TEST_BIT_10) { /* test bit 10 ; if set body complete */
768
      /* body completely decoded; branchValue is valid, set pQuantVal to first
769
       * (of two or four) quantized spectral coefficients */
770
115k
      pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base
771
                                                                 address of
772
                                                                 quantized
773
                                                                 values
774
                                                                 belonging to
775
                                                                 current
776
                                                                 codebook */
777
115k
      pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid
778
                                                  line [of 2 or 4 quantized
779
                                                  values] */
780
781
115k
      iQSC = iResultPointer[codewordOffset]; /* get position of first line for
782
                                                writing result */
783
784
      /* codeword decoding result is written out here: Write out 2 or 4
785
       * quantized spectral values with probably */
786
      /* wrong sign and count number of values which are different from zero for
787
       * sign bit decoding [which happens in next state] */
788
115k
      cntSign = 0;
789
353k
      for (dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0;
790
238k
           dimCntr--) {
791
238k
        pResultBase[iQSC++] =
792
238k
            (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */
793
238k
        if (*pQuantVal++ != 0) {
794
89.7k
          cntSign += 1;
795
89.7k
        }
796
238k
      }
797
798
115k
      if (cntSign == 0) {
799
63.6k
        ClearBitFromBitfield(
800
63.6k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
801
63.6k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
802
                                   statemachine */
803
63.6k
      } else {
804
51.6k
        pCntSign[codewordOffset] = cntSign;     /* write sign count result into
805
                                                   codewordsideinfo of current
806
                                                   codeword */
807
51.6k
        pSta[codewordOffset] = BODY_SIGN__SIGN; /* change state */
808
51.6k
        pHcr->nonPcwSideinfo.pState =
809
51.6k
            aStateConstant2State[pSta[codewordOffset]]; /* get state from
810
                                                           separate array of
811
                                                           cw-sideinfo */
812
51.6k
      }
813
115k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
814
                                                      for loop counter (see
815
                                                      above) is done here */
816
115k
      break; /* end of branch in tree reached  i.e. a whole nonPCW-Body is
817
                decoded */
818
260k
    } else { /* body is not decoded completely: */
819
260k
      treeNode = *(
820
260k
          pCurrentTree +
821
260k
          branchValue); /* update treeNode for further step in decoding tree */
822
260k
    }
823
375k
  }
824
125k
  iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe
825
                                       decoding of codeword body not finished
826
                                       yet */
827
828
125k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
829
14.1k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
830
14.1k
                         pSegmentBitfield); /* clear a bit in bitfield and
831
                                               switch off statemachine */
832
833
14.1k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
834
685
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__BODY;
835
685
      return BODY_SIGN__BODY;
836
685
    }
837
14.1k
  }
838
839
124k
  return STOP_THIS_STATE;
840
125k
}
841
842
/*---------------------------------------------------------------------------------------------
843
     description: This state decodes the sign bits belonging to a codeword. The
844
state is called as often in different "trials" until pCntSgn[codewordOffset] is
845
zero.
846
-----------------------------------------------------------------------------------------------
847
        output:   The two or four quantizes spectral values (written in previous
848
state) have now the correct sign.
849
-----------------------------------------------------------------------------------------------
850
        return:   0
851
--------------------------------------------------------------------------------------------
852
*/
853
54.8k
UINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) {
854
54.8k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
855
54.8k
  SCHAR *pRemainingBitsInSegment;
856
54.8k
  INT *pLeftStartOfSegment;
857
54.8k
  INT *pRightStartOfSegment;
858
54.8k
  UCHAR readDirection;
859
54.8k
  UINT *pSegmentBitfield;
860
54.8k
  UINT *pCodewordBitfield;
861
54.8k
  UINT segmentOffset;
862
863
54.8k
  UCHAR *pCntSign;
864
54.8k
  FIXP_DBL *pResultBase;
865
54.8k
  USHORT *iResultPointer;
866
54.8k
  UINT codewordOffset;
867
868
54.8k
  UCHAR carryBit;
869
54.8k
  UINT iQSC;
870
54.8k
  UCHAR cntSign;
871
872
54.8k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
873
54.8k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
874
54.8k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
875
54.8k
  readDirection = pHcr->segmentInfo.readDirection;
876
54.8k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
877
54.8k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
878
54.8k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
879
880
  /*pCodebook               = */
881
54.8k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
882
54.8k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
883
54.8k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
884
54.8k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
885
886
54.8k
  iQSC = iResultPointer[codewordOffset];
887
54.8k
  cntSign = pCntSign[codewordOffset];
888
889
  /* loop for sign bit decoding */
890
92.5k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
891
87.3k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
892
87.3k
    carryBit = HcrGetABitFromBitstream(
893
87.3k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
894
87.3k
        &pRightStartOfSegment[segmentOffset], readDirection);
895
87.3k
    cntSign -=
896
87.3k
        1; /* decrement sign counter because one sign bit has been read */
897
898
    /* search for a line (which was decoded in previous state) which is not
899
     * zero. [This value will get a sign] */
900
95.3k
    while (pResultBase[iQSC] == (FIXP_DBL)0) {
901
7.98k
      if (++iQSC >= 1024) { /* points to current value different from zero */
902
0
        return BODY_SIGN__SIGN;
903
0
      }
904
7.98k
    }
905
906
    /* put sign together with line; if carryBit is zero, the sign is ok already;
907
     * no write operation necessary in this case */
908
87.3k
    if (carryBit != 0) {
909
36.6k
      pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */
910
36.6k
    }
911
912
87.3k
    iQSC++; /* update pointer to next (maybe valid) value */
913
914
87.3k
    if (cntSign == 0) { /* if (cntSign==0)  ==>  set state CODEWORD_DECODED */
915
49.6k
      ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
916
49.6k
                           pCodewordBitfield); /* clear a bit in bitfield and
917
                                                  switch off statemachine */
918
49.6k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
919
                                                      for loop counter (see
920
                                                      above) is done here */
921
49.6k
      break; /* whole nonPCW-Body and according sign bits are decoded */
922
49.6k
    }
923
87.3k
  }
924
54.8k
  pCntSign[codewordOffset] = cntSign;
925
54.8k
  iResultPointer[codewordOffset] = iQSC; /* store updated pResultPointer */
926
927
54.8k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
928
10.7k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
929
10.7k
                         pSegmentBitfield); /* clear a bit in bitfield and
930
                                               switch off statemachine */
931
932
10.7k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
933
10
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__SIGN;
934
10
      return BODY_SIGN__SIGN;
935
10
    }
936
10.7k
  }
937
938
54.8k
  return STOP_THIS_STATE;
939
54.8k
}
940
941
/*---------------------------------------------------------------------------------------------
942
     description: Decodes the codeword body in case of codebook is 11. Writes
943
out resulting two or four lines [with probably wrong sign] and counts the number
944
of lines, which are different form zero. This information is needed in next
945
                  state where sign bits will be decoded, if necessary.
946
                  If sign bit counter cntSign is zero, no sign bits are needed
947
and codeword is decoded completely.
948
-----------------------------------------------------------------------------------------------
949
        output:   Two lines (quantizes spectral coefficients) which are probably
950
wrong. The sign may be wrong and if one or two values is/are 16, the following
951
states will decode the escape sequence to correct the values which are wirtten
952
here.
953
-----------------------------------------------------------------------------------------------
954
        return:   0
955
--------------------------------------------------------------------------------------------
956
*/
957
125k
UINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) {
958
125k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
959
125k
  SCHAR *pRemainingBitsInSegment;
960
125k
  INT *pLeftStartOfSegment;
961
125k
  INT *pRightStartOfSegment;
962
125k
  UCHAR readDirection;
963
125k
  UINT *pSegmentBitfield;
964
125k
  UINT *pCodewordBitfield;
965
125k
  UINT segmentOffset;
966
967
125k
  UINT *iNode;
968
125k
  UCHAR *pCntSign;
969
125k
  FIXP_DBL *pResultBase;
970
125k
  USHORT *iResultPointer;
971
125k
  UINT codewordOffset;
972
973
125k
  UCHAR carryBit;
974
125k
  UINT iQSC;
975
125k
  UINT cntSign;
976
125k
  UINT dimCntr;
977
125k
  UINT treeNode;
978
125k
  SCHAR *pSta;
979
125k
  UINT branchNode;
980
125k
  UINT branchValue;
981
125k
  const UINT *pCurrentTree;
982
125k
  const SCHAR *pQuantValBase;
983
125k
  const SCHAR *pQuantVal;
984
985
125k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
986
125k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
987
125k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
988
125k
  readDirection = pHcr->segmentInfo.readDirection;
989
125k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
990
125k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
991
125k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
992
993
125k
  iNode = pHcr->nonPcwSideinfo.iNode;
994
125k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
995
125k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
996
125k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
997
125k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
998
125k
  pSta = pHcr->nonPcwSideinfo.pSta;
999
1000
125k
  treeNode = iNode[codewordOffset];
1001
125k
  pCurrentTree = aHuffTable[ESCAPE_CODEBOOK];
1002
1003
799k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1004
792k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1005
792k
    carryBit = HcrGetABitFromBitstream(
1006
792k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1007
792k
        &pRightStartOfSegment[segmentOffset], readDirection);
1008
1009
    /* make a step in tree */
1010
792k
    CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode);
1011
1012
    /* if end of branch reached write out lines and count bits needed for sign,
1013
     * otherwise store node in codeword sideinfo */
1014
792k
    if ((branchNode & TEST_BIT_10) ==
1015
792k
        TEST_BIT_10) { /* test bit 10 ; if set body complete */
1016
1017
      /* body completely decoded; branchValue is valid */
1018
      /* set pQuantVol to first (of two or four) quantized spectral coefficients
1019
       */
1020
117k
      pQuantValBase = aQuantTable[ESCAPE_CODEBOOK]; /* get base address of
1021
                                                       quantized values
1022
                                                       belonging to current
1023
                                                       codebook */
1024
117k
      pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid
1025
                                                  line [of 2 or 4 quantized
1026
                                                  values] */
1027
1028
      /* make backup from original resultPointer in node storage for state
1029
       * BODY_SIGN_ESC__SIGN */
1030
117k
      iNode[codewordOffset] = iResultPointer[codewordOffset];
1031
1032
      /* get position of first line for writing result */
1033
117k
      iQSC = iResultPointer[codewordOffset];
1034
1035
      /* codeword decoding result is written out here: Write out 2 or 4
1036
       * quantized spectral values with probably */
1037
      /* wrong sign and count number of values which are different from zero for
1038
       * sign bit decoding [which happens in next state] */
1039
117k
      cntSign = 0;
1040
1041
353k
      for (dimCntr = DIMENSION_OF_ESCAPE_CODEBOOK; dimCntr != 0; dimCntr--) {
1042
235k
        pResultBase[iQSC++] =
1043
235k
            (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */
1044
235k
        if (*pQuantVal++ != 0) {
1045
158k
          cntSign += 1;
1046
158k
        }
1047
235k
      }
1048
1049
117k
      if (cntSign == 0) {
1050
32.8k
        ClearBitFromBitfield(
1051
32.8k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
1052
32.8k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
1053
                                   statemachine */
1054
        /* codeword decoded */
1055
84.9k
      } else {
1056
        /* write sign count result into codewordsideinfo of current codeword */
1057
84.9k
        pCntSign[codewordOffset] = cntSign;
1058
84.9k
        pSta[codewordOffset] = BODY_SIGN_ESC__SIGN; /* change state */
1059
84.9k
        pHcr->nonPcwSideinfo.pState =
1060
84.9k
            aStateConstant2State[pSta[codewordOffset]]; /* get state from
1061
                                                           separate array of
1062
                                                           cw-sideinfo */
1063
84.9k
      }
1064
117k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* the last reinitialzation
1065
                                                      of for loop counter (see
1066
                                                      above) is done here */
1067
117k
      break; /* end of branch in tree reached  i.e. a whole nonPCW-Body is
1068
                decoded */
1069
674k
    } else { /* body is not decoded completely: */
1070
      /* update treeNode for further step in decoding tree and store updated
1071
       * treeNode because maybe no more bits left in segment */
1072
674k
      treeNode = *(pCurrentTree + branchValue);
1073
674k
      iNode[codewordOffset] = treeNode;
1074
674k
    }
1075
792k
  }
1076
1077
125k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1078
8.08k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1079
8.08k
                         pSegmentBitfield); /* clear a bit in bitfield and
1080
                                               switch off statemachine */
1081
1082
8.08k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1083
716
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__BODY;
1084
716
      return BODY_SIGN_ESC__BODY;
1085
716
    }
1086
8.08k
  }
1087
1088
124k
  return STOP_THIS_STATE;
1089
125k
}
1090
1091
/*---------------------------------------------------------------------------------------------
1092
     description: This state decodes the sign bits, if a codeword of codebook 11
1093
needs some. A flag named 'flagB' in codeword sideinfo is set, if the second line
1094
of quantized spectral values is 16. The 'flagB' is used in case of decoding of a
1095
escape sequence is necessary as far as the second line is concerned.
1096
1097
                  If only the first line needs an escape sequence, the flagB is
1098
cleared. If only the second line needs an escape sequence, the flagB is not
1099
used.
1100
1101
                  For storing sideinfo in case of escape sequence decoding one
1102
single word can be used for both escape sequences because they are decoded not
1103
at the same time:
1104
1105
1106
                  bit 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5
1107
4  3  2  1  0
1108
                      ===== == == =========== ===========
1109
=================================== ^      ^  ^         ^            ^
1110
^ |      |  |         |            |                    | res. flagA  flagB
1111
escapePrefixUp  escapePrefixDown  escapeWord
1112
1113
-----------------------------------------------------------------------------------------------
1114
        output:   Two lines with correct sign. If one or two values is/are 16,
1115
the lines are not valid, otherwise they are.
1116
-----------------------------------------------------------------------------------------------
1117
        return:   0
1118
--------------------------------------------------------------------------------------------
1119
*/
1120
85.2k
UINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) {
1121
85.2k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
1122
85.2k
  SCHAR *pRemainingBitsInSegment;
1123
85.2k
  INT *pLeftStartOfSegment;
1124
85.2k
  INT *pRightStartOfSegment;
1125
85.2k
  UCHAR readDirection;
1126
85.2k
  UINT *pSegmentBitfield;
1127
85.2k
  UINT *pCodewordBitfield;
1128
85.2k
  UINT segmentOffset;
1129
1130
85.2k
  UINT *iNode;
1131
85.2k
  UCHAR *pCntSign;
1132
85.2k
  FIXP_DBL *pResultBase;
1133
85.2k
  USHORT *iResultPointer;
1134
85.2k
  UINT *pEscapeSequenceInfo;
1135
85.2k
  UINT codewordOffset;
1136
1137
85.2k
  UINT iQSC;
1138
85.2k
  UCHAR cntSign;
1139
85.2k
  UINT flagA;
1140
85.2k
  UINT flagB;
1141
85.2k
  UINT flags;
1142
85.2k
  UCHAR carryBit;
1143
85.2k
  SCHAR *pSta;
1144
1145
85.2k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1146
85.2k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1147
85.2k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
1148
85.2k
  readDirection = pHcr->segmentInfo.readDirection;
1149
85.2k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
1150
85.2k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
1151
85.2k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
1152
1153
85.2k
  iNode = pHcr->nonPcwSideinfo.iNode;
1154
85.2k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
1155
85.2k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
1156
85.2k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
1157
85.2k
  pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
1158
85.2k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
1159
85.2k
  pSta = pHcr->nonPcwSideinfo.pSta;
1160
1161
85.2k
  iQSC = iResultPointer[codewordOffset];
1162
85.2k
  cntSign = pCntSign[codewordOffset];
1163
1164
  /* loop for sign bit decoding */
1165
159k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1166
158k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1167
158k
    carryBit = HcrGetABitFromBitstream(
1168
158k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1169
158k
        &pRightStartOfSegment[segmentOffset], readDirection);
1170
1171
    /* decrement sign counter because one sign bit has been read */
1172
158k
    cntSign -= 1;
1173
158k
    pCntSign[codewordOffset] = cntSign;
1174
1175
    /* get a quantized spectral value (which was decoded in previous state)
1176
     * which is not zero. [This value will get a sign] */
1177
161k
    while (pResultBase[iQSC] == (FIXP_DBL)0) {
1178
2.86k
      if (++iQSC >= 1024) {
1179
0
        return BODY_SIGN_ESC__SIGN;
1180
0
      }
1181
2.86k
    }
1182
158k
    iResultPointer[codewordOffset] = iQSC;
1183
1184
    /* put negative sign together with quantized spectral value; if carryBit is
1185
     * zero, the sign is ok already; no write operation necessary in this case
1186
     */
1187
158k
    if (carryBit != 0) {
1188
82.5k
      pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */
1189
82.5k
    }
1190
158k
    iQSC++; /* update index to next (maybe valid) value */
1191
158k
    iResultPointer[codewordOffset] = iQSC;
1192
1193
158k
    if (cntSign == 0) {
1194
      /* all sign bits are decoded now */
1195
84.8k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
1196
                                                      for loop counter (see
1197
                                                      above) is done here */
1198
1199
      /* check decoded values if codeword is decoded: Check if one or two escape
1200
       * sequences 16 follow */
1201
1202
      /* step 0 */
1203
      /* restore pointer to first decoded quantized value [ = original
1204
       * pResultPointr] from index iNode prepared in State_BODY_SIGN_ESC__BODY
1205
       */
1206
84.8k
      iQSC = iNode[codewordOffset];
1207
1208
      /* step 1 */
1209
      /* test first value if escape sequence follows */
1210
84.8k
      flagA = 0; /* for first possible escape sequence */
1211
84.8k
      if (fixp_abs(pResultBase[iQSC++]) == (FIXP_DBL)ESCAPE_VALUE) {
1212
3.45k
        flagA = 1;
1213
3.45k
      }
1214
1215
      /* step 2 */
1216
      /* test second value if escape sequence follows */
1217
84.8k
      flagB = 0; /* for second possible escape sequence */
1218
84.8k
      if (fixp_abs(pResultBase[iQSC]) == (FIXP_DBL)ESCAPE_VALUE) {
1219
16.3k
        flagB = 1;
1220
16.3k
      }
1221
1222
      /* step 3 */
1223
      /* evaluate flag result and go on if necessary */
1224
84.8k
      if (!flagA && !flagB) {
1225
66.8k
        ClearBitFromBitfield(
1226
66.8k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
1227
66.8k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
1228
                                   statemachine */
1229
66.8k
      } else {
1230
        /* at least one of two lines is 16 */
1231
        /* store both flags at correct positions in non PCW codeword sideinfo
1232
         * pEscapeSequenceInfo[codewordOffset] */
1233
18.0k
        flags = flagA << POSITION_OF_FLAG_A;
1234
18.0k
        flags |= (flagB << POSITION_OF_FLAG_B);
1235
18.0k
        pEscapeSequenceInfo[codewordOffset] = flags;
1236
1237
        /* set next state */
1238
18.0k
        pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX;
1239
18.0k
        pHcr->nonPcwSideinfo.pState =
1240
18.0k
            aStateConstant2State[pSta[codewordOffset]]; /* get state from
1241
                                                           separate array of
1242
                                                           cw-sideinfo */
1243
1244
        /* set result pointer to the first line of the two decoded lines */
1245
18.0k
        iResultPointer[codewordOffset] = iNode[codewordOffset];
1246
1247
18.0k
        if (!flagA && flagB) {
1248
          /* update pResultPointr ==> state Stat_BODY_SIGN_ESC__ESC_WORD writes
1249
           * to correct position. Second value is the one and only escape value
1250
           */
1251
14.5k
          iQSC = iResultPointer[codewordOffset];
1252
14.5k
          iQSC++;
1253
14.5k
          iResultPointer[codewordOffset] = iQSC;
1254
14.5k
        }
1255
1256
18.0k
      }      /* at least one of two lines is 16 */
1257
84.8k
      break; /* nonPCW-Body at cb 11 and according sign bits are decoded */
1258
1259
84.8k
    } /* if ( cntSign == 0 ) */
1260
158k
  }   /* loop over remaining Bits in segment */
1261
1262
85.2k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1263
1.01k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1264
1.01k
                         pSegmentBitfield); /* clear a bit in bitfield and
1265
                                               switch off statemachine */
1266
1267
1.01k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1268
1
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__SIGN;
1269
1
      return BODY_SIGN_ESC__SIGN;
1270
1
    }
1271
1.01k
  }
1272
85.2k
  return STOP_THIS_STATE;
1273
85.2k
}
1274
1275
/*---------------------------------------------------------------------------------------------
1276
     description: Decode escape prefix of first or second escape sequence. The
1277
escape prefix consists of ones. The following zero is also decoded here.
1278
-----------------------------------------------------------------------------------------------
1279
        output:   If the single separator-zero which follows the
1280
escape-prefix-ones is not yet decoded: The value 'escapePrefixUp' in word
1281
pEscapeSequenceInfo[codewordOffset] is updated.
1282
1283
                  If the single separator-zero which follows the
1284
escape-prefix-ones is decoded: Two updated values 'escapePrefixUp' and
1285
'escapePrefixDown' in word pEscapeSequenceInfo[codewordOffset]. This State is
1286
finished. Switch to next state.
1287
-----------------------------------------------------------------------------------------------
1288
        return:   0
1289
--------------------------------------------------------------------------------------------
1290
*/
1291
19.9k
UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM bs, void *ptr) {
1292
19.9k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
1293
19.9k
  SCHAR *pRemainingBitsInSegment;
1294
19.9k
  INT *pLeftStartOfSegment;
1295
19.9k
  INT *pRightStartOfSegment;
1296
19.9k
  UCHAR readDirection;
1297
19.9k
  UINT *pSegmentBitfield;
1298
19.9k
  UINT segmentOffset;
1299
19.9k
  UINT *pEscapeSequenceInfo;
1300
19.9k
  UINT codewordOffset;
1301
19.9k
  UCHAR carryBit;
1302
19.9k
  UINT escapePrefixUp;
1303
19.9k
  SCHAR *pSta;
1304
1305
19.9k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1306
19.9k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1307
19.9k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
1308
19.9k
  readDirection = pHcr->segmentInfo.readDirection;
1309
19.9k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
1310
19.9k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
1311
19.9k
  pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
1312
19.9k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
1313
19.9k
  pSta = pHcr->nonPcwSideinfo.pSta;
1314
1315
19.9k
  escapePrefixUp =
1316
19.9k
      (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >>
1317
19.9k
      LSB_ESCAPE_PREFIX_UP;
1318
1319
  /* decode escape prefix */
1320
49.8k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1321
49.5k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1322
49.5k
    carryBit = HcrGetABitFromBitstream(
1323
49.5k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1324
49.5k
        &pRightStartOfSegment[segmentOffset], readDirection);
1325
1326
    /* count ones and store sum in escapePrefixUp */
1327
49.5k
    if (carryBit == 1) {
1328
29.9k
      escapePrefixUp += 1; /* update conter for ones */
1329
29.9k
      if (escapePrefixUp > 8) {
1330
54
        pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX;
1331
54
        return BODY_SIGN_ESC__ESC_PREFIX;
1332
54
      }
1333
1334
      /* store updated counter in sideinfo of current codeword */
1335
29.8k
      pEscapeSequenceInfo[codewordOffset] &=
1336
29.8k
          ~MASK_ESCAPE_PREFIX_UP;              /* delete old escapePrefixUp */
1337
29.8k
      escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */
1338
29.8k
      pEscapeSequenceInfo[codewordOffset] |=
1339
29.8k
          escapePrefixUp;                      /* insert new escapePrefixUp */
1340
29.8k
      escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */
1341
29.8k
    } else {                                   /* separator [zero] reached */
1342
19.6k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
1343
                                                      for loop counter (see
1344
                                                      above) is done here */
1345
19.6k
      escapePrefixUp +=
1346
19.6k
          4; /* if escape_separator '0' appears, add 4 and ==> break */
1347
1348
      /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit
1349
       * position escapePrefixUp */
1350
19.6k
      pEscapeSequenceInfo[codewordOffset] &=
1351
19.6k
          ~MASK_ESCAPE_PREFIX_UP;              /* delete old escapePrefixUp */
1352
19.6k
      escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */
1353
19.6k
      pEscapeSequenceInfo[codewordOffset] |=
1354
19.6k
          escapePrefixUp;                      /* insert new escapePrefixUp */
1355
19.6k
      escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */
1356
1357
      /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit
1358
       * position escapePrefixDown */
1359
19.6k
      pEscapeSequenceInfo[codewordOffset] &=
1360
19.6k
          ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */
1361
19.6k
      escapePrefixUp <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */
1362
19.6k
      pEscapeSequenceInfo[codewordOffset] |=
1363
19.6k
          escapePrefixUp; /* insert new escapePrefixDown */
1364
1365
19.6k
      pSta[codewordOffset] = BODY_SIGN_ESC__ESC_WORD; /* set next state */
1366
19.6k
      pHcr->nonPcwSideinfo.pState =
1367
19.6k
          aStateConstant2State[pSta[codewordOffset]]; /* get state from separate
1368
                                                         array of cw-sideinfo */
1369
19.6k
      break;
1370
19.6k
    }
1371
49.5k
  }
1372
1373
19.8k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1374
258
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1375
258
                         pSegmentBitfield); /* clear a bit in bitfield and
1376
                                               switch off statemachine */
1377
1378
258
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1379
1
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX;
1380
1
      return BODY_SIGN_ESC__ESC_PREFIX;
1381
1
    }
1382
258
  }
1383
1384
19.8k
  return STOP_THIS_STATE;
1385
19.8k
}
1386
1387
/*---------------------------------------------------------------------------------------------
1388
     description: Decode escapeWord of escape sequence. If the escape sequence
1389
is decoded completely, assemble quantized-spectral-escape-coefficient and
1390
replace the previous decoded 16 by the new value. Test flagB. If flagB is set,
1391
the second escape sequence must be decoded. If flagB is not set, the codeword is
1392
decoded and the state machine is switched off.
1393
-----------------------------------------------------------------------------------------------
1394
        output:   Two lines with valid sign. At least one of both lines has got
1395
the correct value.
1396
-----------------------------------------------------------------------------------------------
1397
        return:   0
1398
--------------------------------------------------------------------------------------------
1399
*/
1400
19.8k
UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM bs, void *ptr) {
1401
19.8k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
1402
19.8k
  SCHAR *pRemainingBitsInSegment;
1403
19.8k
  INT *pLeftStartOfSegment;
1404
19.8k
  INT *pRightStartOfSegment;
1405
19.8k
  UCHAR readDirection;
1406
19.8k
  UINT *pSegmentBitfield;
1407
19.8k
  UINT *pCodewordBitfield;
1408
19.8k
  UINT segmentOffset;
1409
1410
19.8k
  FIXP_DBL *pResultBase;
1411
19.8k
  USHORT *iResultPointer;
1412
19.8k
  UINT *pEscapeSequenceInfo;
1413
19.8k
  UINT codewordOffset;
1414
1415
19.8k
  UINT escapeWord;
1416
19.8k
  UINT escapePrefixDown;
1417
19.8k
  UINT escapePrefixUp;
1418
19.8k
  UCHAR carryBit;
1419
19.8k
  UINT iQSC;
1420
19.8k
  INT sign;
1421
19.8k
  UINT flagA;
1422
19.8k
  UINT flagB;
1423
19.8k
  SCHAR *pSta;
1424
1425
19.8k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1426
19.8k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1427
19.8k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
1428
19.8k
  readDirection = pHcr->segmentInfo.readDirection;
1429
19.8k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
1430
19.8k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
1431
19.8k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
1432
1433
19.8k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
1434
19.8k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
1435
19.8k
  pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
1436
19.8k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
1437
19.8k
  pSta = pHcr->nonPcwSideinfo.pSta;
1438
1439
19.8k
  escapeWord = pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_WORD;
1440
19.8k
  escapePrefixDown =
1441
19.8k
      (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_DOWN) >>
1442
19.8k
      LSB_ESCAPE_PREFIX_DOWN;
1443
1444
  /* decode escape word */
1445
108k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1446
108k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1447
108k
    carryBit = HcrGetABitFromBitstream(
1448
108k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1449
108k
        &pRightStartOfSegment[segmentOffset], readDirection);
1450
1451
    /* build escape word */
1452
108k
    escapeWord <<=
1453
108k
        1; /* left shift previous decoded part of escapeWord by on bit */
1454
108k
    escapeWord = escapeWord | carryBit; /* assemble escape word by bitwise or */
1455
1456
    /* decrement counter for length of escape word because one more bit was
1457
     * decoded */
1458
108k
    escapePrefixDown -= 1;
1459
1460
    /* store updated escapePrefixDown */
1461
108k
    pEscapeSequenceInfo[codewordOffset] &=
1462
108k
        ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */
1463
108k
    escapePrefixDown <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */
1464
108k
    pEscapeSequenceInfo[codewordOffset] |=
1465
108k
        escapePrefixDown; /* insert new escapePrefixDown */
1466
108k
    escapePrefixDown >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back */
1467
1468
    /* store updated escapeWord */
1469
108k
    pEscapeSequenceInfo[codewordOffset] &=
1470
108k
        ~MASK_ESCAPE_WORD; /* delete old escapeWord */
1471
108k
    pEscapeSequenceInfo[codewordOffset] |=
1472
108k
        escapeWord; /* insert new escapeWord */
1473
1474
108k
    if (escapePrefixDown == 0) {
1475
19.6k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
1476
                                                      for loop counter (see
1477
                                                      above) is done here */
1478
1479
      /* escape sequence decoded. Assemble escape-line and replace original line
1480
       */
1481
1482
      /* step 0 */
1483
      /* derive sign */
1484
19.6k
      iQSC = iResultPointer[codewordOffset];
1485
19.6k
      sign = (pResultBase[iQSC] >= (FIXP_DBL)0)
1486
19.6k
                 ? 1
1487
19.6k
                 : -1; /* get sign of escape value 16 */
1488
1489
      /* step 1 */
1490
      /* get escapePrefixUp */
1491
19.6k
      escapePrefixUp =
1492
19.6k
          (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >>
1493
19.6k
          LSB_ESCAPE_PREFIX_UP;
1494
1495
      /* step 2 */
1496
      /* calculate escape value */
1497
19.6k
      pResultBase[iQSC] =
1498
19.6k
          (FIXP_DBL)(sign * (((INT)1 << escapePrefixUp) + (INT)escapeWord));
1499
1500
      /* get both flags from sideinfo (flags are not shifted to the
1501
       * lsb-position) */
1502
19.6k
      flagA = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_A;
1503
19.6k
      flagB = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_B;
1504
1505
      /* step 3 */
1506
      /* clear the whole escape sideinfo word */
1507
19.6k
      pEscapeSequenceInfo[codewordOffset] = 0;
1508
1509
      /* change state in dependence of flag flagB */
1510
19.6k
      if (flagA != 0) {
1511
        /* first escape sequence decoded; previous decoded 16 has been replaced
1512
         * by valid line */
1513
1514
        /* clear flagA in sideinfo word because this escape sequence has already
1515
         * beed decoded */
1516
3.35k
        pEscapeSequenceInfo[codewordOffset] &= ~MASK_FLAG_A;
1517
1518
3.35k
        if (flagB == 0) {
1519
1.58k
          ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1520
1.58k
                               pCodewordBitfield); /* clear a bit in bitfield
1521
                                                      and switch off
1522
                                                      statemachine */
1523
1.76k
        } else {
1524
          /* updated pointer to next and last 16 */
1525
1.76k
          iQSC++;
1526
1.76k
          iResultPointer[codewordOffset] = iQSC;
1527
1528
          /* change state */
1529
1.76k
          pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX;
1530
1.76k
          pHcr->nonPcwSideinfo.pState =
1531
1.76k
              aStateConstant2State[pSta[codewordOffset]]; /* get state from
1532
                                                             separate array of
1533
                                                             cw-sideinfo */
1534
1.76k
        }
1535
16.3k
      } else {
1536
16.3k
        ClearBitFromBitfield(
1537
16.3k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
1538
16.3k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
1539
                                   statemachine */
1540
16.3k
      }
1541
19.6k
      break;
1542
19.6k
    }
1543
108k
  }
1544
1545
19.8k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1546
281
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1547
281
                         pSegmentBitfield); /* clear a bit in bitfield and
1548
                                               switch off statemachine */
1549
1550
281
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1551
1
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_WORD;
1552
1
      return BODY_SIGN_ESC__ESC_WORD;
1553
1
    }
1554
281
  }
1555
1556
19.8k
  return STOP_THIS_STATE;
1557
19.8k
}