| /* ----------------------------------------------------------------------------- |
| Software License for The Fraunhofer FDK AAC Codec Library for Android |
| |
| © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten |
| Forschung e.V. All rights reserved. |
| |
| 1. INTRODUCTION |
| The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software |
| that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding |
| scheme for digital audio. This FDK AAC Codec software is intended to be used on |
| a wide variety of Android devices. |
| |
| AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient |
| general perceptual audio codecs. AAC-ELD is considered the best-performing |
| full-bandwidth communications codec by independent studies and is widely |
| deployed. AAC has been standardized by ISO and IEC as part of the MPEG |
| specifications. |
| |
| Patent licenses for necessary patent claims for the FDK AAC Codec (including |
| those of Fraunhofer) may be obtained through Via Licensing |
| (www.vialicensing.com) or through the respective patent owners individually for |
| the purpose of encoding or decoding bit streams in products that are compliant |
| with the ISO/IEC MPEG audio standards. Please note that most manufacturers of |
| Android devices already license these patent claims through Via Licensing or |
| directly from the patent owners, and therefore FDK AAC Codec software may |
| already be covered under those patent licenses when it is used for those |
| licensed purposes only. |
| |
| Commercially-licensed AAC software libraries, including floating-point versions |
| with enhanced sound quality, are also available from Fraunhofer. Users are |
| encouraged to check the Fraunhofer website for additional applications |
| information and documentation. |
| |
| 2. COPYRIGHT LICENSE |
| |
| Redistribution and use in source and binary forms, with or without modification, |
| are permitted without payment of copyright license fees provided that you |
| satisfy the following conditions: |
| |
| You must retain the complete text of this software license in redistributions of |
| the FDK AAC Codec or your modifications thereto in source code form. |
| |
| You must retain the complete text of this software license in the documentation |
| and/or other materials provided with redistributions of the FDK AAC Codec or |
| your modifications thereto in binary form. You must make available free of |
| charge copies of the complete source code of the FDK AAC Codec and your |
| modifications thereto to recipients of copies in binary form. |
| |
| The name of Fraunhofer may not be used to endorse or promote products derived |
| from this library without prior written permission. |
| |
| You may not charge copyright license fees for anyone to use, copy or distribute |
| the FDK AAC Codec software or your modifications thereto. |
| |
| Your modified versions of the FDK AAC Codec must carry prominent notices stating |
| that you changed the software and the date of any change. For modified versions |
| of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" |
| must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK |
| AAC Codec Library for Android." |
| |
| 3. NO PATENT LICENSE |
| |
| NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without |
| limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. |
| Fraunhofer provides no warranty of patent non-infringement with respect to this |
| software. |
| |
| You may use this FDK AAC Codec software or modifications thereto only for |
| purposes that are authorized by appropriate patent licenses. |
| |
| 4. DISCLAIMER |
| |
| This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright |
| holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, |
| including but not limited to the implied warranties of merchantability and |
| fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, |
| or consequential damages, including but not limited to procurement of substitute |
| goods or services; loss of use, data, or profits, or business interruption, |
| however caused and on any theory of liability, whether in contract, strict |
| liability, or tort (including negligence), arising in any way out of the use of |
| this software, even if advised of the possibility of such damage. |
| |
| 5. CONTACT INFORMATION |
| |
| Fraunhofer Institute for Integrated Circuits IIS |
| Attention: Audio and Multimedia Departments - FDK AAC LL |
| Am Wolfsmantel 33 |
| 91058 Erlangen, Germany |
| |
| www.iis.fraunhofer.de/amm |
| amm-info@iis.fraunhofer.de |
| ----------------------------------------------------------------------------- */ |
| |
| /**************************** SBR decoder library ****************************** |
| |
| Author(s): |
| |
| Description: |
| |
| *******************************************************************************/ |
| |
| /*! |
| \file |
| \brief Envelope extraction prototypes |
| */ |
| |
| #ifndef ENV_EXTR_H |
| #define ENV_EXTR_H |
| |
| #include "sbrdecoder.h" |
| |
| #include "FDK_bitstream.h" |
| #include "lpp_tran.h" |
| |
| #include "psdec.h" |
| #include "pvc_dec.h" |
| |
| #define ENV_EXP_FRACT 0 |
| /*!< Shift raw envelope data to support fractional numbers. |
| Can be set to 8 instead of 0 to enhance accuracy during concealment. |
| This is not required for conformance and #requantizeEnvelopeData() will |
| become more expensive. |
| */ |
| |
| #define EXP_BITS 6 |
| /*!< Size of exponent-part of a pseudo float envelope value (should be at least |
| 6). The remaining bits in each word are used for the mantissa (should be at |
| least 10). This format is used in the arrays iEnvelope[] and |
| sbrNoiseFloorLevel[] in the FRAME_DATA struct which must fit in a certain part |
| of the output buffer (See buffer management in sbr_dec.cpp). Exponents and |
| mantissas could also be stored in separate arrays. Accessing the exponent or |
| the mantissa would be simplified and the masks #MASK_E resp. #MASK_M would |
| no longer be required. |
| */ |
| |
| #define MASK_M \ |
| (((1 << (FRACT_BITS - EXP_BITS)) - 1) \ |
| << EXP_BITS) /*!< Mask for extracting the mantissa of a pseudo float \ |
| envelope value */ |
| #define MASK_E \ |
| ((1 << EXP_BITS) - 1) /*!< Mask for extracting the exponent of a pseudo \ |
| float envelope value */ |
| |
| #define SIGN_EXT \ |
| (((SCHAR)-1) ^ \ |
| MASK_E) /*!< a CHAR-constant with all bits above our sign-bit set */ |
| #define ROUNDING \ |
| ((FIXP_SGL)( \ |
| 1 << (EXP_BITS - 1))) /*!< 0.5-offset for rounding the mantissa of a \ |
| pseudo-float envelope value */ |
| #define NRG_EXP_OFFSET \ |
| 16 /*!< Will be added to the reference energy's exponent to prevent negative \ |
| numbers */ |
| #define NOISE_EXP_OFFSET \ |
| 38 /*!< Will be added to the noise level exponent to prevent negative \ |
| numbers */ |
| |
| #define ADD_HARMONICS_FLAGS_SIZE 2 /* ceil(MAX_FREQ_COEFFS/32) */ |
| |
| typedef enum { |
| HEADER_NOT_PRESENT, |
| HEADER_ERROR, |
| HEADER_OK, |
| HEADER_RESET |
| } SBR_HEADER_STATUS; |
| |
| typedef enum { |
| SBR_NOT_INITIALIZED = 0, |
| UPSAMPLING = 1, |
| SBR_HEADER = 2, |
| SBR_ACTIVE = 3 |
| } SBR_SYNC_STATE; |
| |
| typedef enum { COUPLING_OFF = 0, COUPLING_LEVEL, COUPLING_BAL } COUPLING_MODE; |
| |
| typedef struct { |
| UCHAR nSfb[2]; /*!< Number of SBR-bands for low and high freq-resolution */ |
| UCHAR nNfb; /*!< Actual number of noise bands to read from the bitstream*/ |
| UCHAR numMaster; /*!< Number of SBR-bands in v_k_master */ |
| UCHAR lowSubband; /*!< QMF-band where SBR frequency range starts */ |
| UCHAR highSubband; /*!< QMF-band where SBR frequency range ends */ |
| UCHAR ov_highSubband; /*!< if headerchange applies this value holds the old |
| highband value -> highband value of overlap area; |
| required for overlap in usac when headerchange |
| occurs between XVAR and VARX frame */ |
| UCHAR limiterBandTable[MAX_NUM_LIMITERS + 1]; /*!< Limiter band table. */ |
| UCHAR noLimiterBands; /*!< Number of limiter bands. */ |
| UCHAR nInvfBands; /*!< Number of bands for inverse filtering */ |
| UCHAR |
| *freqBandTable[2]; /*!< Pointers to freqBandTableLo and freqBandTableHi */ |
| UCHAR freqBandTableLo[MAX_FREQ_COEFFS / 2 + 1]; |
| /*!< Mapping of SBR bands to QMF bands for low frequency resolution */ |
| UCHAR freqBandTableHi[MAX_FREQ_COEFFS + 1]; |
| /*!< Mapping of SBR bands to QMF bands for high frequency resolution */ |
| UCHAR freqBandTableNoise[MAX_NOISE_COEFFS + 1]; |
| /*!< Mapping of SBR noise bands to QMF bands */ |
| UCHAR v_k_master[MAX_FREQ_COEFFS + 1]; |
| /*!< Master BandTable which freqBandTable is derived from */ |
| } FREQ_BAND_DATA; |
| |
| typedef FREQ_BAND_DATA *HANDLE_FREQ_BAND_DATA; |
| |
| #define SBRDEC_ELD_GRID 1 |
| #define SBRDEC_SYNTAX_SCAL 2 |
| #define SBRDEC_SYNTAX_USAC 4 |
| #define SBRDEC_SYNTAX_RSVD50 8 |
| #define SBRDEC_USAC_INDEP \ |
| 16 /* Flag indicating that USAC global independency flag is active. */ |
| #define SBRDEC_LOW_POWER \ |
| 32 /* Flag indicating that Low Power QMF mode shall be used. */ |
| #define SBRDEC_PS_DECODED \ |
| 64 /* Flag indicating that PS was decoded and rendered. */ |
| #define SBRDEC_QUAD_RATE \ |
| 128 /* Flag indicating that USAC SBR 4:1 is active. \ |
| */ |
| #define SBRDEC_USAC_HARMONICSBR \ |
| 256 /* Flag indicating that USAC HBE tool is active. */ |
| #define SBRDEC_LD_MPS_QMF \ |
| 512 /* Flag indicating that the LD-MPS QMF shall be used. */ |
| #define SBRDEC_USAC_ITES \ |
| 1024 /* Flag indicating that USAC inter TES tool is active. */ |
| #define SBRDEC_SYNTAX_DRM \ |
| 2048 /* Flag indicating that DRM30/DRM+ reverse syntax is being used. */ |
| #define SBRDEC_ELD_DOWNSCALE \ |
| 4096 /* Flag indicating that ELD downscaled mode decoding is used */ |
| #define SBRDEC_DOWNSAMPLE \ |
| 8192 /* Flag indicating that the downsampling mode is used. */ |
| #define SBRDEC_FLUSH 16384 /* Flag is used to flush all elements in use. */ |
| #define SBRDEC_FORCE_RESET \ |
| 32768 /* Flag is used to force a reset of all elements in use. */ |
| #define SBRDEC_SKIP_QMF_ANA \ |
| (1 << 21) /* Flag indicating that the input data is provided in the QMF \ |
| domain. */ |
| #define SBRDEC_SKIP_QMF_SYN \ |
| (1 << 22) /* Flag indicating that the output data is exported in the QMF \ |
| domain. */ |
| |
| #define SBRDEC_HDR_STAT_RESET 1 |
| #define SBRDEC_HDR_STAT_UPDATE 2 |
| |
| typedef struct { |
| UCHAR ampResolution; /*!< Amplitude resolution of envelope values (0: 1.5dB, |
| 1: 3dB) */ |
| UCHAR |
| xover_band; /*!< Start index in #v_k_master[] used for dynamic crossover |
| frequency */ |
| UCHAR sbr_preprocessing; /*!< SBR prewhitening flag. */ |
| UCHAR pvc_mode; /*!< Predictive vector coding mode */ |
| } SBR_HEADER_DATA_BS_INFO; |
| |
| typedef struct { |
| /* Changes in these variables causes a reset of the decoder */ |
| UCHAR startFreq; /*!< Index for SBR start frequency */ |
| UCHAR stopFreq; /*!< Index for SBR highest frequency */ |
| UCHAR freqScale; /*!< 0: linear scale, 1-3 logarithmic scales */ |
| UCHAR alterScale; /*!< Flag for coarser frequency resolution */ |
| UCHAR noise_bands; /*!< Noise bands per octave, read from bitstream*/ |
| |
| /* don't require reset */ |
| UCHAR limiterBands; /*!< Index for number of limiter bands per octave */ |
| UCHAR limiterGains; /*!< Index to select gain limit */ |
| UCHAR interpolFreq; /*!< Select gain calculation method (1: per QMF channel, |
| 0: per SBR band) */ |
| UCHAR smoothingLength; /*!< Smoothing of gains over time (0: on 1: off) */ |
| |
| } SBR_HEADER_DATA_BS; |
| |
| typedef struct { |
| SBR_SYNC_STATE |
| syncState; /*!< The current initialization status of the header */ |
| |
| UCHAR status; /*!< Flags field used for signaling a reset right before the |
| processing starts and an update from config (e.g. ASC). */ |
| UCHAR |
| frameErrorFlag; /*!< Frame data valid flag. CAUTION: This variable will be |
| overwritten by the flag stored in the element |
| structure. This is necessary because of the frame |
| delay. There it might happen that different slots use |
| the same header. */ |
| UCHAR numberTimeSlots; /*!< AAC: 16,15 */ |
| UCHAR numberOfAnalysisBands; /*!< Number of QMF analysis bands */ |
| UCHAR timeStep; /*!< Time resolution of SBR in QMF-slots */ |
| UINT |
| sbrProcSmplRate; /*!< SBR processing sampling frequency (!= |
| OutputSamplingRate) (always: CoreSamplingRate * |
| UpSamplingFactor; even in single rate mode) */ |
| |
| SBR_HEADER_DATA_BS bs_data; /*!< current SBR header. */ |
| SBR_HEADER_DATA_BS bs_dflt; /*!< Default sbr header. */ |
| SBR_HEADER_DATA_BS_INFO bs_info; /*!< SBR info. */ |
| |
| FREQ_BAND_DATA freqBandData; /*!< Pointer to struct #FREQ_BAND_DATA */ |
| UCHAR pvcIDprev; |
| } SBR_HEADER_DATA; |
| |
| typedef SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; |
| |
| typedef struct { |
| UCHAR frameClass; /*!< Select grid type */ |
| UCHAR nEnvelopes; /*!< Number of envelopes */ |
| UCHAR borders[MAX_ENVELOPES + 1]; /*!< Envelope borders (in SBR-timeslots, |
| e.g. mp3PRO: 0..11) */ |
| UCHAR freqRes[MAX_ENVELOPES]; /*!< Frequency resolution for each envelope |
| (0=low, 1=high) */ |
| SCHAR tranEnv; /*!< Transient envelope, -1 if none */ |
| UCHAR nNoiseEnvelopes; /*!< Number of noise envelopes */ |
| UCHAR |
| bordersNoise[MAX_NOISE_ENVELOPES + 1]; /*!< borders of noise envelopes */ |
| UCHAR pvcBorders[MAX_PVC_ENVELOPES + 1]; |
| UCHAR noisePosition; |
| UCHAR varLength; |
| } FRAME_INFO; |
| |
| typedef struct { |
| FIXP_SGL sfb_nrg_prev[MAX_FREQ_COEFFS]; /*!< Previous envelope (required for |
| differential-coded values) */ |
| FIXP_SGL |
| prevNoiseLevel[MAX_NOISE_COEFFS]; /*!< Previous noise envelope (required |
| for differential-coded values) */ |
| COUPLING_MODE coupling; /*!< Stereo-mode of previous frame */ |
| INVF_MODE sbr_invf_mode[MAX_INVF_BANDS]; /*!< Previous strength of filtering |
| in transposer */ |
| UCHAR ampRes; /*!< Previous amplitude resolution (0: 1.5dB, 1: 3dB) */ |
| UCHAR stopPos; /*!< Position in time where last envelope ended */ |
| UCHAR frameErrorFlag; /*!< Previous frame status */ |
| UCHAR prevSbrPitchInBins; /*!< Previous frame pitchInBins */ |
| FRAME_INFO prevFrameInfo; |
| } SBR_PREV_FRAME_DATA; |
| |
| typedef SBR_PREV_FRAME_DATA *HANDLE_SBR_PREV_FRAME_DATA; |
| |
| typedef struct { |
| int nScaleFactors; /*!< total number of scalefactors in frame */ |
| |
| FRAME_INFO frameInfo; /*!< time grid for current frame */ |
| UCHAR domain_vec[MAX_ENVELOPES]; /*!< Bitfield containing direction of |
| delta-coding for each envelope |
| (0:frequency, 1:time) */ |
| UCHAR domain_vec_noise |
| [MAX_NOISE_ENVELOPES]; /*!< Same as above, but for noise envelopes */ |
| |
| INVF_MODE |
| sbr_invf_mode[MAX_INVF_BANDS]; /*!< Strength of filtering in transposer */ |
| COUPLING_MODE coupling; /*!< Stereo-mode */ |
| int ampResolutionCurrentFrame; /*!< Amplitude resolution of envelope values |
| (0: 1.5dB, 1: 3dB) */ |
| |
| ULONG addHarmonics[ADD_HARMONICS_FLAGS_SIZE]; /*!< Flags for synthetic sine |
| addition (aligned to MSB) */ |
| |
| FIXP_SGL iEnvelope[MAX_NUM_ENVELOPE_VALUES]; /*!< Envelope data */ |
| FIXP_SGL sbrNoiseFloorLevel[MAX_NUM_NOISE_VALUES]; /*!< Noise envelope data */ |
| UCHAR iTESactive; /*!< One flag for each envelope to enable USAC inter-TES */ |
| UCHAR |
| interTempShapeMode[MAX_ENVELOPES]; /*!< USAC inter-TES: |
| bs_inter_temp_shape_mode[ch][env] |
| value */ |
| UCHAR pvcID[PVC_NTIMESLOT]; /*!< One PVC ID value for each time slot */ |
| UCHAR ns; |
| UCHAR sinusoidal_position; |
| |
| UCHAR sbrPatchingMode; |
| UCHAR sbrOversamplingFlag; |
| UCHAR sbrPitchInBins; |
| } SBR_FRAME_DATA; |
| |
| typedef SBR_FRAME_DATA *HANDLE_SBR_FRAME_DATA; |
| |
| /*! |
| \brief Maps sampling frequencies to frequencies for which setup tables are |
| available |
| |
| Maps arbitary sampling frequency to nearest neighbors for which setup tables |
| are available (e.g. 25600 -> 24000). |
| Used for startFreq calculation. |
| The mapping is defined in 14496-3 (4.6.18.2.6), fs(SBR), and table 4.82 |
| |
| \return mapped sampling frequency |
| */ |
| UINT sbrdec_mapToStdSampleRate(UINT fs, |
| UINT isUsac); /*!< Output sampling frequency */ |
| |
| void initSbrPrevFrameData(HANDLE_SBR_PREV_FRAME_DATA h_prev_data, |
| int timeSlots); |
| |
| int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData, |
| HANDLE_SBR_FRAME_DATA hFrameDataLeft, |
| HANDLE_SBR_FRAME_DATA hFrameDataRight, |
| HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev, |
| UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBitBuf, |
| HANDLE_PS_DEC hParametricStereoDec, const UINT flags, |
| const int overlap); |
| |
| SBR_HEADER_STATUS |
| sbrGetHeaderData(HANDLE_SBR_HEADER_DATA headerData, |
| HANDLE_FDK_BITSTREAM hBitBuf, const UINT flags, |
| const int fIsSbrData, const UCHAR configMode); |
| |
| /*! |
| \brief Initialize SBR header data |
| |
| Copy default values to the header data struct and patch some entries |
| depending on the core codec. |
| */ |
| SBR_ERROR |
| initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, |
| const int sampleRateOut, const INT downscaleFactor, |
| const int samplesPerFrame, const UINT flags, |
| const int setDefaultHdr); |
| #endif |
| |
| /* Convert headroom bits to exponent */ |
| #define SCALE2EXP(s) (15 - (s)) |
| #define EXP2SCALE(e) (15 - (e)) |