xref: /aosp_15_r20/external/aac/libFDK/include/FDK_qmf_domain.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 - 2019 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 /******************* Library for basic calculation routines ********************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Matthias Hildenbrand
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: Module to efficiently handle QMF data for multiple channels and
100*e5436536SAndroid Build Coastguard Worker                 to share the data between e.g. SBR and MPS
101*e5436536SAndroid Build Coastguard Worker 
102*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
103*e5436536SAndroid Build Coastguard Worker 
104*e5436536SAndroid Build Coastguard Worker #ifndef FDK_QMF_DOMAIN_H
105*e5436536SAndroid Build Coastguard Worker #define FDK_QMF_DOMAIN_H
106*e5436536SAndroid Build Coastguard Worker 
107*e5436536SAndroid Build Coastguard Worker #include "qmf.h"
108*e5436536SAndroid Build Coastguard Worker 
109*e5436536SAndroid Build Coastguard Worker typedef enum {
110*e5436536SAndroid Build Coastguard Worker   QMF_DOMAIN_OK = 0x0, /*!< No error occurred. */
111*e5436536SAndroid Build Coastguard Worker   QMF_DOMAIN_OUT_OF_MEMORY =
112*e5436536SAndroid Build Coastguard Worker       0x1, /*!< QMF-Configuration demands for more memory than allocated on
113*e5436536SAndroid Build Coastguard Worker               heap. */
114*e5436536SAndroid Build Coastguard Worker   QMF_DOMAIN_INIT_ERROR =
115*e5436536SAndroid Build Coastguard Worker       0x2, /*!< An error during filterbank-setup occurred. */
116*e5436536SAndroid Build Coastguard Worker   QMF_DOMAIN_RESAMPLER_INIT_ERROR =
117*e5436536SAndroid Build Coastguard Worker       0x3 /*!< An error during QMF-resampler-setup occurred. */
118*e5436536SAndroid Build Coastguard Worker } QMF_DOMAIN_ERROR;
119*e5436536SAndroid Build Coastguard Worker 
120*e5436536SAndroid Build Coastguard Worker #define CMPLX_MOD (2)
121*e5436536SAndroid Build Coastguard Worker 
122*e5436536SAndroid Build Coastguard Worker #define QMF_MAX_WB_SECTIONS (5) /* maximum number of workbuffer sections */
123*e5436536SAndroid Build Coastguard Worker #define QMF_WB_SECTION_SIZE (1024 * 2)
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore1, FIXP_DBL)
126*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore3, FIXP_DBL)
127*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore4, FIXP_DBL)
128*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore6, FIXP_DBL)
129*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore7, FIXP_DBL)
130*e5436536SAndroid Build Coastguard Worker 
131*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS (64)
132*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS (QMF_MAX_SYNTHESIS_BANDS)
133*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_MAX_QMF_PROC_BANDS (64)
134*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_MAX_TIMESLOTS (64)
135*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_MAX_OV_TIMESLOTS (12)
136*e5436536SAndroid Build Coastguard Worker 
137*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_ANALYSIS_QMF_BANDS_16 (16)
138*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_ANALYSIS_QMF_BANDS_24 (24)
139*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_ANALYSIS_QMF_BANDS_32 (32)
140*e5436536SAndroid Build Coastguard Worker 
141*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_TIMESLOTS_16 (16)
142*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_TIMESLOTS_32 (32)
143*e5436536SAndroid Build Coastguard Worker 
144*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_OV_TIMESLOTS_16 (3)
145*e5436536SAndroid Build Coastguard Worker #define QMF_DOMAIN_OV_TIMESLOTS_32 (6)
146*e5436536SAndroid Build Coastguard Worker 
147*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(AnaQmfStates, FIXP_DBL)
148*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(SynQmfStates, FIXP_QSS)
149*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfSlotsReal, FIXP_DBL *)
150*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfSlotsImag, FIXP_DBL *)
151*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfOverlapBuffer, FIXP_DBL)
152*e5436536SAndroid Build Coastguard Worker 
153*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(AnaQmfStates16, FIXP_DBL)
154*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(AnaQmfStates24, FIXP_DBL)
155*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(AnaQmfStates32, FIXP_DBL)
156*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfSlotsReal16, FIXP_DBL *)
157*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfSlotsReal32, FIXP_DBL *)
158*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfSlotsImag16, FIXP_DBL *)
159*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfSlotsImag32, FIXP_DBL *)
160*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfOverlapBuffer16, FIXP_DBL)
161*e5436536SAndroid Build Coastguard Worker H_ALLOC_MEM(QmfOverlapBuffer32, FIXP_DBL)
162*e5436536SAndroid Build Coastguard Worker 
163*e5436536SAndroid Build Coastguard Worker /**
164*e5436536SAndroid Build Coastguard Worker  * Structure to hold the configuration data which is global whithin a QMF domain
165*e5436536SAndroid Build Coastguard Worker  * instance.
166*e5436536SAndroid Build Coastguard Worker  */
167*e5436536SAndroid Build Coastguard Worker typedef struct {
168*e5436536SAndroid Build Coastguard Worker   UCHAR qmfDomainExplicitConfig;   /*!< Flag to signal that QMF domain is set
169*e5436536SAndroid Build Coastguard Worker                                       explicitly instead of SBR and MPS init
170*e5436536SAndroid Build Coastguard Worker                                       routines. */
171*e5436536SAndroid Build Coastguard Worker   UCHAR nInputChannels;            /*!< Number of QMF input channels. */
172*e5436536SAndroid Build Coastguard Worker   UCHAR nInputChannels_requested;  /*!< Corresponding requested not yet active
173*e5436536SAndroid Build Coastguard Worker                                       configuration parameter. */
174*e5436536SAndroid Build Coastguard Worker   UCHAR nOutputChannels;           /*!< Number of QMF output channels. */
175*e5436536SAndroid Build Coastguard Worker   UCHAR nOutputChannels_requested; /*!< Corresponding requested not yet active
176*e5436536SAndroid Build Coastguard Worker                                       configuration parameter. */
177*e5436536SAndroid Build Coastguard Worker   UCHAR
178*e5436536SAndroid Build Coastguard Worker   parkChannel; /*!< signal to automatically allocate additional memory to
179*e5436536SAndroid Build Coastguard Worker                   park a channel if only one processing channel is
180*e5436536SAndroid Build Coastguard Worker                   available. */
181*e5436536SAndroid Build Coastguard Worker   UCHAR parkChannel_requested;
182*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *
183*e5436536SAndroid Build Coastguard Worker       pWorkBuffer[QMF_MAX_WB_SECTIONS]; /*!< Pointerarray to volatile memory. */
184*e5436536SAndroid Build Coastguard Worker   UINT flags; /*!< Flags to be set on all QMF analysis/synthesis filter
185*e5436536SAndroid Build Coastguard Worker                  instances. */
186*e5436536SAndroid Build Coastguard Worker   UINT flags_requested; /*!< Corresponding requested not yet active
187*e5436536SAndroid Build Coastguard Worker                            configuration parameter. */
188*e5436536SAndroid Build Coastguard Worker   UCHAR nBandsAnalysis; /*!< Number of QMF analysis bands for all input
189*e5436536SAndroid Build Coastguard Worker                            channels. */
190*e5436536SAndroid Build Coastguard Worker   UCHAR nBandsAnalysis_requested; /*!< Corresponding requested not yet active
191*e5436536SAndroid Build Coastguard Worker                                      configuration parameter. */
192*e5436536SAndroid Build Coastguard Worker   USHORT nBandsSynthesis; /*!< Number of QMF synthesis bands for all output
193*e5436536SAndroid Build Coastguard Worker                              channels. */
194*e5436536SAndroid Build Coastguard Worker   USHORT
195*e5436536SAndroid Build Coastguard Worker   nBandsSynthesis_requested; /*!< Corresponding requested not yet active
196*e5436536SAndroid Build Coastguard Worker                                 configuration parameter. */
197*e5436536SAndroid Build Coastguard Worker   UCHAR nQmfTimeSlots; /*!< Number of QMF time slots (stored in work buffer
198*e5436536SAndroid Build Coastguard Worker                           memory). */
199*e5436536SAndroid Build Coastguard Worker   UCHAR nQmfTimeSlots_requested; /*!< Corresponding requested not yet active
200*e5436536SAndroid Build Coastguard Worker                                     configuration parameter. */
201*e5436536SAndroid Build Coastguard Worker   UCHAR
202*e5436536SAndroid Build Coastguard Worker   nQmfOvTimeSlots; /*!< Number of QMF overlap/delay time slots (stored in
203*e5436536SAndroid Build Coastguard Worker                       persistent memory). */
204*e5436536SAndroid Build Coastguard Worker   UCHAR nQmfOvTimeSlots_requested; /*!< Corresponding requested not yet active
205*e5436536SAndroid Build Coastguard Worker                                       configuration parameter. */
206*e5436536SAndroid Build Coastguard Worker   UCHAR nQmfProcBands; /*!< Number of QMF bands which are processed by the
207*e5436536SAndroid Build Coastguard Worker                           decoder. Typically this is equal to nBandsSynthesis
208*e5436536SAndroid Build Coastguard Worker                           but it may differ if the QMF based resampler is being
209*e5436536SAndroid Build Coastguard Worker                           used. */
210*e5436536SAndroid Build Coastguard Worker   UCHAR nQmfProcBands_requested; /*!< Corresponding requested not yet active
211*e5436536SAndroid Build Coastguard Worker                                     configuration parameter. */
212*e5436536SAndroid Build Coastguard Worker   UCHAR
213*e5436536SAndroid Build Coastguard Worker   nQmfProcChannels; /*!< Number of complete QMF channels which need to
214*e5436536SAndroid Build Coastguard Worker                        coexist in memory at the same time. For most cases
215*e5436536SAndroid Build Coastguard Worker                        this is 1 which means the work buffer can be shared
216*e5436536SAndroid Build Coastguard Worker                        between audio channels. */
217*e5436536SAndroid Build Coastguard Worker   UCHAR
218*e5436536SAndroid Build Coastguard Worker   nQmfProcChannels_requested; /*!< Corresponding requested not yet active
219*e5436536SAndroid Build Coastguard Worker                                  configuration parameter. */
220*e5436536SAndroid Build Coastguard Worker } FDK_QMF_DOMAIN_GC;
221*e5436536SAndroid Build Coastguard Worker typedef FDK_QMF_DOMAIN_GC *HANDLE_FDK_QMF_DOMAIN_GC;
222*e5436536SAndroid Build Coastguard Worker 
223*e5436536SAndroid Build Coastguard Worker /**
224*e5436536SAndroid Build Coastguard Worker  * Structure representing one QMF input channel. This includes the QMF analysis
225*e5436536SAndroid Build Coastguard Worker  * and the QMF domain data representation needed by the codec. Work buffer data
226*e5436536SAndroid Build Coastguard Worker  * may be shared between channels if the codec processes all QMF channels in a
227*e5436536SAndroid Build Coastguard Worker  * consecutive order.
228*e5436536SAndroid Build Coastguard Worker  */
229*e5436536SAndroid Build Coastguard Worker typedef struct {
230*e5436536SAndroid Build Coastguard Worker   HANDLE_FDK_QMF_DOMAIN_GC
231*e5436536SAndroid Build Coastguard Worker   pGlobalConf;               /*!< Pointer to global configuration structure. */
232*e5436536SAndroid Build Coastguard Worker   QMF_FILTER_BANK fb;        /*!< QMF (analysis) filter bank structure. */
233*e5436536SAndroid Build Coastguard Worker   QMF_SCALE_FACTOR scaling;  /*!< Structure with scaling information. */
234*e5436536SAndroid Build Coastguard Worker   UCHAR workBuf_nTimeSlots;  /*!< Work buffer dimension for this channel is
235*e5436536SAndroid Build Coastguard Worker                                 (workBuf_nTimeSlots * workBuf_nBands *
236*e5436536SAndroid Build Coastguard Worker                                 CMPLX_MOD). */
237*e5436536SAndroid Build Coastguard Worker   UCHAR workBuf_nBands;      /*!< Work buffer dimension for this channel is
238*e5436536SAndroid Build Coastguard Worker                                 (workBuf_nTimeSlots * workBuf_nBands * CMPLX_MOD). */
239*e5436536SAndroid Build Coastguard Worker   USHORT workBufferOffset;   /*!< Offset within work buffer. */
240*e5436536SAndroid Build Coastguard Worker   USHORT workBufferSectSize; /*!< Size of work buffer section. */
241*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *
242*e5436536SAndroid Build Coastguard Worker       pAnaQmfStates; /*!< Pointer to QMF analysis states (persistent memory). */
243*e5436536SAndroid Build Coastguard Worker   FIXP_DBL
244*e5436536SAndroid Build Coastguard Worker   *pOverlapBuffer;        /*!< Pointer to QMF overlap/delay memory (persistent
245*e5436536SAndroid Build Coastguard Worker                              memory). */
246*e5436536SAndroid Build Coastguard Worker   FIXP_DBL **pWorkBuffer; /*!< Pointer array to available work buffers. */
247*e5436536SAndroid Build Coastguard Worker   FIXP_DBL *
248*e5436536SAndroid Build Coastguard Worker       *hQmfSlotsReal; /*!< Handle for QMF real data time slot pointer array. */
249*e5436536SAndroid Build Coastguard Worker   FIXP_DBL **hQmfSlotsImag; /*!< Handle for QMF imaginary data time slot pointer
250*e5436536SAndroid Build Coastguard Worker                                array. */
251*e5436536SAndroid Build Coastguard Worker } FDK_QMF_DOMAIN_IN;
252*e5436536SAndroid Build Coastguard Worker typedef FDK_QMF_DOMAIN_IN *HANDLE_FDK_QMF_DOMAIN_IN;
253*e5436536SAndroid Build Coastguard Worker 
254*e5436536SAndroid Build Coastguard Worker /**
255*e5436536SAndroid Build Coastguard Worker  * Structure representing one QMF output channel.
256*e5436536SAndroid Build Coastguard Worker  */
257*e5436536SAndroid Build Coastguard Worker typedef struct {
258*e5436536SAndroid Build Coastguard Worker   QMF_FILTER_BANK fb;      /*!< QMF (synthesis) filter bank structure. */
259*e5436536SAndroid Build Coastguard Worker   FIXP_QSS *pSynQmfStates; /*!< Pointer to QMF synthesis states (persistent
260*e5436536SAndroid Build Coastguard Worker                               memory). */
261*e5436536SAndroid Build Coastguard Worker } FDK_QMF_DOMAIN_OUT;
262*e5436536SAndroid Build Coastguard Worker typedef FDK_QMF_DOMAIN_OUT *HANDLE_FDK_QMF_DOMAIN_OUT;
263*e5436536SAndroid Build Coastguard Worker 
264*e5436536SAndroid Build Coastguard Worker /**
265*e5436536SAndroid Build Coastguard Worker  * Structure representing the QMF domain for multiple channels.
266*e5436536SAndroid Build Coastguard Worker  */
267*e5436536SAndroid Build Coastguard Worker typedef struct {
268*e5436536SAndroid Build Coastguard Worker   FDK_QMF_DOMAIN_GC globalConf; /*!< Global configuration structure. */
269*e5436536SAndroid Build Coastguard Worker   FDK_QMF_DOMAIN_IN
270*e5436536SAndroid Build Coastguard Worker   QmfDomainIn[((8) + (1))]; /*!< Array of QMF domain input structures */
271*e5436536SAndroid Build Coastguard Worker   FDK_QMF_DOMAIN_OUT
272*e5436536SAndroid Build Coastguard Worker   QmfDomainOut[((8) + (1))]; /*!< Array of QMF domain output structures */
273*e5436536SAndroid Build Coastguard Worker } FDK_QMF_DOMAIN;
274*e5436536SAndroid Build Coastguard Worker typedef FDK_QMF_DOMAIN *HANDLE_FDK_QMF_DOMAIN;
275*e5436536SAndroid Build Coastguard Worker 
276*e5436536SAndroid Build Coastguard Worker /**
277*e5436536SAndroid Build Coastguard Worker  * \brief Check whether analysis- and synthesis-filterbank-states have been
278*e5436536SAndroid Build Coastguard Worker  * initialized.
279*e5436536SAndroid Build Coastguard Worker  *
280*e5436536SAndroid Build Coastguard Worker  * \param qd Pointer to QMF domain structure.
281*e5436536SAndroid Build Coastguard Worker  *
282*e5436536SAndroid Build Coastguard Worker  * \return  1 if initialized, 0 else
283*e5436536SAndroid Build Coastguard Worker  */
284*e5436536SAndroid Build Coastguard Worker int FDK_QmfDomain_IsInitialized(const HANDLE_FDK_QMF_DOMAIN qd);
285*e5436536SAndroid Build Coastguard Worker 
286*e5436536SAndroid Build Coastguard Worker /**
287*e5436536SAndroid Build Coastguard Worker  * \brief Initialize QMF analysis and synthesis filter banks and set up QMF data
288*e5436536SAndroid Build Coastguard Worker  * representation.
289*e5436536SAndroid Build Coastguard Worker  *
290*e5436536SAndroid Build Coastguard Worker  * \param qd Pointer to QMF domain structure.
291*e5436536SAndroid Build Coastguard Worker  * \param extra_flags Initialize filter banks with extra flags which were not
292*e5436536SAndroid Build Coastguard Worker  * set in the global config flags field.
293*e5436536SAndroid Build Coastguard Worker  *
294*e5436536SAndroid Build Coastguard Worker  * \return  0 on success.
295*e5436536SAndroid Build Coastguard Worker  */
296*e5436536SAndroid Build Coastguard Worker int FDK_QmfDomain_InitFilterBank(HANDLE_FDK_QMF_DOMAIN qd, UINT extra_flags);
297*e5436536SAndroid Build Coastguard Worker 
298*e5436536SAndroid Build Coastguard Worker /**
299*e5436536SAndroid Build Coastguard Worker  * \brief When QMF processing of one channel is finished copy the overlap/delay
300*e5436536SAndroid Build Coastguard Worker  * part into the persistent memory to be used in the next frame.
301*e5436536SAndroid Build Coastguard Worker  *
302*e5436536SAndroid Build Coastguard Worker  * \param qd_ch Pointer to a QMF domain input channel.
303*e5436536SAndroid Build Coastguard Worker  * \param offset
304*e5436536SAndroid Build Coastguard Worker  *
305*e5436536SAndroid Build Coastguard Worker  * \return  void
306*e5436536SAndroid Build Coastguard Worker  */
307*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_SaveOverlap(HANDLE_FDK_QMF_DOMAIN_IN qd_ch, int offset);
308*e5436536SAndroid Build Coastguard Worker 
309*e5436536SAndroid Build Coastguard Worker /**
310*e5436536SAndroid Build Coastguard Worker  * \brief Get one slot of QMF data and adapt the scaling.
311*e5436536SAndroid Build Coastguard Worker  *
312*e5436536SAndroid Build Coastguard Worker  * \param qd_ch Pointer to a QMF domain input channel.
313*e5436536SAndroid Build Coastguard Worker  * \param ts Time slot number to be obtained.
314*e5436536SAndroid Build Coastguard Worker  * \param start_band Start index of QMF bands to be obtained.
315*e5436536SAndroid Build Coastguard Worker  * \param stop_band Stop index of QMF band to be obtained.
316*e5436536SAndroid Build Coastguard Worker  * \param pQmfOutReal Output buffer (real QMF data).
317*e5436536SAndroid Build Coastguard Worker  * \param pQmfOutImag  Output buffer (imag QMF data).
318*e5436536SAndroid Build Coastguard Worker  * \param exp_out Target exponent (scaling) of data.
319*e5436536SAndroid Build Coastguard Worker  *
320*e5436536SAndroid Build Coastguard Worker  * \return  void
321*e5436536SAndroid Build Coastguard Worker  */
322*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_GetSlot(const HANDLE_FDK_QMF_DOMAIN_IN qd_ch, const int ts,
323*e5436536SAndroid Build Coastguard Worker                            const int start_band, const int stop_band,
324*e5436536SAndroid Build Coastguard Worker                            FIXP_DBL *pQmfOutReal, FIXP_DBL *pQmfOutImag,
325*e5436536SAndroid Build Coastguard Worker                            const int exp_out);
326*e5436536SAndroid Build Coastguard Worker 
327*e5436536SAndroid Build Coastguard Worker /**
328*e5436536SAndroid Build Coastguard Worker  * \brief Direct access to the work buffer associated with a certain channel (no
329*e5436536SAndroid Build Coastguard Worker  * time slot pointer array is used).
330*e5436536SAndroid Build Coastguard Worker  *
331*e5436536SAndroid Build Coastguard Worker  * \param qd_ch Pointer to a QMF domain input channel.
332*e5436536SAndroid Build Coastguard Worker  * \param ts Time slot number to be obtained.
333*e5436536SAndroid Build Coastguard Worker  * \param ppQmfReal Returns the pointer to the requested part of the work buffer
334*e5436536SAndroid Build Coastguard Worker  * (real time slot).
335*e5436536SAndroid Build Coastguard Worker  * \param ppQmfImag Returns the pointer to the requested part of the work buffer
336*e5436536SAndroid Build Coastguard Worker  * (imag time slot).
337*e5436536SAndroid Build Coastguard Worker  *
338*e5436536SAndroid Build Coastguard Worker  * \return  void
339*e5436536SAndroid Build Coastguard Worker  */
340*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_GetWorkBuffer(const HANDLE_FDK_QMF_DOMAIN_IN qd_ch,
341*e5436536SAndroid Build Coastguard Worker                                  const int ts, FIXP_DBL **ppQmfReal,
342*e5436536SAndroid Build Coastguard Worker                                  FIXP_DBL **ppQmfImag);
343*e5436536SAndroid Build Coastguard Worker 
344*e5436536SAndroid Build Coastguard Worker /**
345*e5436536SAndroid Build Coastguard Worker  * \brief For the case that the work buffer associated to this channel is not
346*e5436536SAndroid Build Coastguard Worker  * identical to the processing channel work buffer copy the data into the
347*e5436536SAndroid Build Coastguard Worker  * processing channel.
348*e5436536SAndroid Build Coastguard Worker  *
349*e5436536SAndroid Build Coastguard Worker  * \param qd_ch Pointer to a QMF domain input channel.
350*e5436536SAndroid Build Coastguard Worker  * \return  void
351*e5436536SAndroid Build Coastguard Worker  */
352*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_WorkBuffer2ProcChannel(const HANDLE_FDK_QMF_DOMAIN_IN qd_ch);
353*e5436536SAndroid Build Coastguard Worker 
354*e5436536SAndroid Build Coastguard Worker /**
355*e5436536SAndroid Build Coastguard Worker  * \brief For the case of stereoCfgIndex3 with HBE the HBE buffer is copied into
356*e5436536SAndroid Build Coastguard Worker  * the processing channel work buffer and the processing channel work buffer is
357*e5436536SAndroid Build Coastguard Worker  * copied into the HBE buffer.
358*e5436536SAndroid Build Coastguard Worker  *
359*e5436536SAndroid Build Coastguard Worker  * \param qd_ch Pointer to a QMF domain input channel.
360*e5436536SAndroid Build Coastguard Worker  * \param ppQmfReal Pointer to a HBE QMF data buffer (real).
361*e5436536SAndroid Build Coastguard Worker  * \param ppQmfImag Pointer to a HBE QMF data buffer (imag).
362*e5436536SAndroid Build Coastguard Worker  *
363*e5436536SAndroid Build Coastguard Worker  * \return  void
364*e5436536SAndroid Build Coastguard Worker  */
365*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_QmfData2HBE(HANDLE_FDK_QMF_DOMAIN_IN qd_ch,
366*e5436536SAndroid Build Coastguard Worker                                FIXP_DBL **ppQmfReal, FIXP_DBL **ppQmfImag);
367*e5436536SAndroid Build Coastguard Worker 
368*e5436536SAndroid Build Coastguard Worker /**
369*e5436536SAndroid Build Coastguard Worker  * \brief Set all fields for requested parametervalues in global config struct
370*e5436536SAndroid Build Coastguard Worker  * FDK_QMF_DOMAIN_GC to 0.
371*e5436536SAndroid Build Coastguard Worker  *
372*e5436536SAndroid Build Coastguard Worker  * \param hgc  Pointer to a QMF domain global config struct.
373*e5436536SAndroid Build Coastguard Worker  */
374*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_ClearRequested(HANDLE_FDK_QMF_DOMAIN_GC hgc);
375*e5436536SAndroid Build Coastguard Worker 
376*e5436536SAndroid Build Coastguard Worker /**
377*e5436536SAndroid Build Coastguard Worker  * \brief Check for parameter-change requests in global config and
378*e5436536SAndroid Build Coastguard Worker  * (re-)configure QMF domain accordingly.
379*e5436536SAndroid Build Coastguard Worker  *
380*e5436536SAndroid Build Coastguard Worker  * \param  hqd  Pointer to QMF domain
381*e5436536SAndroid Build Coastguard Worker  *
382*e5436536SAndroid Build Coastguard Worker  * \return  errorcode
383*e5436536SAndroid Build Coastguard Worker  */
384*e5436536SAndroid Build Coastguard Worker QMF_DOMAIN_ERROR FDK_QmfDomain_Configure(HANDLE_FDK_QMF_DOMAIN hqd);
385*e5436536SAndroid Build Coastguard Worker 
386*e5436536SAndroid Build Coastguard Worker /**
387*e5436536SAndroid Build Coastguard Worker  * \brief Free QMF workbuffer, QMF persistent memory and configuration
388*e5436536SAndroid Build Coastguard Worker  * variables.
389*e5436536SAndroid Build Coastguard Worker  *
390*e5436536SAndroid Build Coastguard Worker  * \param  hqd  Pointer to QMF domain
391*e5436536SAndroid Build Coastguard Worker  */
392*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_FreeMem(HANDLE_FDK_QMF_DOMAIN hqd);
393*e5436536SAndroid Build Coastguard Worker 
394*e5436536SAndroid Build Coastguard Worker /**
395*e5436536SAndroid Build Coastguard Worker  * \brief Clear QMF overlap buffers and QMF filter bank states.
396*e5436536SAndroid Build Coastguard Worker  *
397*e5436536SAndroid Build Coastguard Worker  * \param  hqd  Pointer to QMF domain
398*e5436536SAndroid Build Coastguard Worker  */
399*e5436536SAndroid Build Coastguard Worker QMF_DOMAIN_ERROR FDK_QmfDomain_ClearPersistentMemory(HANDLE_FDK_QMF_DOMAIN hqd);
400*e5436536SAndroid Build Coastguard Worker 
401*e5436536SAndroid Build Coastguard Worker /**
402*e5436536SAndroid Build Coastguard Worker  * \brief Free QMF workbuffer and QMF persistent memory.
403*e5436536SAndroid Build Coastguard Worker  *
404*e5436536SAndroid Build Coastguard Worker  * \param  hqd  Pointer to QMF domain
405*e5436536SAndroid Build Coastguard Worker  *
406*e5436536SAndroid Build Coastguard Worker  * \param  dmx_lp_mode  downmix low power mode flag
407*e5436536SAndroid Build Coastguard Worker  */
408*e5436536SAndroid Build Coastguard Worker void FDK_QmfDomain_Close(HANDLE_FDK_QMF_DOMAIN hqd);
409*e5436536SAndroid Build Coastguard Worker 
410*e5436536SAndroid Build Coastguard Worker #endif /* FDK_QMF_DOMAIN_H */
411