Coverage Report

Created: 2025-08-03 07:04

/src/aac/libSBRdec/src/env_extr.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 - 2018 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
/**************************** SBR decoder library ******************************
96
97
   Author(s):
98
99
   Description:
100
101
*******************************************************************************/
102
103
/*!
104
  \file
105
  \brief  Envelope extraction
106
  The functions provided by this module are mostly called by applySBR(). After
107
  it is determined that there is valid SBR data, sbrGetHeaderData() might be
108
  called if the current SBR data contains an \ref SBR_HEADER_ELEMENT as opposed
109
  to a \ref SBR_STANDARD_ELEMENT. This function may return various error codes
110
  as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET
111
  when decoder settings need to be recalculated according to the SBR
112
  specifications. In that case applySBR() will initiatite the required
113
  re-configuration.
114
115
  The header data is stored in a #SBR_HEADER_DATA structure.
116
117
  The actual SBR data for the current frame is decoded into SBR_FRAME_DATA
118
  stuctures by sbrGetChannelPairElement() [for stereo streams] and
119
  sbrGetSingleChannelElement() [for mono streams]. There is no fractional
120
  arithmetic involved.
121
122
  Once the information is extracted, the data needs to be further prepared
123
  before the actual decoding process. This is done in decodeSbrData().
124
125
  \sa Description of buffer management in applySBR(). \ref documentationOverview
126
127
  <h1>About the SBR data format:</h1>
128
129
  Each frame includes SBR data (side chain information), and can be either the
130
  \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. Parts of the data
131
  can be protected by a CRC checksum.
132
133
  \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2>
134
135
  The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it
136
  typically is send every second or so. It contains fundamental information such
137
  as SBR sampling frequency and frequency range as well as control signals that
138
  do not require frequent changes. It also includes the \ref
139
  SBR_STANDARD_ELEMENT.
140
141
  Depending on the changes between the information in a current
142
  SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might
143
  need to be reset and reconfigured (e.g. new tables need to be calculated).
144
145
  \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2>
146
147
  This data can be subdivided into "side info" and "raw data", where side info
148
  is defined as signals needed to decode the raw data and some decoder tuning
149
  signals. Raw data is referred to as PCM and Huffman coded envelope and noise
150
  floor estimates. The side info also includes information about the
151
  time-frequency grid for the current frame.
152
153
  \sa \ref documentationOverview
154
*/
155
156
#include "env_extr.h"
157
158
#include "sbr_ram.h"
159
#include "sbr_rom.h"
160
#include "huff_dec.h"
161
162
#include "psbitdec.h"
163
164
#define DRM_PARAMETRIC_STEREO 0
165
18.0k
#define EXTENSION_ID_PS_CODING 2
166
167
static int extractPvcFrameInfo(
168
    HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
169
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
170
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
171
                                           frame-info will be stored */
172
    HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where
173
                                                     the previous frame-info
174
                                                     will be stored */
175
    UCHAR pvc_mode_last,                          /**< PVC mode of last frame */
176
    const UINT flags);
177
static int extractFrameInfo(HANDLE_FDK_BITSTREAM hBs,
178
                            HANDLE_SBR_HEADER_DATA hHeaderData,
179
                            HANDLE_SBR_FRAME_DATA h_frame_data,
180
                            const UINT nrOfChannels, const UINT flags);
181
182
static int sbrGetPvcEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData,
183
                             HANDLE_SBR_FRAME_DATA h_frame_data,
184
                             HANDLE_FDK_BITSTREAM hBs, const UINT flags,
185
                             const UINT pvcMode);
186
static int sbrGetEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData,
187
                          HANDLE_SBR_FRAME_DATA h_frame_data,
188
                          HANDLE_FDK_BITSTREAM hBs, const UINT flags);
189
190
static void sbrGetDirectionControlData(HANDLE_SBR_FRAME_DATA hFrameData,
191
                                       HANDLE_FDK_BITSTREAM hBs,
192
                                       const UINT flags, const int bs_pvc_mode);
193
194
static void sbrGetNoiseFloorData(HANDLE_SBR_HEADER_DATA hHeaderData,
195
                                 HANDLE_SBR_FRAME_DATA h_frame_data,
196
                                 HANDLE_FDK_BITSTREAM hBs);
197
198
static int checkFrameInfo(FRAME_INFO *pFrameInfo, int numberOfTimeSlots,
199
                          int overlap, int timeStep);
200
201
/* Mapping to std samplerate table according to 14496-3 (4.6.18.2.6) */
202
typedef struct SR_MAPPING {
203
  UINT fsRangeLo; /* If fsRangeLo(n+1)>fs>=fsRangeLo(n), it will be mapped to...
204
                   */
205
  UINT fsMapped;  /* fsMapped. */
206
} SR_MAPPING;
207
208
static const SR_MAPPING stdSampleRatesMapping[] = {
209
    {0, 8000},      {9391, 11025},  {11502, 12000}, {13856, 16000},
210
    {18783, 22050}, {23004, 24000}, {27713, 32000}, {37566, 44100},
211
    {46009, 48000}, {55426, 64000}, {75132, 88200}, {92017, 96000}};
212
static const SR_MAPPING stdSampleRatesMappingUsac[] = {
213
    {0, 16000},     {18783, 22050}, {23004, 24000}, {27713, 32000},
214
    {35777, 40000}, {42000, 44100}, {46009, 48000}, {55426, 64000},
215
    {75132, 88200}, {92017, 96000}};
216
217
UINT sbrdec_mapToStdSampleRate(UINT fs,
218
                               UINT isUsac) /*!< Output sampling frequency */
219
293k
{
220
293k
  UINT fsMapped = fs, tableSize = 0;
221
293k
  const SR_MAPPING *mappingTable;
222
293k
  int i;
223
224
293k
  if (!isUsac) {
225
164k
    mappingTable = stdSampleRatesMapping;
226
164k
    tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING);
227
164k
  } else {
228
128k
    mappingTable = stdSampleRatesMappingUsac;
229
128k
    tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING);
230
128k
  }
231
232
2.08M
  for (i = tableSize - 1; i >= 0; i--) {
233
2.08M
    if (fs >= mappingTable[i].fsRangeLo) {
234
293k
      fsMapped = mappingTable[i].fsMapped;
235
293k
      break;
236
293k
    }
237
2.08M
  }
238
239
293k
  return (fsMapped);
240
293k
}
241
242
SBR_ERROR
243
initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn,
244
               const int sampleRateOut, const INT downscaleFactor,
245
               const int samplesPerFrame, const UINT flags,
246
248k
               const int setDefaultHdr) {
247
248k
  HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
248
248k
  SBR_ERROR sbrError = SBRDEC_OK;
249
248k
  int numAnalysisBands;
250
248k
  int sampleRateProc;
251
252
248k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
253
164k
    sampleRateProc =
254
164k
        sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0);
255
164k
  } else {
256
83.5k
    sampleRateProc = sampleRateOut * downscaleFactor;
257
83.5k
  }
258
259
248k
  if (sampleRateIn == sampleRateOut) {
260
98.4k
    hHeaderData->sbrProcSmplRate = sampleRateProc << 1;
261
98.4k
    numAnalysisBands = 32;
262
149k
  } else {
263
149k
    hHeaderData->sbrProcSmplRate = sampleRateProc;
264
149k
    if ((sampleRateOut >> 1) == sampleRateIn) {
265
      /* 1:2 */
266
91.9k
      numAnalysisBands = 32;
267
91.9k
    } else if ((sampleRateOut >> 2) == sampleRateIn) {
268
      /* 1:4 */
269
21.1k
      numAnalysisBands = 16;
270
36.8k
    } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) {
271
      /* 3:8, 3/4 core frame length */
272
36.7k
      numAnalysisBands = 24;
273
36.7k
    } else {
274
134
      sbrError = SBRDEC_UNSUPPORTED_CONFIG;
275
134
      goto bail;
276
134
    }
277
149k
  }
278
248k
  numAnalysisBands /= downscaleFactor;
