Coverage Report

Created: 2025-07-11 06:54

/src/aac/libSBRdec/src/env_extr.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/**************************** SBR decoder library ******************************
96
97
   Author(s):
98
99
   Description:
100
101
*******************************************************************************/
102
103
/*!
104
  \file
105
  \brief  Envelope extraction
106
  The functions provided by this module are mostly called by applySBR(). After
107
  it is determined that there is valid SBR data, sbrGetHeaderData() might be
108
  called if the current SBR data contains an \ref SBR_HEADER_ELEMENT as opposed
109
  to a \ref SBR_STANDARD_ELEMENT. This function may return various error codes
110
  as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET
111
  when decoder settings need to be recalculated according to the SBR
112
  specifications. In that case applySBR() will initiatite the required
113
  re-configuration.
114
115
  The header data is stored in a #SBR_HEADER_DATA structure.
116
117
  The actual SBR data for the current frame is decoded into SBR_FRAME_DATA
118
  stuctures by sbrGetChannelPairElement() [for stereo streams] and
119
  sbrGetSingleChannelElement() [for mono streams]. There is no fractional
120
  arithmetic involved.
121
122
  Once the information is extracted, the data needs to be further prepared
123
  before the actual decoding process. This is done in decodeSbrData().
124
125
  \sa Description of buffer management in applySBR(). \ref documentationOverview
126
127
  <h1>About the SBR data format:</h1>
128
129
  Each frame includes SBR data (side chain information), and can be either the
130
  \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. Parts of the data
131
  can be protected by a CRC checksum.
132
133
  \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2>
134
135
  The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it
136
  typically is send every second or so. It contains fundamental information such
137
  as SBR sampling frequency and frequency range as well as control signals that
138
  do not require frequent changes. It also includes the \ref
139
  SBR_STANDARD_ELEMENT.
140
141
  Depending on the changes between the information in a current
142
  SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might
143
  need to be reset and reconfigured (e.g. new tables need to be calculated).
144
145
  \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2>
146
147
  This data can be subdivided into "side info" and "raw data", where side info
148
  is defined as signals needed to decode the raw data and some decoder tuning
149
  signals. Raw data is referred to as PCM and Huffman coded envelope and noise
150
  floor estimates. The side info also includes information about the
151
  time-frequency grid for the current frame.
152
153
  \sa \ref documentationOverview
154
*/
155
156
#include "env_extr.h"
157
158
#include "sbr_ram.h"
159
#include "sbr_rom.h"
160
#include "huff_dec.h"
161
162
#include "psbitdec.h"
163
164
#define DRM_PARAMETRIC_STEREO 0
165
16.0k
#define EXTENSION_ID_PS_CODING 2
166
167
static int extractPvcFrameInfo(
168
    HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
169
    HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
170
    HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
171
                                           frame-info will be stored */
172
    HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where
173
                                                     the previous frame-info
174
                                                     will be stored */
175
    UCHAR pvc_mode_last,                          /**< PVC mode of last frame */
176
    const UINT flags);
177
static int extractFrameInfo(HANDLE_FDK_BITSTREAM hBs,
178
                            HANDLE_SBR_HEADER_DATA hHeaderData,
179
                            HANDLE_SBR_FRAME_DATA h_frame_data,
180
                            const UINT nrOfChannels, const UINT flags);
181
182
static int sbrGetPvcEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData,
183
                             HANDLE_SBR_FRAME_DATA h_frame_data,
184
                             HANDLE_FDK_BITSTREAM hBs, const UINT flags,
185
                             const UINT pvcMode);
186
static int sbrGetEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData,
187
                          HANDLE_SBR_FRAME_DATA h_frame_data,
188
                          HANDLE_FDK_BITSTREAM hBs, const UINT flags);
189
190
static void sbrGetDirectionControlData(HANDLE_SBR_FRAME_DATA hFrameData,
191
                                       HANDLE_FDK_BITSTREAM hBs,
192
                                       const UINT flags, const int bs_pvc_mode);
193
194
static void sbrGetNoiseFloorData(HANDLE_SBR_HEADER_DATA hHeaderData,
195
                                 HANDLE_SBR_FRAME_DATA h_frame_data,
196
                                 HANDLE_FDK_BITSTREAM hBs);
197
198
static int checkFrameInfo(FRAME_INFO *pFrameInfo, int numberOfTimeSlots,
199
                          int overlap, int timeStep);
200
201
/* Mapping to std samplerate table according to 14496-3 (4.6.18.2.6) */
202
typedef struct SR_MAPPING {
203
  UINT fsRangeLo; /* If fsRangeLo(n+1)>fs>=fsRangeLo(n), it will be mapped to...
204
                   */
205
  UINT fsMapped;  /* fsMapped. */
206
} SR_MAPPING;
207
208
static const SR_MAPPING stdSampleRatesMapping[] = {
209
    {0, 8000},      {9391, 11025},  {11502, 12000}, {13856, 16000},
210
    {18783, 22050}, {23004, 24000}, {27713, 32000}, {37566, 44100},
211
    {46009, 48000}, {55426, 64000}, {75132, 88200}, {92017, 96000}};
212
static const SR_MAPPING stdSampleRatesMappingUsac[] = {
213
    {0, 16000},     {18783, 22050}, {23004, 24000}, {27713, 32000},
214
    {35777, 40000}, {42000, 44100}, {46009, 48000}, {55426, 64000},
215
    {75132, 88200}, {92017, 96000}};
216
217
UINT sbrdec_mapToStdSampleRate(UINT fs,
218
                               UINT isUsac) /*!< Output sampling frequency */
219
283k
{
220
283k
  UINT fsMapped = fs, tableSize = 0;
221
283k
  const SR_MAPPING *mappingTable;
222
283k
  int i;
223
224
283k
  if (!isUsac) {
225
157k
    mappingTable = stdSampleRatesMapping;
226
157k
    tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING);
227
157k
  } else {
228
125k
    mappingTable = stdSampleRatesMappingUsac;
229
125k
    tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING);
230
125k
  }
231
232
2.10M
  for (i = tableSize - 1; i >= 0; i--) {
233
2.10M
    if (fs >= mappingTable[i].fsRangeLo) {
234
283k
      fsMapped = mappingTable[i].fsMapped;
235
283k
      break;
236
283k
    }
237
2.10M
  }
238
239
283k
  return (fsMapped);
240
283k
}
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
246k
               const int setDefaultHdr) {
247
246k
  HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
248
246k
  SBR_ERROR sbrError = SBRDEC_OK;
249
246k
  int numAnalysisBands;
250
246k
  int sampleRateProc;
251
252
246k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
253
157k
    sampleRateProc =
254
157k
        sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0);
255
157k
  } else {
256
88.9k
    sampleRateProc = sampleRateOut * downscaleFactor;
257
88.9k
  }
