Coverage Report

Created: 2026-10-17 06:51

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