279
280
248k
  if (setDefaultHdr) {
281
    /* Fill in default values first */
282
246k
    hHeaderData->syncState = SBR_NOT_INITIALIZED;
283
246k
    hHeaderData->status = 0;
284
246k
    hHeaderData->frameErrorFlag = 0;
285
286
246k
    hHeaderData->bs_info.ampResolution = 1;
287
246k
    hHeaderData->bs_info.xover_band = 0;
288
246k
    hHeaderData->bs_info.sbr_preprocessing = 0;
289
246k
    hHeaderData->bs_info.pvc_mode = 0;
290
291
246k
    hHeaderData->bs_data.startFreq = 5;
292
246k
    hHeaderData->bs_data.stopFreq = 0;
293
246k
    hHeaderData->bs_data.freqScale =
294
246k
        0; /* previously 2; for ELD reduced delay bitstreams
295
           /samplerates initializing of the sbr decoder instance fails if
296
           freqScale is set to 2 because no master table can be generated; in
297
           ELD reduced delay bitstreams this value is always 0; gets overwritten
298
           when header is read */
299
246k
    hHeaderData->bs_data.alterScale = 1;
300
246k
    hHeaderData->bs_data.noise_bands = 2;
301
246k
    hHeaderData->bs_data.limiterBands = 2;
302
246k
    hHeaderData->bs_data.limiterGains = 2;
303
246k
    hHeaderData->bs_data.interpolFreq = 1;
304
246k
    hHeaderData->bs_data.smoothingLength = 1;
305
306
    /* Patch some entries */
307
246k
    if (sampleRateOut * downscaleFactor >= 96000) {
308
29.0k
      hHeaderData->bs_data.startFreq =
309
29.0k
          4; /*   having read these frequency values from bit stream before. */
310
29.0k
      hHeaderData->bs_data.stopFreq = 3;
311
217k
    } else if (sampleRateOut * downscaleFactor >
312
217k
               24000) { /* Trigger an error if SBR is going to be processed
313
                           without     */
314
80.9k
      hHeaderData->bs_data.startFreq =
315
80.9k
          7; /*   having read these frequency values from bit stream before. */
316
80.9k
      hHeaderData->bs_data.stopFreq = 3;
317
80.9k
    }
318
246k
  }
319
320
248k
  if ((sampleRateOut >> 2) == sampleRateIn) {
321
21.1k
    hHeaderData->timeStep = 4;
322
227k
  } else {
323
227k
    hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2;
324
227k
  }
325
326
  /* Setup pointers to frequency band tables */
327
248k
  hFreq->freqBandTable[0] = hFreq->freqBandTableLo;
328
248k
  hFreq->freqBandTable[1] = hFreq->freqBandTableHi;
329
330
  /* One SBR timeslot corresponds to the amount of samples equal to the amount
331
   * of analysis bands, divided by the timestep. */
332
248k
  hHeaderData->numberTimeSlots =
333
248k
      (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1);
334
248k
  if (hHeaderData->numberTimeSlots > (16)) {
335
0
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
336
0
  }
337
338
248k
  hHeaderData->numberOfAnalysisBands = numAnalysisBands;
339
248k
  if ((sampleRateOut >> 2) == sampleRateIn) {
340
21.1k
    hHeaderData->numberTimeSlots <<= 1;
341
21.1k
  }
342
343
248k
bail:
344
248k
  return sbrError;
345
248k
}
346
347
/*!
348
  \brief   Initialize the SBR_PREV_FRAME_DATA struct
349
*/
350
void initSbrPrevFrameData(
351
    HANDLE_SBR_PREV_FRAME_DATA
352
        h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */
353
    int timeSlots)   /*!< Framelength in SBR-timeslots */
354
150k
{
355
150k
  int i;
356
357
  /* Set previous energy and noise levels to 0 for the case
358
     that decoding starts in the middle of a bitstream */
359
8.59M
  for (i = 0; i < MAX_FREQ_COEFFS; i++)
360
8.44M
    h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0;
361
904k
  for (i = 0; i < MAX_NOISE_COEFFS; i++)
362
753k
    h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0;
363
904k
  for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF;
364
365
150k
  h_prev_data->stopPos = timeSlots;
366
150k
  h_prev_data->coupling = COUPLING_OFF;
367
150k
  h_prev_data->ampRes = 0;
368
369
150k
  FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo));
370
150k
}
371
372
/*!
373
  \brief   Read header data from bitstream
374
375
  \return  error status - 0 if ok
376
*/
377
SBR_HEADER_STATUS
378
sbrGetHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_FDK_BITSTREAM hBs,
379
                 const UINT flags, const int fIsSbrData,
380
652k
                 const UCHAR configMode) {
381
652k
  SBR_HEADER_DATA_BS *pBsData;
382
652k
  SBR_HEADER_DATA_BS lastHeader;
383
652k
  SBR_HEADER_DATA_BS_INFO lastInfo;
384
652k
  int headerExtra1 = 0, headerExtra2 = 0;
385
386
  /* Read and discard new header in config change detection mode */
387
652k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
388
332k
    if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
389
      /* ampResolution */
390
223k
      FDKreadBits(hBs, 1);
391
223k
    }
392
    /* startFreq, stopFreq */
393
332k
    FDKpushFor(hBs, 8);
394
332k
    if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
395
      /* xover_band */
396
223k
      FDKreadBits(hBs, 3);
397
      /* reserved bits */
398
223k
      FDKreadBits(hBs, 2);
399
223k
    }
400
332k
    headerExtra1 = FDKreadBit(hBs);
401
332k
    headerExtra2 = FDKreadBit(hBs);
402
332k
    FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2);
403
404
332k
    return HEADER_OK;
405
332k
  }
406
407
  /* Copy SBR bit stream header to temporary header */
408
319k
  lastHeader = hHeaderData->bs_data;
409
319k
  lastInfo = hHeaderData->bs_info;
410
411
  /* Read new header from bitstream */
412
319k
  if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) {
413
64.0k
    pBsData = &hHeaderData->bs_dflt;
414
255k
  } else {
415
255k
    pBsData = &hHeaderData->bs_data;
416
255k
  }
417
418
319k
  if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
419
180k
    hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1);
420
180k
  }
421
422
319k
  pBsData->startFreq = FDKreadBits(hBs, 4);
423
319k
  pBsData->stopFreq = FDKreadBits(hBs, 4);
424
425
319k
  if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
426
180k
    hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3);
427
180k
    FDKreadBits(hBs, 2);
428
180k
  }
429
430
319k
  headerExtra1 = FDKreadBits(hBs, 1);
431
319k
  headerExtra2 = FDKreadBits(hBs, 1);
432
433
  /* Handle extra header information */
434
319k
  if (headerExtra1) {
435
98.6k
    pBsData->freqScale = FDKreadBits(hBs, 2);
436
98.6k
    pBsData->alterScale = FDKreadBits(hBs, 1);
437
98.6k
    pBsData->noise_bands = FDKreadBits(hBs, 2);
438
220k
  } else {
439
220k
    pBsData->freqScale = 2;
440
220k
    pBsData->alterScale = 1;
441
220k
    pBsData->noise_bands = 2;
442
220k
  }
443
444
319k
  if (headerExtra2) {
445
96.6k
    pBsData->limiterBands = FDKreadBits(hBs, 2);
446
96.6k
    pBsData->limiterGains = FDKreadBits(hBs, 2);
447
96.6k
    pBsData->interpolFreq = FDKreadBits(hBs, 1);
448
96.6k
    pBsData->smoothingLength = FDKreadBits(hBs, 1);
449
222k
  } else {
450
222k
    pBsData->limiterBands = 2;
451
222k
    pBsData->limiterGains = 2;
452
222k
    pBsData->interpolFreq = 1;
453
222k
    pBsData->smoothingLength = 1;
454
222k
  }
455
456
  /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */
457
319k
  if (hHeaderData->syncState < SBR_HEADER ||
458
319k
      lastHeader.startFreq != pBsData->startFreq ||
459
319k
      lastHeader.stopFreq != pBsData->stopFreq ||
460
319k
      lastHeader.freqScale != pBsData->freqScale ||
461
319k
      lastHeader.alterScale != pBsData->alterScale ||
462
319k
      lastHeader.noise_bands != pBsData->noise_bands ||
463
319k
      lastInfo.xover_band != hHeaderData->bs_info.xover_band) {
464
245k
    return HEADER_RESET; /* New settings */
465
245k
  }