258
259
246k
  if (sampleRateIn == sampleRateOut) {
260
101k
    hHeaderData->sbrProcSmplRate = sampleRateProc << 1;
261
101k
    numAnalysisBands = 32;
262
145k
  } else {
263
145k
    hHeaderData->sbrProcSmplRate = sampleRateProc;
264
145k
    if ((sampleRateOut >> 1) == sampleRateIn) {
265
      /* 1:2 */
266
80.9k
      numAnalysisBands = 32;
267
80.9k
    } else if ((sampleRateOut >> 2) == sampleRateIn) {
268
      /* 1:4 */
269
26.2k
      numAnalysisBands = 16;
270
38.4k
    } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) {
271
      /* 3:8, 3/4 core frame length */
272
38.3k
      numAnalysisBands = 24;
273
38.3k
    } else {
274
134
      sbrError = SBRDEC_UNSUPPORTED_CONFIG;
275
134
      goto bail;
276
134
    }
277
145k
  }
278
246k
  numAnalysisBands /= downscaleFactor;
279
280
246k
  if (setDefaultHdr) {
281
    /* Fill in default values first */
282
245k
    hHeaderData->syncState = SBR_NOT_INITIALIZED;
283
245k
    hHeaderData->status = 0;
284
245k
    hHeaderData->frameErrorFlag = 0;
285
286
245k
    hHeaderData->bs_info.ampResolution = 1;
287
245k
    hHeaderData->bs_info.xover_band = 0;
288
245k
    hHeaderData->bs_info.sbr_preprocessing = 0;
289
245k
    hHeaderData->bs_info.pvc_mode = 0;
290
291
245k
    hHeaderData->bs_data.startFreq = 5;
292
245k
    hHeaderData->bs_data.stopFreq = 0;
293
245k
    hHeaderData->bs_data.freqScale =
294
245k
        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
245k
    hHeaderData->bs_data.alterScale = 1;
300
245k
    hHeaderData->bs_data.noise_bands = 2;
301
245k
    hHeaderData->bs_data.limiterBands = 2;
302
245k
    hHeaderData->bs_data.limiterGains = 2;
303
245k
    hHeaderData->bs_data.interpolFreq = 1;
304
245k
    hHeaderData->bs_data.smoothingLength = 1;
305
306
    /* Patch some entries */
307
245k
    if (sampleRateOut * downscaleFactor >= 96000) {
308
26.4k
      hHeaderData->bs_data.startFreq =
309
26.4k
          4; /*   having read these frequency values from bit stream before. */
310
26.4k
      hHeaderData->bs_data.stopFreq = 3;
311
218k
    } else if (sampleRateOut * downscaleFactor >
312
218k
               24000) { /* Trigger an error if SBR is going to be processed
313
                           without     */
314
74.9k
      hHeaderData->bs_data.startFreq =
315
74.9k
          7; /*   having read these frequency values from bit stream before. */
316
74.9k
      hHeaderData->bs_data.stopFreq = 3;
317
74.9k
    }
318
245k
  }
319
320
246k
  if ((sampleRateOut >> 2) == sampleRateIn) {
321
26.2k
    hHeaderData->timeStep = 4;
322
220k
  } else {
323
220k
    hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2;
324
220k
  }
325
326
  /* Setup pointers to frequency band tables */
327
246k
  hFreq->freqBandTable[0] = hFreq->freqBandTableLo;
328
246k
  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
246k
  hHeaderData->numberTimeSlots =
333
246k
      (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1);
334
246k
  if (hHeaderData->numberTimeSlots > (16)) {
335
0
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
336
0
  }
337
338
246k
  hHeaderData->numberOfAnalysisBands = numAnalysisBands;
339
246k
  if ((sampleRateOut >> 2) == sampleRateIn) {
340
26.2k
    hHeaderData->numberTimeSlots <<= 1;
341
26.2k
  }
342
343
246k
bail:
344
246k
  return sbrError;
345
246k
}
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
151k
{
355
151k
  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.62M
  for (i = 0; i < MAX_FREQ_COEFFS; i++)
360
8.47M
    h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0;
361
908k
  for (i = 0; i < MAX_NOISE_COEFFS; i++)
362
756k
    h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0;
363
908k
  for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF;
364
365
151k
  h_prev_data->stopPos = timeSlots;
366
151k
  h_prev_data->coupling = COUPLING_OFF;
367
151k
  h_prev_data->ampRes = 0;
368
369
151k
  FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo));
370
151k
}
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
607k
                 const UCHAR configMode) {
381
607k
  SBR_HEADER_DATA_BS *pBsData;
382
607k
  SBR_HEADER_DATA_BS lastHeader;
383
607k
  SBR_HEADER_DATA_BS_INFO lastInfo;
384
607k
  int headerExtra1 = 0, headerExtra2 = 0;
385
386
  /* Read and discard new header in config change detection mode */
387
607k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
388
308k
    if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
389
      /* ampResolution */
390
196k
      FDKreadBits(hBs, 1);
391
196k
    }
392
    /* startFreq, stopFreq */
393
308k
    FDKpushFor(hBs, 8);
394
308k
    if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
395
      /* xover_band */
396
196k
      FDKreadBits(hBs, 3);
397
      /* reserved bits */
398
196k
      FDKreadBits(hBs, 2);
399
196k
    }
400
308k
    headerExtra1 = FDKreadBit(hBs);
401
308k
    headerExtra2 = FDKreadBit(hBs);
402
308k
    FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2);
403
404
308k
    return HEADER_OK;
405
308k
  }
406
407
  /* Copy SBR bit stream header to temporary header */
408
299k
  lastHeader = hHeaderData->bs_data;
409
299k
  lastInfo = hHeaderData->bs_info;
410
411
  /* Read new header from bitstream */
412
299k
  if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) {
413
65.0k
    pBsData = &hHeaderData->bs_dflt;
414
234k
  } else {
415
234k
    pBsData = &hHeaderData->bs_data;
416
234k
  }
417
418
299k
  if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
419
164k
    hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1);
420
164k
  }
421
422
299k
  pBsData->startFreq = FDKreadBits(hBs, 4);
423
299k
  pBsData->stopFreq = FDKreadBits(hBs, 4);
424
425
299k
  if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
426
164k
    hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3);
427
164k
    FDKreadBits(hBs, 2);
428
164k
  }
429
430
299k
  headerExtra1 = FDKreadBits(hBs, 1);
431
299k
  headerExtra2 = FDKreadBits(hBs, 1);
432
433
  /* Handle extra header information */
434
299k
  if (headerExtra1) {
435
98.8k
    pBsData->freqScale = FDKreadBits(hBs, 2);
436
98.8k
    pBsData->alterScale = FDKreadBits(hBs, 1);
437
98.8k
    pBsData->noise_bands = FDKreadBits(hBs, 2);
438
200k
  } else {
439
200k
    pBsData->freqScale = 2;
440
200k
    pBsData->alterScale = 1;
441
200k
    pBsData->noise_bands = 2;
442
200k
  }
443
444
299k
  if (headerExtra2) {
445
100k
    pBsData->limiterBands = FDKreadBits(hBs, 2);
446
100k
    pBsData->limiterGains = FDKreadBits(hBs, 2);
447
100k
    pBsData->interpolFreq = FDKreadBits(hBs, 1);
448
100k
    pBsData->smoothingLength = FDKreadBits(hBs, 1);
449
198k
  } else {
450
198k
    pBsData->limiterBands = 2;
451
198k
    pBsData->limiterGains = 2;
452
198k
    pBsData->interpolFreq = 1;
453
198k
    pBsData->smoothingLength = 1;
454
198k
  }
