Coverage Report

Created: 2026-02-14 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fdk-aac/libSBRdec/src/env_extr.cpp
Line
Count
Source
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
30.9k
#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
437k
{
220
437k
  UINT fsMapped = fs, tableSize = 0;
221
437k
  const SR_MAPPING *mappingTable;
222
437k
  int i;
223
224
437k
  if (!isUsac) {
225
206k
    mappingTable = stdSampleRatesMapping;
226
206k
    tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING);
227
231k
  } else {
228
231k
    mappingTable = stdSampleRatesMappingUsac;
229
231k
    tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING);
230
231k
  }
231
232
2.22M
  for (i = tableSize - 1; i >= 0; i--) {
233
2.22M
    if (fs >= mappingTable[i].fsRangeLo) {
234
437k
      fsMapped = mappingTable[i].fsMapped;
235
437k
      break;
236
437k
    }
237
2.22M
  }
238
239
437k
  return (fsMapped);
240
437k
}
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
293k
               const int setDefaultHdr) {
247
293k
  HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
248
293k
  SBR_ERROR sbrError = SBRDEC_OK;
249
293k
  int numAnalysisBands;
250
293k
  int sampleRateProc;
251
252
293k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
253
206k
    sampleRateProc =
254
206k
        sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0);
255
206k
  } else {
256
86.9k
    sampleRateProc = sampleRateOut * downscaleFactor;
257
86.9k
  }
258
259
293k
  if (sampleRateIn == sampleRateOut) {
260
7.89k
    hHeaderData->sbrProcSmplRate = sampleRateProc << 1;
261
7.89k
    numAnalysisBands = 32;
262
285k
  } else {
263
285k
    hHeaderData->sbrProcSmplRate = sampleRateProc;
264
285k
    if ((sampleRateOut >> 1) == sampleRateIn) {
265
      /* 1:2 */
266
208k
      numAnalysisBands = 32;
267
208k
    } else if ((sampleRateOut >> 2) == sampleRateIn) {
268
      /* 1:4 */
269
5.69k
      numAnalysisBands = 16;
270
72.1k
    } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) {
271
      /* 3:8, 3/4 core frame length */
272
71.7k
      numAnalysisBands = 24;
273
71.7k
    } else {
274
448
      sbrError = SBRDEC_UNSUPPORTED_CONFIG;
275
448
      goto bail;
276
448
    }
277
285k
  }
278
293k
  numAnalysisBands /= downscaleFactor;
279
280
293k
  if (setDefaultHdr) {
281
    /* Fill in default values first */
282
291k
    hHeaderData->syncState = SBR_NOT_INITIALIZED;
283
291k
    hHeaderData->status = 0;
284
291k
    hHeaderData->frameErrorFlag = 0;
285
286
291k
    hHeaderData->bs_info.ampResolution = 1;
287
291k
    hHeaderData->bs_info.xover_band = 0;
288
291k
    hHeaderData->bs_info.sbr_preprocessing = 0;
289
291k
    hHeaderData->bs_info.pvc_mode = 0;
290
291
291k
    hHeaderData->bs_data.startFreq = 5;
292
291k
    hHeaderData->bs_data.stopFreq = 0;
293
291k
    hHeaderData->bs_data.freqScale =
294
291k
        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
291k
    hHeaderData->bs_data.alterScale = 1;
300
291k
    hHeaderData->bs_data.noise_bands = 2;
301
291k
    hHeaderData->bs_data.limiterBands = 2;
302
291k
    hHeaderData->bs_data.limiterGains = 2;
303
291k
    hHeaderData->bs_data.interpolFreq = 1;
304
291k
    hHeaderData->bs_data.smoothingLength = 1;
305
306
    /* Patch some entries */
307
291k
    if (sampleRateOut * downscaleFactor >= 96000) {
308
59.3k
      hHeaderData->bs_data.startFreq =
309
59.3k
          4; /*   having read these frequency values from bit stream before. */
310
59.3k
      hHeaderData->bs_data.stopFreq = 3;
311
232k
    } else if (sampleRateOut * downscaleFactor >
312
232k
               24000) { /* Trigger an error if SBR is going to be processed
313
                           without     */
314
135k
      hHeaderData->bs_data.startFreq =
315
135k
          7; /*   having read these frequency values from bit stream before. */
316
135k
      hHeaderData->bs_data.stopFreq = 3;
317
135k
    }
318
291k
  }
319
320
293k
  if ((sampleRateOut >> 2) == sampleRateIn) {
321
5.69k
    hHeaderData->timeStep = 4;
322
287k
  } else {
323
287k
    hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2;
324
287k
  }
325
326
  /* Setup pointers to frequency band tables */
327
293k
  hFreq->freqBandTable[0] = hFreq->freqBandTableLo;
328
293k
  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
293k
  hHeaderData->numberTimeSlots =
333
293k
      (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1);
334
293k
  if (hHeaderData->numberTimeSlots > (16)) {
335
0
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
336
0
  }
337
338
293k
  hHeaderData->numberOfAnalysisBands = numAnalysisBands;
339
293k
  if ((sampleRateOut >> 2) == sampleRateIn) {
340
5.69k
    hHeaderData->numberTimeSlots <<= 1;
341
5.69k
  }
342
343
293k
bail:
344
293k
  return sbrError;
345
293k
}
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
163k
{
355
163k
  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
9.34M
  for (i = 0; i < MAX_FREQ_COEFFS; i++)
360
9.17M
    h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0;
361
983k
  for (i = 0; i < MAX_NOISE_COEFFS; i++)
362
819k
    h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0;
363
983k
  for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF;
364
365
163k
  h_prev_data->stopPos = timeSlots;
366
163k
  h_prev_data->coupling = COUPLING_OFF;
367
163k
  h_prev_data->ampRes = 0;
368
369
163k
  FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo));
370
163k
}
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
236k
                 const UCHAR configMode) {
381
236k
  SBR_HEADER_DATA_BS *pBsData;
382
236k
  SBR_HEADER_DATA_BS lastHeader;
383
236k
  SBR_HEADER_DATA_BS_INFO lastInfo;
384
236k
  int headerExtra1 = 0, headerExtra2 = 0;
385
386
  /* Read and discard new header in config change detection mode */
387
236k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
388
6.90k
    if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
389
      /* ampResolution */
390
2.10k
      FDKreadBits(hBs, 1);
391
2.10k
    }
392
    /* startFreq, stopFreq */
393
6.90k
    FDKpushFor(hBs, 8);
394
6.90k
    if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
395
      /* xover_band */
396
2.10k
      FDKreadBits(hBs, 3);
397
      /* reserved bits */
