Coverage Report

Created: 2023-03-26 06:13

/src/aac/libAACdec/src/aacdec_hcrs.cpp
Line
Count
Source (jump to first uncovered line)
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
5.53k
void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) {
131
5.53k
  UINT numValidSegment;
132
5.53k
  INT segmentOffset;
133
5.53k
  INT codewordOffsetBase;
134
5.53k
  INT codewordOffset;
135
5.53k
  UINT trial;
136
137
5.53k
  UINT *pNumSegment;
138
5.53k
  SCHAR *pRemainingBitsInSegment;
139
5.53k
  UINT *pSegmentBitfield;
140
5.53k
  UCHAR *pNumWordForBitfield;
141
5.53k
  USHORT *pNumBitValidInLastWord;
142
5.53k
  UINT *pCodewordBitfield;
143
5.53k
  INT bitfieldWord;
144
5.53k
  INT bitInWord;
145
5.53k
  UINT tempWord;
146
5.53k
  UINT interMediateWord;
147
5.53k
  INT tempBit;
148
5.53k
  INT carry;
149
150
5.53k
  UINT numCodeword;
151
5.53k
  UCHAR numSet;
152
5.53k
  UCHAR currentSet;
153
5.53k
  UINT codewordInSet;
154
5.53k
  UINT remainingCodewordsInSet;
155
5.53k
  SCHAR *pSta;
156
5.53k
  UINT ret;
157
158
5.53k
  pNumSegment = &(pHcr->segmentInfo.numSegment);
159
5.53k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
160
5.53k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
161
5.53k
  pNumWordForBitfield = &(pHcr->segmentInfo.numWordForBitfield);
162
5.53k
  pNumBitValidInLastWord = &(pHcr->segmentInfo.pNumBitValidInLastWord);
163
5.53k
  pSta = pHcr->nonPcwSideinfo.pSta;
164
165
5.53k
  numValidSegment = InitSegmentBitfield(pNumSegment, pRemainingBitsInSegment,
166
5.53k
                                        pSegmentBitfield, pNumWordForBitfield,
167
5.53k
                                        pNumBitValidInLastWord);
168
169
5.53k
  if (numValidSegment != 0) {
170
5.34k
    numCodeword = pHcr->sectionInfo.numCodeword;
171
5.34k
    numSet = ((numCodeword - 1) / *pNumSegment) + 1;
172
173
5.34k
    pHcr->segmentInfo.readDirection = FROM_RIGHT_TO_LEFT;
174
175
    /* Process sets subsequently */
176
5.34k
    numSet = fMin(numSet, (UCHAR)MAX_HCR_SETS);
177
29.4k
    for (currentSet = 1; currentSet < numSet; currentSet++) {
178
179
      /* step 1 */
180
25.7k
      numCodeword -=
181
25.7k
          *pNumSegment; /* number of remaining non PCWs [for all sets] */
182
25.7k
      if (numCodeword < *pNumSegment) {
183
3.10k
        codewordInSet = numCodeword; /* for last set */
184
22.6k
      } else {
185
22.6k
        codewordInSet = *pNumSegment; /* for all sets except last set */
186
22.6k
      }
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
25.7k
      tempWord = 0xFFFFFFFF;
193
25.7k
      pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
194
195
52.7k
      for (bitfieldWord = *pNumWordForBitfield; bitfieldWord != 0;
196
27.0k
           bitfieldWord--) { /* loop over all used words */
197
27.0k
        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
777
          *pCodewordBitfield++ = tempWord;
202
777
          codewordInSet -= NUMBER_OF_BIT_IN_WORD; /* subtract number of bits */
203
26.2k
        } else {
204
          /* prepare last tempWord */
205
26.2k
          for (remainingCodewordsInSet = codewordInSet;
206
683k
               remainingCodewordsInSet < NUMBER_OF_BIT_IN_WORD;
207
657k
               remainingCodewordsInSet++) {
208
657k
            tempWord =
209
657k
                tempWord &
210
657k
                ~(1
211
657k
                  << (NUMBER_OF_BIT_IN_WORD - 1 -
212
657k
                      remainingCodewordsInSet)); /* set a zero at bit number
213
                                                    (NUMBER_OF_BIT_IN_WORD-1-i)
214
                                                    in tempWord */
215
657k
          }
216
26.2k
          *pCodewordBitfield++ = tempWord;
217
26.2k
          tempWord = 0x00000000;
218
26.2k
        }
219
27.0k
      }
220
25.7k
      pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
221
222
      /* step 3 */
223
      /* build non-PCW sideinfo for each non-PCW of the current set */
224
25.7k
      InitNonPCWSideInformationForCurrentSet(pHcr);
225
226
      /* step 4 */
227
      /* decode all non-PCWs belonging to this set */
228
229
      /* loop over trials */
230
25.7k
      codewordOffsetBase = 0;
231
230k
      for (trial = *pNumSegment; trial > 0; trial--) {
232
        /* loop over number of words in bitfields */
233
205k
        segmentOffset = 0; /* start at zero in every segment */
234
205k
        pHcr->segmentInfo.segmentOffset =
235
205k
            segmentOffset; /* store in structure for states */
236
205k
        codewordOffset = codewordOffsetBase;
237
205k
        pHcr->nonPcwSideinfo.codewordOffset =
238
205k
            codewordOffset; /* store in structure for states */
239
240
589k
        for (bitfieldWord = 0; bitfieldWord < *pNumWordForBitfield;
241
384k
             bitfieldWord++) {
242
          /* derive tempWord with bitwise and */
243
384k
          tempWord =
244
384k
              pSegmentBitfield[bitfieldWord] & pCodewordBitfield[bitfieldWord];
245
246
          /* if tempWord is not zero, decode something */
247
384k
          if (tempWord != 0) {
248
            /* loop over all bits in tempWord; start state machine if & is true
249
             */
250
1.12M
            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
126k
                pHcr->nonPcwSideinfo.pState =
256
126k
                    aStateConstant2State[pSta[codewordOffset]];
257
258
300k
                while (pHcr->nonPcwSideinfo.pState) {
259
175k
                  ret = ((STATEFUNC)pHcr->nonPcwSideinfo.pState)(bs, pHcr);
260
175k
                  if (ret != 0) {
261
1.61k
                    return;
262
1.61k
                  }
263
175k
                }
264
126k
              }
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
349k
          } else {
277
349k
            segmentOffset +=
278
349k
                NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */
279
349k
            pHcr->segmentInfo.segmentOffset = segmentOffset;
280
349k
            codewordOffset +=
281
349k
                NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */
282
349k
            codewordOffset = ModuloValue(
283
349k
                codewordOffset,
284
349k
                *pNumSegment); /* index of the current codeword lies within
285
                                  modulo range */
286
349k
            pHcr->nonPcwSideinfo.codewordOffset = codewordOffset;
287
349k
          }
288
384k
        } /* end of bitfield word loop */
289
290
        /* decrement codeword - pointer */
291
204k
        codewordOffsetBase -= 1;
292
204k
        codewordOffsetBase =
293
204k
            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
204k
        tempBit = pCodewordBitfield[*pNumWordForBitfield - 1] &
303
204k
                  (1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord));
304
204k
        tempBit = tempBit >> (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord);
305
306
        /* write zero into place where tempBit was fetched from */
307
204k
        pCodewordBitfield[*pNumWordForBitfield - 1] =
308
204k
            pCodewordBitfield[*pNumWordForBitfield - 1] &
309
204k
            ~(1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord));