455
456
  /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */
457
299k
  if (hHeaderData->syncState < SBR_HEADER ||
458
299k
      lastHeader.startFreq != pBsData->startFreq ||
459
299k
      lastHeader.stopFreq != pBsData->stopFreq ||
460
299k
      lastHeader.freqScale != pBsData->freqScale ||
461
299k
      lastHeader.alterScale != pBsData->alterScale ||
462
299k
      lastHeader.noise_bands != pBsData->noise_bands ||
463
299k
      lastInfo.xover_band != hHeaderData->bs_info.xover_band) {
464
233k
    return HEADER_RESET; /* New settings */
465
233k
  }
466
467
65.4k
  return HEADER_OK;
468
299k
}
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
381k
                             HANDLE_FDK_BITSTREAM hBs, const UINT flags) {
478
381k
  int i, bitsRead = 0;
479
480
381k
  int add_harmonic_flag = FDKreadBits(hBs, 1);
481
381k
  bitsRead++;
482
483
381k
  if (add_harmonic_flag) {
484
46.0k
    int nSfb = hHeaderData->freqBandData.nSfb[1];
485
138k
    for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) {
486
      /* read maximum 32 bits and align them to the MSB */
487
92.1k
      int readBits = fMin(32, nSfb);
488
92.1k
      nSfb -= readBits;
489
92.1k
      if (readBits > 0) {
490
46.7k
        hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits)
491
46.7k
                                      << (32 - readBits);
492
46.7k
      } else {
493
45.4k
        hFrameData->addHarmonics[i] = 0;
494
45.4k
      }
495
496
92.1k
      bitsRead += readBits;
497
92.1k
    }
498
    /* bs_pvc_mode = 0 for Rsvd50 */
499
46.0k
    if (flags & SBRDEC_SYNTAX_USAC) {
500
14.6k
      if (hHeaderData->bs_info.pvc_mode) {
501
3.56k
        int bs_sinusoidal_position = 31;
502
3.56k
        if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) {
503
592
          bs_sinusoidal_position = FDKreadBits(hBs, 5);
504
592
        }
505
3.56k
        hFrameData->sinusoidal_position = bs_sinusoidal_position;
506
3.56k
      }
507
14.6k
    }
508
335k
  } else {
509
1.00M
    for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++)
510
671k
      hFrameData->addHarmonics[i] = 0;
511
335k
  }
512
513
381k
  return (bitsRead);
514
381k
}
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
76.1k
) {
531
76.1k
  INT nBitsLeft;
532
76.1k
  int extended_data;
533
76.1k
  int i, frameOk = 1;
534
535
76.1k
  extended_data = FDKreadBits(hBs, 1);
536
537
76.1k
  if (extended_data) {
538
25.1k
    int cnt;
539
25.1k
    int bPsRead = 0;
540
541
25.1k
    cnt = FDKreadBits(hBs, 4);
542
25.1k
    if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8);
543
544
25.1k
    nBitsLeft = 8 * cnt;
545
546
    /* sanity check for cnt */
547
25.1k
    if (nBitsLeft > (INT)FDKgetValidBits(hBs)) {
548
      /* limit nBitsLeft */
549
3.76k
      nBitsLeft = (INT)FDKgetValidBits(hBs);
550
      /* set frame error */
551
3.76k
      frameOk = 0;
552
3.76k
    }
553
554
57.6k
    while (nBitsLeft > 7) {
555
32.4k
      int extension_id = FDKreadBits(hBs, 2);
556
32.4k
      nBitsLeft -= 2;
557
558
32.4k
      switch (extension_id) {
559
16.0k
        case EXTENSION_ID_PS_CODING:
560
561
          /* Read PS data from bitstream */
562
563
16.0k
          if (hParametricStereoDec != NULL) {
564
11.5k
            if (bPsRead &&
565
11.5k
                !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot]
566
3.12k
                     .mpeg.bPsHeaderValid) {
567
317
              cnt = nBitsLeft >> 3; /* number of remaining bytes */
568
9.92k
              for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
569
317
              nBitsLeft -= cnt * 8;
570
11.2k
            } else {
571
11.2k
              nBitsLeft -=
572
11.2k
                  (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft);
573
11.2k
              bPsRead = 1;
574
11.2k
            }
575
11.5k
          }
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
16.0k
          break;
591
592
16.3k
        default:
593
16.3k
          cnt = nBitsLeft >> 3; /* number of remaining bytes */
594
224k
          for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
595
16.3k
          nBitsLeft -= cnt * 8;
596
16.3k
          break;
597
32.4k
      }
598
32.4k
    }
599
600
25.1k
    if (nBitsLeft < 0) {
601
4.10k
      frameOk = 0;
602
4.10k
      goto bail;
603
21.0k
    } else {
604
      /* Read fill bits for byte alignment */
605
21.0k
      FDKreadBits(hBs, nBitsLeft);
606
21.0k
    }
607
25.1k
  }
608
609
76.1k
bail:
610
76.1k
  return (frameOk);
611
76.1k
}
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
301k
                         const int overlap) {
624
301k
  int i, bs_coupling = COUPLING_OFF;
625
301k
  const int nCh = (hFrameDataRight == NULL) ? 1 : 2;
626
627
301k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
628
    /* Reserved bits */
629
83.8k
    if (FDKreadBits(hBs, 1)) { /* bs_data_extra */
630
24.7k
      FDKreadBits(hBs, 4);
631
24.7k
      if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) {
632
21.9k
        FDKreadBits(hBs, 4);
633
21.9k
      }
634
24.7k
    }
635
83.8k
  }
636
637
301k
  if (nCh == 2) {
638
    /* Read coupling flag */
639
98.9k
    bs_coupling = FDKreadBits(hBs, 1);
640
98.9k
    if (bs_coupling) {
641
29.8k
      hFrameDataLeft->coupling = COUPLING_LEVEL;
642
29.8k
      hFrameDataRight->coupling = COUPLING_BAL;
643
69.1k
    } else {
644
69.1k
      hFrameDataLeft->coupling = COUPLING_OFF;
645
69.1k
      hFrameDataRight->coupling = COUPLING_OFF;
646
69.1k
    }
647
202k
  } else {
648
202k
    if (flags & SBRDEC_SYNTAX_SCAL) {
649
24.6k
      FDKreadBits(hBs, 1); /* bs_coupling */
650
24.6k
    }
651
202k
    hFrameDataLeft->coupling = COUPLING_OFF;
652
202k
  }
653
654
301k
  if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
655
217k
    if (flags & SBRDEC_USAC_HARMONICSBR) {
656
55.6k
      hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs);
657
55.6k
      if (hFrameDataLeft->sbrPatchingMode == 0) {
658
33.6k
        hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs);
659
33.6k
        if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
660
4.44k
          hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7);
661
29.2k
        } else {
662
29.2k
          hFrameDataLeft->sbrPitchInBins = 0;
663
29.2k
        }
664
33.6k
      } else {
665
21.9k
        hFrameDataLeft->sbrOversamplingFlag = 0;
666
21.9k
        hFrameDataLeft->sbrPitchInBins = 0;
667
21.9k
      }
