Coverage Report

Created: 2025-07-01 06:21

/src/aac/libAACdec/src/channelinfo.h
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
/**************************** AAC decoder library ******************************
96
97
   Author(s):   Josef Hoepfl
98
99
   Description: individual channel stream info
100
101
*******************************************************************************/
102
103
#ifndef CHANNELINFO_H
104
#define CHANNELINFO_H
105
106
#include "common_fix.h"
107
108
#include "aac_rom.h"
109
#include "aacdecoder_lib.h"
110
#include "FDK_bitstream.h"
111
#include "overlapadd.h"
112
113
#include "mdct.h"
114
#include "stereo.h"
115
#include "pulsedata.h"
116
#include "aacdec_tns.h"
117
118
#include "aacdec_pns.h"
119
120
#include "aacdec_hcr_types.h"
121
#include "rvlc_info.h"
122
123
#include "usacdec_acelp.h"
124
#include "usacdec_const.h"
125
#include "usacdec_rom.h"
126
127
#include "ac_arith_coder.h"
128
129
#include "conceal_types.h"
130
131
#include "aacdec_drc_types.h"
132
133
#define WB_SECTION_SIZE (1024 * 2)
134
135
#define DRM_BS_BUFFER_SIZE                                                 \
136
0
  (512) /* size of the dynamic buffer which is used to reverse the bits of \
137
           the DRM SBR payload */
138
139
/* Output rendering mode */
140
typedef enum {
141
  AACDEC_RENDER_INVALID = 0,
142
  AACDEC_RENDER_IMDCT,
143
  AACDEC_RENDER_ELDFB,
144
  AACDEC_RENDER_LPD,
145
  AACDEC_RENDER_INTIMDCT
146
} AACDEC_RENDER_MODE;
147
148
enum { MAX_QUANTIZED_VALUE = 8191 };
149
150
typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE;
151
152
typedef struct {
153
  const SHORT *ScaleFactorBands_Long;
154
  const SHORT *ScaleFactorBands_Short;
155
  UCHAR NumberOfScaleFactorBands_Long;
156
  UCHAR NumberOfScaleFactorBands_Short;
157
  UINT samplingRateIndex;
158
  UINT samplingRate;
159
} SamplingRateInfo;
160
161
typedef struct {
162
  UCHAR CommonWindow;
163
  UCHAR GlobalGain;
164
165
} CRawDataInfo;
166
167
typedef struct {
168
  UCHAR WindowGroupLength[8];
169
  UCHAR WindowGroups;
170
  UCHAR Valid;
171
172
  UCHAR WindowShape;         /* 0: sine window, 1: KBD, 2: low overlap */
173
  BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */
174
  UCHAR MaxSfBands;
175
  UCHAR max_sfb_ste;
176
  UCHAR ScaleFactorGrouping;
177
178
  UCHAR TotalSfBands;
179
180
} CIcsInfo;
181
182
enum {
183
  ZERO_HCB = 0,
184
  ESCBOOK = 11,
185
  NSPECBOOKS = ESCBOOK + 1,
186
  BOOKSCL = NSPECBOOKS,
187
  NOISE_HCB = 13,
188
  INTENSITY_HCB2 = 14,
189
  INTENSITY_HCB = 15,
190
  LAST_HCB
191
};
192
193
/* This struct holds the persistent data shared by both channels of a CPE.
194
   It needs to be allocated for each CPE. */
195
typedef struct {
196
  CJointStereoPersistentData jointStereoPersistentData;
197
} CpePersistentData;
198
199
/*
200
 * This struct must be allocated one for every channel and must be persistent.
201
 */
202
typedef struct {
203
  FIXP_DBL *pOverlapBuffer;
204
  mdct_t IMdct;
205
206
  CArcoData *hArCo;
207
208
  INT pnsCurrentSeed;
209
210
  /* LPD memory */
211
  FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR];
212
  INT old_T_pf[SYN_SFD];
213
  FIXP_DBL old_gain_pf[SYN_SFD];