310
311
        /* rotate last valid word */
312
204k
        pCodewordBitfield[*pNumWordForBitfield - 1] =
313
204k
            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
383k
        for (bitfieldWord = *pNumWordForBitfield - 2; bitfieldWord > -1;
318
204k
             bitfieldWord--) {
319
          /* get carry (=bit at position 0) from current word */
320
178k
          carry = pCodewordBitfield[bitfieldWord] & 1;
321
322
          /* put the carry bit at position 31 into word right from current word
323
           */
324
178k
          pCodewordBitfield[bitfieldWord + 1] =
325
178k
              pCodewordBitfield[bitfieldWord + 1] |
326
178k
              (carry << (NUMBER_OF_BIT_IN_WORD - 1));
327
328
          /* shift current word */
329
178k
          pCodewordBitfield[bitfieldWord] =
330
178k
              pCodewordBitfield[bitfieldWord] >> 1;
331
178k
        }
332
333
        /* put tempBit into free bit-position 31 from first word */
334
204k
        pCodewordBitfield[0] =
335
204k
            pCodewordBitfield[0] | (tempBit << (NUMBER_OF_BIT_IN_WORD - 1));
336
337
204k
      } /* end of trial loop */
338
339
      /* toggle read direction */
340
24.0k
      pHcr->segmentInfo.readDirection =
341
24.0k
          ToggleReadDirection(pHcr->segmentInfo.readDirection);
342
24.0k
    }
343
    /* end of set loop */
344
345
    /* all non-PCWs of this spectrum are decoded */
346
5.34k
  }
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
5.53k
}
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
5.53k
                                USHORT *pNumBitValidInLastWord) {
366
5.53k
  SHORT i;
367
5.53k
  USHORT r;
368
5.53k
  UCHAR bitfieldWord;
369
5.53k
  UINT tempWord;
370
5.53k
  USHORT numValidSegment;
371
372
5.53k
  *pNumWordForBitfield =
373
5.53k
      (*pNumSegment == 0)
374
5.53k
          ? 0
375
5.53k
          : ((*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
5.53k
  numValidSegment = 0;
381
5.53k
  *pNumBitValidInLastWord = *pNumSegment;
382
383
  /* loop over words */
384
7.25k
  for (bitfieldWord = 0; bitfieldWord < *pNumWordForBitfield - 1;
385
5.53k
       bitfieldWord++) {
386
1.71k
    tempWord = 0xFFFFFFFF; /* set ones */
387
1.71k
    r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG;
388
56.7k
    for (i = 0; i < NUMBER_OF_BIT_IN_WORD; i++) {
389
55.0k
      if (pRemainingBitsInSegment[r + i] == 0) {
390
9.66k
        tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 -
391
9.66k
                                      i)); /* set a zero at bit number
392
                                              (NUMBER_OF_BIT_IN_WORD-1-i) in
393
                                              tempWord */
394
45.3k
      } else {
395
45.3k
        numValidSegment += 1; /* count segments which are not empty */
396
45.3k
      }
397
55.0k
    }
398
1.71k
    pSegmentBitfield[bitfieldWord] = tempWord;        /* store result */
399
1.71k
    *pNumBitValidInLastWord -= NUMBER_OF_BIT_IN_WORD; /* calculate number of
400
                                                         zeros on LSB side in
401
                                                         the last word */
402
1.71k
  }
403
404
  /* calculate last word: prepare special tempWord */
405
5.53k
  tempWord = 0xFFFFFFFF;
406
121k
  for (i = 0; i < (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); i++) {
407
116k
    tempWord = tempWord & ~(1 << i); /* clear bit i in tempWord */
408
116k
  }
409
410
  /* calculate last word */
411
5.53k
  r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG;
412
66.7k
  for (i = 0; i < *pNumBitValidInLastWord; i++) {
413
61.2k
    if (pRemainingBitsInSegment[r + i] == 0) {
414
4.08k
      tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD - 1 -
415
4.08k
                                    i)); /* set a zero at bit number
416
                                            (NUMBER_OF_BIT_IN_WORD-1-i) in
417
                                            tempWord */
418
57.1k
    } else {
419
57.1k
      numValidSegment += 1; /* count segments which are not empty */
420
57.1k
    }
421
61.2k
  }
422
5.53k
  pSegmentBitfield[bitfieldWord] = tempWord; /* store result */
423
424
5.53k
  return numValidSegment;