668
669
55.6k
      if (nCh == 2) {
670
38.9k
        if (bs_coupling) {
671
18.9k
          hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode;
672
18.9k
          hFrameDataRight->sbrOversamplingFlag =
673
18.9k
              hFrameDataLeft->sbrOversamplingFlag;
674
18.9k
          hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins;
675
19.9k
        } else {
676
19.9k
          hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs);
677
19.9k
          if (hFrameDataRight->sbrPatchingMode == 0) {
678
12.6k
            hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs);
679
12.6k
            if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
680
1.78k
              hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7);
681
10.8k
            } else {
682
10.8k
              hFrameDataRight->sbrPitchInBins = 0;
683
10.8k
            }
684
12.6k
          } else {
685
7.23k
            hFrameDataRight->sbrOversamplingFlag = 0;
686
7.23k
            hFrameDataRight->sbrPitchInBins = 0;
687
7.23k
          }
688
19.9k
        }
689
38.9k
      }
690
161k
    } else {
691
161k
      if (nCh == 2) {
692
26.4k
        hFrameDataRight->sbrPatchingMode = 1;
693
26.4k
        hFrameDataRight->sbrOversamplingFlag = 0;
694
26.4k
        hFrameDataRight->sbrPitchInBins = 0;
695
26.4k
      }
696
697
161k
      hFrameDataLeft->sbrPatchingMode = 1;
698
161k
      hFrameDataLeft->sbrOversamplingFlag = 0;
699
161k
      hFrameDataLeft->sbrPitchInBins = 0;
700
161k
    }
701
217k
  } else {
702
83.8k
    if (nCh == 2) {
703
33.6k
      hFrameDataRight->sbrPatchingMode = 1;
704
33.6k
      hFrameDataRight->sbrOversamplingFlag = 0;
705
33.6k
      hFrameDataRight->sbrPitchInBins = 0;
706
33.6k
    }
707
708
83.8k
    hFrameDataLeft->sbrPatchingMode = 1;
709
83.8k
    hFrameDataLeft->sbrOversamplingFlag = 0;
710
83.8k
    hFrameDataLeft->sbrPitchInBins = 0;
711
83.8k
  }
712
713
  /*
714
    sbr_grid(): Grid control
715
  */
716
301k
  if (hHeaderData->bs_info.pvc_mode) {
717
127k
    FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */
718
127k
    if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft,
719
127k
                             hFrameDataLeftPrev, pvc_mode_last, flags))
720
775
      return 0;
721
722
127k
    if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
723
127k
                        hHeaderData->numberTimeSlots, overlap,
724
127k
                        hHeaderData->timeStep))
725
620
      return 0;
726
173k
  } else {
727
173k
    if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0;
728
729
168k
    if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
730
168k
                        hHeaderData->numberTimeSlots, overlap,
731
168k
                        hHeaderData->timeStep))
732
3.07k
      return 0;
733
168k
  }
734
291k
  if (nCh == 2) {
735
95.1k
    if (hFrameDataLeft->coupling) {
736
28.7k
      FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo,
737
28.7k
                sizeof(FRAME_INFO));
738
28.7k
      hFrameDataRight->ampResolutionCurrentFrame =
739
28.7k
          hFrameDataLeft->ampResolutionCurrentFrame;
740
66.4k
    } else {
741
66.4k
      if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags))
742
1.25k
        return 0;
743
744
65.2k
      if (!checkFrameInfo(&hFrameDataRight->frameInfo,
745
65.2k
                          hHeaderData->numberTimeSlots, overlap,
746
65.2k
                          hHeaderData->timeStep))
747
942
        return 0;
748
65.2k
    }
749
95.1k
  }
750
751
  /*
752
    sbr_dtdf(): Fetch domain vectors (time or frequency direction for
753
    delta-coding)
754
  */
755
289k
  sbrGetDirectionControlData(hFrameDataLeft, hBs, flags,
756
289k
                             hHeaderData->bs_info.pvc_mode);
757
289k
  if (nCh == 2) {
758
92.9k
    sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0);
759
92.9k
  }
760
761
  /* sbr_invf() */
762
944k
  for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
763
654k
    hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
764
654k
  }
765
289k
  if (nCh == 2) {
766
92.9k
    if (hFrameDataLeft->coupling) {
767
94.1k
      for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
768
65.4k
        hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i];
769
65.4k
      }
770
64.2k
    } else {
771
234k
      for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
772
169k
        hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
773
169k
      }
774
64.2k
    }
775
92.9k
  }
776
777
289k
  if (nCh == 1) {
778
196k
    if (hHeaderData->bs_info.pvc_mode) {
779
126k
      if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags,
780
126k
                             hHeaderData->bs_info.pvc_mode))
781
858
        return 0;
782
126k
    } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags))
783
0
      return 0;
784
785
195k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
786
195k
  } else if (hFrameDataLeft->coupling) {
787
28.7k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) {
788
0
      return 0;
789
0
    }
790
791
28.7k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
792
793
28.7k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) {
794
0
      return 0;
795
0
    }
796
28.7k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
797
64.2k
  } else { /* nCh == 2 && no coupling */
798
799
64.2k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0;
800
801
64.2k
    if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0;
802
803
64.2k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
804
805
64.2k
    sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
806
64.2k
  }
807
808
288k
  sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags);
809
288k
  if (nCh == 2) {
810
92.9k
    sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags);
811
92.9k
  }
812
813
288k
  if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
814
76.1k
    if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) {
815
6.65k
      return 0;
816
6.65k
    }
817
76.1k
  }
818
819
281k
  return 1;
820
288k
}
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
382k
{
831
382k
  int i;
832
382k
  int indepFlag = 0;
833
834
382k
  if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
835
276k
    indepFlag = flags & SBRDEC_USAC_INDEP;
836
276k
  }
837
838
382k
  if (bs_pvc_mode == 0) {
839
256k
    i = 0;
840
256k
    if (indepFlag) {
841
117k
      h_frame_data->domain_vec[i++] = 0;
842
117k
    }
843
592k
    for (; i < h_frame_data->frameInfo.nEnvelopes; i++) {
844
336k
      h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1);
845
336k
    }
846
256k
  }
847
848
382k
  i = 0;
849
382k
  if (indepFlag) {
850
224k
    h_frame_data->domain_vec_noise[i++] = 0;
851
224k
  }
852
763k
  for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
853
380k
    h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1);
854
380k
  }