398
2.10k
      FDKreadBits(hBs, 2);
399
2.10k
    }
400
6.90k
    headerExtra1 = FDKreadBit(hBs);
401
6.90k
    headerExtra2 = FDKreadBit(hBs);
402
6.90k
    FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2);
403
404
6.90k
    return HEADER_OK;
405
6.90k
  }
406
407
  /* Copy SBR bit stream header to temporary header */
408
229k
  lastHeader = hHeaderData->bs_data;
409
229k
  lastInfo = hHeaderData->bs_info;
410
411
  /* Read new header from bitstream */
412
229k
  if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) {
413
4.60k
    pBsData = &hHeaderData->bs_dflt;
414
224k
  } else {
415
224k
    pBsData = &hHeaderData->bs_data;
416
224k
  }
417
418
229k
  if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
419
138k
    hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1);
420
138k
  }
421
422
229k
  pBsData->startFreq = FDKreadBits(hBs, 4);
423
229k
  pBsData->stopFreq = FDKreadBits(hBs, 4);
424
425
229k
  if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
426
138k
    hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3);
427
138k
    FDKreadBits(hBs, 2);
428
138k
  }
429
430
229k
  headerExtra1 = FDKreadBits(hBs, 1);
431
229k
  headerExtra2 = FDKreadBits(hBs, 1);
432
433
  /* Handle extra header information */
434
229k
  if (headerExtra1) {
435
102k
    pBsData->freqScale = FDKreadBits(hBs, 2);
436
102k
    pBsData->alterScale = FDKreadBits(hBs, 1);
437
102k
    pBsData->noise_bands = FDKreadBits(hBs, 2);
438
127k
  } else {
439
127k
    pBsData->freqScale = 2;
440
127k
    pBsData->alterScale = 1;
441
127k
    pBsData->noise_bands = 2;
442
127k
  }
443
444
229k
  if (headerExtra2) {
445
108k
    pBsData->limiterBands = FDKreadBits(hBs, 2);
446
108k
    pBsData->limiterGains = FDKreadBits(hBs, 2);
447
108k
    pBsData->interpolFreq = FDKreadBits(hBs, 1);
448
108k
    pBsData->smoothingLength = FDKreadBits(hBs, 1);
449
120k
  } else {
450
120k
    pBsData->limiterBands = 2;
451
120k
    pBsData->limiterGains = 2;
452
120k
    pBsData->interpolFreq = 1;
453
120k
    pBsData->smoothingLength = 1;
454
120k
  }
455
456
  /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */
457
229k
  if (hHeaderData->syncState < SBR_HEADER ||
458
61.7k
      lastHeader.startFreq != pBsData->startFreq ||
459
31.2k
      lastHeader.stopFreq != pBsData->stopFreq ||
460
26.4k
      lastHeader.freqScale != pBsData->freqScale ||
461
15.1k
      lastHeader.alterScale != pBsData->alterScale ||
462
14.9k
      lastHeader.noise_bands != pBsData->noise_bands ||
463
214k
      lastInfo.xover_band != hHeaderData->bs_info.xover_band) {
464
214k
    return HEADER_RESET; /* New settings */
465
214k
  }
466
467
14.6k
  return HEADER_OK;
468
229k
}
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
257k
                             HANDLE_FDK_BITSTREAM hBs, const UINT flags) {
478
257k
  int i, bitsRead = 0;
479
480
257k
  int add_harmonic_flag = FDKreadBits(hBs, 1);
481
257k
  bitsRead++;
482
483
257k
  if (add_harmonic_flag) {
484
112k
    int nSfb = hHeaderData->freqBandData.nSfb[1];
485
338k
    for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) {
486
      /* read maximum 32 bits and align them to the MSB */
487
225k
      int readBits = fMin(32, nSfb);
488
225k
      nSfb -= readBits;
489
225k
      if (readBits > 0) {
490
114k
        hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits)
491
114k
                                      << (32 - readBits);
492
114k
      } else {
493
111k
        hFrameData->addHarmonics[i] = 0;
494
111k
      }
495
496
225k
      bitsRead += readBits;
497
225k
    }
498
    /* bs_pvc_mode = 0 for Rsvd50 */
499
112k
    if (flags & SBRDEC_SYNTAX_USAC) {
500
29.2k
      if (hHeaderData->bs_info.pvc_mode) {
501
9.17k
        int bs_sinusoidal_position = 31;
502
9.17k
        if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) {
503
4.78k
          bs_sinusoidal_position = FDKreadBits(hBs, 5);
504
4.78k
        }
505
9.17k
        hFrameData->sinusoidal_position = bs_sinusoidal_position;
506
9.17k
      }
507
29.2k
    }
508
144k
  } else {
509
433k
    for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++)
510
288k
      hFrameData->addHarmonics[i] = 0;
511
144k
  }
512
513
257k
  return (bitsRead);
514
257k
}
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
156k
) {
531
156k
  INT nBitsLeft;
532
156k
  int extended_data;
533
156k
  int i, frameOk = 1;
534
535
156k
  extended_data = FDKreadBits(hBs, 1);
536
537
156k
  if (extended_data) {
538
61.0k
    int cnt;
539
61.0k
    int bPsRead = 0;
540
541
61.0k
    cnt = FDKreadBits(hBs, 4);
542
61.0k
    if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8);
543
544
61.0k
    nBitsLeft = 8 * cnt;
545
546
    /* sanity check for cnt */
547
61.0k
    if (nBitsLeft > (INT)FDKgetValidBits(hBs)) {
548
      /* limit nBitsLeft */
549
10.7k
      nBitsLeft = (INT)FDKgetValidBits(hBs);
550
      /* set frame error */
551
10.7k
      frameOk = 0;
552
10.7k
    }
553
554
121k
    while (nBitsLeft > 7) {
555
60.3k
      int extension_id = FDKreadBits(hBs, 2);
556
60.3k
      nBitsLeft -= 2;
557
558
60.3k
      switch (extension_id) {
559
30.9k
        case EXTENSION_ID_PS_CODING:
560
561
          /* Read PS data from bitstream */
562
563
30.9k
          if (hParametricStereoDec != NULL) {
564
29.6k
            if (bPsRead &&
565
4.84k
                !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot]
566
4.84k
                     .mpeg.bPsHeaderValid) {
567
109
              cnt = nBitsLeft >> 3; /* number of remaining bytes */
568
13.3k
              for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
569
109
              nBitsLeft -= cnt * 8;
570
29.5k
            } else {
571
29.5k
              nBitsLeft -=
572
29.5k
                  (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft);
573
29.5k
              bPsRead = 1;
574
29.5k
            }
575
29.6k
          }
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
30.9k
          break;
591
592
29.3k
        default:
593
29.3k
          cnt = nBitsLeft >> 3; /* number of remaining bytes */
594
2.51M
          for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
595
29.3k
          nBitsLeft -= cnt * 8;
596
29.3k
          break;
597
60.3k
      }
598
60.3k
    }