425
5.53k
}
426
427
/*---------------------------------------------------------------------------------------------
428
  description:  This function sets up sideinfo for the non-PCW decoder (for the
429
current set).
430
---------------------------------------------------------------------------------------------*/
431
25.7k
static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr) {
432
25.7k
  USHORT i, k;
433
25.7k
  UCHAR codebookDim;
434
25.7k
  UINT startNode;
435
436
25.7k
  UCHAR *pCodebook = pHcr->nonPcwSideinfo.pCodebook;
437
25.7k
  UINT *iNode = pHcr->nonPcwSideinfo.iNode;
438
25.7k
  UCHAR *pCntSign = pHcr->nonPcwSideinfo.pCntSign;
439
25.7k
  USHORT *iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
440
25.7k
  UINT *pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
441
25.7k
  SCHAR *pSta = pHcr->nonPcwSideinfo.pSta;
442
25.7k
  USHORT *pNumExtendedSortedCodewordInSection =
443
25.7k
      pHcr->sectionInfo.pNumExtendedSortedCodewordInSection;
444
25.7k
  int numExtendedSortedCodewordInSectionIdx =
445
25.7k
      pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx;
446
25.7k
  UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook;
447
25.7k
  int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx;
448
25.7k
  USHORT *pNumExtendedSortedSectionsInSets =
449
25.7k
      pHcr->sectionInfo.pNumExtendedSortedSectionsInSets;
450
25.7k
  int numExtendedSortedSectionsInSetsIdx =
451
25.7k
      pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx;
452
25.7k
  int quantizedSpectralCoefficientsIdx =
453
25.7k
      pHcr->decInOut.quantizedSpectralCoefficientsIdx;
454
25.7k
  const UCHAR *pCbDimension = aDimCb;
455
25.7k
  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
25.7k
  for (i = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx];
461
67.1k
       i != 0; i--) {
462
41.4k
    codebookDim =
463
41.4k
        pCbDimension[pExtendedSortedCodebook[extendedSortedCodebookIdx]];
464
41.4k
    startNode = *aHuffTable[pExtendedSortedCodebook[extendedSortedCodebookIdx]];
465
466
41.4k
    for (k = pNumExtendedSortedCodewordInSection
467
41.4k
             [numExtendedSortedCodewordInSectionIdx];
468
243k
         k != 0; k--) {
469
202k
      iterationCounter++;
470
202k
      if (iterationCounter > (1024 >> 2)) {
471
2
        return;
472
2
      }
473
202k
      *pSta++ = aCodebook2StartInt
474
202k
          [pExtendedSortedCodebook[extendedSortedCodebookIdx]];
475
202k
      *pCodebook++ = pExtendedSortedCodebook[extendedSortedCodebookIdx];
476
202k
      *iNode++ = startNode;
477
202k
      *pCntSign++ = 0;
478
202k
      *iResultPointer++ = quantizedSpectralCoefficientsIdx;
479
202k
      *pEscapeSequenceInfo++ = 0;
480
202k
      quantizedSpectralCoefficientsIdx +=
481
202k
          codebookDim; /* update pointer by codebookDim --> point to next
482
                          starting value for writing out */
483
202k
      if (quantizedSpectralCoefficientsIdx >= 1024) {
484
18
        return;
485
18
      }
486
202k
    }
487
41.4k
    numExtendedSortedCodewordInSectionIdx++; /* inc ptr for next ext sort sec in
488
                                                current set */
489
41.4k
    extendedSortedCodebookIdx++; /* inc ptr for next ext sort sec in current set
490
                                  */
491
41.4k
    if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS) ||
492
41.4k
        extendedSortedCodebookIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
493
0
      return;
494
0
    }
495
41.4k
  }
496
25.6k
  numExtendedSortedSectionsInSetsIdx++; /* inc ptr for next set of non-PCWs */
497
25.6k
  if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR + MAX_HCR_SETS)) {
498
0
    return;
499
0
  }
500
501
  /* Write back indexes */
502
25.6k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
503
25.6k
      numExtendedSortedCodewordInSectionIdx;
504
25.6k
  pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx;
505
25.6k
  pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx =
506
25.6k
      numExtendedSortedSectionsInSetsIdx;
507
25.6k
  pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx =
508
25.6k
      numExtendedSortedCodewordInSectionIdx;
509
25.6k
  pHcr->decInOut.quantizedSpectralCoefficientsIdx =
510
25.6k
      quantizedSpectralCoefficientsIdx;
511
25.6k
}
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
1.64M
static INT ModuloValue(INT input, INT bufferlength) {
522
1.64M
  if (input > (bufferlength - 1)) {
523
305k
    return (input - bufferlength);
524
305k
  }
525
1.33M
  if (input < 0) {
526
24.1k
    return (input + bufferlength);
527
24.1k
  }
528
1.31M
  return input;
529
1.33M
}
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
132k
                                 UINT *pBitfield) {
543
132k
  UINT numBitfieldWord;
544
132k
  UINT numBitfieldBit;
545
546
  /* get both values needed for clearing the bit */
547
132k
  numBitfieldWord = offset >> THIRTYTWO_LOG_DIV_TWO_LOG; /* int   = wordNr */
548
132k
  numBitfieldBit = offset - (numBitfieldWord
549
132k
                             << THIRTYTWO_LOG_DIV_TWO_LOG); /* fract = bitNr  */
550
551
  /* clear a bit in bitfield */
552
132k
  pBitfield[numBitfieldWord] =
553
132k
      pBitfield[numBitfieldWord] &
554
132k
      ~(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
132k
  *ptrState = NULL;
559
132k
}
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
40.2k
UINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM bs, void *ptr) {
578
40.2k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
579
40.2k
  UINT *pSegmentBitfield;
580
40.2k
  UINT *pCodewordBitfield;
581
40.2k
  UINT segmentOffset;
582
40.2k
  FIXP_DBL *pResultBase;
583
40.2k
  UINT *iNode;
584
40.2k
  USHORT *iResultPointer;
585
40.2k
  UINT codewordOffset;
586
40.2k
  UINT branchNode;
587
40.2k
  UINT branchValue;
588
40.2k
  UINT iQSC;
589
40.2k
  UINT treeNode;
590
40.2k
  UCHAR carryBit;
591
40.2k
  INT *pLeftStartOfSegment;
592
40.2k
  INT *pRightStartOfSegment;
593
40.2k
  SCHAR *pRemainingBitsInSegment;
594
40.2k
  UCHAR readDirection;
595
40.2k
  UCHAR *pCodebook;
596
40.2k
  UCHAR dimCntr;
597
40.2k
  const UINT *pCurrentTree;
598
40.2k
  const UCHAR *pCbDimension;
599
40.2k
  const SCHAR *pQuantVal;
600
40.2k
  const SCHAR *pQuantValBase;
601
602
40.2k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
603
40.2k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
604
40.2k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
605
40.2k
  readDirection = pHcr->segmentInfo.readDirection;
606
40.2k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
607
40.2k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
608
40.2k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
609
610
40.2k
  pCodebook = pHcr->nonPcwSideinfo.pCodebook;
611
40.2k
  iNode = pHcr->nonPcwSideinfo.iNode;
612
40.2k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
613
40.2k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
614
40.2k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
615
616
40.2k
  pCbDimension = aDimCb;
617
618
40.2k
  treeNode = iNode[codewordOffset];
619
40.2k
  pCurrentTree = aHuffTable[pCodebook[codewordOffset]];
620
621
67.4k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
622
65.5k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
623
65.5k
    carryBit = HcrGetABitFromBitstream(
624
65.5k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
625
65.5k
        &pRightStartOfSegment[segmentOffset], readDirection);
626
627
65.5k
    CarryBitToBranchValue(carryBit, /* make a step in decoding tree */
628
65.5k
                          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
65.5k
    if ((branchNode & TEST_BIT_10) ==
633
65.5k
        TEST_BIT_10) { /* test bit 10 ; ==> body is complete */
634
38.4k
      pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base
635
                                                                 address of
636
                                                                 quantized
637
                                                                 values
638
                                                                 belonging to
639
                                                                 current
640
                                                                 codebook */
641
38.4k
      pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid
642
                                                  line [of 2 or 4 quantized
643
                                                  values] */
644
645
38.4k
      iQSC = iResultPointer[codewordOffset]; /* get position of first line for
646
                                                writing out result */
647
648
118k
      for (dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0;
649
80.5k
           dimCntr--) {
650
80.5k
        pResultBase[iQSC++] =
651
80.5k
            (FIXP_DBL)*pQuantVal++; /* write out 2 or 4 lines into
652
                                       spectrum; no Sign bits
653
                                       available in this state */
654
80.5k
      }
655
656
38.4k
      ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
657
38.4k
                           pCodewordBitfield); /* clear a bit in bitfield and
658
                                                  switch off statemachine */
659
38.4k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
660
                                                      for loop counter (see
661
                                                      above) is done here */
662
38.4k
      break; /* end of branch in tree reached  i.e. a whole nonPCW-Body is
663
                decoded */
664
38.4k
    } else { /* body is not decoded completely: */
665
27.1k
      treeNode = *(
666
27.1k
          pCurrentTree +
667
27.1k
          branchValue); /* update treeNode for further step in decoding tree */
668
27.1k
    }
669
65.5k
  }