855
382k
}
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
381k
{
865
381k
  int i, j;
866
381k
  int delta;
867
381k
  COUPLING_MODE coupling;
868
381k
  int noNoiseBands = hHeaderData->freqBandData.nNfb;
869
870
381k
  Huffman hcb_noiseF;
871
381k
  Huffman hcb_noise;
872
381k
  int envDataTableCompFactor;
873
874
381k
  coupling = h_frame_data->coupling;
875
876
  /*
877
    Select huffman codebook depending on coupling mode
878
  */
879
381k
  if (coupling == COUPLING_BAL) {
880
28.7k
    hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T;
881
28.7k
    hcb_noiseF =
882
28.7k
        (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F"
883
                                                              */
884
28.7k
    envDataTableCompFactor = 1;
885
352k
  } else {
886
352k
    hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T;
887
352k
    hcb_noiseF =
888
352k
        (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F"
889
                                                            */
890
352k
    envDataTableCompFactor = 0;
891
352k
  }
892
893
  /*
894
    Read raw noise-envelope data
895
  */
896
985k
  for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
897
604k
    if (h_frame_data->domain_vec_noise[i] == 0) {
898
437k
      if (coupling == COUPLING_BAL) {
899
42.0k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
900
42.0k
            (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor);
901
395k
      } else {
902
395k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
903
395k
            (FIXP_SGL)(int)FDKreadBits(hBs, 5);
904
395k
      }
905
906
1.05M
      for (j = 1; j < noNoiseBands; j++) {
907
617k
        delta = DecodeHuffmanCW(hcb_noiseF, hBs);
908
617k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
909
617k
            (FIXP_SGL)(delta << envDataTableCompFactor);
910
617k
      }
911
437k
    } else {
912
499k
      for (j = 0; j < noNoiseBands; j++) {
913
333k
        delta = DecodeHuffmanCW(hcb_noise, hBs);
914
333k
        h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
915
333k
            (FIXP_SGL)(delta << envDataTableCompFactor);
916
333k
      }
917
166k
    }
918
604k
  }
919
381k
}
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
126k
    const UINT flags, const UINT pvcMode) {
932
126k
  int divMode, nsMode;
933
126k
  int indepFlag = flags & SBRDEC_USAC_INDEP;
934
126k
  UCHAR *pvcID = h_frame_data->pvcID;
935
936
126k
  divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS);
937
126k
  nsMode = FDKreadBit(hBs);
938
126k
  FDK_ASSERT((pvcMode == 1) || (pvcMode == 2));
939
126k
  h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode];
940
941
126k
  if (divMode <= 3) {
942
16.2k
    int i, k = 1, sum_length = 0, reuse_pcvID;
943
944
    /* special treatment for first time slot k=0 */
945
16.2k
    indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs));
946
16.2k
    if (reuse_pcvID) {
947
4.66k
      pvcID[0] = hHeaderData->pvcIDprev;
948
11.5k
    } else {
949
11.5k
      pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS);
950
11.5k
    }
951
952
    /* other time slots k>0 */
953
32.1k
    for (i = 0; i < divMode; i++) {
954
16.7k
      int length, numBits = 4;
955
956
16.7k
      if (sum_length >= 13) {
957
1.12k
        numBits = 1;
958
15.6k
      } else if (sum_length >= 11) {
959
263
        numBits = 2;
960
15.3k
      } else if (sum_length >= 7) {
961
1.46k
        numBits = 3;
962
1.46k
      }
963
964
16.7k
      length = FDKreadBits(hBs, numBits);
965
16.7k
      sum_length += length + 1;
966
16.7k
      if (sum_length >= PVC_NTIMESLOT) {
967
858
        return 0; /* parse error */
968
858
      }
969
63.3k
      for (; length--; k++) {
970
47.4k
        pvcID[k] = pvcID[k - 1];
971
47.4k
      }
972
15.9k
      pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
973
15.9k
    }
974
189k
    for (; k < 16; k++) {
975
173k
      pvcID[k] = pvcID[k - 1];
976
173k
    }
977
110k
  } else { /* divMode >= 4 */
978
110k
    int num_grid_info, fixed_length, grid_info, j, k = 0;
979
980
110k
    divMode -= 4;
981
110k
    num_grid_info = 2 << divMode;
982
110k
    fixed_length = 8 >> divMode;
983
110k
    FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT);
984
985
    /* special treatment for first time slot k=0 */
986
110k
    indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs));
987
110k
    if (grid_info) {
988
105k
      pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
989
105k
    } else {
990
4.28k
      pvcID[k++] = hHeaderData->pvcIDprev;
991
4.28k
    }
992
110k
    j = fixed_length - 1;
993
854k
    for (; j--; k++) {
994
743k
      pvcID[k] = pvcID[k - 1];
995
743k
    }
996
110k
    num_grid_info--;
997
998
    /* other time slots k>0 */
999
266k
    for (; num_grid_info--;) {
1000
156k
      j = fixed_length;
1001
156k
      grid_info = FDKreadBit(hBs);
1002
156k
      if (grid_info) {
1003
17.7k
        pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
1004
17.7k
        j--;
1005
17.7k
      }
1006
1.04M
      for (; j--; k++) {
1007
891k
        pvcID[k] = pvcID[k - 1];
1008
891k
      }
1009
156k
    }
1010
110k
  }
1011
1012
125k
  hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1];
1013
1014
  /* usage of PVC excludes inter-TES tool */
1015
125k
  h_frame_data->iTESactive = (UCHAR)0;
1016
1017
125k
  return 1;
1018
126k
}
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
256k
    const UINT flags) {
1027
256k
  int i, j;
1028
256k
  UCHAR no_band[MAX_ENVELOPES];
1029
256k
  int delta = 0;
1030
256k
  int offset = 0;
1031
256k
  COUPLING_MODE coupling = h_frame_data->coupling;
1032
256k
  int ampRes = hHeaderData->bs_info.ampResolution;
1033
256k
  int nEnvelopes = h_frame_data->frameInfo.nEnvelopes;
1034
256k
  int envDataTableCompFactor;
1035
256k
  int start_bits, start_bits_balance;
1036
256k
  Huffman hcb_t, hcb_f;
1037
1038
256k
  h_frame_data->nScaleFactors = 0;
1039
1040
256k
  if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) {
1041
96.2k
    if (flags & SBRDEC_ELD_GRID)
1042
36.7k
      ampRes = h_frame_data->ampResolutionCurrentFrame;
1043
59.4k
    else
1044
59.4k
      ampRes = 0;
1045
96.2k
  }
1046
256k
  h_frame_data->ampResolutionCurrentFrame = ampRes;
1047
1048
  /*
1049
    Set number of bits for first value depending on amplitude resolution
1050
  */
1051
256k
  if (ampRes == 1) {
1052
67.3k
    start_bits = 6;
1053
67.3k
    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
710k
  for (i = 0; i < nEnvelopes; i++) {
1063
453k
    no_band[i] =
1064
453k
        hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]];
1065
453k
    h_frame_data->nScaleFactors += no_band[i];
1066
453k
  }
1067
256k
  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
256k
  if (coupling == COUPLING_BAL) {
1073
28.7k
    envDataTableCompFactor = 1;
1074
28.7k
    if (ampRes == 0) {
1075
23.9k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T;
1076
23.9k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F;
1077
23.9k
    } else {
1078
4.75k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T;
1079
4.75k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F;
1080
4.75k
    }
1081
227k
  } else {
1082
227k
    envDataTableCompFactor = 0;
1083
227k
    if (ampRes == 0) {
1084
164k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T;
1085
164k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F;
1086
164k
    } else {
1087
62.6k
      hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T;
1088
62.6k
      hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F;
1089
62.6k
    }
1090
227k
  }
1091
1092
256k
  h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */
1093
  /*
1094
    Now read raw envelope data
1095
  */