466
467
74.2k
  return HEADER_OK;
468
319k
}
469
470
/*!
471
  \brief   Get missing harmonics parameters (only used for AAC+SBR)
472
473
  \return  error status - 0 if ok
474
*/
475
int sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData,
476
                             HANDLE_SBR_FRAME_DATA hFrameData,
477
415k
                             HANDLE_FDK_BITSTREAM hBs, const UINT flags) {
478
415k
  int i, bitsRead = 0;
479
480
415k
  int add_harmonic_flag = FDKreadBits(hBs, 1);
481
415k
  bitsRead++;
482
483
415k
  if (add_harmonic_flag) {
484
52.6k
    int nSfb = hHeaderData->freqBandData.nSfb[1];
485
158k
    for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) {
486
      /* read maximum 32 bits and align them to the MSB */
487
105k
      int readBits = fMin(32, nSfb);
488
105k
      nSfb -= readBits;
489
105k
      if (readBits > 0) {
490
53.8k
        hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits)
491
53.8k
                                      << (32 - readBits);
492
53.8k
      } else {
493
51.4k
        hFrameData->addHarmonics[i] = 0;
494
51.4k
      }
495
496
105k
      bitsRead += readBits;
497
105k
    }
498
    /* bs_pvc_mode = 0 for Rsvd50 */
499
52.6k
    if (flags & SBRDEC_SYNTAX_USAC) {
500
17.7k
      if (hHeaderData->bs_info.pvc_mode) {
501
4.57k
        int bs_sinusoidal_position = 31;
502
4.57k
        if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) {
503
980
          bs_sinusoidal_position = FDKreadBits(hBs, 5);
504
980
        }
505
4.57k
        hFrameData->sinusoidal_position = bs_sinusoidal_position;
506
4.57k
      }
507
17.7k
    }
508
362k
  } else {
509
1.08M
    for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++)
510
725k
      hFrameData->addHarmonics[i] = 0;
511
362k
  }
512
513
415k
  return (bitsRead);
514
415k
}
515
516
/*!
517
  \brief      Reads extension data from the bitstream
518
519
  The bitstream format allows up to 4 kinds of extended data element.
520
  Extended data may contain several elements, each identified by a 2-bit-ID.
521
  So far, no extended data elements are defined hence the first 2 parameters
522
  are unused. The data should be skipped in order to update the number
523
  of read bits for the consistency check in applySBR().
524
*/
525
static int extractExtendedData(
526
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */
527
    HANDLE_FDK_BITSTREAM hBs            /*!< Handle to the bit buffer */
528
    ,
529
    HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */
530
81.5k
) {
531
81.5k
  INT nBitsLeft;
532
81.5k
  int extended_data;
533
81.5k
  int i, frameOk = 1;
534
535
81.5k
  extended_data = FDKreadBits(hBs, 1);
536
537
81.5k
  if (extended_data) {
538
28.0k
    int cnt;
539
28.0k
    int bPsRead = 0;
540
541
28.0k
    cnt = FDKreadBits(hBs, 4);
542
28.0k
    if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8);
543
544
28.0k
    nBitsLeft = 8 * cnt;
545
546
    /* sanity check for cnt */
547
28.0k
    if (nBitsLeft > (INT)FDKgetValidBits(hBs)) {
548
      /* limit nBitsLeft */
549
4.31k
      nBitsLeft = (INT)FDKgetValidBits(hBs);
550
      /* set frame error */
551
4.31k
      frameOk = 0;
552
4.31k
    }
553
554
64.9k
    while (nBitsLeft > 7) {
555
36.8k
      int extension_id = FDKreadBits(hBs, 2);
556
36.8k
      nBitsLeft -= 2;
557
558
36.8k
      switch (extension_id) {
559
18.0k
        case EXTENSION_ID_PS_CODING:
560
561
          /* Read PS data from bitstream */
562
563
18.0k
          if (hParametricStereoDec != NULL) {
564
13.1k
            if (bPsRead &&
565
13.1k
                !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot]
566
4.28k
                     .mpeg.bPsHeaderValid) {
567
362
              cnt = nBitsLeft >> 3; /* number of remaining bytes */
568
4.77k
              for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
569
362
              nBitsLeft -= cnt * 8;
570
12.7k
            } else {
571
12.7k
              nBitsLeft -=
572
12.7k
                  (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft);
573
12.7k
              bPsRead = 1;
574
12.7k
            }
575
13.1k
          }
576
577
          /* parametric stereo detected, could set channelMode accordingly here
578
           */
579
          /*                                                                     */
580
          /* "The usage of this parametric stereo extension to HE-AAC is */
581
          /* signalled implicitly in the bitstream. Hence, if an sbr_extension()
582
           */
583
          /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of
584
           */
585
          /* the bitstream, a decoder supporting the combination of SBR and PS
586
           */
587
          /* shall operate the PS tool to generate a stereo output signal." */
588
          /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E) */
589
590
18.0k
          break;
591
592
18.7k
        default:
593
18.7k
          cnt = nBitsLeft >> 3; /* number of remaining bytes */
594
229k
          for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
595
18.7k
          nBitsLeft -= cnt * 8;
596
18.7k
          break;
597
36.8k
      }
598
36.8k
    }
599
600
28.0k
    if (nBitsLeft < 0) {
601
4.31k
      frameOk = 0;
602
4.31k
      goto bail;
603
23.7k
    } else {
604
      /* Read fill bits for byte alignment */
605
23.7k
      FDKreadBits(hBs, nBitsLeft);
606
23.7k
    }
607
28.0k
  }
608
609
81.5k
bail:
610
81.5k
  return (frameOk);
611
81.5k
}
612
613
/*!
614
  \brief      Read bitstream elements of a SBR channel element
615
  \return     SbrFrameOK
616
*/
617
int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData,
618
                         HANDLE_SBR_FRAME_DATA hFrameDataLeft,
619
                         HANDLE_SBR_FRAME_DATA hFrameDataRight,
620
                         HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev,
621
                         UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBs,
622
                         HANDLE_PS_DEC hParametricStereoDec, const UINT flags,
623
325k
                         const int overlap) {
624
325k
  int i, bs_coupling = COUPLING_OFF;
625
325k
  const int nCh = (hFrameDataRight == NULL) ? 1 : 2;
626
627
325k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
628
    /* Reserved bits */
629
89.7k
    if (FDKreadBits(hBs, 1)) { /* bs_data_extra */
630
26.2k
      FDKreadBits(hBs, 4);
631
26.2k
      if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) {
632
23.0k
        FDKreadBits(hBs, 4);
633
23.0k
      }
634
26.2k
    }
635
89.7k
  }
636
637
325k
  if (nCh == 2) {
638
    /* Read coupling flag */
639
108k
    bs_coupling = FDKreadBits(hBs, 1);
640
108k
    if (bs_coupling) {
641
34.3k
      hFrameDataLeft->coupling = COUPLING_LEVEL;
642
34.3k
      hFrameDataRight->coupling = COUPLING_BAL;
643
74.0k
    } else {
644
74.0k
      hFrameDataLeft->coupling = COUPLING_OFF;
645
74.0k
      hFrameDataRight->coupling = COUPLING_OFF;
646
74.0k
    }
647
216k
  } else {
648
216k
    if (flags & SBRDEC_SYNTAX_SCAL) {
649
23.7k
      FDKreadBits(hBs, 1); /* bs_coupling */
650
23.7k
    }
651
216k
    hFrameDataLeft->coupling = COUPLING_OFF;
652
216k
  }
653
654
325k
  if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
655
235k
    if (flags & SBRDEC_USAC_HARMONICSBR) {
656
64.4k
      hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs);
657
64.4k
      if (hFrameDataLeft->sbrPatchingMode == 0) {
658
39.1k
        hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs);
659
39.1k
        if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
660
4.83k
          hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7);
661
34.3k
        } else {
662
34.3k
          hFrameDataLeft->sbrPitchInBins = 0;
663
34.3k
        }
664
39.1k
      } else {
665
25.2k
        hFrameDataLeft->sbrOversamplingFlag = 0;
666
25.2k
        hFrameDataLeft->sbrPitchInBins = 0;
667
25.2k
      }