670
40.2k
  iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe
671
                                       decoding of codeword body not finished
672
                                       yet */
673
674
40.2k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
675
4.85k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
676
4.85k
                         pSegmentBitfield); /* clear a bit in bitfield and
677
                                               switch off statemachine */
678
679
4.85k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
680
1
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_ONLY;
681
1
      return BODY_ONLY;
682
1
    }
683
4.85k
  }
684
685
40.2k
  return STOP_THIS_STATE;
686
40.2k
}
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
46.4k
UINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) {
705
46.4k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
706
46.4k
  SCHAR *pRemainingBitsInSegment;
707
46.4k
  INT *pLeftStartOfSegment;
708
46.4k
  INT *pRightStartOfSegment;
709
46.4k
  UCHAR readDirection;
710
46.4k
  UINT *pSegmentBitfield;
711
46.4k
  UINT *pCodewordBitfield;
712
46.4k
  UINT segmentOffset;
713
714
46.4k
  UCHAR *pCodebook;
715
46.4k
  UINT *iNode;
716
46.4k
  UCHAR *pCntSign;
717
46.4k
  FIXP_DBL *pResultBase;
718
46.4k
  USHORT *iResultPointer;
719
46.4k
  UINT codewordOffset;
720
721
46.4k
  UINT iQSC;
722
46.4k
  UINT cntSign;
723
46.4k
  UCHAR dimCntr;
724
46.4k
  UCHAR carryBit;
725
46.4k
  SCHAR *pSta;
726
46.4k
  UINT treeNode;
727
46.4k
  UINT branchValue;
728
46.4k
  UINT branchNode;
729
46.4k
  const UCHAR *pCbDimension;
730
46.4k
  const UINT *pCurrentTree;
731
46.4k
  const SCHAR *pQuantValBase;
732
46.4k
  const SCHAR *pQuantVal;
733
734
46.4k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
735
46.4k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
736
46.4k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
737
46.4k
  readDirection = pHcr->segmentInfo.readDirection;
738
46.4k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
739
46.4k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
740
46.4k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
741
742
46.4k
  pCodebook = pHcr->nonPcwSideinfo.pCodebook;
743
46.4k
  iNode = pHcr->nonPcwSideinfo.iNode;
744
46.4k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
745
46.4k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
746
46.4k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
747
46.4k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
748
46.4k
  pSta = pHcr->nonPcwSideinfo.pSta;
749
750
46.4k
  pCbDimension = aDimCb;
751
752
46.4k
  treeNode = iNode[codewordOffset];
753
46.4k
  pCurrentTree = aHuffTable[pCodebook[codewordOffset]];
754
755
169k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
756
158k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
757
158k
    carryBit = HcrGetABitFromBitstream(
758
158k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
759
158k
        &pRightStartOfSegment[segmentOffset], readDirection);
760
761
158k
    CarryBitToBranchValue(carryBit, /* make a step in decoding tree */
762
158k
                          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
158k
    if ((branchNode & TEST_BIT_10) ==
767
158k
        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
35.4k
      pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base
771
                                                                 address of
772
                                                                 quantized
773
                                                                 values
774
                                                                 belonging to
775
                                                                 current
776
                                                                 codebook */
777
35.4k
      pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid
778
                                                  line [of 2 or 4 quantized
779
                                                  values] */
780
781
35.4k
      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
35.4k
      cntSign = 0;
789
110k
      for (dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0;
790
74.5k
           dimCntr--) {
791
74.5k
        pResultBase[iQSC++] =
792
74.5k
            (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */
793
74.5k
        if (*pQuantVal++ != 0) {
794
57.3k
          cntSign += 1;
795
57.3k
        }
796
74.5k
      }
797
798
35.4k
      if (cntSign == 0) {
799
6.55k
        ClearBitFromBitfield(
800
6.55k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
801
6.55k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
802
                                   statemachine */
803
28.9k
      } else {
804
28.9k
        pCntSign[codewordOffset] = cntSign;     /* write sign count result into
805
                                                   codewordsideinfo of current
806
                                                   codeword */
807
28.9k
        pSta[codewordOffset] = BODY_SIGN__SIGN; /* change state */
808
28.9k
        pHcr->nonPcwSideinfo.pState =
809
28.9k
            aStateConstant2State[pSta[codewordOffset]]; /* get state from
810
                                                           separate array of
811
                                                           cw-sideinfo */
812
28.9k
      }
813
35.4k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
814
                                                      for loop counter (see
815
                                                      above) is done here */
816
35.4k
      break; /* end of branch in tree reached  i.e. a whole nonPCW-Body is
817
                decoded */
818
123k
    } else { /* body is not decoded completely: */
819
123k
      treeNode = *(
820
123k
          pCurrentTree +
821
123k
          branchValue); /* update treeNode for further step in decoding tree */
822
123k
    }
823
158k
  }
824
46.4k
  iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe
825
                                       decoding of codeword body not finished
826
                                       yet */
827
828
46.4k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
829
11.4k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
830
11.4k
                         pSegmentBitfield); /* clear a bit in bitfield and
831
                                               switch off statemachine */
832
833
11.4k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
834
1.57k
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__BODY;
835
1.57k
      return BODY_SIGN__BODY;
836
1.57k
    }
837
11.4k
  }