1096
710k
  for (j = 0, offset = 0; j < nEnvelopes; j++) {
1097
453k
    if (h_frame_data->domain_vec[j] == 0) {
1098
332k
      if (coupling == COUPLING_BAL) {
1099
48.4k
        h_frame_data->iEnvelope[offset] =
1100
48.4k
            (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance))
1101
48.4k
                       << envDataTableCompFactor);
1102
283k
      } else {
1103
283k
        h_frame_data->iEnvelope[offset] =
1104
283k
            (FIXP_SGL)(int)FDKreadBits(hBs, start_bits);
1105
283k
      }
1106
332k
    }
1107
1108
3.64M
    for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) {
1109
3.18M
      if (h_frame_data->domain_vec[j] == 0) {
1110
2.11M
        delta = DecodeHuffmanCW(hcb_f, hBs);
1111
2.11M
      } else {
1112
1.06M
        delta = DecodeHuffmanCW(hcb_t, hBs);
1113
1.06M
      }
1114
1115
3.18M
      h_frame_data->iEnvelope[offset + i] =
1116
3.18M
          (FIXP_SGL)(delta << envDataTableCompFactor);
1117
3.18M
    }
1118
453k
    if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) {
1119
145k
      int bs_temp_shape = FDKreadBit(hBs);
1120
145k
      FDK_ASSERT(j < 8);
1121
145k
      h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j);
1122
145k
      if (bs_temp_shape) {
1123
38.4k
        h_frame_data->interTempShapeMode[j] =
1124
38.4k
            FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */
1125
106k
      } else {
1126
106k
        h_frame_data->interTempShapeMode[j] = 0;
1127
106k
      }
1128
145k
    }
1129
453k
    offset += no_band[j];
1130
453k
  }
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
256k
  return 1;
1141
256k
}
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
10.1k
                              int numberTimeSlots, const UINT flags) {
1152
10.1k
  int nEnv, i, tranIdx;
1153
10.1k
  const int *pTable;
1154
1155
10.1k
  if (tranPosInternal >= numberTimeSlots) {
1156
0
    return 0;
1157
0
  }
1158
1159
10.1k
  switch (numberTimeSlots) {
1160
0
    case 8:
1161
0
      pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal];
1162
0
      break;
1163
8.19k
    case 15:
1164
8.19k
      pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal];
1165
8.19k
      break;
1166
1.94k
    case 16:
1167
1.94k
      pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal];
1168
1.94k
      break;
1169
0
    default:
1170
0
      return 0;
1171
10.1k
  }
1172
1173
  /* look number of envelopes in table */
1174
10.1k
  nEnv = pTable[0];
1175
  /* look up envelope distribution in table */
1176
23.7k
  for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2];
1177
  /* open and close frame border */
1178
10.1k
  hSbrFrameInfo->borders[0] = 0;
1179
10.1k
  hSbrFrameInfo->borders[nEnv] = numberTimeSlots;
1180
10.1k
  hSbrFrameInfo->nEnvelopes = nEnv;
1181
1182
  /* transient idx */
1183
10.1k
  tranIdx = hSbrFrameInfo->tranEnv = pTable[1];
1184
1185
  /* add noise floors */
1186
10.1k
  hSbrFrameInfo->bordersNoise[0] = 0;
1187
10.1k
  hSbrFrameInfo->bordersNoise[1] =
1188
10.1k
      hSbrFrameInfo->borders[tranIdx ? tranIdx : 1];
1189
10.1k
  hSbrFrameInfo->bordersNoise[2] = numberTimeSlots;
1190
  /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2)
1191
   */
1192
10.1k
  hSbrFrameInfo->nNoiseEnvelopes = 2;
1193
1194
10.1k
  return 1;
1195
10.1k
}
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
12.2k
    int timeSlots, const UINT flags) {
1208
12.2k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1209
12.2k
  INT numberTimeSlots = hHeaderData->numberTimeSlots;
1210
12.2k
  INT temp = 0, k;
1211
1212
  /* FIXFIXonly framing case */
1213
12.2k
  h_frame_data->frameInfo.frameClass = 0;
1214
1215
  /* get the transient position from the bitstream */
1216
12.2k
  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.94k
    case 16:
1223
12.2k
    case 15:
1224
      /* 4bit transient position (temp={0;..;15}) */
1225
12.2k
      temp = FDKreadBits(hBitBuf, 4);
1226
12.2k
      break;
1227
1228
0
    default:
1229
0
      return 0;
1230
12.2k
  }
1231
1232
  /* For "case 15" only*/
1233
12.2k
  if (temp >= timeSlots) {
1234
2.07k
    return 0;
1235
2.07k
  }
1236
1237
  /* calculate borders according to the transient position */
1238
10.1k
  if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) {
1239
0
    return 0;
1240
0
  }
1241
1242
  /* decode freq res: */
1243
33.8k
  for (k = 0; k < pFrameInfo->nEnvelopes; k++) {
1244
23.7k
    pFrameInfo->freqRes[k] =
1245
23.7k
        (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */
1246
23.7k
  }
1247
1248
10.1k
  return 1;
1249
10.1k
}
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
127k
    const UINT flags) {
1265
127k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1266
127k
  FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo;
1267
127k
  int bs_var_len_hf, bs_noise_position;
1268
127k
  bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */
1269
127k
  bs_var_len_hf = FDKreadBit(hBs);
1270
127k
  pFrameInfo->noisePosition = bs_noise_position;
1271
127k
  pFrameInfo->tranEnv = -1;
1272
1273
  /* Init for bs_noise_position == 0 in case a parse error is found below. */
1274
127k
  pFrameInfo->nEnvelopes = 1;
1275
127k
  pFrameInfo->nNoiseEnvelopes = 1;
1276
127k
  pFrameInfo->freqRes[0] = 0;
1277
1278
127k
  if (bs_var_len_hf) { /* 1 or 3 Bits */
1279
109k
    pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1;
1280
109k
    if (pFrameInfo->varLength > 3) {
1281
775
      pFrameInfo->varLength =
1282
775
          0;    /* assume bs_var_len_hf == 0 in case of error */
1283
775
      return 0; /* reserved value -> parse error */
1284
775
    }
1285
109k
  } else {
1286
18.3k
    pFrameInfo->varLength = 0;
1287
18.3k
  }
1288
1289
127k
  if (bs_noise_position) {
1290
111k
    pFrameInfo->nEnvelopes = 2;
1291
111k
    pFrameInfo->nNoiseEnvelopes = 2;
1292
111k
    FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes));
1293
111k
  }
1294
1295
  /* frame border calculation */
1296
127k
  if (hHeaderData->bs_info.pvc_mode > 0) {
1297
    /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference.
1298
     */
1299
1300
127k
    FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2));
1301
1302
    /* left timeborder-offset: use the timeborder of prev SBR frame */
1303
127k
    if (pPrevFrameInfo->nEnvelopes > 0) {
1304
123k
      pFrameInfo->borders[0] =
1305
123k
          pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT;
1306
123k
      FDK_ASSERT(pFrameInfo->borders[0] <= 3);
1307
123k
    } else {
1308
3.95k
      pFrameInfo->borders[0] = 0;
1309
3.95k
    }
1310
1311
    /* right timeborder-offset: */
1312
127k
    pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength;
1313
1314
127k
    if (pFrameInfo->nEnvelopes == 2) {
1315
111k
      pFrameInfo->borders[1] = pFrameInfo->noisePosition;
1316
111k
    }