668
669
64.4k
      if (nCh == 2) {
670
42.6k
        if (bs_coupling) {
671
21.0k
          hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode;
672
21.0k
          hFrameDataRight->sbrOversamplingFlag =
673
21.0k
              hFrameDataLeft->sbrOversamplingFlag;
674
21.0k
          hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins;
675
21.6k
        } else {
676
21.6k
          hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs);
677
21.6k
          if (hFrameDataRight->sbrPatchingMode == 0) {
678
13.9k
            hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs);
679
13.9k
            if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
680
2.18k
              hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7);
681
11.7k
            } else {
682
11.7k
              hFrameDataRight->sbrPitchInBins = 0;
683
11.7k
            }
684
13.9k
          } else {
685
7.73k
            hFrameDataRight->sbrOversamplingFlag = 0;
686
7.73k
            hFrameDataRight->sbrPitchInBins = 0;
687
7.73k
          }
688
21.6k
        }
689
42.6k
      }
690
171k
    } else {
691
171k
      if (nCh == 2) {
692
27.0k
        hFrameDataRight->sbrPatchingMode = 1;
693
27.0k
        hFrameDataRight->sbrOversamplingFlag = 0;
694
27.0k
        hFrameDataRight->sbrPitchInBins = 0;
695
27.0k
      }
696
697
171k
      hFrameDataLeft->sbrPatchingMode = 1;
698
171k
      hFrameDataLeft->sbrOversamplingFlag = 0;
699
171k
      hFrameDataLeft->sbrPitchInBins = 0;
700
171k
    }
701
235k
  } else {
702
89.7k
    if (nCh == 2) {
703
38.7k
      hFrameDataRight->sbrPatchingMode = 1;
704
38.7k
      hFrameDataRight->sbrOversamplingFlag = 0;
705
38.7k
      hFrameDataRight->sbrPitchInBins = 0;
706
38.7k
    }
707
708
89.7k
    hFrameDataLeft->sbrPatchingMode = 1;
709
89.7k
    hFrameDataLeft->sbrOversamplingFlag = 0;
710
89.7k
    hFrameDataLeft->sbrPitchInBins = 0;
711
89.7k
  }
712
713
  /*
714
    sbr_grid(): Grid control
715
  */
716
325k
  if (hHeaderData->bs_info.pvc_mode) {
717
140k
    FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */
718
140k
    if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft,
719
140k
                             hFrameDataLeftPrev, pvc_mode_last, flags))
720
1.02k
      return 0;
721
722
139k
    if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
723
139k
                        hHeaderData->numberTimeSlots, overlap,
724
139k
                        hHeaderData->timeStep))
725
655
      return 0;
726
184k
  } else {
727
184k
    if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0;
728
729
180k
    if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
730
180k
                        hHeaderData->numberTimeSlots, overlap,
731
180k
                        hHeaderData->timeStep))
732
3.06k
      return 0;
733
180k
  }
734
315k
  if (nCh == 2) {
735
105k
    if (hFrameDataLeft->coupling) {
736
33.5k
      FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo,
737
33.5k
                sizeof(FRAME_INFO));
738
33.5k
      hFrameDataRight->ampResolutionCurrentFrame =
739
33.5k
          hFrameDataLeft->ampResolutionCurrentFrame;
740
71.5k
    } else {
741
71.5k
      if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags))
742
1.48k
        return 0;
743
744
70.0k
      if (!checkFrameInfo(&hFrameDataRight->frameInfo,
745
70.0k
                          hHeaderData->numberTimeSlots, overlap,
746
70.0k
                          hHeaderData->timeStep))
747
749
        return 0;
748
70.0k
    }
749
105k
  }
750
751
  /*
752
    sbr_dtdf(): Fetch domain vectors (time or frequency direction for
753
    delta-coding)
754
  */
755
313k
  sbrGetDirectionControlData(hFrameDataLeft, hBs, flags,
756
313k
                             hHeaderData->bs_info.pvc_mode);
757
313k
  if (nCh == 2) {
758
102k
    sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0);
759
102k
  }
760
761
  /* sbr_invf() */
762
1.03M
  for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
763
721k
    hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
764
721k
  }
765
313k
  if (nCh == 2) {
766
102k
    if (hFrameDataLeft->coupling) {
767
114k
      for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
768
81.2k
        hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i];
769
81.2k
      }
770
69.2k
    } else {
771
251k
      for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
772
181k
        hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
773
181k
      }
774
69.2k
    }
775
102k
  }
776
777
313k
  if (nCh == 1) {
778
210k
    if (hHeaderData->bs_info.pvc_mode) {
779
138k
      if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags,
780
138k
                             hHeaderData->bs_info.pvc_mode))
781
1.03k
        return 0;
782
138k
    } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags))
783
0
      return 0;
784
785
209k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
786
209k
  } else if (hFrameDataLeft->coupling) {
787
33.5k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) {
788
0
      return 0;
789
0
    }
790
791
33.5k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
792
793
33.5k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) {
794
0
      return 0;
795
0
    }
796
33.5k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
797
69.2k
  } else { /* nCh == 2 && no coupling */
798
799
69.2k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0;
800
801
69.2k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0;
802
803
69.2k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
804
805
69.2k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
806
69.2k
  }
807
808
312k
  sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags);
809
312k
  if (nCh == 2) {
810
102k
    sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags);
811
102k
  }
812
813
312k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
814
81.5k
    if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) {
815
7.38k
      return 0;
816
7.38k
    }
817
81.5k
  }
818
819
305k
  return 1;
820
312k
}
821
822
/*!
823
  \brief   Read direction control data from bitstream
824
*/
825
void sbrGetDirectionControlData(
826
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
827
    HANDLE_FDK_BITSTREAM hBs,           /*!< handle to struct BIT_BUF */
828
    const UINT flags, const int bs_pvc_mode)
829
830
416k
{
831
416k
  int i;
832
416k
  int indepFlag = 0;
833
834
416k
  if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
835
300k
    indepFlag = flags & SBRDEC_USAC_INDEP;
836
300k
  }
837
838
416k
  if (bs_pvc_mode == 0) {
839
277k
    i = 0;
840
277k
    if (indepFlag) {
841
129k
      h_frame_data->domain_vec[i++] = 0;
842
129k
    }
843
645k
    for (; i < h_frame_data->frameInfo.nEnvelopes; i++) {
844
367k
      h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1);
845
367k
    }
846
277k
  }
847
848
416k
  i = 0;
849
416k
  if (indepFlag) {
850
242k
    h_frame_data->domain_vec_noise[i++] = 0;
851
242k
  }
852
834k
  for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
853
417k
    h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1);
854
417k
  }
855
416k
}
856
857
/*!
858
  \brief   Read noise-floor-level data from bitstream
859
*/
860
void sbrGetNoiseFloorData(
861
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
862
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
863
    HANDLE_FDK_BITSTREAM hBs)           /*!< handle to struct BIT_BUF */