838
839
44.9k
  return STOP_THIS_STATE;
840
46.4k
}
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
29.3k
UINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) {
854
29.3k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
855
29.3k
  SCHAR *pRemainingBitsInSegment;
856
29.3k
  INT *pLeftStartOfSegment;
857
29.3k
  INT *pRightStartOfSegment;
858
29.3k
  UCHAR readDirection;
859
29.3k
  UINT *pSegmentBitfield;
860
29.3k
  UINT *pCodewordBitfield;
861
29.3k
  UINT segmentOffset;
862
863
29.3k
  UCHAR *pCntSign;
864
29.3k
  FIXP_DBL *pResultBase;
865
29.3k
  USHORT *iResultPointer;
866
29.3k
  UINT codewordOffset;
867
868
29.3k
  UCHAR carryBit;
869
29.3k
  UINT iQSC;
870
29.3k
  UCHAR cntSign;
871
872
29.3k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
873
29.3k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
874
29.3k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
875
29.3k
  readDirection = pHcr->segmentInfo.readDirection;
876
29.3k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
877
29.3k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
878
29.3k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
879
880
  /*pCodebook               = */
881
29.3k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
882
29.3k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
883
29.3k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
884
29.3k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
885
886
29.3k
  iQSC = iResultPointer[codewordOffset];
887
29.3k
  cntSign = pCntSign[codewordOffset];
888
889
  /* loop for sign bit decoding */
890
57.6k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
891
57.1k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
892
57.1k
    carryBit = HcrGetABitFromBitstream(
893
57.1k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
894
57.1k
        &pRightStartOfSegment[segmentOffset], readDirection);
895
57.1k
    cntSign -=
896
57.1k
        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
58.8k
    while (pResultBase[iQSC] == (FIXP_DBL)0) {
901
1.72k
      if (++iQSC >= 1024) { /* points to current value different from zero */
902
0
        return BODY_SIGN__SIGN;
903
0
      }
904
1.72k
    }
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
57.1k
    if (carryBit != 0) {
909
7.67k
      pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */
910
7.67k
    }
911
912
57.1k
    iQSC++; /* update pointer to next (maybe valid) value */
913
914
57.1k
    if (cntSign == 0) { /* if (cntSign==0)  ==>  set state CODEWORD_DECODED */
915
28.8k
      ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
916
28.8k
                           pCodewordBitfield); /* clear a bit in bitfield and
917
                                                  switch off statemachine */
918
28.8k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
919
                                                      for loop counter (see
920
                                                      above) is done here */
921
28.8k
      break; /* whole nonPCW-Body and according sign bits are decoded */
922
28.8k
    }
923
57.1k
  }
924
29.3k
  pCntSign[codewordOffset] = cntSign;
925
29.3k
  iResultPointer[codewordOffset] = iQSC; /* store updated pResultPointer */
926
927
29.3k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
928
2.19k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
929
2.19k
                         pSegmentBitfield); /* clear a bit in bitfield and
930
                                               switch off statemachine */
931
932
2.19k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
933
4
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__SIGN;
934
4
      return BODY_SIGN__SIGN;
935
4
    }
936
2.19k
  }
937
938
29.3k
  return STOP_THIS_STATE;
939
29.3k
}
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
35.9k
UINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) {
958
35.9k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
959
35.9k
  SCHAR *pRemainingBitsInSegment;
960
35.9k
  INT *pLeftStartOfSegment;
961
35.9k
  INT *pRightStartOfSegment;
962
35.9k
  UCHAR readDirection;
963
35.9k
  UINT *pSegmentBitfield;
964
35.9k
  UINT *pCodewordBitfield;
965
35.9k
  UINT segmentOffset;
966
967
35.9k
  UINT *iNode;
968
35.9k
  UCHAR *pCntSign;
969
35.9k
  FIXP_DBL *pResultBase;
970
35.9k
  USHORT *iResultPointer;
971
35.9k
  UINT codewordOffset;
972
973
35.9k
  UCHAR carryBit;
974
35.9k
  UINT iQSC;
975
35.9k
  UINT cntSign;
976
35.9k
  UINT dimCntr;
977
35.9k
  UINT treeNode;
978
35.9k
  SCHAR *pSta;
979
35.9k
  UINT branchNode;
980
35.9k
  UINT branchValue;
981
35.9k
  const UINT *pCurrentTree;
982
35.9k
  const SCHAR *pQuantValBase;
983
35.9k
  const SCHAR *pQuantVal;
984
985
35.9k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
986
35.9k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
987
35.9k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
988
35.9k
  readDirection = pHcr->segmentInfo.readDirection;
989
35.9k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
990
35.9k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
991
35.9k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
992
993
35.9k
  iNode = pHcr->nonPcwSideinfo.iNode;
994
35.9k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
995
35.9k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
996
35.9k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
997
35.9k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
998
35.9k
  pSta = pHcr->nonPcwSideinfo.pSta;
999
1000
35.9k
  treeNode = iNode[codewordOffset];
1001
35.9k
  pCurrentTree = aHuffTable[ESCAPE_CODEBOOK];
1002
1003
172k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1004
170k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1005
170k
    carryBit = HcrGetABitFromBitstream(
1006
170k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1007
170k
        &pRightStartOfSegment[segmentOffset], readDirection);
1008
1009
    /* make a step in tree */
1010
170k
    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
170k
    if ((branchNode & TEST_BIT_10) ==
1015
170k
        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
33.9k
      pQuantValBase = aQuantTable[ESCAPE_CODEBOOK]; /* get base address of
1021
                                                       quantized values
1022
                                                       belonging to current
1023
                                                       codebook */
1024
33.9k
      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
33.9k
      iNode[codewordOffset] = iResultPointer[codewordOffset];
1031
1032
      /* get position of first line for writing result */
1033
33.9k
      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
33.9k
      cntSign = 0;
1040
1041
101k
      for (dimCntr = DIMENSION_OF_ESCAPE_CODEBOOK; dimCntr != 0; dimCntr--) {
1042
67.9k
        pResultBase[iQSC++] =
1043
67.9k
            (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */
1044
67.9k
        if (*pQuantVal++ != 0) {
1045
22.7k
          cntSign += 1;
1046
22.7k
        }
1047
67.9k
      }
1048
1049
33.9k
      if (cntSign == 0) {
1050
21.5k
        ClearBitFromBitfield(
1051
21.5k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
1052
21.5k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
1053
                                   statemachine */
1054
        /* codeword decoded */
1055
21.5k
      } else {
1056
        /* write sign count result into codewordsideinfo of current codeword */
1057
12.4k
        pCntSign[codewordOffset] = cntSign;
1058
12.4k
        pSta[codewordOffset] = BODY_SIGN_ESC__SIGN; /* change state */
1059
12.4k
        pHcr->nonPcwSideinfo.pState =
1060
12.4k
            aStateConstant2State[pSta[codewordOffset]]; /* get state from
1061
                                                           separate array of
1062
                                                           cw-sideinfo */
1063
12.4k
      }
1064
33.9k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* the last reinitialzation
1065
                                                      of for loop counter (see
1066
                                                      above) is done here */
1067
33.9k
      break; /* end of branch in tree reached  i.e. a whole nonPCW-Body is
1068
                decoded */
1069
136k
    } 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
136k
      treeNode = *(pCurrentTree + branchValue);
1073
136k
      iNode[codewordOffset] = treeNode;
1074
136k
    }
1075
170k
  }
1076
1077
35.9k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1078
3.40k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1079
3.40k
                         pSegmentBitfield); /* clear a bit in bitfield and
1080
                                               switch off statemachine */