599
600
61.0k
    if (nBitsLeft < 0) {
601
14.2k
      frameOk = 0;
602
14.2k
      goto bail;
603
46.7k
    } else {
604
      /* Read fill bits for byte alignment */
605
46.7k
      FDKreadBits(hBs, nBitsLeft);
606
46.7k
    }
607
61.0k
  }
608
609
156k
bail:
610
156k
  return (frameOk);
611
156k
}
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
267k
                         const int overlap) {
624
267k
  int i, bs_coupling = COUPLING_OFF;
625
267k
  const int nCh = (hFrameDataRight == NULL) ? 1 : 2;
626
627
267k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
628
    /* Reserved bits */
629
172k
    if (FDKreadBits(hBs, 1)) { /* bs_data_extra */
630
41.1k
      FDKreadBits(hBs, 4);
631
41.1k
      if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) {
632
10.0k
        FDKreadBits(hBs, 4);
633
10.0k
      }
634
41.1k
    }
635
172k
  }
636
637
267k
  if (nCh == 2) {
638
    /* Read coupling flag */
639
22.2k
    bs_coupling = FDKreadBits(hBs, 1);
640
22.2k
    if (bs_coupling) {
641
7.48k
      hFrameDataLeft->coupling = COUPLING_LEVEL;
642
7.48k
      hFrameDataRight->coupling = COUPLING_BAL;
643
14.7k
    } else {
644
14.7k
      hFrameDataLeft->coupling = COUPLING_OFF;
645
14.7k
      hFrameDataRight->coupling = COUPLING_OFF;
646
14.7k
    }
647
245k
  } else {
648
245k
    if (flags & SBRDEC_SYNTAX_SCAL) {
649
2.51k
      FDKreadBits(hBs, 1); /* bs_coupling */
650
2.51k
    }
651
245k
    hFrameDataLeft->coupling = COUPLING_OFF;
652
245k
  }
653
654
267k
  if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
655
95.8k
    if (flags & SBRDEC_USAC_HARMONICSBR) {
656
54.1k
      hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs);
657
54.1k
      if (hFrameDataLeft->sbrPatchingMode == 0) {
658
42.0k
        hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs);
659
42.0k
        if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
660
8.75k
          hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7);
661
33.2k
        } else {
662
33.2k
          hFrameDataLeft->sbrPitchInBins = 0;
663
33.2k
        }
664
42.0k
      } else {
665
12.1k
        hFrameDataLeft->sbrOversamplingFlag = 0;
666
12.1k
        hFrameDataLeft->sbrPitchInBins = 0;
667
12.1k
      }
668
669
54.1k
      if (nCh == 2) {
670
709
        if (bs_coupling) {
671
245
          hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode;
672
245
          hFrameDataRight->sbrOversamplingFlag =
673
245
              hFrameDataLeft->sbrOversamplingFlag;
674
245
          hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins;
675
464
        } else {
676
464
          hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs);
677
464
          if (hFrameDataRight->sbrPatchingMode == 0) {
678
379
            hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs);
679
379
            if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
680
111
              hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7);
681
268
            } else {
682
268
              hFrameDataRight->sbrPitchInBins = 0;
683
268
            }
684
379
          } else {
685
85
            hFrameDataRight->sbrOversamplingFlag = 0;
686
85
            hFrameDataRight->sbrPitchInBins = 0;
687
85
          }
688
464
        }
689
709
      }
690
54.1k
    } else {
691
41.7k
      if (nCh == 2) {
692
420
        hFrameDataRight->sbrPatchingMode = 1;
693
420
        hFrameDataRight->sbrOversamplingFlag = 0;
694
420
        hFrameDataRight->sbrPitchInBins = 0;
695
420
      }
696
697
41.7k
      hFrameDataLeft->sbrPatchingMode = 1;
698
41.7k
      hFrameDataLeft->sbrOversamplingFlag = 0;
699
41.7k
      hFrameDataLeft->sbrPitchInBins = 0;
700
41.7k
    }
701
172k
  } else {
702
172k
    if (nCh == 2) {
703
21.1k
      hFrameDataRight->sbrPatchingMode = 1;
704
21.1k
      hFrameDataRight->sbrOversamplingFlag = 0;
705
21.1k
      hFrameDataRight->sbrPitchInBins = 0;
706
21.1k
    }
707
708
172k
    hFrameDataLeft->sbrPatchingMode = 1;
709
172k
    hFrameDataLeft->sbrOversamplingFlag = 0;
710
172k
    hFrameDataLeft->sbrPitchInBins = 0;
711
172k
  }
712
713
  /*
714
    sbr_grid(): Grid control
715
  */
716
267k
  if (hHeaderData->bs_info.pvc_mode) {
717
25.5k
    FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */
718
25.5k
    if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft,
719
25.5k
                             hFrameDataLeftPrev, pvc_mode_last, flags))
720
937
      return 0;
721
722
24.6k
    if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
723
24.6k
                        hHeaderData->numberTimeSlots, overlap,
724
24.6k
                        hHeaderData->timeStep))
725
0
      return 0;
726
242k
  } else {
727
242k
    if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0;
728
729
223k
    if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
730
223k
                        hHeaderData->numberTimeSlots, overlap,
731
223k
                        hHeaderData->timeStep))
732
8.44k
      return 0;
733
223k
  }
734
239k
  if (nCh == 2) {
735
21.5k
    if (hFrameDataLeft->coupling) {
736
7.33k
      FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo,
737
7.33k
                sizeof(FRAME_INFO));
738
7.33k
      hFrameDataRight->ampResolutionCurrentFrame =
739
7.33k
          hFrameDataLeft->ampResolutionCurrentFrame;
740
14.2k
    } else {
741
14.2k
      if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags))
742
184
        return 0;
743
744
14.0k
      if (!checkFrameInfo(&hFrameDataRight->frameInfo,
745
14.0k
                          hHeaderData->numberTimeSlots, overlap,
746
14.0k
                          hHeaderData->timeStep))
747
317
        return 0;
748
14.0k
    }
749
21.5k
  }
750
751
  /*
752
    sbr_dtdf(): Fetch domain vectors (time or frequency direction for
753
    delta-coding)
754
  */
755
239k
  sbrGetDirectionControlData(hFrameDataLeft, hBs, flags,
756
239k
                             hHeaderData->bs_info.pvc_mode);