864
415k
{
865
415k
  int i, j;
866
415k
  int delta;
867
415k
  COUPLING_MODE coupling;
868
415k
  int noNoiseBands = hHeaderData->freqBandData.nNfb;
869
870
415k
  Huffman hcb_noiseF;
871
415k
  Huffman hcb_noise;
872
415k
  int envDataTableCompFactor;
873
874
415k
  coupling = h_frame_data->coupling;
875
876
  /*
877
    Select huffman codebook depending on coupling mode
878
  */
879
415k
  if (coupling == COUPLING_BAL) {
880
33.5k
    hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T;
881
33.5k
    hcb_noiseF =
882
33.5k
        (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F"
883
                                                              */
884
33.5k
    envDataTableCompFactor = 1;
885
381k
  } else {
886
381k
    hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T;
887
381k
    hcb_noiseF =
888
381k
        (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F"
889
                                                            */
890
381k
    envDataTableCompFactor = 0;
891
381k
  }
892
893
  /*
894
    Read raw noise-envelope data
895
  */
896
1.07M
  for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
897
658k
    if (h_frame_data->domain_vec_noise[i] == 0) {
898
475k
      if (coupling == COUPLING_BAL) {
899
45.7k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
900
45.7k
            (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor);
901
429k
      } else {
902
429k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
903
429k
            (FIXP_SGL)(int)FDKreadBits(hBs, 5);
904
429k
      }
905
906
1.16M
      for (j = 1; j < noNoiseBands; j++) {
907
687k
        delta = DecodeHuffmanCW(hcb_noiseF, hBs);
908
687k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
909
687k
            (FIXP_SGL)(delta << envDataTableCompFactor);
910
687k
      }
911
475k
    } else {
912
559k
      for (j = 0; j < noNoiseBands; j++) {
913
375k
        delta = DecodeHuffmanCW(hcb_noise, hBs);
914
375k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
915
375k
            (FIXP_SGL)(delta << envDataTableCompFactor);
916
375k
      }
917
183k
    }
918
658k
  }
919
415k
}
920
921
/* ns = mapNsMode2ns[pvcMode-1][nsMode] */
922
static const UCHAR mapNsMode2ns[2][2] = {
923
    {16, 4}, /* pvcMode = 1 */
924
    {12, 3}  /* pvcMode = 2 */
925
};
926
927
static int sbrGetPvcEnvelope(
928
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
929
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
930
    HANDLE_FDK_BITSTREAM hBs,           /*!< handle to struct BIT_BUF */
931
138k
    const UINT flags, const UINT pvcMode) {
932
138k
  int divMode, nsMode;
933
138k
  int indepFlag = flags & SBRDEC_USAC_INDEP;
934
138k
  UCHAR *pvcID = h_frame_data->pvcID;
935
936
138k
  divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS);
937
138k
  nsMode = FDKreadBit(hBs);
938
138k
  FDK_ASSERT((pvcMode == 1) || (pvcMode == 2));
939
138k
  h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode];
940
941
138k
  if (divMode <= 3) {
942
21.7k
    int i, k = 1, sum_length = 0, reuse_pcvID;
943
944
    /* special treatment for first time slot k=0 */
945
21.7k
    indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs));
946
21.7k
    if (reuse_pcvID) {
947
6.15k
      pvcID[0] = hHeaderData->pvcIDprev;
948
15.6k
    } else {
949
15.6k
      pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS);
950
15.6k
    }
951
952
    /* other time slots k>0 */
953
42.6k
    for (i = 0; i < divMode; i++) {
954
21.9k
      int length, numBits = 4;
955
956
21.9k
      if (sum_length >= 13) {
957
1.17k
        numBits = 1;
958
20.7k
      } else if (sum_length >= 11) {
959
309
        numBits = 2;
960
20.4k
      } else if (sum_length >= 7) {
961
2.49k
        numBits = 3;
962
2.49k
      }
963
964
21.9k
      length = FDKreadBits(hBs, numBits);
965
21.9k
      sum_length += length + 1;
966
21.9k
      if (sum_length >= PVC_NTIMESLOT) {
967
1.03k
        return 0; /* parse error */
968
1.03k
      }
969
80.3k
      for (; length--; k++) {
970
59.4k
        pvcID[k] = pvcID[k - 1];
971
59.4k
      }
972
20.9k
      pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
973
20.9k
    }
974
261k
    for (; k < 16; k++) {
975
240k
      pvcID[k] = pvcID[k - 1];
976
240k
    }
977
116k
  } else { /* divMode >= 4 */
978
116k
    int num_grid_info, fixed_length, grid_info, j, k = 0;
979
980
116k
    divMode -= 4;
981
116k
    num_grid_info = 2 << divMode;
982
116k
    fixed_length = 8 >> divMode;
983
116k
    FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT);
984
985
    /* special treatment for first time slot k=0 */
986
116k
    indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs));
987
116k
    if (grid_info) {
988
111k
      pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
989
111k
    } else {
990
5.71k
      pvcID[k++] = hHeaderData->pvcIDprev;
991
5.71k
    }
992
116k
    j = fixed_length - 1;
993
908k
    for (; j--; k++) {
994
792k
      pvcID[k] = pvcID[k - 1];
995
792k
    }
996
116k
    num_grid_info--;
997
998
    /* other time slots k>0 */
999
272k
    for (; num_grid_info--;) {
1000
155k
      j = fixed_length;
1001
155k
      grid_info = FDKreadBit(hBs);
1002
155k
      if (grid_info) {
1003
13.8k
        pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
1004
13.8k
        j--;
1005
13.8k
      }
1006
1.10M
      for (; j--; k++) {
1007
945k
        pvcID[k] = pvcID[k - 1];
1008
945k
      }
1009
155k
    }
1010
116k
  }
1011
1012
137k
  hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1];
1013
1014
  /* usage of PVC excludes inter-TES tool */
1015
137k
  h_frame_data->iTESactive = (UCHAR)0;
1016
1017
137k
  return 1;
1018
138k
}
1019
/*!
1020
  \brief   Read envelope data from bitstream
1021
*/
1022
static int sbrGetEnvelope(
1023
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
1024
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
1025
    HANDLE_FDK_BITSTREAM hBs,           /*!< handle to struct BIT_BUF */
1026
277k
    const UINT flags) {
1027
277k
  int i, j;
1028
277k
  UCHAR no_band[MAX_ENVELOPES];
1029
277k
  int delta = 0;
1030
277k
  int offset = 0;
1031
277k
  COUPLING_MODE coupling = h_frame_data->coupling;
1032
277k
  int ampRes = hHeaderData->bs_info.ampResolution;
1033
277k
  int nEnvelopes = h_frame_data->frameInfo.nEnvelopes;
1034
277k
  int envDataTableCompFactor;
1035
277k
  int start_bits, start_bits_balance;
1036
277k
  Huffman hcb_t, hcb_f;
1037
1038
277k
  h_frame_data->nScaleFactors = 0;
1039
1040
277k
  if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) {
1041
102k
    if (flags & SBRDEC_ELD_GRID)
1042
37.7k
      ampRes = h_frame_data->ampResolutionCurrentFrame;
1043
65.0k
    else
1044
65.0k
      ampRes = 0;
1045
102k
  }
1046
277k
  h_frame_data->ampResolutionCurrentFrame = ampRes;
1047
1048
  /*
1049
    Set number of bits for first value depending on amplitude resolution
1050
  */
1051
277k
  if (ampRes == 1) {
1052
68.1k
    start_bits = 6;
1053
68.1k
    start_bits_balance = 5;
1054
209k
  } else {
1055
209k
    start_bits = 7;
1056
209k
    start_bits_balance = 6;
1057
209k
  }
1058
1059
  /*
1060
    Calculate number of values for each envelope and alltogether
1061
  */
1062
774k
  for (i = 0; i < nEnvelopes; i++) {
1063
496k
    no_band[i] =
1064
496k
        hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]];
1065
496k
    h_frame_data->nScaleFactors += no_band[i];
1066
496k
  }
1067
277k
  if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) return 0;
1068
1069
  /*
1070
    Select Huffman codebook depending on coupling mode and amplitude resolution
1071
  */
1072
277k
  if (coupling == COUPLING_BAL) {
1073
33.5k
    envDataTableCompFactor = 1;
1074
33.5k
    if (ampRes == 0) {
1075
28.2k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T;
1076
28.2k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F;
1077
28.2k
    } else {
1078
5.34k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T;
1079
5.34k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F;
1080
5.34k
    }
1081
244k
  } else {
1082
244k
    envDataTableCompFactor = 0;
1083
244k
    if (ampRes == 0) {
1084
181k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T;
1085
181k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F;
1086
181k
    } else {
1087
62.8k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T;
1088
62.8k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F;
1089
62.8k
    }
1090
244k
  }
1091
1092
277k
  h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */
1093
  /*
1094
    Now read raw envelope data
1095
  */
1096
774k
  for (j = 0, offset = 0; j < nEnvelopes; j++) {
1097
496k
    if (h_frame_data->domain_vec[j] == 0) {
1098
359k
      if (coupling == COUPLING_BAL) {
1099
55.8k
        h_frame_data->iEnvelope[offset] =
1100
55.8k
            (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance))
1101
55.8k
                       << envDataTableCompFactor);
1102
303k
      } else {
1103
303k
        h_frame_data->iEnvelope[offset] =
1104
303k
            (FIXP_SGL)(int)FDKreadBits(hBs, start_bits);
1105
303k
      }
