Coverage Report

Created: 2025-11-11 06:41

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