214
  FIXP_DBL mem_bpf[L_FILT + L_SUBFR];
215
  UCHAR
216
  old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe
217
                         */
218
219
  USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous
220
                                   frame. (not signalled by the bitstream, see
221
                                   CAacDecoderChannelInfo::core_mode_last !! )
222
                                 */
223
  UCHAR last_lpd_mode;      /* LPD mode used by the decoder in last LPD subframe
224
                                (not signalled by the bitstream, see
225
                               CAacDecoderChannelInfo::lpd_mode_last !! ) */
226
  UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe
227
                                (not signalled by the bitstream) */
228
  UCHAR last_lpc_lost;      /* Flag indicating that the previous LPC is lost */
229
230
  FIXP_LPC
231
  lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */
232
  FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC
233
                                                    coefficients in LSF domain
234
                                                    for concealment. */
235
  FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER];   /* Last LPC coefficients in LP
236
                                    domain. lp_coeff_old[0] is lpc4 (coeffs for
237
                                    right folding point of last tcx frame),
238
                                    lp_coeff_old[1] are coeffs for left folding
239
                                    point of last tcx frame */
240
  INT lp_coeff_old_exp[2];
241
242
  FIXP_SGL
243
  oldStability; /* LPC coeff stability value from last frame (required for
244
                   TCX concealment). */
245
  UINT numLostLpdFrames; /* Number of consecutive lost subframes. */
246
247
  /* TCX memory */
248
  FIXP_DBL last_tcx_gain;
249
  INT last_tcx_gain_e;
250
  FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */
251
  SHORT last_tcx_pitch;
252
  UCHAR last_tcx_noise_factor;
253
254
  /* ACELP memory */
255
  CAcelpStaticMem acelp;
256
257
  ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */
258
259
  CDrcChannelData drcData;
260
  CConcealmentInfo concealmentInfo;
261
262
  CpePersistentData *pCpeStaticData;
263
264
} CAacDecoderStaticChannelInfo;
265
266
/*
267
 * This union must be allocated for every element (up to 2 channels).
268
 */
269
typedef struct {
270
  /* Common bit stream data */
271
  SHORT aScaleFactor[(
272
      8 * 16)]; /* Spectral scale factors for each sfb in each window. */
273
  SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */
274
  UCHAR
275
  aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */
276
  UCHAR band_is_noise[(8 * 16)];
277
  CTnsData TnsData;
278
  CRawDataInfo RawDataInfo;
279
280
  shouldBeUnion {
281
    struct {
282
      CPulseData PulseData;
283
      SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels
284
                                               except for Drm syntax */
285
      UCHAR
286
      aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for
287
                                      Drm syntax. Same as "aCodeBook" ? */
288
      SHORT lenOfReorderedSpectralData;
289
      SCHAR lenOfLongestCodeword;
290
      SCHAR numberSection;
291
      SCHAR rvlcCurrentScaleFactorOK;
292
      SCHAR rvlcIntensityUsed;
293
    } aac;
294
    struct {
295
      UCHAR fd_noise_level_and_offset;
296
      UCHAR tns_active;
297
      UCHAR tns_on_lr;
298
      UCHAR tcx_noise_factor[4];
299
      UCHAR tcx_global_gain[4];
300
    } usac;
301
  }
302
  specificTo;
303
304
} CAacDecoderDynamicData;
305
306
typedef shouldBeUnion {
307
  UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE];
308
309
  /* Common signal data, can be used once the bit stream data from above is not
310
   * used anymore. */
311
  FIXP_DBL mdctOutTemp[1024];
312
313
  FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)];
314
315
  FIXP_DBL workBuffer[WB_SECTION_SIZE];
