Coverage Report

Created: 2024-09-06 07:53

/src/fdk-aac/libMpegTPDec/include/tp_data.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 - 2020 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
/******************* MPEG transport format decoder library *********************
96
97
   Author(s):   Manuel Jander
98
99
   Description: MPEG Transport data tables
100
101
*******************************************************************************/
102
103
#ifndef TP_DATA_H
104
#define TP_DATA_H
105
106
#include "machine_type.h"
107
#include "FDK_audio.h"
108
#include "FDK_bitstream.h"
109
110
/*
111
 * Configuration
112
 */
113
114
#define TP_USAC_MAX_SPEAKERS (24)
115
116
#define TP_USAC_MAX_EXT_ELEMENTS ((24))
117
118
#define TP_USAC_MAX_ELEMENTS ((24) + TP_USAC_MAX_EXT_ELEMENTS)
119
120
#define TP_USAC_MAX_CONFIG_LEN                                         \
121
  512 /* next power of two of maximum of escapedValue(hBs, 4, 4, 8) in \
122
         AudioPreRoll() (285) */
123
124
#define TPDEC_USAC_NUM_CONFIG_CHANGE_FRAMES \
125
  (1) /* Number of frames for config change in USAC */
126
127
enum {
128
  TPDEC_FLUSH_OFF = 0,
129
  TPDEC_RSV60_CFG_CHANGE_ATSC_FLUSH_ON = 1,
130
  TPDEC_RSV60_DASH_IPF_ATSC_FLUSH_ON = 2,
131
  TPDEC_USAC_DASH_IPF_FLUSH_ON = 3
132
};
133
134
enum {
135
  TPDEC_BUILD_UP_OFF = 0,
136
  TPDEC_RSV60_BUILD_UP_ON = 1,
137
  TPDEC_RSV60_BUILD_UP_ON_IN_BAND = 2,
138
  TPDEC_USAC_BUILD_UP_ON = 3,
139
  TPDEC_RSV60_BUILD_UP_IDLE = 4,
140
  TPDEC_RSV60_BUILD_UP_IDLE_IN_BAND = 5
141
};
142
143
/**
144
 * ProgramConfig struct.
145
 */
146
/* ISO/IEC 14496-3 4.4.1.1 Table 4.2 Program config element */
147
#define PC_FSB_CHANNELS_MAX 16 /* Front/Side/Back channels */
148
#define PC_LFE_CHANNELS_MAX 4
149
#define PC_ASSOCDATA_MAX 8
150
#define PC_CCEL_MAX 16 /* CC elements */
151
#define PC_COMMENTLENGTH 256
152
#define PC_NUM_HEIGHT_LAYER 3
153
154
typedef struct {
155
  /* PCE bitstream elements: */
156
  UCHAR ElementInstanceTag;
157
  UCHAR Profile;
158
  UCHAR SamplingFrequencyIndex;
159
  UCHAR NumFrontChannelElements;
160
  UCHAR NumSideChannelElements;
161
  UCHAR NumBackChannelElements;
162
  UCHAR NumLfeChannelElements;
163
  UCHAR NumAssocDataElements;
164
  UCHAR NumValidCcElements;
165
166
  UCHAR MonoMixdownPresent;
167
  UCHAR MonoMixdownElementNumber;
168
169
  UCHAR StereoMixdownPresent;
170
  UCHAR StereoMixdownElementNumber;
171
172
  UCHAR MatrixMixdownIndexPresent;
173
  UCHAR MatrixMixdownIndex;
174
  UCHAR PseudoSurroundEnable;
175
176
  UCHAR FrontElementIsCpe[PC_FSB_CHANNELS_MAX];
177
  UCHAR FrontElementTagSelect[PC_FSB_CHANNELS_MAX];
178
  UCHAR FrontElementHeightInfo[PC_FSB_CHANNELS_MAX];
179
180
  UCHAR SideElementIsCpe[PC_FSB_CHANNELS_MAX];
181
  UCHAR SideElementTagSelect[PC_FSB_CHANNELS_MAX];
182
  UCHAR SideElementHeightInfo[PC_FSB_CHANNELS_MAX];
183
184
  UCHAR BackElementIsCpe[PC_FSB_CHANNELS_MAX];
185
  UCHAR BackElementTagSelect[PC_FSB_CHANNELS_MAX];
186
  UCHAR BackElementHeightInfo[PC_FSB_CHANNELS_MAX];
187
188
  UCHAR LfeElementTagSelect[PC_LFE_CHANNELS_MAX];
189
190
  UCHAR AssocDataElementTagSelect[PC_ASSOCDATA_MAX];
191
192
  UCHAR CcElementIsIndSw[PC_CCEL_MAX];
193
  UCHAR ValidCcElementTagSelect[PC_CCEL_MAX];
194
195
  UCHAR CommentFieldBytes;
196
  UCHAR Comment[PC_COMMENTLENGTH];
197
198
  /* Helper variables for administration: */
199
  UCHAR isValid; /*!< Flag showing if PCE has been read successfully. */
200
  UCHAR
201
  NumChannels; /*!< Amount of audio channels summing all channel elements
202
                  including LFEs */
203
  UCHAR NumEffectiveChannels; /*!< Amount of audio channels summing only SCEs
204
                                 and CPEs */
205
  UCHAR elCounter;
206
207
} CProgramConfig;
208
209
typedef enum {
210
  ASCEXT_UNKOWN = -1,
211
  ASCEXT_SBR = 0x2b7,
212
  ASCEXT_PS = 0x548,
213
  ASCEXT_MPS = 0x76a,
214
  ASCEXT_SAOC = 0x7cb,
215
  ASCEXT_LDMPS = 0x7cc
216
217
} TP_ASC_EXTENSION_ID;
218
219
/**
220
 * GaSpecificConfig struct
221
 */
222
typedef struct {
223
  UINT m_frameLengthFlag;
224
  UINT m_dependsOnCoreCoder;
225
  UINT m_coreCoderDelay;
226
227
  UINT m_extensionFlag;
228
  UINT m_extensionFlag3;
229
230
  UINT m_layer;
231
  UINT m_numOfSubFrame;
232
  UINT m_layerLength;
233
234
} CSGaSpecificConfig;
235
236
typedef enum {
237
  ELDEXT_TERM = 0x0,         /* Termination tag */
238
  ELDEXT_SAOC = 0x1,         /* SAOC config */
239
  ELDEXT_LDSAC = 0x2,        /* LD MPEG Surround config */
240
  ELDEXT_DOWNSCALEINFO = 0x3 /* ELD sample rate adaptation */
241
  /* reserved */
242
} ASC_ELD_EXT_TYPE;
243
244
typedef struct {
245
  UCHAR m_frameLengthFlag;
246
247
  UCHAR m_sbrPresentFlag;
248
  UCHAR
249
  m_useLdQmfTimeAlign; /* Use LD-MPS QMF in SBR to achive time alignment */
250
  UCHAR m_sbrSamplingRate;
251
  UCHAR m_sbrCrcFlag;
252
  UINT m_downscaledSamplingFrequency;
253
254
} CSEldSpecificConfig;
255
256
typedef struct {
257
  USAC_EXT_ELEMENT_TYPE usacExtElementType;
258
  USHORT usacExtElementConfigLength;
259
  USHORT usacExtElementDefaultLength;
260
  UCHAR usacExtElementPayloadFrag;
261
  UCHAR usacExtElementHasAudioPreRoll;
262
} CSUsacExtElementConfig;
263
264
typedef struct {
265
  MP4_ELEMENT_ID usacElementType;
266
  UCHAR m_noiseFilling;
267
  UCHAR m_harmonicSBR;
268
  UCHAR m_interTes;
269
  UCHAR m_pvc;
270
  UCHAR m_stereoConfigIndex;
271
  CSUsacExtElementConfig extElement;
272
} CSUsacElementConfig;
273
274
typedef struct {
275
  UCHAR m_frameLengthFlag;
276
  UCHAR m_coreSbrFrameLengthIndex;
277
  UCHAR m_sbrRatioIndex;
278
  UCHAR m_nUsacChannels; /* number of audio channels signaled in
279
                            UsacDecoderConfig() / rsv603daDecoderConfig() via
280
                            numElements and usacElementType */
281
  UCHAR m_channelConfigurationIndex;
282
  UINT m_usacNumElements;
283
  CSUsacElementConfig element[TP_USAC_MAX_ELEMENTS];
284
285
  UCHAR numAudioChannels;
286
  UCHAR m_usacConfigExtensionPresent;
287
  UCHAR elementLengthPresent;
288
  UCHAR UsacConfig[TP_USAC_MAX_CONFIG_LEN];
289
  USHORT UsacConfigBits;
290
} CSUsacConfig;
291
292
/**
293
 * Audio configuration struct, suitable for encoder and decoder configuration.
294
 */
295
typedef struct {
296
  /* XYZ Specific Data */
297
  union {
298
    CSGaSpecificConfig
299
        m_gaSpecificConfig; /**< General audio specific configuration. */
300
    CSEldSpecificConfig m_eldSpecificConfig; /**< ELD specific configuration. */
301
    CSUsacConfig m_usacConfig; /**< USAC specific configuration               */
302
  } m_sc;
303
304
  /* Common ASC parameters */
305
  CProgramConfig m_progrConfigElement; /**< Program configuration. */
306
307
  AUDIO_OBJECT_TYPE m_aot;  /**< Audio Object Type.  */
308
  UINT m_samplingFrequency; /**< Samplerate. */
309
  UINT m_samplesPerFrame;   /**< Amount of samples per frame.   */
310
  UINT m_directMapping; /**< Document this please !!                         */
311
312
  AUDIO_OBJECT_TYPE m_extensionAudioObjectType; /**< Audio object type */
313
  UINT m_extensionSamplingFrequency;            /**< Samplerate            */
314
315
  SCHAR m_channelConfiguration; /**< Channel configuration index */
316
317
  SCHAR m_epConfig;  /**< Error protection index                           */
318
  SCHAR m_vcb11Flag; /**< aacSectionDataResilienceFlag                     */
319
  SCHAR m_rvlcFlag;  /**< aacScalefactorDataResilienceFlag                 */
320
  SCHAR m_hcrFlag;   /**< aacSpectralDataResilienceFlag                    */
321
322
  SCHAR m_sbrPresentFlag; /**< Flag indicating the presence of SBR data in the
323
                             bitstream               */
324
  SCHAR
325
  m_psPresentFlag; /**< Flag indicating the presence of parametric stereo
326
                      data in the bitstream */
327
  UCHAR m_samplingFrequencyIndex;          /**< Samplerate index          */
328
  UCHAR m_extensionSamplingFrequencyIndex; /**< Samplerate index */
329
  SCHAR m_extensionChannelConfiguration;   /**< Channel configuration index   */
330
331
  UCHAR
332
  configMode; /**< The flag indicates if the callback shall work in memory
333
                 allocation mode or in config change detection mode */
334
  UCHAR AacConfigChanged; /**< The flag will be set if at least one aac config
335
                             parameter has changed that requires a memory
336
                             reconfiguration, otherwise it will be cleared */
337
  UCHAR SbrConfigChanged; /**< The flag will be set if at least one sbr config
338
                             parameter has changed that requires a memory
339
                             reconfiguration, otherwise it will be cleared */
340
  UCHAR SacConfigChanged; /**< The flag will be set if at least one sac config
341
                             parameter has changed that requires a memory
342
                             reconfiguration, otherwise it will be cleared */
343
344
  UCHAR
345
  config[TP_USAC_MAX_CONFIG_LEN]; /**< Configuration stored as bitstream */
346
  UINT configBits;                /**< Configuration length in bits */
347
348
} CSAudioSpecificConfig;
349
350
typedef struct {
351
  SCHAR flushCnt;      /**< Flush frame counter */
352
  UCHAR flushStatus;   /**< Flag indicates flush mode: on|off */
353
  SCHAR buildUpCnt;    /**< Build up frame counter */
354
  UCHAR buildUpStatus; /**< Flag indicates build up mode: on|off */
355
  UCHAR cfgChanged; /**< Flag indicates that the config changed and the decoder
356
                       needs to be initialized again via callback. Make sure
357
                       that memory is freed before initialization. */
358
  UCHAR contentChanged; /**< Flag indicates that the content changed i.e. a
359
                           right truncation occured before */
360
  UCHAR forceCfgChange; /**< Flag indicates if config change has to be forced
361
                           even if new config is the same */
362
} CCtrlCFGChange;
363
364
typedef INT (*cbUpdateConfig_t)(void *, const CSAudioSpecificConfig *,
365
                                const UCHAR configMode, UCHAR *configChanged);
366
typedef INT (*cbFreeMem_t)(void *, const CSAudioSpecificConfig *);
367
typedef INT (*cbCtrlCFGChange_t)(void *, const CCtrlCFGChange *);
368
typedef INT (*cbSsc_t)(void *, HANDLE_FDK_BITSTREAM,
369
                       const AUDIO_OBJECT_TYPE coreCodec,
370
                       const INT samplingRate, const INT frameSize,
371
                       const INT numChannels, const INT stereoConfigIndex,
372
                       const INT coreSbrFrameLengthIndex, const INT configBytes,
373
                       const UCHAR configMode, UCHAR *configChanged);
374
375
typedef INT (*cbSbr_t)(void *self, HANDLE_FDK_BITSTREAM hBs,
376
                       const INT sampleRateIn, const INT sampleRateOut,
377
                       const INT samplesPerFrame,
378
                       const AUDIO_OBJECT_TYPE coreCodec,
379
                       const MP4_ELEMENT_ID elementID, const INT elementIndex,
380
                       const UCHAR harmonicSbr, const UCHAR stereoConfigIndex,
381
                       const UCHAR configMode, UCHAR *configChanged,
382
                       const INT downscaleFactor);
383
384
typedef INT (*cbUsac_t)(void *self, HANDLE_FDK_BITSTREAM hBs);
385
386
typedef INT (*cbUniDrc_t)(void *self, HANDLE_FDK_BITSTREAM hBs,
387
                          const INT fullPayloadLength, const INT payloadType,
388
                          const INT subStreamIndex, const INT payloadStart,
389
                          const AUDIO_OBJECT_TYPE);
390
391
typedef struct {
392
  cbUpdateConfig_t cbUpdateConfig; /*!< Function pointer for Config change
393
                                      notify callback.  */
394
  void *cbUpdateConfigData; /*!< User data pointer for Config change notify
395
                               callback. */
396
  cbFreeMem_t cbFreeMem;    /*!< Function pointer for free memory callback.  */
397
  void *cbFreeMemData;      /*!< User data pointer for free memory callback. */
398
  cbCtrlCFGChange_t cbCtrlCFGChange; /*!< Function pointer for config change
399
                                        control callback. */
400
  void *cbCtrlCFGChangeData; /*!< User data pointer for config change control
401
                                callback. */
402
  cbSsc_t cbSsc;             /*!< Function pointer for SSC parser callback. */
403
  void *cbSscData;           /*!< User data pointer for SSC parser callback. */
404
  cbSbr_t cbSbr;   /*!< Function pointer for SBR header parser callback. */
405
  void *cbSbrData; /*!< User data pointer for SBR header parser callback. */
406
  cbUsac_t cbUsac;
407
  void *cbUsacData;
408
  cbUniDrc_t cbUniDrc; /*!< Function pointer for uniDrcConfig and
409
                          loudnessInfoSet parser callback. */
410
  void *cbUniDrcData;  /*!< User data pointer for uniDrcConfig and
411
                          loudnessInfoSet parser callback. */
412
} CSTpCallBacks;
413
414
static const UINT SamplingRateTable[] = {
415
    96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,
416
    8000,  7350,  0,     0,     57600, 51200, 40000, 38400, 34150, 28800, 25600,
417
    20000, 19200, 17075, 14400, 12800, 9600,  0,     0,     0,     0};
418
419
0
static inline int getSamplingRateIndex(UINT samplingRate, UINT nBits) {
420
0
  UINT sf_index;
421
0
  UINT tableSize = (1 << nBits) - 1;
422
423
0
  for (sf_index = 0; sf_index < tableSize; sf_index++) {
424
0
    if (SamplingRateTable[sf_index] == samplingRate) break;
425
0
  }
426
427
0
  if (sf_index > tableSize) {
428
0
    return tableSize - 1;
429
0
  }
430
431
0
  return sf_index;
432
0
}
Unexecuted instantiation: tpenc_adif.cpp:getSamplingRateIndex(unsigned int, unsigned int)
Unexecuted instantiation: tpenc_adts.cpp:getSamplingRateIndex(unsigned int, unsigned int)
Unexecuted instantiation: tpenc_asc.cpp:getSamplingRateIndex(unsigned int, unsigned int)
433
434
/*
435
 * Get Channel count from channel configuration
436
 */
437
0
static inline int getNumberOfTotalChannels(int channelConfig) {
438
0
  switch (channelConfig) {
439
0
    case 1:
440
0
    case 2:
441
0
    case 3:
442
0
    case 4:
443
0
    case 5:
444
0
    case 6:
445
0
      return channelConfig;
446
0
    case 7:
447
0
    case 12:
448
0
    case 14:
449
0
      return 8;
450
0
    case 11:
451
0
      return 7;
452
0
    case 13:
453
0
      return 24;
454
0
    default:
455
0
      return 0;
456
0
  }
457
0
}
Unexecuted instantiation: tpenc_adif.cpp:getNumberOfTotalChannels(int)
Unexecuted instantiation: tpenc_adts.cpp:getNumberOfTotalChannels(int)
Unexecuted instantiation: tpenc_asc.cpp:getNumberOfTotalChannels(int)
458
459
static inline int getNumberOfEffectiveChannels(
460
    const int
461
0
        channelConfig) { /* index: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 */
462
0
  const int n[] = {0, 1, 2, 3, 4, 5, 5, 7, 0, 0, 0, 6, 7, 22, 7, 0};
463
0
  return n[channelConfig];
464
0
}
Unexecuted instantiation: tpenc_adif.cpp:getNumberOfEffectiveChannels(int)
Unexecuted instantiation: tpenc_adts.cpp:getNumberOfEffectiveChannels(int)
Unexecuted instantiation: tpenc_asc.cpp:getNumberOfEffectiveChannels(int)
465
466
#endif /* TP_DATA_H */