1106
359k
    }
1107
1108
3.90M
    for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) {
1109
3.40M
      if (h_frame_data->domain_vec[j] == 0) {
1110
2.26M
        delta = DecodeHuffmanCW(hcb_f, hBs);
1111
2.26M
      } else {
1112
1.14M
        delta = DecodeHuffmanCW(hcb_t, hBs);
1113
1.14M
      }
1114
1115
3.40M
      h_frame_data->iEnvelope[offset + i] =
1116
3.40M
          (FIXP_SGL)(delta << envDataTableCompFactor);
1117
3.40M
    }
1118
496k
    if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) {
1119
153k
      int bs_temp_shape = FDKreadBit(hBs);
1120
153k
      FDK_ASSERT(j < 8);
1121
153k
      h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j);
1122
153k
      if (bs_temp_shape) {
1123
40.2k
        h_frame_data->interTempShapeMode[j] =
1124
40.2k
            FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */
1125
113k
      } else {
1126
113k
        h_frame_data->interTempShapeMode[j] = 0;
1127
113k
      }
1128
153k
    }
1129
496k
    offset += no_band[j];
1130
496k
  }
1131
1132
#if ENV_EXP_FRACT
1133
  /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional
1134
   * part) */
1135
  for (i = 0; i < h_frame_data->nScaleFactors; i++) {
1136
    h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT;
1137
  }
1138
#endif
1139
1140
277k
  return 1;
1141
277k
}
1142
1143
/***************************************************************************/
1144
/*!
1145
  \brief    Generates frame info for FIXFIXonly frame class used for low delay
1146
 version
1147
1148
  \return   zero for error, one for correct.
1149
 ****************************************************************************/
1150
static int generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal,
1151
11.5k
                              int numberTimeSlots, const UINT flags) {
1152
11.5k
  int nEnv, i, tranIdx;
1153
11.5k
  const int *pTable;
1154
1155
11.5k
  if (tranPosInternal >= numberTimeSlots) {
1156
0
    return 0;
1157
0
  }
1158
1159
11.5k
  switch (numberTimeSlots) {
1160
0
    case 8:
1161
0
      pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal];
1162
0
      break;
1163
8.73k
    case 15:
1164
8.73k
      pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal];
1165
8.73k
      break;
1166
2.82k
    case 16:
1167
2.82k
      pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal];
1168
2.82k
      break;
1169
0
    default:
1170
0
      return 0;
1171
11.5k
  }
1172
1173
  /* look number of envelopes in table */
1174
11.5k
  nEnv = pTable[0];
1175
  /* look up envelope distribution in table */
1176
27.8k
  for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2];
1177
  /* open and close frame border */
1178
11.5k
  hSbrFrameInfo->borders[0] = 0;
1179
11.5k
  hSbrFrameInfo->borders[nEnv] = numberTimeSlots;
1180
11.5k
  hSbrFrameInfo->nEnvelopes = nEnv;
1181
1182
  /* transient idx */
1183
11.5k
  tranIdx = hSbrFrameInfo->tranEnv = pTable[1];
1184
1185
  /* add noise floors */
1186
11.5k
  hSbrFrameInfo->bordersNoise[0] = 0;
1187
11.5k
  hSbrFrameInfo->bordersNoise[1] =
1188
11.5k
      hSbrFrameInfo->borders[tranIdx ? tranIdx : 1];
1189
11.5k
  hSbrFrameInfo->bordersNoise[2] = numberTimeSlots;
1190
  /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2)
1191
   */
1192
11.5k
  hSbrFrameInfo->nNoiseEnvelopes = 2;
1193
1194
11.5k
  return 1;
1195
11.5k
}
1196
1197
/*!
1198
  \brief  Extracts LowDelaySBR control data from the bitstream.
1199
1200
  \return zero for bitstream error, one for correct.
1201
*/
1202
static int extractLowDelayGrid(
1203
    HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */
1204
    HANDLE_SBR_HEADER_DATA hHeaderData,
1205
    HANDLE_SBR_FRAME_DATA
1206
        h_frame_data, /*!< contains the FRAME_INFO struct to be filled */
1207
13.6k
    int timeSlots, const UINT flags) {
1208
13.6k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1209
13.6k
  INT numberTimeSlots = hHeaderData->numberTimeSlots;
1210
13.6k
  INT temp = 0, k;
1211
1212
  /* FIXFIXonly framing case */
1213
13.6k
  h_frame_data->frameInfo.frameClass = 0;
1214
1215
  /* get the transient position from the bitstream */
1216
13.6k
  switch (timeSlots) {
1217
0
    case 8:
1218
      /* 3bit transient position (temp={0;..;7}) */
1219
0
      temp = FDKreadBits(hBitBuf, 3);
1220
0
      break;
1221
1222
2.82k
    case 16:
1223
13.6k
    case 15:
1224
      /* 4bit transient position (temp={0;..;15}) */
1225
13.6k
      temp = FDKreadBits(hBitBuf, 4);
1226
13.6k
      break;
1227
1228
0
    default:
1229
0
      return 0;
1230
13.6k
  }
1231
1232
  /* For "case 15" only*/
1233
13.6k
  if (temp >= timeSlots) {
1234
2.07k
    return 0;
1235
2.07k
  }
1236
1237
  /* calculate borders according to the transient position */
1238
11.5k
  if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) {
1239
0
    return 0;
1240
0
  }
1241
1242
  /* decode freq res: */
1243
39.4k
  for (k = 0; k < pFrameInfo->nEnvelopes; k++) {
1244
27.8k
    pFrameInfo->freqRes[k] =
1245
27.8k
        (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */
1246
27.8k
  }
1247
1248
11.5k
  return 1;
1249
11.5k
}
1250
1251
/*!
1252
  \brief   Extract the PVC frame information (structure FRAME_INFO) from the
1253
  bitstream \return  Zero for bitstream error, one for correct.
1254
*/
1255
int extractPvcFrameInfo(
1256
    HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
1257
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
1258
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
1259
                                           frame-info will be stored */
1260
    HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where
1261
                                                     the previous frame-info
1262
                                                     will be stored */
1263
    UCHAR pvc_mode_last,                          /**< PVC mode of last frame */
1264
140k
    const UINT flags) {
1265
140k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1266
140k
  FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo;
1267
140k
  int bs_var_len_hf, bs_noise_position;
1268
140k
  bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */
1269
140k
  bs_var_len_hf = FDKreadBit(hBs);
1270
140k
  pFrameInfo->noisePosition = bs_noise_position;
1271
140k
  pFrameInfo->tranEnv = -1;
1272
1273
  /* Init for bs_noise_position == 0 in case a parse error is found below. */
1274
140k
  pFrameInfo->nEnvelopes = 1;
1275
140k
  pFrameInfo->nNoiseEnvelopes = 1;
1276
140k
  pFrameInfo->freqRes[0] = 0;
1277
1278
140k
  if (bs_var_len_hf) { /* 1 or 3 Bits */
1279
116k
    pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1;
1280
116k
    if (pFrameInfo->varLength > 3) {
1281
1.02k
      pFrameInfo->varLength =
1282
1.02k
          0;    /* assume bs_var_len_hf == 0 in case of error */
1283
1.02k
      return 0; /* reserved value -> parse error */
1284
1.02k
    }
1285
116k
  } else {
1286
23.9k
    pFrameInfo->varLength = 0;
1287
23.9k
  }
1288
1289
139k
  if (bs_noise_position) {
1290
120k
    pFrameInfo->nEnvelopes = 2;
1291
120k
    pFrameInfo->nNoiseEnvelopes = 2;
1292
120k
    FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes));
1293
120k
  }
1294
1295
  /* frame border calculation */
1296
139k
  if (hHeaderData->bs_info.pvc_mode > 0) {
1297
    /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference.
1298
     */
1299
1300
139k
    FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2));
1301
1302
    /* left timeborder-offset: use the timeborder of prev SBR frame */
1303
139k
    if (pPrevFrameInfo->nEnvelopes > 0) {
1304
134k
      pFrameInfo->borders[0] =
1305
134k
          pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT;
1306
134k
      FDK_ASSERT(pFrameInfo->borders[0] <= 3);
1307
134k
    } else {
1308
4.42k
      pFrameInfo->borders[0] = 0;
1309
4.42k
    }