1081
1082
3.40k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1083
30
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__BODY;
1084
30
      return BODY_SIGN_ESC__BODY;
1085
30
    }
1086
3.40k
  }
1087
1088
35.9k
  return STOP_THIS_STATE;
1089
35.9k
}
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
12.9k
UINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) {
1121
12.9k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
1122
12.9k
  SCHAR *pRemainingBitsInSegment;
1123
12.9k
  INT *pLeftStartOfSegment;
1124
12.9k
  INT *pRightStartOfSegment;
1125
12.9k
  UCHAR readDirection;
1126
12.9k
  UINT *pSegmentBitfield;
1127
12.9k
  UINT *pCodewordBitfield;
1128
12.9k
  UINT segmentOffset;
1129
1130
12.9k
  UINT *iNode;
1131
12.9k
  UCHAR *pCntSign;
1132
12.9k
  FIXP_DBL *pResultBase;
1133
12.9k
  USHORT *iResultPointer;
1134
12.9k
  UINT *pEscapeSequenceInfo;
1135
12.9k
  UINT codewordOffset;
1136
1137
12.9k
  UINT iQSC;
1138
12.9k
  UCHAR cntSign;
1139
12.9k
  UINT flagA;
1140
12.9k
  UINT flagB;
1141
12.9k
  UINT flags;
1142
12.9k
  UCHAR carryBit;
1143
12.9k
  SCHAR *pSta;
1144
1145
12.9k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1146
12.9k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1147
12.9k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
1148
12.9k
  readDirection = pHcr->segmentInfo.readDirection;
1149
12.9k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
1150
12.9k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
1151
12.9k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
1152
1153
12.9k
  iNode = pHcr->nonPcwSideinfo.iNode;
1154
12.9k
  pCntSign = pHcr->nonPcwSideinfo.pCntSign;
1155
12.9k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
1156
12.9k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
1157
12.9k
  pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
1158
12.9k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
1159
12.9k
  pSta = pHcr->nonPcwSideinfo.pSta;
1160
1161
12.9k
  iQSC = iResultPointer[codewordOffset];
1162
12.9k
  cntSign = pCntSign[codewordOffset];
1163
1164
  /* loop for sign bit decoding */
1165
23.2k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1166
22.6k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1167
22.6k
    carryBit = HcrGetABitFromBitstream(
1168
22.6k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1169
22.6k
        &pRightStartOfSegment[segmentOffset], readDirection);
1170
1171
    /* decrement sign counter because one sign bit has been read */
1172
22.6k
    cntSign -= 1;
1173
22.6k
    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
23.0k
    while (pResultBase[iQSC] == (FIXP_DBL)0) {
1178
416
      if (++iQSC >= 1024) {
1179
0
        return BODY_SIGN_ESC__SIGN;
1180
0
      }
1181
416
    }
1182
22.6k
    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
22.6k
    if (carryBit != 0) {
1188
5.31k
      pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */
1189
5.31k
    }
1190
22.6k
    iQSC++; /* update index to next (maybe valid) value */
1191
22.6k
    iResultPointer[codewordOffset] = iQSC;
1192
1193
22.6k
    if (cntSign == 0) {
1194
      /* all sign bits are decoded now */
1195
12.3k
      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
12.3k
      iQSC = iNode[codewordOffset];
1207
1208
      /* step 1 */
1209
      /* test first value if escape sequence follows */
1210
12.3k
      flagA = 0; /* for first possible escape sequence */
1211
12.3k
      if (fixp_abs(pResultBase[iQSC++]) == (FIXP_DBL)ESCAPE_VALUE) {
1212
2.38k
        flagA = 1;
1213
2.38k
      }
1214
1215
      /* step 2 */
1216
      /* test second value if escape sequence follows */
1217
12.3k
      flagB = 0; /* for second possible escape sequence */
1218
12.3k
      if (fixp_abs(pResultBase[iQSC]) == (FIXP_DBL)ESCAPE_VALUE) {
1219
3.20k
        flagB = 1;
1220
3.20k
      }
1221
1222
      /* step 3 */
1223
      /* evaluate flag result and go on if necessary */
1224
12.3k
      if (!flagA && !flagB) {
1225
8.30k
        ClearBitFromBitfield(
1226
8.30k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
1227
8.30k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
1228
                                   statemachine */
1229
8.30k
      } 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
4.01k
        flags = flagA << POSITION_OF_FLAG_A;
1234
4.01k
        flags |= (flagB << POSITION_OF_FLAG_B);
1235
4.01k
        pEscapeSequenceInfo[codewordOffset] = flags;
1236
1237
        /* set next state */
1238
4.01k
        pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX;
1239
4.01k
        pHcr->nonPcwSideinfo.pState =
1240
4.01k
            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
4.01k
        iResultPointer[codewordOffset] = iNode[codewordOffset];
1246
1247
4.01k
        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
1.63k
          iQSC = iResultPointer[codewordOffset];
1252
1.63k
          iQSC++;
1253
1.63k
          iResultPointer[codewordOffset] = iQSC;
1254
1.63k
        }
1255
1256
4.01k
      }      /* at least one of two lines is 16 */
1257
12.3k
      break; /* nonPCW-Body at cb 11 and according sign bits are decoded */
1258
1259
12.3k
    } /* if ( cntSign == 0 ) */