757
239k
  if (nCh == 2) {
758
21.0k
    sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0);
759
21.0k
  }
760
761
  /* sbr_invf() */
762
664k
  for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
763
425k
    hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
764
425k
  }
765
239k
  if (nCh == 2) {
766
21.0k
    if (hFrameDataLeft->coupling) {
767
27.6k
      for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
768
20.2k
        hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i];
769
20.2k
      }
770
13.7k
    } else {
771
40.3k
      for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
772
26.6k
        hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
773
26.6k
      }
774
13.7k
    }
775
21.0k
  }
776
777
239k
  if (nCh == 1) {
778
218k
    if (hHeaderData->bs_info.pvc_mode) {
779
24.6k
      if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags,
780
24.6k
                             hHeaderData->bs_info.pvc_mode))
781
2.82k
        return 0;
782
193k
    } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags))
783
0
      return 0;
784
785
215k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
786
215k
  } else if (hFrameDataLeft->coupling) {
787
7.33k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) {
788
0
      return 0;
789
0
    }
790
791
7.33k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
792
793
7.33k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) {
794
0
      return 0;
795
0
    }
796
7.33k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
797
13.7k
  } else { /* nCh == 2 && no coupling */
798
799
13.7k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0;
800
801
13.7k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0;
802
803
13.7k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
804
805
13.7k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
806
13.7k
  }
807
808
236k
  sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags);
809
236k
  if (nCh == 2) {
810
21.0k
    sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags);
811
21.0k
  }
812
813
236k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
814
156k
    if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) {
815
18.8k
      return 0;
816
18.8k
    }
817
156k
  }
818
819
217k
  return 1;
820
236k
}
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
260k
{
831
260k
  int i;
832
260k
  int indepFlag = 0;
833
834
260k
  if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
835
83.4k
    indepFlag = flags & SBRDEC_USAC_INDEP;
836
83.4k
  }
837
838
260k
  if (bs_pvc_mode == 0) {
839
235k
    i = 0;
840
235k
    if (indepFlag) {
841
41.4k
      h_frame_data->domain_vec[i++] = 0;
842
41.4k
    }
843
602k
    for (; i < h_frame_data->frameInfo.nEnvelopes; i++) {
844
366k
      h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1);
845
366k
    }
846
235k
  }
847
848
260k
  i = 0;
849
260k
  if (indepFlag) {
850
49.2k
    h_frame_data->domain_vec_noise[i++] = 0;
851
49.2k
  }
852
576k
  for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
853
315k
    h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1);
854
315k
  }
855
260k
}
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
257k
{
865
257k
  int i, j;
866
257k
  int delta;
867
257k
  COUPLING_MODE coupling;
868
257k
  int noNoiseBands = hHeaderData->freqBandData.nNfb;
869
870
257k
  Huffman hcb_noiseF;
871
257k
  Huffman hcb_noise;
872
257k
  int envDataTableCompFactor;
873
874
257k
  coupling = h_frame_data->coupling;
875
876
  /*
877
    Select huffman codebook depending on coupling mode
878
  */
879
257k
  if (coupling == COUPLING_BAL) {
880
7.33k
    hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T;
881
7.33k
    hcb_noiseF =
882
7.33k
        (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F"
883
                                                              */
884
7.33k
    envDataTableCompFactor = 1;
885
249k
  } else {
886
249k
    hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T;
887
249k
    hcb_noiseF =
888
249k
        (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F"
889
                                                            */
890
249k
    envDataTableCompFactor = 0;
891
249k
  }
892
893
  /*
894
    Read raw noise-envelope data
895
  */
896
616k
  for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
897
359k
    if (h_frame_data->domain_vec_noise[i] == 0) {
898
267k
      if (coupling == COUPLING_BAL) {
899
10.4k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
900
10.4k
            (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor);
901
256k
      } else {
902
256k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
903
256k
            (FIXP_SGL)(int)FDKreadBits(hBs, 5);
904
256k
      }
905
906
516k
      for (j = 1; j < noNoiseBands; j++) {
907
249k
        delta = DecodeHuffmanCW(hcb_noiseF, hBs);
908
249k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
909
249k
            (FIXP_SGL)(delta << envDataTableCompFactor);
910
249k
      }
911
267k
    } else {
912
240k
      for (j = 0; j < noNoiseBands; j++) {
913
148k
        delta = DecodeHuffmanCW(hcb_noise, hBs);
914
148k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
915
148k
            (FIXP_SGL)(delta << envDataTableCompFactor);
916
148k
      }
917
92.3k
    }
918
359k
  }
919
257k
}
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
24.6k
    const UINT flags, const UINT pvcMode) {
932
24.6k
  int divMode, nsMode;
933
24.6k
  int indepFlag = flags & SBRDEC_USAC_INDEP;
934
24.6k
  UCHAR *pvcID = h_frame_data->pvcID;
935
936
24.6k
  divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS);
937
24.6k
  nsMode = FDKreadBit(hBs);
938
24.6k
  FDK_ASSERT((pvcMode == 1) || (pvcMode == 2));
939
24.6k
  h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode];
940
941
24.6k
  if (divMode <= 3) {
942
15.6k
    int i, k = 1, sum_length = 0, reuse_pcvID;
943
944
    /* special treatment for first time slot k=0 */
945
15.6k
    indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs));
946
15.6k
    if (reuse_pcvID) {
947
2.43k
      pvcID[0] = hHeaderData->pvcIDprev;
948
13.2k
    } else {
949
13.2k
      pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS);
950
13.2k
    }
951
952
    /* other time slots k>0 */
953
25.1k
    for (i = 0; i < divMode; i++) {
954
12.3k
      int length, numBits = 4;
955
956
12.3k
      if (sum_length >= 13) {
957
917
        numBits = 1;
958
11.3k
      } else if (sum_length >= 11) {
959
243
        numBits = 2;
960
11.1k
      } else if (sum_length >= 7) {
961
192
        numBits = 3;
962
192
      }
963
964
12.3k
      length = FDKreadBits(hBs, numBits);
965
12.3k
      sum_length += length + 1;
966
12.3k
      if (sum_length >= PVC_NTIMESLOT) {
967
2.82k
        return 0; /* parse error */
968
2.82k
      }
969
45.6k
      for (; length--; k++) {
970
36.2k
        pvcID[k] = pvcID[k - 1];
971
36.2k
      }
972
9.47k
      pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
973
9.47k
    }
974
180k
    for (; k < 16; k++) {
975
168k
      pvcID[k] = pvcID[k - 1];
976
168k
    }