1317
1318
    /* Calculation of PVC time borders t_EPVC */
1319
127k
    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.93k
      pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0];
1323
118k
    } else {
1324
118k
      pFrameInfo->pvcBorders[0] = 0;
1325
118k
    }
1326
127k
    if (pFrameInfo->nEnvelopes == 2) {
1327
111k
      pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1];
1328
111k
    }
1329
127k
    pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16;
1330
1331
    /* calculation of SBR noise-floor time-border vector: */
1332
492k
    for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) {
1333
365k
      pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i];
1334
365k
    }
1335
1336
127k
    pFrameInfo->tranEnv = -1; /* tranEnv not used */
1337
127k
  }
1338
127k
  return 1;
1339
127k
}
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
240k
    const UINT nrOfChannels, const UINT flags) {
1351
240k
  FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
1352
240k
  int numberTimeSlots = hHeaderData->numberTimeSlots;
1353
240k
  int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR,
1354
240k
      temp = 0, staticFreqRes;
1355
240k
  UCHAR frameClass;
1356
1357
240k
  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
60.3k
    frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */
1361
60.3k
    if (frameClass == 1) {
1362
      /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal
1363
       * SBR-Grid for FIXIFX */
1364
      /* extract the AACLD-Sbr-Grid */
1365
12.2k
      pFrameInfo->frameClass = frameClass;
1366
12.2k
      int err = 1;
1367
12.2k
      err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots,
1368
12.2k
                                flags);
1369
12.2k
      return err;
1370
12.2k
    }
1371
179k
  } else {
1372
179k
    frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */
1373
179k
  }
1374
1375
227k
  switch (frameClass) {
1376
128k
    case 0:
1377
128k
      temp = FDKreadBits(hBs, 2); /* E [2 bits ] */
1378
128k
      nEnv = (int)(1 << temp);    /* E -> e */
1379
1380
128k
      if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1))
1381
36.2k
        h_frame_data->ampResolutionCurrentFrame =
1382
36.2k
            FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */
1383
1384
128k
      staticFreqRes = FDKreadBits(hBs, 1);
1385
1386
128k
      if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
1387
68.1k
        if (nEnv > MAX_ENVELOPES_USAC) return 0;
1388
68.1k
      } else
1389
1390
60.6k
        b = nEnv + 1;
1391
128k
      switch (nEnv) {
1392
88.8k
        case 1:
1393
88.8k
          switch (numberTimeSlots) {
1394
35.4k
            case 15:
1395
35.4k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15,
1396
35.4k
                        sizeof(FRAME_INFO));
1397
35.4k
              break;
1398
53.3k
            case 16:
1399
53.3k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16,
1400
53.3k
                        sizeof(FRAME_INFO));
1401
53.3k
              break;
1402
0
            default:
1403
0
              FDK_ASSERT(0);
1404
88.8k
          }
1405
88.8k
          break;
1406
88.8k
        case 2:
1407
26.7k
          switch (numberTimeSlots) {
1408
6.07k
            case 15:
1409
6.07k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15,
1410
6.07k
                        sizeof(FRAME_INFO));
1411
6.07k
              break;
1412
20.6k
            case 16:
1413
20.6k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16,
1414
20.6k
                        sizeof(FRAME_INFO));
1415
20.6k
              break;
1416
0
            default:
1417
0
              FDK_ASSERT(0);
1418
26.7k
          }
1419
26.7k
          break;
1420
26.7k
        case 4:
1421
7.56k
          switch (numberTimeSlots) {
1422
5.29k
            case 15:
1423
5.29k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15,
1424
5.29k
                        sizeof(FRAME_INFO));
1425
5.29k
              break;
1426
2.26k
            case 16:
1427
2.26k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16,
1428
2.26k
                        sizeof(FRAME_INFO));
1429
2.26k
              break;
1430
0
            default:
1431
0
              FDK_ASSERT(0);
1432
7.56k
          }
1433
7.56k
          break;
1434
7.56k
        case 8:
1435
5.61k
#if (MAX_ENVELOPES >= 8)
1436
5.61k
          switch (numberTimeSlots) {
1437
1.87k
            case 15:
1438
1.87k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15,
1439
1.87k
                        sizeof(FRAME_INFO));
1440
1.87k
              break;
1441
3.74k
            case 16:
1442
3.74k
              FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16,
1443
3.74k
                        sizeof(FRAME_INFO));
1444
3.74k
              break;
1445
0
            default:
1446
0
              FDK_ASSERT(0);
1447
5.61k
          }
1448
5.61k
          break;
1449
#else
1450
          return 0;
1451
#endif
1452
128k
      }
1453
      /* Apply correct freqRes (High is default) */
1454
128k
      if (!staticFreqRes) {
1455
212k
        for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0;
1456
90.1k
      }
1457
1458
128k
      break;
1459
46.2k
    case 1:
1460
85.8k
    case 2:
1461
85.8k
      temp = FDKreadBits(hBs, 2); /* A [2 bits] */
1462
1463
85.8k
      n = FDKreadBits(hBs, 2); /* n = N [2 bits] */
1464
1465
85.8k
      nEnv = n + 1; /* # envelopes */
1466
85.8k
      b = nEnv + 1; /* # borders   */
1467
1468
85.8k
      break;
1469
227k
  }
1470
1471
227k
  switch (frameClass) {
1472
46.2k
    case 1:
1473
      /* Decode borders: */
1474
46.2k
      pFrameInfo->borders[0] = 0;      /* first border          */
1475
46.2k
      border = temp + numberTimeSlots; /* A -> aR               */
1476
46.2k
      i = b - 1;                       /* frame info index for last border */
1477
46.2k
      pFrameInfo->borders[i] = border; /* last border                      */
1478
1479
87.7k
      for (k = 0; k < n; k++) {
1480
41.5k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1481
41.5k
        border -= (2 * temp + 2);   /* R -> r                */
1482
41.5k
        pFrameInfo->borders[--i] = border;
1483
41.5k
      }
1484
1485
      /* Decode pointer: */
1486
46.2k
      pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
1487
46.2k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1488
1489
46.2k
      if (p > n + 1) return 0;
1490
1491
44.7k
      pFrameInfo->tranEnv = p ? n + 2 - p : -1;
1492
1493
      /* Decode freq res: */
1494
127k
      for (k = n; k >= 0; k--) {
1495
82.5k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1496
82.5k
      }
1497
1498
      /* Calculate noise floor middle border: */
1499
44.7k
      if (p == 0 || p == 1)
1500
43.1k
        pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
1501
1.56k
      else
1502
1.56k
        pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
1503
1504
44.7k
      break;
1505
1506
39.6k
    case 2:
1507
      /* Decode borders: */
1508
39.6k
      border = temp;                   /* A -> aL */
1509
39.6k
      pFrameInfo->borders[0] = border; /* first border */
1510
1511
62.7k
      for (k = 1; k <= n; k++) {
1512
23.1k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1513
23.1k
        border += (2 * temp + 2);   /* R -> r                */
1514
23.1k
        pFrameInfo->borders[k] = border;
1515
23.1k
      }
1516
39.6k
      pFrameInfo->borders[k] = numberTimeSlots; /* last border */
1517
1518
      /* Decode pointer: */
1519
39.6k
      pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
1520
39.6k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1521
39.6k
      if (p > n + 1) return 0;
1522
1523
38.0k
      if (p == 0 || p == 1)
1524
30.6k
        pFrameInfo->tranEnv = -1;
1525
7.35k
      else
1526
7.35k
        pFrameInfo->tranEnv = p - 1;
1527
1528
      /* Decode freq res: */
1529
95.0k
      for (k = 0; k <= n; k++) {
1530
57.0k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1531
57.0k
      }
1532
1533
      /* Calculate noise floor middle border: */
1534
38.0k
      switch (p) {
1535
28.2k
        case 0:
1536
28.2k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1];
1537
28.2k
          break;
1538
2.41k
        case 1:
1539
2.41k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
1540
2.41k
          break;
1541
7.35k
        default:
1542
7.35k
          pFrameInfo->bordersNoise[1] =
1543
7.35k
              pFrameInfo->borders[pFrameInfo->tranEnv];
1544
7.35k
          break;
1545
38.0k
      }