316
}
317
CWorkBufferCore1;
318
319
/* Common data referenced by all channels */
320
typedef struct {
321
  CAacDecoderDynamicData pAacDecoderDynamicData[2];
322
323
  CPnsInterChannelData pnsInterChannelData;
324
  INT pnsRandomSeed[(8 * 16)];
325
326
  CJointStereoData jointStereoData; /* One for one element */
327
328
  shouldBeUnion {
329
    struct {
330
      CErHcrInfo erHcrInfo;
331
      CErRvlcInfo erRvlcInfo;
332
      SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */
333
      SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */
334
      SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */
335
    } aac;
336
  }
337
  overlay;
338
339
} CAacDecoderCommonData;
340
341
typedef struct {
342
  CWorkBufferCore1 *pWorkBufferCore1;
343
  CCplxPredictionData *cplxPredictionData;
344
} CAacDecoderCommonStaticData;
345
346
/*
347
 * This struct must be allocated one for every channel of every element and must
348
 * be persistent. Among its members, the following memory areas can be
349
 * overwritten under the given conditions:
350
 *  - pSpectralCoefficient The memory pointed to can be overwritten after time
351
 * signal rendering.
352
 *  - data can be overwritten after time signal rendering.
353
 *  - pDynData memory pointed to can be overwritten after each
354
 * CChannelElement_Decode() call.
355
 *  - pComData->overlay memory pointed to can be overwritten after each
356
 * CChannelElement_Decode() call..
357
 */
358
typedef struct {
359
  shouldBeUnion {
360
    struct {
361
      FIXP_DBL fac_data0[LFAC];
362
      SCHAR fac_data_e[4];
363
      FIXP_DBL
364
      *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */
365
366
      UCHAR core_mode; /* current core mode */
367
      USAC_COREMODE
368
      core_mode_last;      /* previous core mode, signalled in the bitstream
369
                              (not done by the decoder, see
370
                              CAacDecoderStaticChannelInfo::last_core_mode !!)*/
371
      UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream
372
                              (not done by the decoder, see
373
                              CAacDecoderStaticChannelInfo::last_core_mode !!)*/
374
      UCHAR mod[4];
375
      UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current
376
                                 superframe */
377
378
      FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction
379
                                                   coefficients in LSP domain */
380
      FIXP_LPC
381
      lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in
382
                                         LP domain */
383
      INT lp_coeff_exp[5];
384
      FIXP_LPC lsf_adaptive_mean_cand
385
          [M_LP_FILTER_ORDER]; /* concealment: is copied to
386
                  CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is
387
                  assumed to be correct*/
388
      FIXP_SGL aStability[4];  /* LPC coeff stability values required for ACELP
389
                                  and TCX (concealment) */
390
391
      CAcelpChannelData acelp[4];
392
393
      FIXP_DBL tcx_gain[4];
394
      SCHAR tcx_gain_e[4];
395
    } usac;
396
397
    struct {
398
      CPnsData PnsData; /* Not required for USAC */
399
    } aac;
400
  }
401
  data;
402
403
  SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */
404
  SHORT specScale[8]; /* Scale shift values of each spectrum window */
405
  CIcsInfo icsInfo;
406
  INT granuleLength; /* Size of smallest spectrum piece */
407
  UCHAR ElementInstanceTag;
408
409
  AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */
410
411
  CAacDecoderDynamicData *
412
      pDynData; /* Data required for one element and discarded after decoding */
413
  CAacDecoderCommonData
414
      *pComData; /* Data required for one channel at a time during decode */
415
  CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for
416
                                                  one channel at a time during
417
                                                  decode */
418
419
  int currAliasingSymmetry; /* required for RSVD60 MCT */
420
421
} CAacDecoderChannelInfo;
422
423
/* channelinfo.cpp */
424
425
AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame,
426
                                      UINT samplingRateIndex,
427
                                      UINT samplingRate);
428
429
/**
430
 * \brief Read max SFB from bit stream and assign TotalSfBands according
431
 *        to the window sequence and sample rate.
432
 * \param hBs bit stream handle as data source
433
 * \param pIcsInfo IcsInfo structure to read the window sequence and store
434
 * MaxSfBands and TotalSfBands
435
 * \param pSamplingRateInfo read only
436
 */