1310
1311
    /* right timeborder-offset: */
1312
139k
    pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength;
1313
1314
139k
    if (pFrameInfo->nEnvelopes == 2) {
1315
120k
      pFrameInfo->borders[1] = pFrameInfo->noisePosition;
1316
120k
    }
1317
1318
    /* Calculation of PVC time borders t_EPVC */
1319
139k
    if (pvc_mode_last == 0) {
1320
      /* there was a legacy SBR frame before this frame => use bs_var_len' for
1321
       * first PVC timeslot */
1322
11.0k
      pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0];
1323
128k
    } else {
1324
128k
      pFrameInfo->pvcBorders[0] = 0;
1325
128k
    }
1326
139k
    if (pFrameInfo->nEnvelopes == 2) {
1327
120k
      pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1];
1328
120k
    }
1329
139k
    pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16;
1330
1331
    /* calculation of SBR noise-floor time-border vector: */
1332
537k
    for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) {
1333
398k
      pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i];
1334
398k
    }
1335
1336
139k
    pFrameInfo->tranEnv = -1; /* tranEnv not used */
1337
139k
  }
1338
139k
  return 1;
1339
139k
}
1340
1341
/*!
1342
  \brief   Extract the frame information (structure FRAME_INFO) from the
1343
  bitstream \return  Zero for bitstream error, one for correct.
1344
*/
1345
int extractFrameInfo(
1346
    HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
1347
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
1348
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
1349
                                           frame-info will be stored */
1350
256k
    const UINT nrOfChannels, const UINT flags) {
1351
256k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1352
256k
  int numberTimeSlots = hHeaderData->numberTimeSlots;
1353
256k
  int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR,
1354
256k
      temp = 0, staticFreqRes;
1355
256k
  UCHAR frameClass;
1356
1357
256k
  if (flags & SBRDEC_ELD_GRID) {
1358
    /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames
1359
     * and the LowDelayGrid for transient Frames */
1360
64.0k
    frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */
1361
64.0k
    if (frameClass == 1) {
1362
      /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal
1363
       * SBR-Grid for FIXIFX */
1364
      /* extract the AACLD-Sbr-Grid */
1365
13.6k
      pFrameInfo->frameClass = frameClass;
1366
13.6k
      int err = 1;
1367
13.6k
      err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots,
1368
13.6k
                                flags);
1369
13.6k
      return err;
1370
13.6k
    }
1371
192k
  } else {
1372
192k
    frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */
1373
192k
  }
1374
1375
242k
  switch (frameClass) {
1376
139k
    case 0:
1377
139k
      temp = FDKreadBits(hBs, 2); /* E [2 bits ] */
1378
139k
      nEnv = (int)(1 << temp);    /* E -> e */
1379
1380
139k
      if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1))
1381
37.1k
        h_frame_data->ampResolutionCurrentFrame =
1382
37.1k
            FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */
1383
1384
139k
      staticFreqRes = FDKreadBits(hBs, 1);
1385
1386
139k
      if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
1387
74.8k
        if (nEnv > MAX_ENVELOPES_USAC) return 0;
1388
74.8k
      } else
1389
1390
64.1k
        b = nEnv + 1;
1391
139k
      switch (nEnv) {
1392
94.8k
        case 1:
1393
94.8k
          switch (numberTimeSlots) {
1394
34.2k
            case 15:
1395
34.2k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15,
1396
34.2k
                        sizeof(FRAME_INFO));
1397
34.2k
              break;
1398
60.5k
            case 16:
1399
60.5k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16,
1400
60.5k
                        sizeof(FRAME_INFO));
1401
60.5k
              break;
1402
0
            default:
1403
0
              FDK_ASSERT(0);
1404
94.8k
          }
1405
94.8k
          break;
1406
94.8k
        case 2:
1407
29.5k
          switch (numberTimeSlots) {
1408
6.96k
            case 15:
1409
6.96k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15,
1410
6.96k
                        sizeof(FRAME_INFO));
1411
6.96k
              break;
1412
22.5k
            case 16:
1413
22.5k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16,
1414
22.5k
                        sizeof(FRAME_INFO));
1415
22.5k
              break;
1416
0
            default:
1417
0
              FDK_ASSERT(0);
1418
29.5k
          }
1419
29.5k
          break;
1420
29.5k
        case 4:
1421
9.18k
          switch (numberTimeSlots) {
1422
5.59k
            case 15:
1423
5.59k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15,
1424
5.59k
                        sizeof(FRAME_INFO));
1425
5.59k
              break;
1426
3.59k
            case 16:
1427
3.59k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16,
1428
3.59k
                        sizeof(FRAME_INFO));
1429
3.59k
              break;
1430
0
            default:
1431
0
              FDK_ASSERT(0);
1432
9.18k
          }
1433
9.18k
          break;
1434
9.18k
        case 8:
1435
5.50k
#if (MAX_ENVELOPES >= 8)
1436
5.50k
          switch (numberTimeSlots) {
1437
1.79k
            case 15:
1438
1.79k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15,
1439
1.79k
                        sizeof(FRAME_INFO));
1440
1.79k
              break;
1441
3.71k
            case 16:
1442
3.71k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16,
1443
3.71k
                        sizeof(FRAME_INFO));
1444
3.71k
              break;
1445
0
            default:
1446
0
              FDK_ASSERT(0);
1447
5.50k
          }
1448
5.50k
          break;
1449
#else
1450
          return 0;
1451
#endif
1452
139k
      }
1453
      /* Apply correct freqRes (High is default) */
1454
139k
      if (!staticFreqRes) {
1455
228k
        for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0;
1456
97.0k
      }
1457
1458
139k
      break;
1459
48.1k
    case 1:
1460
90.1k
    case 2:
1461
90.1k
      temp = FDKreadBits(hBs, 2); /* A [2 bits] */
1462
1463
90.1k
      n = FDKreadBits(hBs, 2); /* n = N [2 bits] */
1464
1465
90.1k
      nEnv = n + 1; /* # envelopes */
1466
90.1k
      b = nEnv + 1; /* # borders   */
1467
1468
90.1k
      break;
1469
242k
  }
1470
1471
242k
  switch (frameClass) {
1472
48.1k
    case 1:
1473
      /* Decode borders: */
1474
48.1k
      pFrameInfo->borders[0] = 0;      /* first border          */
1475
48.1k
      border = temp + numberTimeSlots; /* A -> aR               */
1476
48.1k
      i = b - 1;                       /* frame info index for last border */
1477
48.1k
      pFrameInfo->borders[i] = border; /* last border                      */
1478
1479
91.7k
      for (k = 0; k < n; k++) {
1480
43.5k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1481
43.5k
        border -= (2 * temp + 2);   /* R -> r                */
1482
43.5k
        pFrameInfo->borders[--i] = border;
1483
43.5k
      }
1484
1485
      /* Decode pointer: */
1486
48.1k
      pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
1487
48.1k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1488
1489
48.1k
      if (p > n + 1) return 0;
1490
1491
46.8k
      pFrameInfo->tranEnv = p ? n + 2 - p : -1;
1492
1493
      /* Decode freq res: */
1494
134k
      for (k = n; k >= 0; k--) {
1495
87.4k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1496
87.4k
      }
1497
1498
      /* Calculate noise floor middle border: */
1499
46.8k
      if (p == 0 || p == 1)
1500
44.7k
        pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
1501
2.12k
      else
1502
2.12k
        pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
1503
1504
46.8k
      break;
1505
1506
41.9k
    case 2:
1507
      /* Decode borders: */
1508
41.9k
      border = temp;                   /* A -> aL */
1509
41.9k
      pFrameInfo->borders[0] = border; /* first border */
1510
1511
65.6k
      for (k = 1; k <= n; k++) {
1512
23.7k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1513
23.7k
        border += (2 * temp + 2);   /* R -> r                */
1514
23.7k
        pFrameInfo->borders[k] = border;
1515
23.7k
      }
1516
41.9k
      pFrameInfo->borders[k] = numberTimeSlots; /* last border */
1517
1518
      /* Decode pointer: */
1519
41.9k
      pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
1520
41.9k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1521
41.9k
      if (p > n + 1) return 0;
1522
1523
40.6k
      if (p == 0 || p == 1)
1524
33.7k
        pFrameInfo->tranEnv = -1;
1525
6.87k
      else
1526
6.87k
        pFrameInfo->tranEnv = p - 1;
1527
1528
      /* Decode freq res: */
1529
101k
      for (k = 0; k <= n; k++) {
1530
60.5k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1531
60.5k
      }
1532
1533
      /* Calculate noise floor middle border: */
1534
40.6k
      switch (p) {
1535
30.3k
        case 0:
1536
30.3k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1];
1537
30.3k
          break;
1538
3.39k
        case 1:
1539
3.39k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
1540
3.39k
          break;
1541
6.87k
        default:
1542
6.87k
          pFrameInfo->bordersNoise[1] =
1543
6.87k
              pFrameInfo->borders[pFrameInfo->tranEnv];
1544
6.87k
          break;
1545
40.6k
      }