977
12.8k
  } else { /* divMode >= 4 */
978
8.94k
    int num_grid_info, fixed_length, grid_info, j, k = 0;
979
980
8.94k
    divMode -= 4;
981
8.94k
    num_grid_info = 2 << divMode;
982
8.94k
    fixed_length = 8 >> divMode;
983
8.94k
    FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT);
984
985
    /* special treatment for first time slot k=0 */
986
8.94k
    indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs));
987
8.94k
    if (grid_info) {
988
3.57k
      pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
989
5.37k
    } else {
990
5.37k
      pvcID[k++] = hHeaderData->pvcIDprev;
991
5.37k
    }
992
8.94k
    j = fixed_length - 1;
993
35.3k
    for (; j--; k++) {
994
26.3k
      pvcID[k] = pvcID[k - 1];
995
26.3k
    }
996
8.94k
    num_grid_info--;
997
998
    /* other time slots k>0 */
999
73.7k
    for (; num_grid_info--;) {
1000
64.7k
      j = fixed_length;
1001
64.7k
      grid_info = FDKreadBit(hBs);
1002
64.7k
      if (grid_info) {
1003
40.1k
        pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
1004
40.1k
        j--;
1005
40.1k
      }
1006
132k
      for (; j--; k++) {
1007
67.5k
        pvcID[k] = pvcID[k - 1];
1008
67.5k
      }
1009
64.7k
    }
1010
8.94k
  }
1011
1012
21.8k
  hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1];
1013
1014
  /* usage of PVC excludes inter-TES tool */
1015
21.8k
  h_frame_data->iTESactive = (UCHAR)0;
1016
1017
21.8k
  return 1;
1018
24.6k
}
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
235k
    const UINT flags) {
1027
235k
  int i, j;
1028
235k
  UCHAR no_band[MAX_ENVELOPES];
1029
235k
  int delta = 0;
1030
235k
  int offset = 0;
1031
235k
  COUPLING_MODE coupling = h_frame_data->coupling;
1032
235k
  int ampRes = hHeaderData->bs_info.ampResolution;
1033
235k
  int nEnvelopes = h_frame_data->frameInfo.nEnvelopes;
1034
235k
  int envDataTableCompFactor;
1035
235k
  int start_bits, start_bits_balance;
1036
235k
  Huffman hcb_t, hcb_f;
1037
1038
235k
  h_frame_data->nScaleFactors = 0;
1039
1040
235k
  if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) {
1041
131k
    if (flags & SBRDEC_ELD_GRID)
1042
34.1k
      ampRes = h_frame_data->ampResolutionCurrentFrame;
1043
96.8k
    else
1044
96.8k
      ampRes = 0;
1045
131k
  }
1046
235k
  h_frame_data->ampResolutionCurrentFrame = ampRes;
1047
1048
  /*
1049
    Set number of bits for first value depending on amplitude resolution
1050
  */
1051
235k
  if (ampRes == 1) {
1052
46.5k
    start_bits = 6;
1053
46.5k
    start_bits_balance = 5;
1054
188k
  } else {
1055
188k
    start_bits = 7;
1056
188k
    start_bits_balance = 6;
1057
188k
  }
1058
1059
  /*
1060
    Calculate number of values for each envelope and alltogether
1061
  */
1062
643k
  for (i = 0; i < nEnvelopes; i++) {
1063
408k
    no_band[i] =
1064
408k
        hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]];
1065
408k
    h_frame_data->nScaleFactors += no_band[i];
1066
408k
  }
1067
235k
  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
235k
  if (coupling == COUPLING_BAL) {
1073
7.33k
    envDataTableCompFactor = 1;
1074
7.33k
    if (ampRes == 0) {
1075
4.59k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T;
1076
4.59k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F;
1077
4.59k
    } else {
1078
2.73k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T;
1079
2.73k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F;
1080
2.73k
    }
1081
228k
  } else {
1082
228k
    envDataTableCompFactor = 0;
1083
228k
    if (ampRes == 0) {
1084
184k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T;
1085
184k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F;
1086
184k
    } else {
1087
43.8k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T;
1088
43.8k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F;
1089
43.8k
    }
1090
228k
  }
1091
1092
235k
  h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */
1093
  /*
1094
    Now read raw envelope data
1095
  */
1096
643k
  for (j = 0, offset = 0; j < nEnvelopes; j++) {
1097
408k
    if (h_frame_data->domain_vec[j] == 0) {
1098
277k
      if (coupling == COUPLING_BAL) {
1099
13.2k
        h_frame_data->iEnvelope[offset] =
1100
13.2k
            (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance))
1101
13.2k
                       << envDataTableCompFactor);
1102
263k
      } else {
1103
263k
        h_frame_data->iEnvelope[offset] =
1104
263k
            (FIXP_SGL)(int)FDKreadBits(hBs, start_bits);
1105
263k
      }
1106
277k
    }
1107
1108
3.15M
    for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) {
1109
2.75M
      if (h_frame_data->domain_vec[j] == 0) {
1110
1.53M
        delta = DecodeHuffmanCW(hcb_f, hBs);
1111
1.53M
      } else {
1112
1.21M
        delta = DecodeHuffmanCW(hcb_t, hBs);
1113
1.21M
      }
1114
1115
2.75M
      h_frame_data->iEnvelope[offset + i] =
1116
2.75M
          (FIXP_SGL)(delta << envDataTableCompFactor);
1117
2.75M
    }
1118
408k
    if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) {
1119
43.8k
      int bs_temp_shape = FDKreadBit(hBs);
1120
43.8k
      FDK_ASSERT(j < 8);
1121
43.8k
      h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j);
1122
43.8k
      if (bs_temp_shape) {
1123
17.7k
        h_frame_data->interTempShapeMode[j] =
1124
17.7k
            FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */
1125
26.1k
      } else {
1126
26.1k
        h_frame_data->interTempShapeMode[j] = 0;
1127
26.1k
      }
1128
43.8k
    }
1129
408k
    offset += no_band[j];
1130
408k
  }
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
235k
  return 1;
1141
235k
}
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
13.4k
                              int numberTimeSlots, const UINT flags) {
1152
13.4k
  int nEnv, i, tranIdx;
1153
13.4k
  const int *pTable;
1154
1155
13.4k
  if (tranPosInternal >= numberTimeSlots) {
1156
0
    return 0;
1157
0
  }
1158
1159
13.4k
  switch (numberTimeSlots) {
1160
0
    case 8:
1161
0
      pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal];
1162
0
      break;
1163
11.8k
    case 15:
1164
11.8k
      pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal];
1165
11.8k
      break;