1260
22.6k
  }   /* loop over remaining Bits in segment */
1261
1262
12.9k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1263
1.17k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1264
1.17k
                         pSegmentBitfield); /* clear a bit in bitfield and
1265
                                               switch off statemachine */
1266
1267
1.17k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1268
2
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__SIGN;
1269
2
      return BODY_SIGN_ESC__SIGN;
1270
2
    }
1271
1.17k
  }
1272
12.9k
  return STOP_THIS_STATE;
1273
12.9k
}
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
4.92k
UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM bs, void *ptr) {
1292
4.92k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
1293
4.92k
  SCHAR *pRemainingBitsInSegment;
1294
4.92k
  INT *pLeftStartOfSegment;
1295
4.92k
  INT *pRightStartOfSegment;
1296
4.92k
  UCHAR readDirection;
1297
4.92k
  UINT *pSegmentBitfield;
1298
4.92k
  UINT segmentOffset;
1299
4.92k
  UINT *pEscapeSequenceInfo;
1300
4.92k
  UINT codewordOffset;
1301
4.92k
  UCHAR carryBit;
1302
4.92k
  UINT escapePrefixUp;
1303
4.92k
  SCHAR *pSta;
1304
1305
4.92k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1306
4.92k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1307
4.92k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
1308
4.92k
  readDirection = pHcr->segmentInfo.readDirection;
1309
4.92k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
1310
4.92k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
1311
4.92k
  pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
1312
4.92k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
1313
4.92k
  pSta = pHcr->nonPcwSideinfo.pSta;
1314
1315
4.92k
  escapePrefixUp =
1316
4.92k
      (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >>
1317
4.92k
      LSB_ESCAPE_PREFIX_UP;
1318
1319
  /* decode escape prefix */
1320
6.18k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1321
5.92k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1322
5.92k
    carryBit = HcrGetABitFromBitstream(
1323
5.92k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1324
5.92k
        &pRightStartOfSegment[segmentOffset], readDirection);
1325
1326
    /* count ones and store sum in escapePrefixUp */
1327
5.92k
    if (carryBit == 1) {
1328
1.26k
      escapePrefixUp += 1; /* update conter for ones */
1329
1.26k
      if (escapePrefixUp > 8) {
1330
6
        pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX;
1331
6
        return BODY_SIGN_ESC__ESC_PREFIX;
1332
6
      }
1333
1334
      /* store updated counter in sideinfo of current codeword */
1335
1.26k
      pEscapeSequenceInfo[codewordOffset] &=
1336
1.26k
          ~MASK_ESCAPE_PREFIX_UP;              /* delete old escapePrefixUp */
1337
1.26k
      escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */
1338
1.26k
      pEscapeSequenceInfo[codewordOffset] |=
1339
1.26k
          escapePrefixUp;                      /* insert new escapePrefixUp */
1340
1.26k
      escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */
1341
4.65k
    } else {                                   /* separator [zero] reached */
1342
4.65k
      pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of
1343
                                                      for loop counter (see
1344
                                                      above) is done here */
1345
4.65k
      escapePrefixUp +=
1346
4.65k
          4; /* if escape_separator '0' appears, add 4 and ==> break */
1347
1348
      /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit
1349
       * position escapePrefixUp */
1350
4.65k
      pEscapeSequenceInfo[codewordOffset] &=
1351
4.65k
          ~MASK_ESCAPE_PREFIX_UP;              /* delete old escapePrefixUp */
1352
4.65k
      escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */
1353
4.65k
      pEscapeSequenceInfo[codewordOffset] |=
1354
4.65k
          escapePrefixUp;                      /* insert new escapePrefixUp */
1355
4.65k
      escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */
1356
1357
      /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit
1358
       * position escapePrefixDown */
1359
4.65k
      pEscapeSequenceInfo[codewordOffset] &=
1360
4.65k
          ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */
1361
4.65k
      escapePrefixUp <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */
1362
4.65k
      pEscapeSequenceInfo[codewordOffset] |=
1363
4.65k
          escapePrefixUp; /* insert new escapePrefixDown */
1364
1365
4.65k
      pSta[codewordOffset] = BODY_SIGN_ESC__ESC_WORD; /* set next state */
1366
4.65k
      pHcr->nonPcwSideinfo.pState =
1367
4.65k
          aStateConstant2State[pSta[codewordOffset]]; /* get state from separate
1368
                                                         array of cw-sideinfo */
1369
4.65k
      break;
1370
4.65k
    }
1371
5.92k
  }
1372
1373
4.91k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1374
773
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1375
773
                         pSegmentBitfield); /* clear a bit in bitfield and
1376
                                               switch off statemachine */
1377
1378
773
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1379
2
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX;
1380
2
      return BODY_SIGN_ESC__ESC_PREFIX;
1381
2
    }
1382
773
  }
1383
1384
4.91k
  return STOP_THIS_STATE;