1546
1547
40.6k
      break;
1548
1549
40.6k
    case 3:
1550
      /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */
1551
1552
13.7k
      aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */
1553
1554
13.7k
      aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */
1555
1556
13.7k
      nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */
1557
1558
13.7k
      nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */
1559
1560
      /*-------------------------------------------------------------------------
1561
        Calculate help variables
1562
        --------------------------------------------------------------------------*/
1563
1564
      /* general: */
1565
13.7k
      nEnv = nL + nR + 1; /* # envelopes */
1566
13.7k
      if (nEnv > MAX_ENVELOPES) return 0;
1567
13.7k
      b = nEnv + 1; /* # borders   */
1568
1569
      /*-------------------------------------------------------------------------
1570
        Decode envelopes
1571
        --------------------------------------------------------------------------*/
1572
1573
      /* L-borders:   */
1574
13.7k
      border = aL; /* first border */
1575
13.7k
      pFrameInfo->borders[0] = border;
1576
1577
29.9k
      for (k = 1; k <= nL; k++) {
1578
16.2k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1579
16.2k
        border += (2 * temp + 2);   /* R -> r                */
1580
16.2k
        pFrameInfo->borders[k] = border;
1581
16.2k
      }
1582
1583
      /* R-borders:  */
1584
13.7k
      border = aR; /* last border */
1585
13.7k
      i = nEnv;
1586
1587
13.7k
      pFrameInfo->borders[i] = border;
1588
1589
29.9k
      for (k = 0; k < nR; k++) {
1590
16.2k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1591
16.2k
        border -= (2 * temp + 2);   /* R -> r                */
1592
16.2k
        pFrameInfo->borders[--i] = border;
1593
16.2k
      }
1594
1595
      /* decode pointer: */
1596
13.7k
      pointer_bits =
1597
13.7k
          DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1));
1598
13.7k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1599
1600
13.7k
      if (p > nL + nR + 1) return 0;
1601
1602
12.2k
      pFrameInfo->tranEnv = p ? b - p : -1;
1603
1604
      /* decode freq res: */
1605
51.9k
      for (k = 0; k < nEnv; k++) {
1606
39.6k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1607
39.6k
      }
1608
1609
      /*-------------------------------------------------------------------------
1610
        Decode noise floors
1611
        --------------------------------------------------------------------------*/
1612
12.2k
      pFrameInfo->bordersNoise[0] = aL;
1613
1614
12.2k
      if (nEnv == 1) {
1615
        /* 1 noise floor envelope: */
1616
2.02k
        pFrameInfo->bordersNoise[1] = aR;
1617
10.2k
      } else {
1618
        /* 2 noise floor envelopes */
1619
10.2k
        if (p == 0 || p == 1)
1620
7.62k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1];
1621
2.60k
        else
1622
2.60k
          pFrameInfo->bordersNoise[1] =
1623
2.60k
              pFrameInfo->borders[pFrameInfo->tranEnv];
1624
10.2k
        pFrameInfo->bordersNoise[2] = aR;
1625
10.2k
      }
1626
12.2k
      break;
1627
242k
  }
1628
1629
  /*
1630
    Store number of envelopes, noise floor envelopes and frame class
1631
  */
1632
238k
  pFrameInfo->nEnvelopes = nEnv;
1633
1634
238k
  if (nEnv == 1)
1635
145k
    pFrameInfo->nNoiseEnvelopes = 1;
1636
93.3k
  else
1637
93.3k
    pFrameInfo->nNoiseEnvelopes = 2;
1638
1639
238k
  pFrameInfo->frameClass = frameClass;
1640
1641
238k
  if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) {
1642
    /* calculate noise floor first and last borders: */
1643
87.4k
    pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0];
1644
87.4k
    pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] =
1645
87.4k
        pFrameInfo->borders[nEnv];
1646
87.4k
  }
1647
1648
238k
  return 1;
1649
242k
}
1650
1651
/*!
1652
  \brief   Check if the frameInfo vector has reasonable values.
1653
  \return  Zero for error, one for correct
1654
*/
1655
static int checkFrameInfo(
1656
    FRAME_INFO *pFrameInfo, /*!< pointer to frameInfo */
1657
    int numberOfTimeSlots,  /*!< QMF time slots per frame */
1658
    int overlap,            /*!< Amount of overlap QMF time slots */
1659
    int timeStep)           /*!< QMF slots to SBR slots step factor */
1660
389k
{
1661
389k
  int maxPos, i, j;
1662
389k
  int startPos;
1663
389k
  int stopPos;
1664
389k
  int tranEnv;
1665
389k
  int startPosNoise;
1666
389k
  int stopPosNoise;
1667
389k
  int nEnvelopes = pFrameInfo->nEnvelopes;
1668
389k
  int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes;
1669
1670
389k
  if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0;
1671
1672
389k
  if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0;
1673
1674
389k
  startPos = pFrameInfo->borders[0];
1675
389k
  stopPos = pFrameInfo->borders[nEnvelopes];
1676
389k
  tranEnv = pFrameInfo->tranEnv;
1677
389k
  startPosNoise = pFrameInfo->bordersNoise[0];
1678
389k
  stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes];
1679
1680
389k
  if (overlap < 0 || overlap > (3 * (4))) {
1681
0
    return 0;
1682
0
  }
1683
389k
  if (timeStep < 1 || timeStep > (4)) {
1684
0
    return 0;
1685
0
  }
1686
389k
  maxPos = numberOfTimeSlots + (overlap / timeStep);
1687
1688
  /* Check that the start and stop positions of the frame are reasonable values.
1689
   */
1690
389k
  if ((startPos < 0) || (startPos >= stopPos)) return 0;
1691
389k
  if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or
1692
                                                directly after the overlap
1693
                                                buffer */
1694
0
    return 0;
1695
389k
  if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for
1696
                                      output after processing */
1697
0
    return 0;
1698
389k
  if (stopPos > maxPos) return 0;
1699
1700
  /* Check that the  start border for every envelope is strictly later in time
1701
   */
1702
1.08M
  for (i = 0; i < nEnvelopes; i++) {
1703
701k
    if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0;
1704
701k
  }
1705
1706
  /* Check that the envelope to be shortened is actually among the envelopes */
1707
385k
  if (tranEnv > nEnvelopes) return 0;
1708
1709
  /* Check the noise borders */
1710
385k
  if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0;
1711
1712
385k
  if (startPos != startPosNoise || stopPos != stopPosNoise) return 0;
1713
1714
  /* Check that the  start border for every noise-envelope is strictly later in
1715
   * time*/
1716
990k
  for (i = 0; i < nNoiseEnvelopes; i++) {
1717
605k
    if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1])
1718
0
      return 0;
1719
605k
  }
1720
1721
  /* Check that every noise border is the same as an envelope border*/
1722
990k
  for (i = 0; i < nNoiseEnvelopes; i++) {
1723
605k
    startPosNoise = pFrameInfo->bordersNoise[i];
1724
1725
877k
    for (j = 0; j < nEnvelopes; j++) {
1726
877k
      if (pFrameInfo->borders[j] == startPosNoise) break;
1727
877k
    }
1728
605k
    if (j == nEnvelopes) return 0;
1729
605k
  }
1730
1731
385k
  return 1;
1732
385k
}