1166
1.63k
    case 16:
1167
1.63k
      pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal];
1168
1.63k
      break;
1169
0
    default:
1170
0
      return 0;
1171
13.4k
  }
1172
1173
  /* look number of envelopes in table */
1174
13.4k
  nEnv = pTable[0];
1175
  /* look up envelope distribution in table */
1176
31.5k
  for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2];
1177
  /* open and close frame border */
1178
13.4k
  hSbrFrameInfo->borders[0] = 0;
1179
13.4k
  hSbrFrameInfo->borders[nEnv] = numberTimeSlots;
1180
13.4k
  hSbrFrameInfo->nEnvelopes = nEnv;
1181
1182
  /* transient idx */
1183
13.4k
  tranIdx = hSbrFrameInfo->tranEnv = pTable[1];
1184
1185
  /* add noise floors */
1186
13.4k
  hSbrFrameInfo->bordersNoise[0] = 0;
1187
13.4k
  hSbrFrameInfo->bordersNoise[1] =
1188
13.4k
      hSbrFrameInfo->borders[tranIdx ? tranIdx : 1];
1189
13.4k
  hSbrFrameInfo->bordersNoise[2] = numberTimeSlots;
1190
  /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2)
1191
   */
1192
13.4k
  hSbrFrameInfo->nNoiseEnvelopes = 2;
1193
1194
13.4k
  return 1;
1195
13.4k
}
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.9k
    int timeSlots, const UINT flags) {
1208
13.9k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1209
13.9k
  INT numberTimeSlots = hHeaderData->numberTimeSlots;
1210
13.9k
  INT temp = 0, k;
1211
1212
  /* FIXFIXonly framing case */
1213
13.9k
  h_frame_data->frameInfo.frameClass = 0;
1214
1215
  /* get the transient position from the bitstream */
1216
13.9k
  switch (timeSlots) {
1217
0
    case 8:
1218
      /* 3bit transient position (temp={0;..;7}) */
1219
0
      temp = FDKreadBits(hBitBuf, 3);
1220
0
      break;
1221
1222
1.63k
    case 16:
1223
13.9k
    case 15:
1224
      /* 4bit transient position (temp={0;..;15}) */
1225
13.9k
      temp = FDKreadBits(hBitBuf, 4);
1226
13.9k
      break;
1227
1228
0
    default:
1229
0
      return 0;
1230
13.9k
  }
1231
1232
  /* For "case 15" only*/
1233
13.9k
  if (temp >= timeSlots) {
1234
450
    return 0;
1235
450
  }
1236
1237
  /* calculate borders according to the transient position */
1238
13.4k
  if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) {
1239
0
    return 0;
1240
0
  }
1241
1242
  /* decode freq res: */
1243
45.0k
  for (k = 0; k < pFrameInfo->nEnvelopes; k++) {
1244
31.5k
    pFrameInfo->freqRes[k] =
1245
31.5k
        (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */
1246
31.5k
  }
1247
1248
13.4k
  return 1;
1249
13.4k
}
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
25.5k
    const UINT flags) {
1265
25.5k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1266
25.5k
  FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo;
1267
25.5k
  int bs_var_len_hf, bs_noise_position;
1268
25.5k
  bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */
1269
25.5k
  bs_var_len_hf = FDKreadBit(hBs);
1270
25.5k
  pFrameInfo->noisePosition = bs_noise_position;
1271
25.5k
  pFrameInfo->tranEnv = -1;
1272
1273
  /* Init for bs_noise_position == 0 in case a parse error is found below. */
1274
25.5k
  pFrameInfo->nEnvelopes = 1;
1275
25.5k
  pFrameInfo->nNoiseEnvelopes = 1;
1276
25.5k
  pFrameInfo->freqRes[0] = 0;
1277
1278
25.5k
  if (bs_var_len_hf) { /* 1 or 3 Bits */
1279
8.74k
    pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1;
1280
8.74k
    if (pFrameInfo->varLength > 3) {
1281
937
      pFrameInfo->varLength =
1282
937
          0;    /* assume bs_var_len_hf == 0 in case of error */
1283
937
      return 0; /* reserved value -> parse error */
1284
937
    }
1285
16.8k
  } else {
1286
16.8k
    pFrameInfo->varLength = 0;
1287
16.8k
  }
1288
1289
24.6k
  if (bs_noise_position) {
1290
15.9k
    pFrameInfo->nEnvelopes = 2;
1291
15.9k
    pFrameInfo->nNoiseEnvelopes = 2;
1292
15.9k
    FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes));
1293
15.9k
  }
1294
1295
  /* frame border calculation */
1296
24.6k
  if (hHeaderData->bs_info.pvc_mode > 0) {
1297
    /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference.
1298
     */
1299
1300
24.6k
    FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2));
1301
1302
    /* left timeborder-offset: use the timeborder of prev SBR frame */
1303
24.6k
    if (pPrevFrameInfo->nEnvelopes > 0) {
1304
1.80k
      pFrameInfo->borders[0] =
1305
1.80k
          pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT;
1306
1.80k
      FDK_ASSERT(pFrameInfo->borders[0] <= 3);
1307
22.8k
    } else {
1308
22.8k
      pFrameInfo->borders[0] = 0;
1309
22.8k
    }
1310
1311
    /* right timeborder-offset: */
1312
24.6k
    pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength;
1313
1314
24.6k
    if (pFrameInfo->nEnvelopes == 2) {
1315
15.9k
      pFrameInfo->borders[1] = pFrameInfo->noisePosition;
1316
15.9k
    }
1317
1318
    /* Calculation of PVC time borders t_EPVC */
1319
24.6k
    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
24.6k
      pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0];
1323
24.6k
    } else {
1324
0
      pFrameInfo->pvcBorders[0] = 0;
1325
0
    }
1326
24.6k
    if (pFrameInfo->nEnvelopes == 2) {
1327
15.9k
      pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1];
1328
15.9k
    }
1329
24.6k
    pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16;
1330
1331
    /* calculation of SBR noise-floor time-border vector: */
1332
89.8k
    for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) {
1333
65.2k
      pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i];
1334
65.2k
    }
1335
1336
24.6k
    pFrameInfo->tranEnv = -1; /* tranEnv not used */
1337
24.6k
  }
1338
24.6k
  return 1;
1339
24.6k
}
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
57.4k
    frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */
1361
57.4k
    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.9k
      pFrameInfo->frameClass = frameClass;
1366
13.9k
      int err = 1;
1367
13.9k
      err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots,
1368
13.9k
                                flags);
1369
13.9k
      return err;
1370
13.9k
    }
