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