1546
1547
38.0k
      break;
1548
1549
38.0k
    case 3:
1550
      /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */
1551
1552
13.3k
      aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */
1553
1554
13.3k
      aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */
1555
1556
13.3k
      nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */
1557
1558
13.3k
      nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */
1559
1560
      /*-------------------------------------------------------------------------
1561
        Calculate help variables
1562
        --------------------------------------------------------------------------*/
1563
1564
      /* general: */
1565
13.3k
      nEnv = nL + nR + 1; /* # envelopes */
1566
13.3k
      if (nEnv > MAX_ENVELOPES) return 0;
1567
13.3k
      b = nEnv + 1; /* # borders   */
1568
1569
      /*-------------------------------------------------------------------------
1570
        Decode envelopes
1571
        --------------------------------------------------------------------------*/
1572
1573
      /* L-borders:   */
1574
13.3k
      border = aL; /* first border */
1575
13.3k
      pFrameInfo->borders[0] = border;
1576
1577
29.3k
      for (k = 1; k <= nL; k++) {
1578
16.0k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1579
16.0k
        border += (2 * temp + 2);   /* R -> r                */
1580
16.0k
        pFrameInfo->borders[k] = border;
1581
16.0k
      }
1582
1583
      /* R-borders:  */
1584
13.3k
      border = aR; /* last border */
1585
13.3k
      i = nEnv;
1586
1587
13.3k
      pFrameInfo->borders[i] = border;
1588
1589
30.4k
      for (k = 0; k < nR; k++) {
1590
17.1k
        temp = FDKreadBits(hBs, 2); /* R [2 bits] */
1591
17.1k
        border -= (2 * temp + 2);   /* R -> r                */
1592
17.1k
        pFrameInfo->borders[--i] = border;
1593
17.1k
      }
1594
1595
      /* decode pointer: */
1596
13.3k
      pointer_bits =
1597
13.3k
          DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1));
1598
13.3k
      p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
1599
1600
13.3k
      if (p > nL + nR + 1) return 0;
1601
1602
11.8k
      pFrameInfo->tranEnv = p ? b - p : -1;
1603
1604
      /* decode freq res: */
1605
52.3k
      for (k = 0; k < nEnv; k++) {
1606
40.4k
        pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
1607
40.4k
      }
1608
1609
      /*-------------------------------------------------------------------------
1610
        Decode noise floors
1611
        --------------------------------------------------------------------------*/
1612
11.8k
      pFrameInfo->bordersNoise[0] = aL;
1613
1614
11.8k
      if (nEnv == 1) {
1615
        /* 1 noise floor envelope: */
1616
1.52k
        pFrameInfo->bordersNoise[1] = aR;
1617
10.3k
      } else {
1618
        /* 2 noise floor envelopes */
1619
10.3k
        if (p == 0 || p == 1)
1620
7.68k
          pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1];
1621
2.67k
        else
1622
2.67k
          pFrameInfo->bordersNoise[1] =
1623
2.67k
              pFrameInfo->borders[pFrameInfo->tranEnv];
1624
10.3k
        pFrameInfo->bordersNoise[2] = aR;
1625
10.3k
      }
1626
11.8k
      break;
1627
227k
  }
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
136k
    pFrameInfo->nNoiseEnvelopes = 1;
1636
86.8k
  else
1637
86.8k
    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
82.7k
    pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0];
1644
82.7k
    pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] =
1645
82.7k
        pFrameInfo->borders[nEnv];
1646
82.7k
  }
1647
1648
223k
  return 1;
1649
227k
}
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
360k
{
1661
360k
  int maxPos, i, j;
1662
360k
  int startPos;
1663
360k
  int stopPos;
1664
360k
  int tranEnv;
1665
360k
  int startPosNoise;
1666
360k
  int stopPosNoise;
1667
360k
  int nEnvelopes = pFrameInfo->nEnvelopes;
1668
360k
  int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes;
1669
1670
360k
  if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0;
1671
1672
360k
  if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0;
1673
1674
360k
  startPos = pFrameInfo->borders[0];
1675
360k
  stopPos = pFrameInfo->borders[nEnvelopes];
1676
360k
  tranEnv = pFrameInfo->tranEnv;
1677
360k
  startPosNoise = pFrameInfo->bordersNoise[0];
1678
360k
  stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes];
1679
1680
360k
  if (overlap < 0 || overlap > (3 * (4))) {
1681
0
    return 0;
1682
0
  }
1683
360k
  if (timeStep < 1 || timeStep > (4)) {
1684
0
    return 0;
1685
0
  }
1686
360k
  maxPos = numberOfTimeSlots + (overlap / timeStep);
1687
1688
  /* Check that the start and stop positions of the frame are reasonable values.
1689
   */
1690
360k
  if ((startPos < 0) || (startPos >= stopPos)) return 0;
1691
360k
  if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or
1692
                                                directly after the overlap
1693
                                                buffer */
1694
0
    return 0;
1695
360k
  if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for
1696
                                      output after processing */
1697
0
    return 0;
1698
360k
  if (stopPos > maxPos) return 0;
1699
1700
  /* Check that the  start border for every envelope is strictly later in time
1701
   */
1702
1.00M
  for (i = 0; i < nEnvelopes; i++) {
1703
651k
    if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0;
1704
651k
  }
1705
1706
  /* Check that the envelope to be shortened is actually among the envelopes */
1707
355k
  if (tranEnv > nEnvelopes) return 0;
1708
1709
  /* Check the noise borders */
1710
355k
  if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0;
1711
1712
355k
  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
916k
  for (i = 0; i < nNoiseEnvelopes; i++) {
1717
560k
    if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1])
1718
0
      return 0;
1719
560k
  }
1720
1721
  /* Check that every noise border is the same as an envelope border*/
1722
916k
  for (i = 0; i < nNoiseEnvelopes; i++) {
1723
560k
    startPosNoise = pFrameInfo->bordersNoise[i];
1724
1725
811k
    for (j = 0; j < nEnvelopes; j++) {
1726
811k
      if (pFrameInfo->borders[j] == startPosNoise) break;
1727
811k
    }
1728
560k
    if (j == nEnvelopes) return 0;
1729
560k
  }
1730
1731
355k
  return 1;
1732
355k
}