1371
199k
  } else {
1372
199k
    frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */
1373
199k
  }
1374
1375
242k
  switch (frameClass) {
1376
167k
    case 0:
1377
167k
      temp = FDKreadBits(hBs, 2); /* E [2 bits ] */
1378
167k
      nEnv = (int)(1 << temp);    /* E -> e */
1379
1380
167k
      if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1))
1381
33.8k
        h_frame_data->ampResolutionCurrentFrame =
1382
33.8k
            FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */
1383
1384
167k
      staticFreqRes = FDKreadBits(hBs, 1);
1385
1386
167k
      if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
1387
36.4k
        if (nEnv > MAX_ENVELOPES_USAC) return 0;
1388
36.4k
      } else
1389
1390
130k
        b = nEnv + 1;
1391
167k
      switch (nEnv) {
1392
130k
        case 1:
1393
130k
          switch (numberTimeSlots) {
1394
31.2k
            case 15:
1395
31.2k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15,
1396
31.2k
                        sizeof(FRAME_INFO));
1397
31.2k
              break;
1398
99.1k
            case 16:
1399
99.1k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16,
1400
99.1k
                        sizeof(FRAME_INFO));
1401
99.1k
              break;
1402
0
            default:
1403
0
              FDK_ASSERT(0);
1404
130k
          }
1405
130k
          break;
1406
130k
        case 2:
1407
21.4k
          switch (numberTimeSlots) {
1408
1.31k
            case 15:
1409
1.31k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15,
1410
1.31k
                        sizeof(FRAME_INFO));
1411
1.31k
              break;
1412
20.0k
            case 16:
1413
20.0k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16,
1414
20.0k
                        sizeof(FRAME_INFO));
1415
20.0k
              break;
1416
0
            default:
1417
0
              FDK_ASSERT(0);
1418
21.4k
          }
1419
21.4k
          break;
1420
21.4k
        case 4:
1421
11.3k
          switch (numberTimeSlots) {
1422
6.28k
            case 15:
1423
6.28k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15,
1424
6.28k
                        sizeof(FRAME_INFO));
1425
6.28k
              break;
1426
5.02k
            case 16:
1427
5.02k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16,
1428
5.02k
                        sizeof(FRAME_INFO));
1429
5.02k
              break;
1430
0
            default:
1431
0
              FDK_ASSERT(0);
1432
11.3k
          }
1433
11.3k
          break;
1434
11.3k
        case 8:
1435
4.18k
#if (MAX_ENVELOPES >= 8)
1436
4.18k
          switch (numberTimeSlots) {
1437
1.20k
            case 15:
1438
1.20k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15,
1439
1.20k
                        sizeof(FRAME_INFO));
1440
1.20k
              break;
1441
2.98k
            case 16:
1442
2.98k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16,
1443
2.98k
                        sizeof(FRAME_INFO));
1444
2.98k
              break;
1445
0
            default:
1446
0
              FDK_ASSERT(0);
1447
4.18k
          }
1448
4.18k
          break;
1449
#else
1450
          return 0;
1451
#endif
1452
167k
      }
1453
      /* Apply correct freqRes (High is default) */
1454
167k
      if (!staticFreqRes) {
1455
288k
        for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0;
1456
124k
      }
1457
1458
167k
      break;
1459
27.3k
    case 1:
1460
55.8k
    case 2:
1461
55.8k
      temp = FDKreadBits(hBs, 2); /* A [2 bits] */
1462
1463
55.8k
      n = FDKreadBits(hBs, 2); /* n = N [2 bits] */
1464
1465
55.8k
      nEnv = n + 1; /* # envelopes */
1466
55.8k
      b = nEnv + 1; /* # borders   */
1467
1468
55.8k
      break;
1469
242k
  }
1470
1471
242k
  switch (frameClass) {
1472
27.3k
    case 1:
1473
      /* Decode borders: */
1474
27.3k
      pFrameInfo->borders[0] = 0;      /* first border          */
1475
27.3k
      border = temp + numberTimeSlots; /* A -> aR               */
1476
27.3k
      i = b - 1;                       /* frame info index for last border */
1477
27.3k
      pFrameInfo->borders[i] = border; /* last border                      */
1478
1479
66.7k
      for (k = 0; k < n; k++) {
1480
39.4k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1481
39.4k
        border -= (2 * temp + 2);   /* R -> r                */
1482
39.4k
        pFrameInfo->borders[--i] = border;
1483
39.4k
      }
1484
1485
      /* Decode pointer: */
1486
27.3k
      pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
1487
27.3k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1488
1489
27.3k
      if (p > n + 1) return 0;
1490
1491
21.6k
      pFrameInfo->tranEnv = p ? n + 2 - p : -1;
1492
1493
      /* Decode freq res: */
1494
66.2k
      for (k = n; k >= 0; k--) {
1495
44.5k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1496
44.5k
      }
1497
1498
      /* Calculate noise floor middle border: */
1499
21.6k
      if (p == 0 || p == 1)
1500
13.0k
        pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
1501
8.68k
      else
1502
8.68k
        pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
1503
1504
21.6k
      break;
1505
1506
28.5k
    case 2:
1507
      /* Decode borders: */
1508
28.5k
      border = temp;                   /* A -> aL */
1509
28.5k
      pFrameInfo->borders[0] = border; /* first border */
1510
1511
60.7k
      for (k = 1; k <= n; k++) {
1512
32.2k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1513
32.2k
        border += (2 * temp + 2);   /* R -> r                */
1514
32.2k
        pFrameInfo->borders[k] = border;
1515
32.2k
      }
1516
28.5k
      pFrameInfo->borders[k] = numberTimeSlots; /* last border */
1517
1518
      /* Decode pointer: */
1519
28.5k
      pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
1520
28.5k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1521
28.5k
      if (p > n + 1) return 0;
1522
1523
16.9k
      if (p == 0 || p == 1)
1524
13.7k
        pFrameInfo->tranEnv = -1;
1525
3.21k
      else
1526
3.21k
        pFrameInfo->tranEnv = p - 1;
1527
1528
      /* Decode freq res: */
1529
53.6k
      for (k = 0; k <= n; k++) {
1530
36.6k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1531
36.6k
      }
1532
1533
      /* Calculate noise floor middle border: */
1534
16.9k
      switch (p) {
1535
8.35k
        case 0:
1536
8.35k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1];
1537
8.35k
          break;
1538
5.34k
        case 1:
1539
5.34k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
1540
5.34k
          break;
1541
3.21k
        default:
1542
3.21k
          pFrameInfo->bordersNoise[1] =
1543
3.21k
              pFrameInfo->borders[pFrameInfo->tranEnv];
1544
3.21k
          break;
1545
16.9k
      }