1385
4.91k
}
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
5.88k
UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM bs, void *ptr) {
1401
5.88k
  H_HCR_INFO pHcr = (H_HCR_INFO)ptr;
1402
5.88k
  SCHAR *pRemainingBitsInSegment;
1403
5.88k
  INT *pLeftStartOfSegment;
1404
5.88k
  INT *pRightStartOfSegment;
1405
5.88k
  UCHAR readDirection;
1406
5.88k
  UINT *pSegmentBitfield;
1407
5.88k
  UINT *pCodewordBitfield;
1408
5.88k
  UINT segmentOffset;
1409
1410
5.88k
  FIXP_DBL *pResultBase;
1411
5.88k
  USHORT *iResultPointer;
1412
5.88k
  UINT *pEscapeSequenceInfo;
1413
5.88k
  UINT codewordOffset;
1414
1415
5.88k
  UINT escapeWord;
1416
5.88k
  UINT escapePrefixDown;
1417
5.88k
  UINT escapePrefixUp;
1418
5.88k
  UCHAR carryBit;
1419
5.88k
  UINT iQSC;
1420
5.88k
  INT sign;
1421
5.88k
  UINT flagA;
1422
5.88k
  UINT flagB;
1423
5.88k
  SCHAR *pSta;
1424
1425
5.88k
  pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment;
1426
5.88k
  pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment;
1427
5.88k
  pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment;
1428
5.88k
  readDirection = pHcr->segmentInfo.readDirection;
1429
5.88k
  pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield;
1430
5.88k
  pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield;
1431
5.88k
  segmentOffset = pHcr->segmentInfo.segmentOffset;
1432
1433
5.88k
  pResultBase = pHcr->nonPcwSideinfo.pResultBase;
1434
5.88k
  iResultPointer = pHcr->nonPcwSideinfo.iResultPointer;
1435
5.88k
  pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo;
1436
5.88k
  codewordOffset = pHcr->nonPcwSideinfo.codewordOffset;
1437
5.88k
  pSta = pHcr->nonPcwSideinfo.pSta;
1438
1439
5.88k
  escapeWord = pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_WORD;
1440
5.88k
  escapePrefixDown =
1441
5.88k
      (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_DOWN) >>
1442
5.88k
      LSB_ESCAPE_PREFIX_DOWN;
1443
1444
  /* decode escape word */
1445
19.3k
  for (; pRemainingBitsInSegment[segmentOffset] > 0;
1446
17.2k
       pRemainingBitsInSegment[segmentOffset] -= 1) {
1447
17.2k
    carryBit = HcrGetABitFromBitstream(
1448
17.2k
        bs, pHcr->decInOut.bitstreamAnchor, &pLeftStartOfSegment[segmentOffset],
1449
17.2k
        &pRightStartOfSegment[segmentOffset], readDirection);
1450
1451
    /* build escape word */
1452
17.2k
    escapeWord <<=
1453
17.2k
        1; /* left shift previous decoded part of escapeWord by on bit */
1454
17.2k
    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
17.2k
    escapePrefixDown -= 1;
1459
1460
    /* store updated escapePrefixDown */
1461
17.2k
    pEscapeSequenceInfo[codewordOffset] &=
1462
17.2k
        ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */
1463
17.2k
    escapePrefixDown <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */
1464
17.2k
    pEscapeSequenceInfo[codewordOffset] |=
1465
17.2k
        escapePrefixDown; /* insert new escapePrefixDown */
1466
17.2k
    escapePrefixDown >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back */
1467
1468
    /* store updated escapeWord */
1469
17.2k
    pEscapeSequenceInfo[codewordOffset] &=
1470
17.2k
        ~MASK_ESCAPE_WORD; /* delete old escapeWord */
1471
17.2k
    pEscapeSequenceInfo[codewordOffset] |=
1472
17.2k
        escapeWord; /* insert new escapeWord */
1473
1474
17.2k
    if (escapePrefixDown == 0) {
1475
3.86k
      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
3.86k
      iQSC = iResultPointer[codewordOffset];
1485
3.86k
      sign = (pResultBase[iQSC] >= (FIXP_DBL)0)
1486
3.86k
                 ? 1
1487
3.86k
                 : -1; /* get sign of escape value 16 */
1488
1489
      /* step 1 */
1490
      /* get escapePrefixUp */
1491
3.86k
      escapePrefixUp =
1492
3.86k
          (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >>
1493
3.86k
          LSB_ESCAPE_PREFIX_UP;
1494
1495
      /* step 2 */
1496
      /* calculate escape value */
1497
3.86k
      pResultBase[iQSC] =
1498
3.86k
          (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
3.86k
      flagA = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_A;
1503
3.86k
      flagB = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_B;
1504
1505
      /* step 3 */
1506
      /* clear the whole escape sideinfo word */
1507
3.86k
      pEscapeSequenceInfo[codewordOffset] = 0;
1508
1509
      /* change state in dependence of flag flagB */
1510
3.86k
      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
1.51k
        pEscapeSequenceInfo[codewordOffset] &= ~MASK_FLAG_A;
1517
1518
1.51k
        if (flagB == 0) {
1519
675
          ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1520
675
                               pCodewordBitfield); /* clear a bit in bitfield
1521
                                                      and switch off
1522
                                                      statemachine */
1523
842
        } else {
1524
          /* updated pointer to next and last 16 */
1525
842
          iQSC++;
1526
842
          iResultPointer[codewordOffset] = iQSC;
1527
1528
          /* change state */
1529
842
          pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX;
1530
842
          pHcr->nonPcwSideinfo.pState =
1531
842
              aStateConstant2State[pSta[codewordOffset]]; /* get state from
1532
                                                             separate array of
1533
                                                             cw-sideinfo */
1534
842
        }
1535
2.35k
      } else {
1536
2.35k
        ClearBitFromBitfield(
1537
2.35k
            &(pHcr->nonPcwSideinfo.pState), segmentOffset,
1538
2.35k
            pCodewordBitfield); /* clear a bit in bitfield and switch off
1539
                                   statemachine */
1540
2.35k
      }
1541
3.86k
      break;
1542
3.86k
    }
1543
17.2k
  }
1544
1545
5.88k
  if (pRemainingBitsInSegment[segmentOffset] <= 0) {
1546
2.40k
    ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset,
1547
2.40k
                         pSegmentBitfield); /* clear a bit in bitfield and
1548
                                               switch off statemachine */
1549
1550
2.40k
    if (pRemainingBitsInSegment[segmentOffset] < 0) {
1551
2
      pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_WORD;
1552
2
      return BODY_SIGN_ESC__ESC_WORD;
1553
2
    }
1554
2.40k
  }
1555
1556
5.88k
  return STOP_THIS_STATE;
1557
5.88k
}