| /* ----------------------------------------------------------------------------- |
| 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: SBR decoder front-end prototypes and definitions. |
| |
| *******************************************************************************/ |
| |
| #ifndef SBRDECODER_H |
| #define SBRDECODER_H |
| |
| #include "common_fix.h" |
| |
| #include "FDK_bitstream.h" |
| #include "FDK_audio.h" |
| |
| #include "FDK_qmf_domain.h" |
| |
| #define SBR_DEBUG_EXTHLP \ |
| "\ |
| --- SBR ---\n\ |
| 0x00000010 Ancillary data and SBR-Header\n\ |
| 0x00000020 SBR-Side info\n\ |
| 0x00000040 Decoded SBR-bitstream data, e.g. envelope data\n\ |
| 0x00000080 SBR-Bitstream statistics\n\ |
| 0x00000100 Miscellaneous SBR-messages\n\ |
| 0x00000200 SBR-Energies and gains in the adjustor\n\ |
| 0x00000400 Fatal SBR errors\n\ |
| 0x00000800 Transposer coefficients for inverse filtering\n\ |
| " |
| |
| /* Capability flags */ |
| #define CAPF_SBR_LP \ |
| 0x00000001 /*!< Flag indicating library's capability of Low Power mode. */ |
| #define CAPF_SBR_HQ \ |
| 0x00000002 /*!< Flag indicating library's capability of High Quality mode. \ |
| */ |
| #define CAPF_SBR_DRM_BS \ |
| 0x00000004 /*!< Flag indicating library's capability to decode DRM SBR data. \ |
| */ |
| #define CAPF_SBR_CONCEALMENT \ |
| 0x00000008 /*!< Flag indicating library's capability to conceal erroneous \ |
| frames. */ |
| #define CAPF_SBR_DRC \ |
| 0x00000010 /*!< Flag indicating library's capability for Dynamic Range \ |
| Control. */ |
| #define CAPF_SBR_PS_MPEG \ |
| 0x00000020 /*!< Flag indicating library's capability to do MPEG Parametric \ |
| Stereo. */ |
| #define CAPF_SBR_PS_DRM \ |
| 0x00000040 /*!< Flag indicating library's capability to do DRM Parametric \ |
| Stereo. */ |
| #define CAPF_SBR_ELD_DOWNSCALE \ |
| 0x00000080 /*!< Flag indicating library's capability to do ELD decoding in \ |
| downscaled mode */ |
| #define CAPF_SBR_HBEHQ \ |
| 0x00000100 /*!< Flag indicating library's capability to do HQ Harmonic \ |
| transposing */ |
| |
| typedef enum { |
| SBRDEC_OK = 0, /*!< All fine. */ |
| /* SBRDEC_CONCEAL, */ |
| /* SBRDEC_NOSYNCH, */ |
| /* SBRDEC_ILLEGAL_PROGRAM, */ |
| /* SBRDEC_ILLEGAL_TAG, */ |
| /* SBRDEC_ILLEGAL_CHN_CONFIG, */ |
| /* SBRDEC_ILLEGAL_SECTION, */ |
| /* SBRDEC_ILLEGAL_SCFACTORS, */ |
| /* SBRDEC_ILLEGAL_PULSE_DATA, */ |
| /* SBRDEC_MAIN_PROFILE_NOT_IMPLEMENTED, */ |
| /* SBRDEC_GC_NOT_IMPLEMENTED, */ |
| /* SBRDEC_ILLEGAL_PLUS_ELE_ID, */ |
| SBRDEC_INVALID_ARGUMENT, /*!< */ |
| SBRDEC_CREATE_ERROR, /*!< */ |
| SBRDEC_NOT_INITIALIZED, /*!< */ |
| SBRDEC_MEM_ALLOC_FAILED, /*!< Memory allocation failed. Probably not enough |
| memory available. */ |
| SBRDEC_PARSE_ERROR, /*!< */ |
| SBRDEC_UNSUPPORTED_CONFIG, /*!< */ |
| SBRDEC_SET_PARAM_FAIL, /*!< */ |
| SBRDEC_OUTPUT_BUFFER_TOO_SMALL /*!< */ |
| } SBR_ERROR; |
| |
| typedef enum { |
| SBR_SYSTEM_BITSTREAM_DELAY, /*!< System: Switch to enable an additional SBR |
| bitstream delay of one frame. */ |
| SBR_QMF_MODE, /*!< Set QMF mode, either complex or low power. */ |
| SBR_LD_QMF_TIME_ALIGN, /*!< Set QMF type, either LD-MPS or CLDFB. Relevant for |
| ELD streams only. */ |
| SBR_FLUSH_DATA, /*!< Set internal state to flush the decoder with the next |
| process call. */ |
| SBR_CLEAR_HISTORY, /*!< Clear all internal states (delay lines, QMF states, |
| ...). */ |
| SBR_BS_INTERRUPTION /*!< Signal bit stream interruption. Value is ignored. */ |
| , |
| SBR_SKIP_QMF /*!< Enable skipping of QMF step: 1 skip analysis, 2 skip |
| synthesis */ |
| } SBRDEC_PARAM; |
| |
| typedef struct SBR_DECODER_INSTANCE *HANDLE_SBRDECODER; |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * \brief Allocates and initializes one SBR decoder instance. |
| * \param pSelf Pointer to where a SBR decoder handle is copied into. |
| * \param pQmfDomain Pointer to QMF domain data structure. |
| * |
| * \return Error code. |
| */ |
| SBR_ERROR sbrDecoder_Open(HANDLE_SBRDECODER *pSelf, |
| HANDLE_FDK_QMF_DOMAIN pQmfDomain); |
| |
| /** |
| * \brief Initialize a SBR decoder runtime instance. Must be called before |
| * decoding starts. |
| * |
| * \param self Handle to a SBR decoder instance. |
| * \param sampleRateIn Input samplerate of the SBR decoder instance. |
| * \param sampleRateOut Output samplerate of the SBR decoder instance. |
| * \param samplesPerFrame Number of samples per frames. |
| * \param coreCodec Audio Object Type (AOT) of the core codec. |
| * \param elementID Table with MPEG-4 element Ids in canonical order. |
| * \param elementIndex SBR element index |
| * \param harmonicSBR |
| * \param stereoConfigIndex |
| * \param downscaleFactor ELD downscale factor |
| * \param configMode Table with MPEG-4 element Ids in canonical order. |
| * \param configChanged Flag that enforces a complete decoder reset. |
| * |
| * \return Error code. |
| */ |
| SBR_ERROR sbrDecoder_InitElement( |
| HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut, |
| const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, |
| const MP4_ELEMENT_ID elementID, const int elementIndex, |
| const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, |
| const UCHAR configMode, UCHAR *configChanged, const INT downscaleFactor); |
| |
| /** |
| * \brief Free config dependent SBR memory. |
| * \param self SBR decoder instance handle |
| */ |
| SBR_ERROR sbrDecoder_FreeMem(HANDLE_SBRDECODER *self); |
| |
| /** |
| * \brief pass out of band SBR header to SBR decoder |
| * |
| * \param self Handle to a SBR decoder instance. |
| * \param hBs bit stream handle data source. |
| * \param sampleRateIn SBR input sampling rate |
| * \param sampleRateOut SBR output sampling rate |
| * \param samplesPerFrame frame length |
| * \param elementID SBR element ID. |
| * \param elementIndex SBR element index. |
| * \param harmonicSBR |
| * \param stereoConfigIndex |
| * \param downscaleFactor ELD downscale factor |
| * |
| * \return Error code. |
| */ |
| INT sbrDecoder_Header(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, |
| const INT sampleRateIn, const INT sampleRateOut, |
| const INT samplesPerFrame, |
| const AUDIO_OBJECT_TYPE coreCodec, |
| const MP4_ELEMENT_ID elementID, const INT elementIndex, |
| const UCHAR harmonicSBR, const UCHAR stereoConfigIndex, |
| const UCHAR configMode, UCHAR *configChanged, |
| const INT downscaleFactor); |
| |
| /** |
| * \brief Set a parameter of the SBR decoder runtime instance. |
| * \param self SBR decoder handle. |
| * \param param Parameter which will be set if successfull. |
| * \param value New parameter value. |
| * \return Error code. |
| */ |
| SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param, |
| const INT value); |
| |
| /** |
| * \brief Feed DRC channel data into a SBR decoder runtime instance. |
| * |
| * \param self SBR decoder handle. |
| * \param ch Channel number to which the DRC data is |
| * associated to. |
| * \param numBands Number of DRC bands. |
| * \param pNextFact_mag Pointer to a table with the DRC factor |
| * magnitudes. |
| * \param nextFact_exp Exponent for all DRC factors. |
| * \param drcInterpolationScheme DRC interpolation scheme. |
| * \param winSequence Window sequence from core coder (eight short |
| * or one long window). |
| * \param pBandTop Pointer to a table with the top borders for |
| * all DRC bands. |
| * |
| * \return Error code. |
| */ |
| SBR_ERROR sbrDecoder_drcFeedChannel(HANDLE_SBRDECODER self, INT ch, |
| UINT numBands, FIXP_DBL *pNextFact_mag, |
| INT nextFact_exp, |
| SHORT drcInterpolationScheme, |
| UCHAR winSequence, USHORT *pBandTop); |
| |
| /** |
| * \brief Disable SBR DRC for a certain channel. |
| * |
| * \param hSbrDecoder SBR decoder handle. |
| * \param ch Number of the channel that has to be disabled. |
| * |
| * \return None. |
| */ |
| void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch); |
| |
| /** |
| * \brief Parse one SBR element data extension data block. The bit stream |
| * position will be placed at the end of the SBR payload block. The remaining |
| * bits will be returned into *count if a payload length is given |
| * (byPayLen > 0). If no SBR payload length is given (bsPayLen < 0) then |
| * the bit stream position on return will be random after this function |
| * call in case of errors, and any further decoding will be completely |
| * pointless. This function accepts either normal ordered SBR data or reverse |
| * ordered DRM SBR data. |
| * |
| * \param self SBR decoder handle. |
| * \param hBs Bit stream handle as data source. |
| * \param count Pointer to an integer where the amount of parsed SBR |
| * payload bits is stored into. |
| * \param bsPayLen If > 0 this value is the SBR payload length. If < 0, |
| * the SBR payload length is unknown. |
| * \param flags CRC flag (0: EXT_SBR_DATA; 1: EXT_SBR_DATA_CRC) |
| * \param prev_element Previous MPEG-4 element ID. |
| * \param element_index Index of the current element. |
| * \param acFlags Audio codec flags |
| * |
| * \return Error code. |
| */ |
| SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, |
| UCHAR *pDrmBsBuffer, USHORT drmBsBufferSize, |
| int *count, int bsPayLen, int crcFlag, |
| MP4_ELEMENT_ID prev_element, int element_index, |
| UINT acFlags, UINT acElFlags[]); |
| |
| /** |
| * \brief This function decodes the given SBR bitstreams and applies SBR to the |
| * given time data. |
| * |
| * SBR-processing works InPlace. I.e. the calling function has to provide |
| * a time domain buffer timeData which can hold the completely decoded |
| * result. |
| * |
| * Left and right channel are read and stored according to the |
| * interleaving flag, frame length and number of channels. |
| * |
| * \param self Handle of an open SBR decoder instance. |
| * \param hSbrBs SBR Bitstream handle. |
| * \param input Pointer to input data. |
| * \param timeData Pointer to upsampled output data. |
| * \param timeDataSize Size of timeData. |
| * \param numChannels Pointer to a buffer holding the number of channels in |
| * time data buffer. |
| * \param sampleRate Output samplerate. |
| * \param channelMapping Channel mapping indices. |
| * \param coreDecodedOk Flag indicating if the core decoder did not find any |
| * error (0: core decoder found errors, 1: no errors). |
| * \param psDecoded Pointer to a buffer holding a flag. Input: PS is |
| * possible, Output: PS has been rendered. |
| * |
| * \return Error code. |
| */ |
| SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, |
| INT_PCM *timeData, const int timeDataSize, |
| int *numChannels, int *sampleRate, |
| const FDK_channelMapDescr *const mapDescr, |
| const int mapIdx, const int coreDecodedOk, |
| UCHAR *psDecoded); |
| |
| /** |
| * \brief Close SBR decoder instance and free memory. |
| * \param self SBR decoder handle. |
| * \return Error Code. |
| */ |
| SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *self); |
| |
| /** |
| * \brief Get SBR decoder library information. |
| * \param info Pointer to a LIB_INFO struct, where library information is |
| * written to. |
| * \return 0 on success, -1 if invalid handle or if no free element is |
| * available to write information to. |
| */ |
| INT sbrDecoder_GetLibInfo(LIB_INFO *info); |
| |
| /** |
| * \brief Determine the modules output signal delay in samples. |
| * \param self SBR decoder handle. |
| * \return The number of samples signal delay added by the module. |
| */ |
| UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |