xref: /aosp_15_r20/external/aac/libAACdec/src/aacdecoder.h (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker 
4*e5436536SAndroid Build Coastguard Worker © Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker 
7*e5436536SAndroid Build Coastguard Worker  1.    INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker 
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker 
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker 
34*e5436536SAndroid Build Coastguard Worker 2.    COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker 
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker 
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker 
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker 
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker 
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker 
61*e5436536SAndroid Build Coastguard Worker 3.    NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker 
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker 
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker 
71*e5436536SAndroid Build Coastguard Worker 4.    DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker 
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker 
84*e5436536SAndroid Build Coastguard Worker 5.    CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker 
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker 
95*e5436536SAndroid Build Coastguard Worker /**************************** AAC decoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Josef Hoepfl
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description:
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #ifndef AACDECODER_H
104*e5436536SAndroid Build Coastguard Worker #define AACDECODER_H
105*e5436536SAndroid Build Coastguard Worker 
106*e5436536SAndroid Build Coastguard Worker #include "common_fix.h"
107*e5436536SAndroid Build Coastguard Worker 
108*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h"
109*e5436536SAndroid Build Coastguard Worker 
110*e5436536SAndroid Build Coastguard Worker #include "channel.h"
111*e5436536SAndroid Build Coastguard Worker 
112*e5436536SAndroid Build Coastguard Worker #include "tpdec_lib.h"
113*e5436536SAndroid Build Coastguard Worker #include "FDK_audio.h"
114*e5436536SAndroid Build Coastguard Worker 
115*e5436536SAndroid Build Coastguard Worker #include "block.h"
116*e5436536SAndroid Build Coastguard Worker 
117*e5436536SAndroid Build Coastguard Worker #include "genericStds.h"
118*e5436536SAndroid Build Coastguard Worker 
119*e5436536SAndroid Build Coastguard Worker #include "FDK_qmf_domain.h"
120*e5436536SAndroid Build Coastguard Worker 
121*e5436536SAndroid Build Coastguard Worker #include "sbrdecoder.h"
122*e5436536SAndroid Build Coastguard Worker 
123*e5436536SAndroid Build Coastguard Worker #include "aacdec_drc.h"
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker #include "pcmdmx_lib.h"
126*e5436536SAndroid Build Coastguard Worker 
127*e5436536SAndroid Build Coastguard Worker #include "FDK_drcDecLib.h"
128*e5436536SAndroid Build Coastguard Worker 
129*e5436536SAndroid Build Coastguard Worker #include "limiter.h"
130*e5436536SAndroid Build Coastguard Worker 
131*e5436536SAndroid Build Coastguard Worker #include "FDK_delay.h"
132*e5436536SAndroid Build Coastguard Worker 
133*e5436536SAndroid Build Coastguard Worker #define TIME_DATA_FLUSH_SIZE (128)
134*e5436536SAndroid Build Coastguard Worker #define TIME_DATA_FLUSH_SIZE_SF (7)
135*e5436536SAndroid Build Coastguard Worker 
136*e5436536SAndroid Build Coastguard Worker #define AACDEC_MAX_NUM_PREROLL_AU_USAC (3)
137*e5436536SAndroid Build Coastguard Worker #if (AACDEC_MAX_NUM_PREROLL_AU < 3)
138*e5436536SAndroid Build Coastguard Worker #undef AACDEC_MAX_NUM_PREROLL_AU
139*e5436536SAndroid Build Coastguard Worker #define AACDEC_MAX_NUM_PREROLL_AU AACDEC_MAX_NUM_PREROLL_AU_USAC
140*e5436536SAndroid Build Coastguard Worker #endif
141*e5436536SAndroid Build Coastguard Worker 
142*e5436536SAndroid Build Coastguard Worker typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER;
143*e5436536SAndroid Build Coastguard Worker 
144*e5436536SAndroid Build Coastguard Worker enum { L = 0, R = 1 };
145*e5436536SAndroid Build Coastguard Worker 
146*e5436536SAndroid Build Coastguard Worker typedef struct {
147*e5436536SAndroid Build Coastguard Worker   unsigned char *buffer;
148*e5436536SAndroid Build Coastguard Worker   int bufferSize;
149*e5436536SAndroid Build Coastguard Worker   int offset[8];
150*e5436536SAndroid Build Coastguard Worker   int nrElements;
151*e5436536SAndroid Build Coastguard Worker } CAncData;
152*e5436536SAndroid Build Coastguard Worker 
153*e5436536SAndroid Build Coastguard Worker typedef enum { NOT_DEFINED = -1, MODE_HQ = 0, MODE_LP = 1 } QMF_MODE;
154*e5436536SAndroid Build Coastguard Worker 
155*e5436536SAndroid Build Coastguard Worker typedef struct {
156*e5436536SAndroid Build Coastguard Worker   int bsDelay;
157*e5436536SAndroid Build Coastguard Worker } SBR_PARAMS;
158*e5436536SAndroid Build Coastguard Worker 
159*e5436536SAndroid Build Coastguard Worker enum {
160*e5436536SAndroid Build Coastguard Worker   AACDEC_FLUSH_OFF = 0,
161*e5436536SAndroid Build Coastguard Worker   AACDEC_RSV60_CFG_CHANGE_ATSC_FLUSH_ON = 1,
162*e5436536SAndroid Build Coastguard Worker   AACDEC_RSV60_DASH_IPF_ATSC_FLUSH_ON = 2,
163*e5436536SAndroid Build Coastguard Worker   AACDEC_USAC_DASH_IPF_FLUSH_ON = 3
164*e5436536SAndroid Build Coastguard Worker };
165*e5436536SAndroid Build Coastguard Worker 
166*e5436536SAndroid Build Coastguard Worker enum {
167*e5436536SAndroid Build Coastguard Worker   AACDEC_BUILD_UP_OFF = 0,
168*e5436536SAndroid Build Coastguard Worker   AACDEC_RSV60_BUILD_UP_ON = 1,
169*e5436536SAndroid Build Coastguard Worker   AACDEC_RSV60_BUILD_UP_ON_IN_BAND = 2,
170*e5436536SAndroid Build Coastguard Worker   AACDEC_USAC_BUILD_UP_ON = 3,
171*e5436536SAndroid Build Coastguard Worker   AACDEC_RSV60_BUILD_UP_IDLE = 4,
172*e5436536SAndroid Build Coastguard Worker   AACDEC_RSV60_BUILD_UP_IDLE_IN_BAND = 5
173*e5436536SAndroid Build Coastguard Worker };
174*e5436536SAndroid Build Coastguard Worker 
175*e5436536SAndroid Build Coastguard Worker #define AACDEC_CROSSFADE_BITMASK_OFF                                    \
176*e5436536SAndroid Build Coastguard Worker   ((UCHAR)0) /*!< No cross-fade between frames shall be applied at next \
177*e5436536SAndroid Build Coastguard Worker                 config change. */
178*e5436536SAndroid Build Coastguard Worker #define AACDEC_CROSSFADE_BITMASK_PREROLL \
179*e5436536SAndroid Build Coastguard Worker   ((UCHAR)1 << 1) /*!< applyCrossfade is signaled in AudioPreRoll */
180*e5436536SAndroid Build Coastguard Worker 
181*e5436536SAndroid Build Coastguard Worker typedef struct {
182*e5436536SAndroid Build Coastguard Worker   /* Usac Extension Elements */
183*e5436536SAndroid Build Coastguard Worker   USAC_EXT_ELEMENT_TYPE usacExtElementType[(3)];
184*e5436536SAndroid Build Coastguard Worker   UINT usacExtElementDefaultLength[(3)];
185*e5436536SAndroid Build Coastguard Worker   UCHAR usacExtElementPayloadFrag[(3)];
186*e5436536SAndroid Build Coastguard Worker } CUsacCoreExtensions;
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker /* AAC decoder (opaque toward userland) struct declaration */
189*e5436536SAndroid Build Coastguard Worker struct AAC_DECODER_INSTANCE {
190*e5436536SAndroid Build Coastguard Worker   INT aacChannels; /*!< Amount of AAC decoder channels allocated.        */
191*e5436536SAndroid Build Coastguard Worker   INT ascChannels[(1 *
192*e5436536SAndroid Build Coastguard Worker                    1)]; /*!< Amount of AAC decoder channels signalled in ASC. */
193*e5436536SAndroid Build Coastguard Worker   INT blockNumber;      /*!< frame counter                                    */
194*e5436536SAndroid Build Coastguard Worker 
195*e5436536SAndroid Build Coastguard Worker   INT nrOfLayers;
196*e5436536SAndroid Build Coastguard Worker 
197*e5436536SAndroid Build Coastguard Worker   INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved).
198*e5436536SAndroid Build Coastguard Worker                           */
199*e5436536SAndroid Build Coastguard Worker 
200*e5436536SAndroid Build Coastguard Worker   INT aacOutDataHeadroom; /*!< Headroom of the output time signal to prevent
201*e5436536SAndroid Build Coastguard Worker                              clipping */
202*e5436536SAndroid Build Coastguard Worker 
203*e5436536SAndroid Build Coastguard Worker   HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */
204*e5436536SAndroid Build Coastguard Worker 
205*e5436536SAndroid Build Coastguard Worker   SamplingRateInfo
206*e5436536SAndroid Build Coastguard Worker       samplingRateInfo[(1 * 1)]; /*!< Sampling Rate information table */
207*e5436536SAndroid Build Coastguard Worker 
208*e5436536SAndroid Build Coastguard Worker   UCHAR
209*e5436536SAndroid Build Coastguard Worker   frameOK; /*!< Will be unset if a consistency check, e.g. CRC etc. fails */
210*e5436536SAndroid Build Coastguard Worker 
211*e5436536SAndroid Build Coastguard Worker   UINT flags[(1 * 1)]; /*!< Flags for internal decoder use. DO NOT USE
212*e5436536SAndroid Build Coastguard Worker                           self::streaminfo::flags ! */
213*e5436536SAndroid Build Coastguard Worker   UINT elFlags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
214*e5436536SAndroid Build Coastguard Worker                 1)]; /*!< Flags for internal decoder use (element specific). DO
215*e5436536SAndroid Build Coastguard Worker                         NOT USE self::streaminfo::flags ! */
216*e5436536SAndroid Build Coastguard Worker 
217*e5436536SAndroid Build Coastguard Worker   MP4_ELEMENT_ID elements[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
218*e5436536SAndroid Build Coastguard Worker                            1)]; /*!< Table where the element Id's are listed */
219*e5436536SAndroid Build Coastguard Worker   UCHAR elTags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
220*e5436536SAndroid Build Coastguard Worker                 1)]; /*!< Table where the elements id Tags are listed      */
221*e5436536SAndroid Build Coastguard Worker   UCHAR chMapping[((8) * 2)]; /*!< Table of MPEG canonical order to bitstream
222*e5436536SAndroid Build Coastguard Worker                                  channel order mapping. */
223*e5436536SAndroid Build Coastguard Worker 
224*e5436536SAndroid Build Coastguard Worker   AUDIO_CHANNEL_TYPE channelType[(8)]; /*!< Audio channel type of each output
225*e5436536SAndroid Build Coastguard Worker                                           audio channel (from 0 upto
226*e5436536SAndroid Build Coastguard Worker                                           numChannels).           */
227*e5436536SAndroid Build Coastguard Worker   UCHAR channelIndices[(8)]; /*!< Audio channel index for each output audio
228*e5436536SAndroid Build Coastguard Worker                                 channel (from 0 upto numChannels).         */
229*e5436536SAndroid Build Coastguard Worker   /* See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a
230*e5436536SAndroid Build Coastguard Worker    * program_config_element() */
231*e5436536SAndroid Build Coastguard Worker 
232*e5436536SAndroid Build Coastguard Worker   FDK_channelMapDescr mapDescr; /*!< Describes the output channel mapping. */
233*e5436536SAndroid Build Coastguard Worker   UCHAR chMapIndex; /*!< Index to access one line of the channelOutputMapping
234*e5436536SAndroid Build Coastguard Worker                        table. This is required because not all 8 channel
235*e5436536SAndroid Build Coastguard Worker                        configurations have the same output mapping. */
236*e5436536SAndroid Build Coastguard Worker   INT sbrDataLen;   /*!< Expected length of the SBR remaining in bitbuffer after
237*e5436536SAndroid Build Coastguard Worker                          the AAC payload has been pared.   */
238*e5436536SAndroid Build Coastguard Worker 
239*e5436536SAndroid Build Coastguard Worker   CProgramConfig pce;
240*e5436536SAndroid Build Coastguard Worker   CStreamInfo
241*e5436536SAndroid Build Coastguard Worker       streamInfo; /*!< Pointer to StreamInfo data (read from the bitstream) */
242*e5436536SAndroid Build Coastguard Worker   CAacDecoderChannelInfo
243*e5436536SAndroid Build Coastguard Worker       *pAacDecoderChannelInfo[(8)]; /*!< Temporal channel memory */
244*e5436536SAndroid Build Coastguard Worker   CAacDecoderStaticChannelInfo
245*e5436536SAndroid Build Coastguard Worker       *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */
246*e5436536SAndroid Build Coastguard Worker 
247*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *workBufferCore1;
248*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *workBufferCore2;
249*e5436536SAndroid Build Coastguard Worker   PCM_DEC *pTimeData2;
250*e5436536SAndroid Build Coastguard Worker   INT timeData2Size;
251*e5436536SAndroid Build Coastguard Worker 
252*e5436536SAndroid Build Coastguard Worker   CpePersistentData *cpeStaticData[(
253*e5436536SAndroid Build Coastguard Worker       3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
254*e5436536SAndroid Build Coastguard Worker       1)]; /*!< Pointer to persistent data shared by both channels of a CPE.
255*e5436536SAndroid Build Coastguard Worker This structure is allocated once for each CPE. */
256*e5436536SAndroid Build Coastguard Worker 
257*e5436536SAndroid Build Coastguard Worker   CConcealParams concealCommonData;
258*e5436536SAndroid Build Coastguard Worker   CConcealmentMethod concealMethodUser;
259*e5436536SAndroid Build Coastguard Worker 
260*e5436536SAndroid Build Coastguard Worker   CUsacCoreExtensions usacCoreExt; /*!< Data and handles to extend USAC FD/LPD
261*e5436536SAndroid Build Coastguard Worker                                       core decoder (SBR, MPS, ...) */
262*e5436536SAndroid Build Coastguard Worker   UINT numUsacElements[(1 * 1)];
263*e5436536SAndroid Build Coastguard Worker   UCHAR usacStereoConfigIndex[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1)];
264*e5436536SAndroid Build Coastguard Worker   const CSUsacConfig *pUsacConfig[(1 * 1)];
265*e5436536SAndroid Build Coastguard Worker   INT nbDiv; /*!< number of frame divisions in LPD-domain */
266*e5436536SAndroid Build Coastguard Worker 
267*e5436536SAndroid Build Coastguard Worker   UCHAR useLdQmfTimeAlign;
268*e5436536SAndroid Build Coastguard Worker 
269*e5436536SAndroid Build Coastguard Worker   INT aacChannelsPrev; /*!< The amount of AAC core channels of the last
270*e5436536SAndroid Build Coastguard Worker                           successful decode call.         */
271*e5436536SAndroid Build Coastguard Worker   AUDIO_CHANNEL_TYPE channelTypePrev[(8)]; /*!< Array holding the channelType
272*e5436536SAndroid Build Coastguard Worker                                               values of the last successful
273*e5436536SAndroid Build Coastguard Worker                                               decode call.    */
274*e5436536SAndroid Build Coastguard Worker   UCHAR
275*e5436536SAndroid Build Coastguard Worker   channelIndicesPrev[(8)]; /*!< Array holding the channelIndices values of
276*e5436536SAndroid Build Coastguard Worker                               the last successful decode call. */
277*e5436536SAndroid Build Coastguard Worker 
278*e5436536SAndroid Build Coastguard Worker   UCHAR
279*e5436536SAndroid Build Coastguard Worker   downscaleFactor; /*!< Variable to store a supported ELD downscale factor
280*e5436536SAndroid Build Coastguard Worker                       of 1, 2, 3 or 4 */
281*e5436536SAndroid Build Coastguard Worker   UCHAR downscaleFactorInBS; /*!< Variable to store the (not necessarily
282*e5436536SAndroid Build Coastguard Worker                                 supported) ELD downscale factor discovered in
283*e5436536SAndroid Build Coastguard Worker                                 the bitstream */
284*e5436536SAndroid Build Coastguard Worker 
285*e5436536SAndroid Build Coastguard Worker   HANDLE_SBRDECODER hSbrDecoder; /*!< SBR decoder handle. */
286*e5436536SAndroid Build Coastguard Worker   UCHAR sbrEnabled;     /*!< flag to store if SBR has been detected     */
287*e5436536SAndroid Build Coastguard Worker   UCHAR sbrEnabledPrev; /*!< flag to store if SBR has been detected from
288*e5436536SAndroid Build Coastguard Worker                            previous frame */
289*e5436536SAndroid Build Coastguard Worker   UCHAR psPossible;     /*!< flag to store if PS is possible            */
290*e5436536SAndroid Build Coastguard Worker   SBR_PARAMS sbrParams; /*!< struct to store all sbr parameters         */
291*e5436536SAndroid Build Coastguard Worker 
292*e5436536SAndroid Build Coastguard Worker   UCHAR *pDrmBsBuffer; /*!< Pointer to dynamic buffer which is used to reverse
293*e5436536SAndroid Build Coastguard Worker                           the bits of the DRM SBR payload */
294*e5436536SAndroid Build Coastguard Worker   USHORT drmBsBufferSize; /*!< Size of the dynamic buffer which is used to
295*e5436536SAndroid Build Coastguard Worker                              reverse the bits of the DRM SBR payload */
296*e5436536SAndroid Build Coastguard Worker   FDK_QMF_DOMAIN
297*e5436536SAndroid Build Coastguard Worker   qmfDomain; /*!< Instance of module for QMF domain data handling */
298*e5436536SAndroid Build Coastguard Worker 
299*e5436536SAndroid Build Coastguard Worker   QMF_MODE qmfModeCurr; /*!< The current QMF mode                       */
300*e5436536SAndroid Build Coastguard Worker   QMF_MODE qmfModeUser; /*!< The QMF mode requested by the library user */
301*e5436536SAndroid Build Coastguard Worker 
302*e5436536SAndroid Build Coastguard Worker   HANDLE_AAC_DRC hDrcInfo; /*!< handle to DRC data structure               */
303*e5436536SAndroid Build Coastguard Worker   INT metadataExpiry;      /*!< Metadata expiry time in milli-seconds.     */
304*e5436536SAndroid Build Coastguard Worker 
305*e5436536SAndroid Build Coastguard Worker   void *pMpegSurroundDecoder; /*!< pointer to mpeg surround decoder structure */
306*e5436536SAndroid Build Coastguard Worker   UCHAR mpsEnableUser;        /*!< MPS enable user flag                       */
307*e5436536SAndroid Build Coastguard Worker   UCHAR mpsEnableCurr;        /*!< MPS enable decoder state                   */
308*e5436536SAndroid Build Coastguard Worker   UCHAR mpsApplicable;        /*!< MPS applicable                             */
309*e5436536SAndroid Build Coastguard Worker   SCHAR mpsOutputMode; /*!< setting: normal = 0, binaural = 1, stereo = 2, 5.1ch
310*e5436536SAndroid Build Coastguard Worker                           = 3 */
311*e5436536SAndroid Build Coastguard Worker   INT mpsOutChannelsLast; /*!< The amount of channels returned by the last
312*e5436536SAndroid Build Coastguard Worker                              successful MPS decoder call. */
313*e5436536SAndroid Build Coastguard Worker   INT mpsFrameSizeLast;   /*!< The frame length returned by the last successful
314*e5436536SAndroid Build Coastguard Worker                              MPS decoder call. */
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker   CAncData ancData; /*!< structure to handle ancillary data         */
317*e5436536SAndroid Build Coastguard Worker 
318*e5436536SAndroid Build Coastguard Worker   HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */
319*e5436536SAndroid Build Coastguard Worker 
320*e5436536SAndroid Build Coastguard Worker   TDLimiterPtr hLimiter;   /*!< Handle of time domain limiter.             */
321*e5436536SAndroid Build Coastguard Worker   UCHAR limiterEnableUser; /*!< The limiter configuration requested by the
322*e5436536SAndroid Build Coastguard Worker                               library user */
323*e5436536SAndroid Build Coastguard Worker   UCHAR limiterEnableCurr; /*!< The current limiter configuration.         */
324*e5436536SAndroid Build Coastguard Worker 
325*e5436536SAndroid Build Coastguard Worker   FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */
326*e5436536SAndroid Build Coastguard Worker   UINT extGainDelay;   /*!< Delay that must be accounted for extGain. */
327*e5436536SAndroid Build Coastguard Worker 
328*e5436536SAndroid Build Coastguard Worker   HANDLE_DRC_DECODER hUniDrcDecoder;
329*e5436536SAndroid Build Coastguard Worker   UCHAR multibandDrcPresent;
330*e5436536SAndroid Build Coastguard Worker   UCHAR numTimeSlots;
331*e5436536SAndroid Build Coastguard Worker   UINT loudnessInfoSetPosition[3];
332*e5436536SAndroid Build Coastguard Worker   SCHAR defaultTargetLoudness;
333*e5436536SAndroid Build Coastguard Worker 
334*e5436536SAndroid Build Coastguard Worker   PCM_DEC
335*e5436536SAndroid Build Coastguard Worker   *pTimeDataFlush[((8) * 2)]; /*!< Pointer to the flushed time data which
336*e5436536SAndroid Build Coastguard Worker                                  will be used for the crossfade in case of
337*e5436536SAndroid Build Coastguard Worker                                  an USAC DASH IPF config change */
338*e5436536SAndroid Build Coastguard Worker 
339*e5436536SAndroid Build Coastguard Worker   UCHAR flushStatus;     /*!< Indicates flush status: on|off */
340*e5436536SAndroid Build Coastguard Worker   SCHAR flushCnt;        /*!< Flush frame counter */
341*e5436536SAndroid Build Coastguard Worker   UCHAR buildUpStatus;   /*!< Indicates build up status: on|off */
342*e5436536SAndroid Build Coastguard Worker   SCHAR buildUpCnt;      /*!< Build up frame counter */
343*e5436536SAndroid Build Coastguard Worker   UCHAR hasAudioPreRoll; /*!< Indicates preRoll status: on|off */
344*e5436536SAndroid Build Coastguard Worker   UINT prerollAULength[AACDEC_MAX_NUM_PREROLL_AU + 1]; /*!< Relative offset of
345*e5436536SAndroid Build Coastguard Worker                                                           the prerollAU end
346*e5436536SAndroid Build Coastguard Worker                                                           position to the AU
347*e5436536SAndroid Build Coastguard Worker                                                           start position in the
348*e5436536SAndroid Build Coastguard Worker                                                           bitstream */
349*e5436536SAndroid Build Coastguard Worker   INT accessUnit; /*!< Number of the actual processed preroll accessUnit */
350*e5436536SAndroid Build Coastguard Worker   UCHAR applyCrossfade; /*!< If any bit is set, cross-fade for seamless stream
351*e5436536SAndroid Build Coastguard Worker                            switching is applied */
352*e5436536SAndroid Build Coastguard Worker 
353*e5436536SAndroid Build Coastguard Worker   FDK_SignalDelay usacResidualDelay; /*!< Delay residual signal to compensate
354*e5436536SAndroid Build Coastguard Worker                                         for eSBR delay of DMX signal in case of
355*e5436536SAndroid Build Coastguard Worker                                         stereoConfigIndex==2. */
356*e5436536SAndroid Build Coastguard Worker };
357*e5436536SAndroid Build Coastguard Worker 
358*e5436536SAndroid Build Coastguard Worker #define AAC_DEBUG_EXTHLP \
359*e5436536SAndroid Build Coastguard Worker   "\
360*e5436536SAndroid Build Coastguard Worker --- AAC-Core ---\n\
361*e5436536SAndroid Build Coastguard Worker     0x00010000 Header data\n\
362*e5436536SAndroid Build Coastguard Worker     0x00020000 CRC data\n\
363*e5436536SAndroid Build Coastguard Worker     0x00040000 Channel info\n\
364*e5436536SAndroid Build Coastguard Worker     0x00080000 Section data\n\
365*e5436536SAndroid Build Coastguard Worker     0x00100000 Scalefactor data\n\
366*e5436536SAndroid Build Coastguard Worker     0x00200000 Pulse data\n\
367*e5436536SAndroid Build Coastguard Worker     0x00400000 Tns data\n\
368*e5436536SAndroid Build Coastguard Worker     0x00800000 Quantized spectrum\n\
369*e5436536SAndroid Build Coastguard Worker     0x01000000 Requantized spectrum\n\
370*e5436536SAndroid Build Coastguard Worker     0x02000000 Time output\n\
371*e5436536SAndroid Build Coastguard Worker     0x04000000 Fatal errors\n\
372*e5436536SAndroid Build Coastguard Worker     0x08000000 Buffer fullness\n\
373*e5436536SAndroid Build Coastguard Worker     0x10000000 Average bitrate\n\
374*e5436536SAndroid Build Coastguard Worker     0x20000000 Synchronization\n\
375*e5436536SAndroid Build Coastguard Worker     0x40000000 Concealment\n\
376*e5436536SAndroid Build Coastguard Worker     0x7FFF0000 all AAC-Core-Info\n\
377*e5436536SAndroid Build Coastguard Worker "
378*e5436536SAndroid Build Coastguard Worker 
379*e5436536SAndroid Build Coastguard Worker /**
380*e5436536SAndroid Build Coastguard Worker  * \brief Synchronise QMF mode for all modules using QMF data.
381*e5436536SAndroid Build Coastguard Worker  * \param self decoder handle
382*e5436536SAndroid Build Coastguard Worker  */
383*e5436536SAndroid Build Coastguard Worker void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self);
384*e5436536SAndroid Build Coastguard Worker 
385*e5436536SAndroid Build Coastguard Worker /**
386*e5436536SAndroid Build Coastguard Worker  * \brief Signal a bit stream interruption to the decoder
387*e5436536SAndroid Build Coastguard Worker  * \param self decoder handle
388*e5436536SAndroid Build Coastguard Worker  */
389*e5436536SAndroid Build Coastguard Worker void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self);
390*e5436536SAndroid Build Coastguard Worker 
391*e5436536SAndroid Build Coastguard Worker /*!
392*e5436536SAndroid Build Coastguard Worker   \brief Initialize ancillary buffer
393*e5436536SAndroid Build Coastguard Worker 
394*e5436536SAndroid Build Coastguard Worker   \ancData Pointer to ancillary data structure
395*e5436536SAndroid Build Coastguard Worker   \buffer Pointer to (external) anc data buffer
396*e5436536SAndroid Build Coastguard Worker   \size Size of the buffer pointed on by buffer
397*e5436536SAndroid Build Coastguard Worker 
398*e5436536SAndroid Build Coastguard Worker   \return  Error code
399*e5436536SAndroid Build Coastguard Worker */
400*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData,
401*e5436536SAndroid Build Coastguard Worker                                           unsigned char *buffer, int size);
402*e5436536SAndroid Build Coastguard Worker 
403*e5436536SAndroid Build Coastguard Worker /*!
404*e5436536SAndroid Build Coastguard Worker   \brief Get one ancillary data element
405*e5436536SAndroid Build Coastguard Worker 
406*e5436536SAndroid Build Coastguard Worker   \ancData Pointer to ancillary data structure
407*e5436536SAndroid Build Coastguard Worker   \index Index of the anc data element to get
408*e5436536SAndroid Build Coastguard Worker   \ptr Pointer to a buffer receiving a pointer to the requested anc data element
409*e5436536SAndroid Build Coastguard Worker   \size Pointer to a buffer receiving the length of the requested anc data
410*e5436536SAndroid Build Coastguard Worker   element
411*e5436536SAndroid Build Coastguard Worker 
412*e5436536SAndroid Build Coastguard Worker   \return  Error code
413*e5436536SAndroid Build Coastguard Worker */
414*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index,
415*e5436536SAndroid Build Coastguard Worker                                          unsigned char **ptr, int *size);
416*e5436536SAndroid Build Coastguard Worker 
417*e5436536SAndroid Build Coastguard Worker /* initialization of aac decoder */
418*e5436536SAndroid Build Coastguard Worker LINKSPEC_H HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat);
419*e5436536SAndroid Build Coastguard Worker 
420*e5436536SAndroid Build Coastguard Worker /* Initialization of channel elements */
421*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self,
422*e5436536SAndroid Build Coastguard Worker                                               const CSAudioSpecificConfig *asc,
423*e5436536SAndroid Build Coastguard Worker                                               UCHAR configMode,
424*e5436536SAndroid Build Coastguard Worker                                               UCHAR *configChanged);
425*e5436536SAndroid Build Coastguard Worker /*!
426*e5436536SAndroid Build Coastguard Worker   \brief Decodes one aac frame
427*e5436536SAndroid Build Coastguard Worker 
428*e5436536SAndroid Build Coastguard Worker   The function decodes one aac frame. The decoding of coupling channel
429*e5436536SAndroid Build Coastguard Worker   elements are not supported. The transport layer might signal, that the
430*e5436536SAndroid Build Coastguard Worker   data of the current frame is invalid, e.g. as a result of a packet
431*e5436536SAndroid Build Coastguard Worker   loss in streaming mode.
432*e5436536SAndroid Build Coastguard Worker   The bitstream position of transportDec_GetBitstream(self->hInput) must
433*e5436536SAndroid Build Coastguard Worker   be exactly the end of the access unit, including all byte alignment bits.
434*e5436536SAndroid Build Coastguard Worker   For this purpose, the variable auStartAnchor is used.
435*e5436536SAndroid Build Coastguard Worker 
436*e5436536SAndroid Build Coastguard Worker   \return  error status
437*e5436536SAndroid Build Coastguard Worker */
438*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
439*e5436536SAndroid Build Coastguard Worker     HANDLE_AACDECODER self, const UINT flags, PCM_DEC *pTimeData,
440*e5436536SAndroid Build Coastguard Worker     const INT timeDataSize, const int timeDataChannelOffset);
441*e5436536SAndroid Build Coastguard Worker 
442*e5436536SAndroid Build Coastguard Worker /* Free config dependent AAC memory */
443*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_FreeMem(HANDLE_AACDECODER self,
444*e5436536SAndroid Build Coastguard Worker                                                  const int subStreamIndex);
445*e5436536SAndroid Build Coastguard Worker 
446*e5436536SAndroid Build Coastguard Worker /* Prepare crossfade for USAC DASH IPF config change */
447*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PrepareCrossFade(
448*e5436536SAndroid Build Coastguard Worker     const PCM_DEC *pTimeData, PCM_DEC **pTimeDataFlush, const INT numChannels,
449*e5436536SAndroid Build Coastguard Worker     const INT frameSize, const INT interleaved);
450*e5436536SAndroid Build Coastguard Worker 
451*e5436536SAndroid Build Coastguard Worker /* Apply crossfade for USAC DASH IPF config change */
452*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_ApplyCrossFade(
453*e5436536SAndroid Build Coastguard Worker     PCM_DEC *pTimeData, PCM_DEC **pTimeDataFlush, const INT numChannels,
454*e5436536SAndroid Build Coastguard Worker     const INT frameSize, const INT interleaved);
455*e5436536SAndroid Build Coastguard Worker 
456*e5436536SAndroid Build Coastguard Worker /* Set flush and build up mode */
457*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_CtrlCFGChange(HANDLE_AACDECODER self,
458*e5436536SAndroid Build Coastguard Worker                                                        UCHAR flushStatus,
459*e5436536SAndroid Build Coastguard Worker                                                        SCHAR flushCnt,
460*e5436536SAndroid Build Coastguard Worker                                                        UCHAR buildUpStatus,
461*e5436536SAndroid Build Coastguard Worker                                                        SCHAR buildUpCnt);
462*e5436536SAndroid Build Coastguard Worker 
463*e5436536SAndroid Build Coastguard Worker /* Parse preRoll Extension Payload */
464*e5436536SAndroid Build Coastguard Worker LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PreRollExtensionPayloadParse(
465*e5436536SAndroid Build Coastguard Worker     HANDLE_AACDECODER self, UINT *numPrerollAU, UINT *prerollAUOffset,
466*e5436536SAndroid Build Coastguard Worker     UINT *prerollAULength);
467*e5436536SAndroid Build Coastguard Worker 
468*e5436536SAndroid Build Coastguard Worker /* Destroy aac decoder */
469*e5436536SAndroid Build Coastguard Worker LINKSPEC_H void CAacDecoder_Close(HANDLE_AACDECODER self);
470*e5436536SAndroid Build Coastguard Worker 
471*e5436536SAndroid Build Coastguard Worker /* get streaminfo handle from decoder */
472*e5436536SAndroid Build Coastguard Worker LINKSPEC_H CStreamInfo *CAacDecoder_GetStreamInfo(HANDLE_AACDECODER self);
473*e5436536SAndroid Build Coastguard Worker 
474*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef AACDECODER_H */
475