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 - 2018 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 /**************************** SBR encoder library ****************************** 96*e5436536SAndroid Build Coastguard Worker 97*e5436536SAndroid Build Coastguard Worker Author(s): 98*e5436536SAndroid Build Coastguard Worker 99*e5436536SAndroid Build Coastguard Worker Description: SBR encoder top level processing prototype 100*e5436536SAndroid Build Coastguard Worker 101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/ 102*e5436536SAndroid Build Coastguard Worker 103*e5436536SAndroid Build Coastguard Worker #ifndef SBR_ENCODER_H 104*e5436536SAndroid Build Coastguard Worker #define SBR_ENCODER_H 105*e5436536SAndroid Build Coastguard Worker 106*e5436536SAndroid Build Coastguard Worker #include "common_fix.h" 107*e5436536SAndroid Build Coastguard Worker #include "FDK_audio.h" 108*e5436536SAndroid Build Coastguard Worker 109*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h" 110*e5436536SAndroid Build Coastguard Worker 111*e5436536SAndroid Build Coastguard Worker /* core coder helpers */ 112*e5436536SAndroid Build Coastguard Worker #define MAX_TRANS_FAC 8 113*e5436536SAndroid Build Coastguard Worker #define MAX_CODEC_FRAME_RATIO 2 114*e5436536SAndroid Build Coastguard Worker #define MAX_PAYLOAD_SIZE 256 115*e5436536SAndroid Build Coastguard Worker 116*e5436536SAndroid Build Coastguard Worker typedef enum codecType { 117*e5436536SAndroid Build Coastguard Worker CODEC_AAC = 0, 118*e5436536SAndroid Build Coastguard Worker CODEC_AACLD = 1, 119*e5436536SAndroid Build Coastguard Worker CODEC_UNSPECIFIED = 99 120*e5436536SAndroid Build Coastguard Worker } CODEC_TYPE; 121*e5436536SAndroid Build Coastguard Worker 122*e5436536SAndroid Build Coastguard Worker typedef struct { 123*e5436536SAndroid Build Coastguard Worker INT bitRate; 124*e5436536SAndroid Build Coastguard Worker INT nChannels; 125*e5436536SAndroid Build Coastguard Worker INT sampleFreq; 126*e5436536SAndroid Build Coastguard Worker INT transFac; 127*e5436536SAndroid Build Coastguard Worker INT standardBitrate; 128*e5436536SAndroid Build Coastguard Worker } CODEC_PARAM; 129*e5436536SAndroid Build Coastguard Worker 130*e5436536SAndroid Build Coastguard Worker typedef enum { 131*e5436536SAndroid Build Coastguard Worker SBR_MONO, 132*e5436536SAndroid Build Coastguard Worker SBR_LEFT_RIGHT, 133*e5436536SAndroid Build Coastguard Worker SBR_COUPLING, 134*e5436536SAndroid Build Coastguard Worker SBR_SWITCH_LRC 135*e5436536SAndroid Build Coastguard Worker } SBR_STEREO_MODE; 136*e5436536SAndroid Build Coastguard Worker 137*e5436536SAndroid Build Coastguard Worker /* bitstream syntax flags */ 138*e5436536SAndroid Build Coastguard Worker enum { 139*e5436536SAndroid Build Coastguard Worker SBR_SYNTAX_LOW_DELAY = 0x0001, 140*e5436536SAndroid Build Coastguard Worker SBR_SYNTAX_SCALABLE = 0x0002, 141*e5436536SAndroid Build Coastguard Worker SBR_SYNTAX_CRC = 0x0004, 142*e5436536SAndroid Build Coastguard Worker SBR_SYNTAX_DRM_CRC = 0x0008, 143*e5436536SAndroid Build Coastguard Worker SBR_SYNTAX_ELD_REDUCED_DELAY = 0x0010 144*e5436536SAndroid Build Coastguard Worker }; 145*e5436536SAndroid Build Coastguard Worker 146*e5436536SAndroid Build Coastguard Worker typedef enum { FREQ_RES_LOW = 0, FREQ_RES_HIGH } FREQ_RES; 147*e5436536SAndroid Build Coastguard Worker 148*e5436536SAndroid Build Coastguard Worker typedef struct { 149*e5436536SAndroid Build Coastguard Worker CODEC_TYPE coreCoder; /*!< LC or ELD */ 150*e5436536SAndroid Build Coastguard Worker UINT bitrateFrom; /*!< inclusive */ 151*e5436536SAndroid Build Coastguard Worker UINT bitrateTo; /*!< exclusive */ 152*e5436536SAndroid Build Coastguard Worker 153*e5436536SAndroid Build Coastguard Worker UINT sampleRate; /*!< */ 154*e5436536SAndroid Build Coastguard Worker UCHAR numChannels; /*!< */ 155*e5436536SAndroid Build Coastguard Worker 156*e5436536SAndroid Build Coastguard Worker UCHAR startFreq; /*!< bs_start_freq */ 157*e5436536SAndroid Build Coastguard Worker UCHAR startFreqSpeech; /*!< bs_start_freq for speech config flag */ 158*e5436536SAndroid Build Coastguard Worker UCHAR stopFreq; /*!< bs_stop_freq */ 159*e5436536SAndroid Build Coastguard Worker UCHAR stopFreqSpeech; /*!< bs_stop_freq for speech config flag */ 160*e5436536SAndroid Build Coastguard Worker 161*e5436536SAndroid Build Coastguard Worker UCHAR numNoiseBands; /*!< */ 162*e5436536SAndroid Build Coastguard Worker UCHAR noiseFloorOffset; /*!< */ 163*e5436536SAndroid Build Coastguard Worker SCHAR noiseMaxLevel; /*!< */ 164*e5436536SAndroid Build Coastguard Worker SBR_STEREO_MODE stereoMode; /*!< */ 165*e5436536SAndroid Build Coastguard Worker UCHAR freqScale; /*!< */ 166*e5436536SAndroid Build Coastguard Worker } sbrTuningTable_t; 167*e5436536SAndroid Build Coastguard Worker 168*e5436536SAndroid Build Coastguard Worker typedef struct sbrConfiguration { 169*e5436536SAndroid Build Coastguard Worker /* 170*e5436536SAndroid Build Coastguard Worker core coder dependent configurations 171*e5436536SAndroid Build Coastguard Worker */ 172*e5436536SAndroid Build Coastguard Worker CODEC_PARAM 173*e5436536SAndroid Build Coastguard Worker codecSettings; /*!< Core coder settings. To be set from core coder. */ 174*e5436536SAndroid Build Coastguard Worker INT SendHeaderDataTime; /*!< SBR header send update frequency in ms. */ 175*e5436536SAndroid Build Coastguard Worker INT useWaveCoding; /*!< Flag: usage of wavecoding tool. */ 176*e5436536SAndroid Build Coastguard Worker INT crcSbr; /*!< Flag: usage of SBR-CRC. */ 177*e5436536SAndroid Build Coastguard Worker INT dynBwSupported; /*!< Flag: support for dynamic bandwidth in this 178*e5436536SAndroid Build Coastguard Worker combination. */ 179*e5436536SAndroid Build Coastguard Worker INT parametricCoding; /*!< Flag: usage of parametric coding tool. */ 180*e5436536SAndroid Build Coastguard Worker INT downSampleFactor; /*!< Sampling rate relation between the SBR and the core 181*e5436536SAndroid Build Coastguard Worker encoder. */ 182*e5436536SAndroid Build Coastguard Worker FREQ_RES freq_res_fixfix[2]; /*!< Frequency resolution of envelopes in frame 183*e5436536SAndroid Build Coastguard Worker class FIXFIX, for non-split case and split 184*e5436536SAndroid Build Coastguard Worker case */ 185*e5436536SAndroid Build Coastguard Worker UCHAR fResTransIsLow; /*!< Frequency resolution of envelopes in transient 186*e5436536SAndroid Build Coastguard Worker frames: low (0) or variable (1) */ 187*e5436536SAndroid Build Coastguard Worker 188*e5436536SAndroid Build Coastguard Worker /* 189*e5436536SAndroid Build Coastguard Worker core coder dependent tuning parameters 190*e5436536SAndroid Build Coastguard Worker */ 191*e5436536SAndroid Build Coastguard Worker INT tran_thr; /*!< SBR transient detector threshold (* 100). */ 192*e5436536SAndroid Build Coastguard Worker INT noiseFloorOffset; /*!< Noise floor offset. */ 193*e5436536SAndroid Build Coastguard Worker UINT useSpeechConfig; /*!< Flag: adapt tuning parameters according to speech. 194*e5436536SAndroid Build Coastguard Worker */ 195*e5436536SAndroid Build Coastguard Worker 196*e5436536SAndroid Build Coastguard Worker /* 197*e5436536SAndroid Build Coastguard Worker core coder independent configurations 198*e5436536SAndroid Build Coastguard Worker */ 199*e5436536SAndroid Build Coastguard Worker INT sbrFrameSize; /*!< SBR frame size in samples. Will be calculated from core 200*e5436536SAndroid Build Coastguard Worker coder settings. */ 201*e5436536SAndroid Build Coastguard Worker INT sbr_data_extra; /*!< Flag usage of data extra. */ 202*e5436536SAndroid Build Coastguard Worker INT amp_res; /*!< Amplitude resolution. */ 203*e5436536SAndroid Build Coastguard Worker INT ana_max_level; /*!< Noise insertion maximum level. */ 204*e5436536SAndroid Build Coastguard Worker INT tran_fc; /*!< Transient detector start frequency. */ 205*e5436536SAndroid Build Coastguard Worker INT tran_det_mode; /*!< Transient detector mode. */ 206*e5436536SAndroid Build Coastguard Worker INT spread; /*!< Flag: usage of SBR spread. */ 207*e5436536SAndroid Build Coastguard Worker INT stat; /*!< Flag: usage of static framing. */ 208*e5436536SAndroid Build Coastguard Worker INT e; /*!< Number of envelopes when static framing is chosen. */ 209*e5436536SAndroid Build Coastguard Worker SBR_STEREO_MODE stereoMode; /*!< SBR stereo mode. */ 210*e5436536SAndroid Build Coastguard Worker INT deltaTAcrossFrames; /*!< Flag: allow time-delta coding. */ 211*e5436536SAndroid Build Coastguard Worker FIXP_DBL dF_edge_1stEnv; /*!< Extra fraction delta-F coding is allowed to be 212*e5436536SAndroid Build Coastguard Worker more expensive. */ 213*e5436536SAndroid Build Coastguard Worker FIXP_DBL dF_edge_incr; /*!< Increment dF_edge_1stEnv this much if dT-coding 214*e5436536SAndroid Build Coastguard Worker was used this frame. */ 215*e5436536SAndroid Build Coastguard Worker INT sbr_invf_mode; /*!< Inverse filtering mode. */ 216*e5436536SAndroid Build Coastguard Worker INT sbr_xpos_mode; /*!< Transposer mode. */ 217*e5436536SAndroid Build Coastguard Worker INT sbr_xpos_ctrl; /*!< Transposer control. */ 218*e5436536SAndroid Build Coastguard Worker INT sbr_xpos_level; /*!< Transposer 3rd order level. */ 219*e5436536SAndroid Build Coastguard Worker INT startFreq; /*!< The start frequency table index. */ 220*e5436536SAndroid Build Coastguard Worker INT stopFreq; /*!< The stop frequency table index. */ 221*e5436536SAndroid Build Coastguard Worker INT useSaPan; /*!< Flag: usage of SAPAN stereo. */ 222*e5436536SAndroid Build Coastguard Worker INT dynBwEnabled; /*!< Flag: usage of dynamic bandwidth. */ 223*e5436536SAndroid Build Coastguard Worker INT bParametricStereo; /*!< Flag: usage of parametric stereo coding tool. */ 224*e5436536SAndroid Build Coastguard Worker 225*e5436536SAndroid Build Coastguard Worker /* 226*e5436536SAndroid Build Coastguard Worker header_extra1 configuration 227*e5436536SAndroid Build Coastguard Worker */ 228*e5436536SAndroid Build Coastguard Worker UCHAR freqScale; /*!< Frequency grouping. */ 229*e5436536SAndroid Build Coastguard Worker INT alterScale; /*!< Scale resolution. */ 230*e5436536SAndroid Build Coastguard Worker INT sbr_noise_bands; /*!< Number of noise bands. */ 231*e5436536SAndroid Build Coastguard Worker 232*e5436536SAndroid Build Coastguard Worker /* 233*e5436536SAndroid Build Coastguard Worker header_extra2 configuration 234*e5436536SAndroid Build Coastguard Worker */ 235*e5436536SAndroid Build Coastguard Worker INT sbr_limiter_bands; /*!< Number of limiter bands. */ 236*e5436536SAndroid Build Coastguard Worker INT sbr_limiter_gains; /*!< Gain of limiter. */ 237*e5436536SAndroid Build Coastguard Worker INT sbr_interpol_freq; /*!< Flag: use interpolation in freq. direction. */ 238*e5436536SAndroid Build Coastguard Worker INT sbr_smoothing_length; /*!< Flag: choose length 4 or 0 (=on, off). */ 239*e5436536SAndroid Build Coastguard Worker UCHAR init_amp_res_FF; 240*e5436536SAndroid Build Coastguard Worker FIXP_DBL threshold_AmpRes_FF_m; 241*e5436536SAndroid Build Coastguard Worker SCHAR threshold_AmpRes_FF_e; 242*e5436536SAndroid Build Coastguard Worker } sbrConfiguration, *sbrConfigurationPtr; 243*e5436536SAndroid Build Coastguard Worker 244*e5436536SAndroid Build Coastguard Worker typedef struct SBR_CONFIG_DATA { 245*e5436536SAndroid Build Coastguard Worker UINT sbrSyntaxFlags; /**< SBR syntax flags derived from AOT. */ 246*e5436536SAndroid Build Coastguard Worker INT nChannels; /**< Number of channels. */ 247*e5436536SAndroid Build Coastguard Worker 248*e5436536SAndroid Build Coastguard Worker INT nSfb[2]; /**< Number of SBR scalefactor bands for LO_RES and HI_RES (?) */ 249*e5436536SAndroid Build Coastguard Worker INT num_Master; /**< Number of elements in v_k_master. */ 250*e5436536SAndroid Build Coastguard Worker INT sampleFreq; /**< SBR sampling frequency. */ 251*e5436536SAndroid Build Coastguard Worker INT frameSize; 252*e5436536SAndroid Build Coastguard Worker INT xOverFreq; /**< The SBR start frequency. */ 253*e5436536SAndroid Build Coastguard Worker INT dynXOverFreq; /**< Used crossover frequency when dynamic bandwidth is 254*e5436536SAndroid Build Coastguard Worker enabled. */ 255*e5436536SAndroid Build Coastguard Worker 256*e5436536SAndroid Build Coastguard Worker INT noQmfBands; /**< Number of QMF frequency bands. */ 257*e5436536SAndroid Build Coastguard Worker INT noQmfSlots; /**< Number of QMF slots. */ 258*e5436536SAndroid Build Coastguard Worker 259*e5436536SAndroid Build Coastguard Worker UCHAR *freqBandTable[2]; /**< Frequency table for low and hires, only 260*e5436536SAndroid Build Coastguard Worker MAX_FREQ_COEFFS/2 +1 coeffs actually needed for 261*e5436536SAndroid Build Coastguard Worker lowres. */ 262*e5436536SAndroid Build Coastguard Worker UCHAR 263*e5436536SAndroid Build Coastguard Worker *v_k_master; /**< Master BandTable where freqBandTable is derived from. */ 264*e5436536SAndroid Build Coastguard Worker 265*e5436536SAndroid Build Coastguard Worker SBR_STEREO_MODE stereoMode; 266*e5436536SAndroid Build Coastguard Worker INT noEnvChannels; /**< Number of envelope channels. */ 267*e5436536SAndroid Build Coastguard Worker 268*e5436536SAndroid Build Coastguard Worker INT useWaveCoding; /**< Flag indicates whether to use wave coding at all. */ 269*e5436536SAndroid Build Coastguard Worker INT useParametricCoding; /**< Flag indicates whether to use para coding at 270*e5436536SAndroid Build Coastguard Worker all. */ 271*e5436536SAndroid Build Coastguard Worker INT xposCtrlSwitch; /**< Flag indicates whether to switch xpos ctrl on the 272*e5436536SAndroid Build Coastguard Worker fly. */ 273*e5436536SAndroid Build Coastguard Worker INT switchTransposers; /**< Flag indicates whether to switch xpos on the fly . 274*e5436536SAndroid Build Coastguard Worker */ 275*e5436536SAndroid Build Coastguard Worker UCHAR initAmpResFF; 276*e5436536SAndroid Build Coastguard Worker FIXP_DBL thresholdAmpResFF_m; 277*e5436536SAndroid Build Coastguard Worker SCHAR thresholdAmpResFF_e; 278*e5436536SAndroid Build Coastguard Worker } SBR_CONFIG_DATA, *HANDLE_SBR_CONFIG_DATA; 279*e5436536SAndroid Build Coastguard Worker 280*e5436536SAndroid Build Coastguard Worker typedef struct { 281*e5436536SAndroid Build Coastguard Worker MP4_ELEMENT_ID elType; 282*e5436536SAndroid Build Coastguard Worker INT bitRate; 283*e5436536SAndroid Build Coastguard Worker int instanceTag; 284*e5436536SAndroid Build Coastguard Worker UCHAR fParametricStereo; 285*e5436536SAndroid Build Coastguard Worker UCHAR fDualMono; /**< This flags allows to disable coupling in sbr channel 286*e5436536SAndroid Build Coastguard Worker pair element */ 287*e5436536SAndroid Build Coastguard Worker UCHAR nChannelsInEl; 288*e5436536SAndroid Build Coastguard Worker UCHAR ChannelIndex[2]; 289*e5436536SAndroid Build Coastguard Worker } SBR_ELEMENT_INFO; 290*e5436536SAndroid Build Coastguard Worker 291*e5436536SAndroid Build Coastguard Worker #ifdef __cplusplus 292*e5436536SAndroid Build Coastguard Worker extern "C" { 293*e5436536SAndroid Build Coastguard Worker #endif 294*e5436536SAndroid Build Coastguard Worker 295*e5436536SAndroid Build Coastguard Worker typedef struct SBR_ENCODER *HANDLE_SBR_ENCODER; 296*e5436536SAndroid Build Coastguard Worker 297*e5436536SAndroid Build Coastguard Worker /** 298*e5436536SAndroid Build Coastguard Worker * \brief Get the max required input buffer size including delay balancing 299*e5436536SAndroid Build Coastguard Worker * space for N audio channels. 300*e5436536SAndroid Build Coastguard Worker * \param noChannels Number of audio channels. 301*e5436536SAndroid Build Coastguard Worker * \return Max required input buffer size in bytes. 302*e5436536SAndroid Build Coastguard Worker */ 303*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetInBufferSize(int noChannels); 304*e5436536SAndroid Build Coastguard Worker 305*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_Open(HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements, 306*e5436536SAndroid Build Coastguard Worker INT nChannels, INT supportPS); 307*e5436536SAndroid Build Coastguard Worker 308*e5436536SAndroid Build Coastguard Worker /** 309*e5436536SAndroid Build Coastguard Worker * \brief Get closest working bitrate to specified desired 310*e5436536SAndroid Build Coastguard Worker * bitrate for a single SBR element. 311*e5436536SAndroid Build Coastguard Worker * \param bitRate The desired target bit rate 312*e5436536SAndroid Build Coastguard Worker * \param numChannels The amount of audio channels 313*e5436536SAndroid Build Coastguard Worker * \param coreSampleRate The sample rate of the core coder 314*e5436536SAndroid Build Coastguard Worker * \param aot The current Audio Object Type 315*e5436536SAndroid Build Coastguard Worker * \return Closest working bit rate to bitRate value 316*e5436536SAndroid Build Coastguard Worker */ 317*e5436536SAndroid Build Coastguard Worker UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, 318*e5436536SAndroid Build Coastguard Worker UINT coreSampleRate, AUDIO_OBJECT_TYPE aot); 319*e5436536SAndroid Build Coastguard Worker 320*e5436536SAndroid Build Coastguard Worker /** 321*e5436536SAndroid Build Coastguard Worker * \brief Check whether downsampled SBR single rate is possible 322*e5436536SAndroid Build Coastguard Worker * with given audio object type. 323*e5436536SAndroid Build Coastguard Worker * \param aot The Audio object type. 324*e5436536SAndroid Build Coastguard Worker * \return 0 when downsampled SBR is not possible, 325*e5436536SAndroid Build Coastguard Worker * 1 when downsampled SBR is possible. 326*e5436536SAndroid Build Coastguard Worker */ 327*e5436536SAndroid Build Coastguard Worker UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot); 328*e5436536SAndroid Build Coastguard Worker 329*e5436536SAndroid Build Coastguard Worker /** 330*e5436536SAndroid Build Coastguard Worker * \brief Initialize SBR Encoder instance. 331*e5436536SAndroid Build Coastguard Worker * \param phSbrEncoder Pointer to a SBR Encoder instance. 332*e5436536SAndroid Build Coastguard Worker * \param elInfo Structure that describes the element/channel 333*e5436536SAndroid Build Coastguard Worker * arrangement. 334*e5436536SAndroid Build Coastguard Worker * \param noElements Amount of elements described in elInfo. 335*e5436536SAndroid Build Coastguard Worker * \param inputBuffer Pointer to the encoder audio buffer 336*e5436536SAndroid Build Coastguard Worker * \param inputBufferBufSize Buffer offset of one channel (frameSize + delay) 337*e5436536SAndroid Build Coastguard Worker * \param bandwidth Returns the core audio encoder bandwidth (output) 338*e5436536SAndroid Build Coastguard Worker * \param bufferOffset Returns the offset for the audio input data in order 339*e5436536SAndroid Build Coastguard Worker * to do delay balancing. 340*e5436536SAndroid Build Coastguard Worker * \param numChannels Input: Encoder input channels. output: core encoder 341*e5436536SAndroid Build Coastguard Worker * channels. 342*e5436536SAndroid Build Coastguard Worker * \param sampleRate Input: Encoder samplerate. output core encoder 343*e5436536SAndroid Build Coastguard Worker * samplerate. 344*e5436536SAndroid Build Coastguard Worker * \param downSampleFactor Input: Relation between SBR and core coder sampling 345*e5436536SAndroid Build Coastguard Worker * rate; 346*e5436536SAndroid Build Coastguard Worker * \param frameLength Input: Encoder frameLength. output core encoder 347*e5436536SAndroid Build Coastguard Worker * frameLength. 348*e5436536SAndroid Build Coastguard Worker * \param aot Input: AOT.. 349*e5436536SAndroid Build Coastguard Worker * \param delay Input: core encoder delay. Output: total delay 350*e5436536SAndroid Build Coastguard Worker * because of SBR. 351*e5436536SAndroid Build Coastguard Worker * \param transformFactor The core encoder transform factor (blockswitching). 352*e5436536SAndroid Build Coastguard Worker * \param headerPeriod Repetition rate of the SBR header: 353*e5436536SAndroid Build Coastguard Worker * - (-1) means intern configuration. 354*e5436536SAndroid Build Coastguard Worker * - (1-10) corresponds to header repetition rate in 355*e5436536SAndroid Build Coastguard Worker * frames. 356*e5436536SAndroid Build Coastguard Worker * \return 0 on success, and non-zero if failed. 357*e5436536SAndroid Build Coastguard Worker */ 358*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_Init(HANDLE_SBR_ENCODER hSbrEncoder, 359*e5436536SAndroid Build Coastguard Worker SBR_ELEMENT_INFO elInfo[(8)], int noElements, 360*e5436536SAndroid Build Coastguard Worker INT_PCM *inputBuffer, UINT inputBufferBufSize, 361*e5436536SAndroid Build Coastguard Worker INT *coreBandwidth, INT *inputBufferOffset, 362*e5436536SAndroid Build Coastguard Worker INT *numChannels, const UINT syntaxFlags, INT *sampleRate, 363*e5436536SAndroid Build Coastguard Worker UINT *downSampleFactor, INT *frameLength, 364*e5436536SAndroid Build Coastguard Worker AUDIO_OBJECT_TYPE aot, int *delay, int transformFactor, 365*e5436536SAndroid Build Coastguard Worker const int headerPeriod, ULONG statesInitFlag); 366*e5436536SAndroid Build Coastguard Worker 367*e5436536SAndroid Build Coastguard Worker /** 368*e5436536SAndroid Build Coastguard Worker * \brief Do delay line buffers housekeeping. To be called after 369*e5436536SAndroid Build Coastguard Worker * each encoded audio frame. 370*e5436536SAndroid Build Coastguard Worker * \param hEnvEnc SBR Encoder handle. 371*e5436536SAndroid Build Coastguard Worker * \param timeBuffer Pointer to the encoder audio buffer. 372*e5436536SAndroid Build Coastguard Worker * \param timeBufferBufSIze buffer size for one channel 373*e5436536SAndroid Build Coastguard Worker * \return 0 on success, and non-zero if failed. 374*e5436536SAndroid Build Coastguard Worker */ 375*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hEnvEnc, INT_PCM *timeBuffer, 376*e5436536SAndroid Build Coastguard Worker UINT timeBufferBufSIze); 377*e5436536SAndroid Build Coastguard Worker 378*e5436536SAndroid Build Coastguard Worker /** 379*e5436536SAndroid Build Coastguard Worker * \brief Close SBR encoder instance. 380*e5436536SAndroid Build Coastguard Worker * \param phEbrEncoder Handle of SBR encoder instance to be closed. 381*e5436536SAndroid Build Coastguard Worker * \return void 382*e5436536SAndroid Build Coastguard Worker */ 383*e5436536SAndroid Build Coastguard Worker void sbrEncoder_Close(HANDLE_SBR_ENCODER *phEbrEncoder); 384*e5436536SAndroid Build Coastguard Worker 385*e5436536SAndroid Build Coastguard Worker /** 386*e5436536SAndroid Build Coastguard Worker * \brief Encode SBR data of one complete audio frame. 387*e5436536SAndroid Build Coastguard Worker * \param hEnvEncoder Handle of SBR encoder instance. 388*e5436536SAndroid Build Coastguard Worker * \param samples Time samples, not interleaved. 389*e5436536SAndroid Build Coastguard Worker * \param timeInStride Channel offset of samples buffer. 390*e5436536SAndroid Build Coastguard Worker * \param sbrDataBits Size of SBR payload in bits. 391*e5436536SAndroid Build Coastguard Worker * \param sbrData SBR payload. 392*e5436536SAndroid Build Coastguard Worker * \return 0 on success, and non-zero if failed. 393*e5436536SAndroid Build Coastguard Worker */ 394*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder, INT_PCM *samples, 395*e5436536SAndroid Build Coastguard Worker UINT samplesBufSize, UINT sbrDataBits[(8)], 396*e5436536SAndroid Build Coastguard Worker UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]); 397*e5436536SAndroid Build Coastguard Worker 398*e5436536SAndroid Build Coastguard Worker /** 399*e5436536SAndroid Build Coastguard Worker * \brief Write SBR headers of one SBR element. 400*e5436536SAndroid Build Coastguard Worker * \param sbrEncoder Handle of the SBR encoder instance. 401*e5436536SAndroid Build Coastguard Worker * \param hBs Handle of bit stream handle to write SBR header to. 402*e5436536SAndroid Build Coastguard Worker * \param element_index Index of the SBR element which header should be written. 403*e5436536SAndroid Build Coastguard Worker * \param fSendHeaders Flag indicating that the SBR encoder should send more 404*e5436536SAndroid Build Coastguard Worker * headers in the SBR payload or not. 405*e5436536SAndroid Build Coastguard Worker * \return void 406*e5436536SAndroid Build Coastguard Worker */ 407*e5436536SAndroid Build Coastguard Worker void sbrEncoder_GetHeader(HANDLE_SBR_ENCODER sbrEncoder, 408*e5436536SAndroid Build Coastguard Worker HANDLE_FDK_BITSTREAM hBs, INT element_index, 409*e5436536SAndroid Build Coastguard Worker int fSendHeaders); 410*e5436536SAndroid Build Coastguard Worker 411*e5436536SAndroid Build Coastguard Worker /** 412*e5436536SAndroid Build Coastguard Worker * \brief Request to write SBR header. 413*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 414*e5436536SAndroid Build Coastguard Worker * \return 0 on success, and non-zero if failed. 415*e5436536SAndroid Build Coastguard Worker */ 416*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_SendHeader(HANDLE_SBR_ENCODER hSbrEncoder); 417*e5436536SAndroid Build Coastguard Worker 418*e5436536SAndroid Build Coastguard Worker /** 419*e5436536SAndroid Build Coastguard Worker * \brief Request if last sbr payload contains an SBR header. 420*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 421*e5436536SAndroid Build Coastguard Worker * \return 1 contains sbr header, 0 without sbr header. 422*e5436536SAndroid Build Coastguard Worker */ 423*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_ContainsHeader(HANDLE_SBR_ENCODER hSbrEncoder); 424*e5436536SAndroid Build Coastguard Worker 425*e5436536SAndroid Build Coastguard Worker /** 426*e5436536SAndroid Build Coastguard Worker * \brief SBR header delay in frames. 427*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 428*e5436536SAndroid Build Coastguard Worker * \return Delay in frames, -1 on failure. 429*e5436536SAndroid Build Coastguard Worker */ 430*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetHeaderDelay(HANDLE_SBR_ENCODER hSbrEncoder); 431*e5436536SAndroid Build Coastguard Worker 432*e5436536SAndroid Build Coastguard Worker /** 433*e5436536SAndroid Build Coastguard Worker * \brief Bitstrem delay in SBR frames. 434*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 435*e5436536SAndroid Build Coastguard Worker * \return Delay in frames, -1 on failure. 436*e5436536SAndroid Build Coastguard Worker */ 437*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetBsDelay(HANDLE_SBR_ENCODER hSbrEncoder); 438*e5436536SAndroid Build Coastguard Worker 439*e5436536SAndroid Build Coastguard Worker /** 440*e5436536SAndroid Build Coastguard Worker * \brief Prepare SBR payload for SAP. 441*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 442*e5436536SAndroid Build Coastguard Worker * \return 0 on success, and non-zero if failed. 443*e5436536SAndroid Build Coastguard Worker */ 444*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_SAPPrepare(HANDLE_SBR_ENCODER hSbrEncoder); 445*e5436536SAndroid Build Coastguard Worker 446*e5436536SAndroid Build Coastguard Worker /** 447*e5436536SAndroid Build Coastguard Worker * \brief SBR encoder bitrate estimation. 448*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 449*e5436536SAndroid Build Coastguard Worker * \return Estimated bitrate. 450*e5436536SAndroid Build Coastguard Worker */ 451*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder); 452*e5436536SAndroid Build Coastguard Worker 453*e5436536SAndroid Build Coastguard Worker /** 454*e5436536SAndroid Build Coastguard Worker * \brief Delay between input data and downsampled output data. 455*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 456*e5436536SAndroid Build Coastguard Worker * \return Delay. 457*e5436536SAndroid Build Coastguard Worker */ 458*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder); 459*e5436536SAndroid Build Coastguard Worker 460*e5436536SAndroid Build Coastguard Worker /** 461*e5436536SAndroid Build Coastguard Worker * \brief Delay caused by the SBR decoder. 462*e5436536SAndroid Build Coastguard Worker * \param hSbrEncoder SBR encoder handle. 463*e5436536SAndroid Build Coastguard Worker * \return Delay. 464*e5436536SAndroid Build Coastguard Worker */ 465*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetSbrDecDelay(HANDLE_SBR_ENCODER hSbrEncoder); 466*e5436536SAndroid Build Coastguard Worker 467*e5436536SAndroid Build Coastguard Worker /** 468*e5436536SAndroid Build Coastguard Worker * \brief Get decoder library version info. 469*e5436536SAndroid Build Coastguard Worker * \param info Pointer to an allocated LIB_INFO struct, where library info is 470*e5436536SAndroid Build Coastguard Worker * written to. 471*e5436536SAndroid Build Coastguard Worker * \return 0 on sucess. 472*e5436536SAndroid Build Coastguard Worker */ 473*e5436536SAndroid Build Coastguard Worker INT sbrEncoder_GetLibInfo(LIB_INFO *info); 474*e5436536SAndroid Build Coastguard Worker 475*e5436536SAndroid Build Coastguard Worker void sbrPrintRAM(void); 476*e5436536SAndroid Build Coastguard Worker 477*e5436536SAndroid Build Coastguard Worker void sbrPrintROM(void); 478*e5436536SAndroid Build Coastguard Worker 479*e5436536SAndroid Build Coastguard Worker #ifdef __cplusplus 480*e5436536SAndroid Build Coastguard Worker } 481*e5436536SAndroid Build Coastguard Worker #endif 482*e5436536SAndroid Build Coastguard Worker 483*e5436536SAndroid Build Coastguard Worker #endif /* ifndef __SBR_MAIN_H */ 484