437
AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo,
438
                                const SamplingRateInfo *pSamplingRateInfo);
439
440
AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo,
441
                          const SamplingRateInfo *SamplingRateInfoTable,
442
                          const UINT flags);
443
444
/* stereo.cpp, only called from this file */
445
446
/*!
447
  \brief Applies MS stereo.
448
449
  The function applies MS stereo.
450
451
  \param pAacDecoderChannelInfo aac channel info.
452
  \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
453
  \param pWindowGroupLength pointer to window group length array.
454
  \param windowGroups number of window groups.
455
  \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in
456
  left channel. \param scaleFactorBandsTransmittedR number of transmitted
457
  scalefactor bands in right channel. May differ from
458
  scaleFactorBandsTransmittedL only for USAC. \return  none
459
*/
460
void CJointStereo_ApplyMS(
461
    CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
462
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
463
    FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale,
464
    SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR,
465
    const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength,
466
    const int windowGroups, const int max_sfb_ste_outside,
467
    const int scaleFactorBandsTransmittedL,
468
    const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev,
469
    SHORT *store_dmx_re_prev_e, const int mainband_flag);
470
471
/*!
472
  \brief Applies intensity stereo
473
474
  The function applies intensity stereo.
475
476
  \param pAacDecoderChannelInfo aac channel info.
477
  \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
478
  \param pWindowGroupLength pointer to window group length array.
479
  \param windowGroups number of window groups.
480
  \param scaleFactorBandsTransmitted number of transmitted scalefactor bands.
481
  \return  none
482
*/
483
void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
484
                          const short *pScaleFactorBandOffsets,
485
                          const UCHAR *pWindowGroupLength,
486
                          const int windowGroups,
487
                          const int scaleFactorBandsTransmitted);
488
489
/* aacdec_pns.cpp */
490
int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band);
491
492
void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band,
493
                         const int outofphase);
494
495
/****************** inline functions ******************/
496
497
0
inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; }
498
499
0
inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) {
500
0
  return (pIcsInfo->WindowSequence != BLOCK_SHORT);
501
0
}
502
503
0
inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) {
504
0
  return pIcsInfo->WindowShape;
505
0
}
506
507
0
inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) {
508
0
  return pIcsInfo->WindowSequence;
509
0
}
510
511
inline const SHORT *GetScaleFactorBandOffsets(
512
0
    const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
513
0
  if (IsLongBlock(pIcsInfo)) {
514
0
    return samplingRateInfo->ScaleFactorBands_Long;
515
0
  } else {
516
0
    return samplingRateInfo->ScaleFactorBands_Short;
517
0
  }
518
0
}
519
520
inline UCHAR GetNumberOfScaleFactorBands(
521
0
    const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
522
0
  if (IsLongBlock(pIcsInfo)) {
523
0
    return samplingRateInfo->NumberOfScaleFactorBands_Long;
524
0
  } else {
525
0
    return samplingRateInfo->NumberOfScaleFactorBands_Short;
526
0
  }
527
0
}
528
529
0
inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) {
530
0
  return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1;
531
0
}
532
533
0
inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) {
534
0
  return pIcsInfo->WindowGroups;
535
0
}
536
537
0
inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) {
538
0
  return pIcsInfo->WindowGroupLength[index];
539
0
}
540
541
0
inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) {
542
0
  return pIcsInfo->WindowGroupLength;
543
0
}
544
545
0
inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) {
546
0
  return pIcsInfo->MaxSfBands;
547
0
}
548
549
inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0,
550
0
                                               const CIcsInfo *pIcsInfo1) {
551
0
  return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands);
552
0
}
553
554
0
inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) {
555
0
  return pIcsInfo->TotalSfBands;
556
0
}
557
558
/* Note: This function applies to AAC-LC only ! */
559
inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo,
560
0
                                const int samplingRateIndex) {
561
0
  return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)];
562
0
}
563
564
#endif /* #ifndef CHANNELINFO_H */