1546
1547
16.9k
      break;
1548
1549
19.4k
    case 3:
1550
      /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */
1551
1552
19.4k
      aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */
1553
1554
19.4k
      aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */
1555
1556
19.4k
      nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */
1557
1558
19.4k
      nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */
1559
1560
      /*-------------------------------------------------------------------------
1561
        Calculate help variables
1562
        --------------------------------------------------------------------------*/
1563
1564
      /* general: */
1565
19.4k
      nEnv = nL + nR + 1; /* # envelopes */
1566
19.4k
      if (nEnv > MAX_ENVELOPES) return 0;
1567
19.4k
      b = nEnv + 1; /* # borders   */
1568
1569
      /*-------------------------------------------------------------------------
1570
        Decode envelopes
1571
        --------------------------------------------------------------------------*/
1572
1573
      /* L-borders:   */
1574
19.4k
      border = aL; /* first border */
1575
19.4k
      pFrameInfo->borders[0] = border;
1576
1577
46.6k
      for (k = 1; k <= nL; k++) {
1578
27.1k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1579
27.1k
        border += (2 * temp + 2);   /* R -> r                */
1580
27.1k
        pFrameInfo->borders[k] = border;
1581
27.1k
      }
1582
1583
      /* R-borders:  */
1584
19.4k
      border = aR; /* last border */
1585
19.4k
      i = nEnv;
1586
1587
19.4k
      pFrameInfo->borders[i] = border;
1588
1589
51.6k
      for (k = 0; k < nR; k++) {
1590
32.1k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1591
32.1k
        border -= (2 * temp + 2);   /* R -> r                */
1592
32.1k
        pFrameInfo->borders[--i] = border;
1593
32.1k
      }
1594
1595
      /* decode pointer: */
1596
19.4k
      pointer_bits =
1597
19.4k
          DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1));
1598
19.4k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1599
1600
19.4k
      if (p > nL + nR + 1) return 0;
1601
1602
17.9k
      pFrameInfo->tranEnv = p ? b - p : -1;
1603
1604
      /* decode freq res: */
1605
90.5k
      for (k = 0; k < nEnv; k++) {
1606
72.5k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1607
72.5k
      }
1608
1609
      /*-------------------------------------------------------------------------
1610
        Decode noise floors
1611
        --------------------------------------------------------------------------*/
1612
17.9k
      pFrameInfo->bordersNoise[0] = aL;
1613
1614
17.9k
      if (nEnv == 1) {
1615
        /* 1 noise floor envelope: */
1616
1.16k
        pFrameInfo->bordersNoise[1] = aR;
1617
16.8k
      } else {
1618
        /* 2 noise floor envelopes */
1619
16.8k
        if (p == 0 || p == 1)
1620
10.5k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1];
1621
6.22k
        else
1622
6.22k
          pFrameInfo->bordersNoise[1] =
1623
6.22k
              pFrameInfo->borders[pFrameInfo->tranEnv];
1624
16.8k
        pFrameInfo->bordersNoise[2] = aR;
1625
16.8k
      }
1626
17.9k
      break;
1627
242k
  }
1628
1629
  /*
1630
    Store number of envelopes, noise floor envelopes and frame class
1631
  */
1632
223k
  pFrameInfo->nEnvelopes = nEnv;
1633
1634
223k
  if (nEnv == 1)
1635
145k
    pFrameInfo->nNoiseEnvelopes = 1;
1636
77.9k
  else
1637
77.9k
    pFrameInfo->nNoiseEnvelopes = 2;
1638
1639
223k
  pFrameInfo->frameClass = frameClass;
1640
1641
223k
  if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) {
1642
    /* calculate noise floor first and last borders: */
1643
38.6k
    pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0];
1644
38.6k
    pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] =
1645
38.6k
        pFrameInfo->borders[nEnv];
1646
38.6k
  }
1647
1648
223k
  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
262k
{
1661
262k
  int maxPos, i, j;
1662
262k
  int startPos;
1663
262k
  int stopPos;
1664
262k
  int tranEnv;
1665
262k
  int startPosNoise;
1666
262k
  int stopPosNoise;
1667
262k
  int nEnvelopes = pFrameInfo->nEnvelopes;
1668
262k
  int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes;
1669
1670
262k
  if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0;
1671
1672
262k
  if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0;
1673
1674
262k
  startPos = pFrameInfo->borders[0];
1675
262k
  stopPos = pFrameInfo->borders[nEnvelopes];
1676
262k
  tranEnv = pFrameInfo->tranEnv;
1677
262k
  startPosNoise = pFrameInfo->bordersNoise[0];
1678
262k
  stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes];
1679
1680
262k
  if (overlap < 0 || overlap > (3 * (4))) {
1681
0
    return 0;
1682
0
  }
1683
262k
  if (timeStep < 1 || timeStep > (4)) {
1684
0
    return 0;
1685
0
  }
1686
262k
  maxPos = numberOfTimeSlots + (overlap / timeStep);
1687
1688
  /* Check that the start and stop positions of the frame are reasonable values.
1689
   */
1690
262k
  if ((startPos < 0) || (startPos >= stopPos)) return 0;
1691
262k
  if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or
1692
                                                directly after the overlap
1693
                                                buffer */
1694
0
    return 0;
1695
262k
  if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for
1696
                                      output after processing */
1697
0
    return 0;
1698
262k
  if (stopPos > maxPos) return 0;
1699
1700
  /* Check that the  start border for every envelope is strictly later in time
1701
   */
1702
711k
  for (i = 0; i < nEnvelopes; i++) {
1703
458k
    if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0;
1704
458k
  }
1705
1706
  /* Check that the envelope to be shortened is actually among the envelopes */
1707
253k
  if (tranEnv > nEnvelopes) return 0;
1708
1709
  /* Check the noise borders */
1710
253k
  if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0;
1711
1712
253k
  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
605k
  for (i = 0; i < nNoiseEnvelopes; i++) {
1717
351k
    if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1])
1718
0
      return 0;
1719
351k
  }
1720
1721
  /* Check that every noise border is the same as an envelope border*/
1722
605k
  for (i = 0; i < nNoiseEnvelopes; i++) {
1723
351k
    startPosNoise = pFrameInfo->bordersNoise[i];
1724
1725
495k
    for (j = 0; j < nEnvelopes; j++) {
1726
495k
      if (pFrameInfo->borders[j] == startPosNoise) break;
1727
495k
    }
1728
351k
    if (j == nEnvelopes) return 0;
1729
351k
  }
1730
1731
253k
  return 1;
1732
253k
}