/* ----------------------------------------------------------------------------- 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 ----------------------------------------------------------------------------- */ /*********************** MPEG surround decoder library ************************* Author(s): Description: Space Decoder *******************************************************************************/ #ifndef SAC_DEC_LIB_H #define SAC_DEC_LIB_H #include "common_fix.h" #include "FDK_audio.h" #include "sac_dec_errorcodes.h" #include "FDK_bitstream.h" #include "FDK_qmf_domain.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * \brief MPEG Surround input data interface mode. **/ typedef enum { SAC_INTERFACE_QMF = 0, /*!< Use QMF domain interface for the input downmix audio. */ SAC_INTERFACE_TIME, /*!< Use time domain interface for the input downmix audio. */ SAC_INTERFACE_AUTO /*!< */ } SAC_INPUT_CONFIG; /** * \brief MPEG Surround output mode. **/ typedef enum { SACDEC_OUT_MODE_NORMAL = 0, /*!< Normal multi channel processing without output restrictions. */ SACDEC_OUT_MODE_BINAURAL, /*!< Two channel output with binaural processsing. */ SACDEC_OUT_MODE_STEREO, /*!< Always two channel output mode. */ SACDEC_OUT_MODE_6CHANNEL /*!< Always process with 5.1 channel output. */ } SAC_DEC_OUTPUT_MODE; /** * \brief MPEG Surround binaural HRTF model. * HRTF will be applied only in combination with upmixtype *SAC_UPMIX_TYPE_BINAURAL. **/ typedef enum { SAC_BINAURAL_HRTF_KEMAR = 0, SAC_BINAURAL_HRTF_VAST, SAC_BINAURAL_HRTF_MPSVT, SAC_BINAURAL_SINGLE_HRTFS } SAC_BINAURAL_HRTF_MODEL; /** * \brief MPEG Surround decoder instance available. **/ typedef enum { SAC_INSTANCE_NOT_FULL_AVAILABLE = 0, /*!< MPEG Surround decoder instance not full available. */ SAC_INSTANCE_FULL_AVAILABLE /*!< MPEG Surround decoder instance full available. */ } SAC_INSTANCE_AVAIL; /** * \brief MPEG Surround decoder dynamic parameters. * * Use mpegSurroundDecoder_SetParam() function to configure internal status of * following parameters. */ typedef enum { SACDEC_OUTPUT_MODE = 0x0001, /*!< Set MPEG Surround decoder output mode. See SAC_DEC_OUTPUT_MODE. */ SACDEC_BLIND_ENABLE = 0x0002, /*!< Multi channel output without MPEG Surround side info. */ SACDEC_PARTIALLY_COMPLEX = 0x0003, /*!< Set partially complex flag for MPEG Surround. 0: Use complex valued QMF data. 1: Use real valued QMF data (low power mode) */ SACDEC_INTERFACE = 0x0004, /*!< Select signal input interface for MPEG Surround. Switch time interface off: 0 Switch time interface on: 1 */ SACDEC_BS_DELAY = 0x0005, /*!< Select bit stream delay for MPEG Surround. Switch bit stream delay off: 0 Switch bit stream delay on: 1 */ SACDEC_BINAURAL_QUALITY = 0x0102, /*!< Set binaural quality for MPEG Surround binaural mode. 0: Low Complexity, 1: High Quality */ SACDEC_BINAURAL_DISTANCE = 0x0103, /*!< Set perceived distance for binaural playback (binaural mode only). The valid values range from 0 to 100. Where 100 corresponds to the farthest perceived distance. */ SACDEC_BINAURAL_DIALOG_CLARITY = 0x0104, /*!< Set dialog clarity (for binaural playback). The valid values range from 0 to 100. */ SACDEC_BINAURAL_FRONT_ANGLE = 0x0105, /*!< Set angle between the virtual front speaker pair (binaural mode only). The valid range is from 0 to 180 angular degrees. */ SACDEC_BINAURAL_BACK_ANGLE = 0x0106, /*!< Set angle between the virtual back speaker pair (binaural mode only). The valid range is from 0 to 180 angular degrees. */ SACDEC_BINAURAL_PRESET = 0x0107, /*!< Set a virtual speaker setup preset for binaural playback (binaural mode only). This meta-parameter implicitly modifies the following parameters: SACDEC_BINAURAL_DISTANCE, SACDEC_BINAURAL_DIALOG_CLARITY, SACDEC_BINAURAL_FRONT_ANGLE and SACDEC_BINAURAL_BACK_ANGLE. The following presets are available: 1: Dry room 2: Living room (default) 3: Cinema */ SACDEC_BS_INTERRUPTION = 0x0200, /*!< If the given value is unequal to 0 hint the MPEG Surround decoder that the next input data is discontinuous, because of frame loss, seeking, etc. Announce the decoder that the bitstream data was interrupted (fSync = 0). This will cause the surround decoder not to parse any new bitstream data until a new header with a valid Spatial Specific Config and a independently decodable frame is found. Specially important when the MPEG Surround data is split accross several frames (for example in the case of AAC-LC downmix with 1024 framelength and 2048 surround frame length) and a discontinuity in the bitstream data occurs. If fSync is 1, assume that MPEG Surround data is in sync (out of band config for example). */ SACDEC_CLEAR_HISTORY = 0x0201, /*!< If the given value is unequal to 0 clear all internal states (delay lines, QMF states, ...) of the MPEG Surround decoder. This will cause a discontinuity in the audio output signal. */ SACDEC_CONCEAL_NUM_KEEP_FRAMES = 0x0301, /*!< Error concealment: The Number of frames the module keeps the last spatial image before fading to the particular spatial scenario starts. The default is 10 frames. */ SACDEC_CONCEAL_FADE_OUT_SLOPE_LENGTH = 0x0302, /*!< Error concealment: Length of the slope (in frames) the module creates to fade from the last spatial scenario to the particular default scenario (downmix) in case of consecutive errors. Default is 5. */ SACDEC_CONCEAL_FADE_IN_SLOPE_LENGTH = 0x0303, /*!< Error concealment: Length of the slope (in frames) the module creates to fade from the default spatial scenario (downmix) to the current scenario after fade-out. Default parameter value is 5. */ SACDEC_CONCEAL_NUM_RELEASE_FRAMES = 0x0304 /*!< Error concealment: The number of error free frames before the module starts fading from default to the current spatial scenario. Default parameter value is 3 frames. */ } SACDEC_PARAM; #define PCM_MPS INT_PCM /** * \brief MPEG Surround decoder handle. */ typedef struct MpegSurroundDecoder CMpegSurroundDecoder; /** * \brief Check if the full MPEG Surround decoder instance is allocated. * * Check if the full MPEG Surround decoder instance is allocated. * * \param pMpegSurroundDecoder A pointer to a decoder stucture. * * \return SACDEC_ERROR error code */ SAC_INSTANCE_AVAIL mpegSurroundDecoder_IsFullMpegSurroundDecoderInstanceAvailable( CMpegSurroundDecoder *pMpegSurroundDecoder); /** * \brief Open one instance of the MPEG Surround decoder. * * Allocate one instance of decoder and input buffers. * - Allocate decoder structure * - Allocate input buffers (QMF/time/MPS data) * * \param pMpegSurroundDecoder A pointer to a decoder handle; filled on * return. * \param splitMemoryAllocation Allocate only outer layer of MPS decoder. Core * part is reallocated later if needed. * \param stereoConfigIndex USAC: Save memory by opening the MPS decoder * for a specific stereoConfigIndex. (Needs optimization macros enabled.) * \param pQmfDomain Pointer to QMF domain data structure. * * \return SACDEC_ERROR error code */ SACDEC_ERROR mpegSurroundDecoder_Open( CMpegSurroundDecoder **pMpegSurroundDecoder, int stereoConfigIndex, HANDLE_FDK_QMF_DOMAIN pQmfDomain); /** * \brief Init one instance of the MPEG Surround decoder. * * Init one instance of the MPEG Surround decoder * * \param pMpegSurroundDecoder A pointer to a decoder handle; * * \return SACDEC_ERROR error code */ SACDEC_ERROR mpegSurroundDecoder_Init( CMpegSurroundDecoder *pMpegSurroundDecoder); /** * \brief Read and parse SpatialSpecificConfig. * * \param pMpegSurroundDecoder A pointer to a decoder handle. * \param hBs bitstream handle config parsing data source. * * \return SACDEC_ERROR error code */ SACDEC_ERROR mpegSurroundDecoder_Config( CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, AUDIO_OBJECT_TYPE coreCodec, INT samplingRate, INT frameSize, INT stereoConfigIndex, INT coreSbrFrameLengthIndex, INT configBytes, const UCHAR configMode, UCHAR *configChanged); SACDEC_ERROR mpegSurroundDecoder_ConfigureQmfDomain( CMpegSurroundDecoder *pMpegSurroundDecoder, SAC_INPUT_CONFIG sac_dec_interface, UINT coreSamplingRate, AUDIO_OBJECT_TYPE coreCodec); /** * \brief Parse MPEG Surround data without header * * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. * \param hBs Bit stream handle data input source * \param pMpsDataBits Pointer to number of valid bits in extension * payload. Function updates mpsDataBits while parsing bitstream. * \param fGlobalIndependencyFlag Global independency flag of current frame. * * \return Error code. */ int mpegSurroundDecoder_ParseNoHeader( CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, int *pMpsDataBits, int fGlobalIndependencyFlag); /* #ifdef SACDEC_MPS_ENABLE */ /** * \brief Parse MPEG Surround data with header. Header is ancType, ancStart, ancStop (4 bits total). Body is ancDataSegmentByte[i]. * * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. * \param hBs Bit stream handle data input source * \param pMpsDataBits Pointer to number of valid bits in extension payload. Function updates mpsDataBits while parsing bitstream. Needs to be a multiple of 8 + 4 (4 bits header). * \param coreCodec The audio object type of the core codec handling the downmix input signal. * \param sampleRate Samplerate of input downmix data. * \param nChannels Amount of input channels. * \param frameSize Amount of input samples. * \param fGlobalIndependencyFlag Global independency flag of current frame. * * \return Error code. */ int mpegSurroundDecoder_Parse(CMpegSurroundDecoder *pMpegSurroundDecoder, HANDLE_FDK_BITSTREAM hBs, int *pMpsDataBits, AUDIO_OBJECT_TYPE coreCodec, int sampleRate, int frameSize, int fGlobalIndependencyFlag); /* #endif */ /** * \brief Apply MPEG Surround upmix. * * Process one downmix audio frame and decode one surround frame if it applies. * Downmix framing can be different from surround framing, so depending on the * frame size of the downmix audio data and the framing being used by the MPEG * Surround decoder, it could be that only every second call, for example, of * this function actually surround data was decoded. The returned value of * frameSize will be zero, if no surround data was decoded. * * Decoding one MPEG Surround frame. Depending on interface configuration * mpegSurroundDecoder_SetParam(self, SACDEC_INTERFACE, value), the QMF or time * interface will be applied. External access to QMF buffer interface can be * achieved by mpegSurroundDecoder_GetQmfBuffer() call before decode frame. * While using time interface, pTimeData buffer will be shared as input and * output buffer. * * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. * \param pTimeData Pointer to time buffer. Depending on interface * configuration, the content of pTimeData is ignored, and the internal QMF * buffer will be used as input data source. * Otherwise, the MPEG Surround processing is applied to the timesignal * pTimeData. For both variants, the resulting MPEG * Surround signal is written into pTimeData. * \param timeDataSize Size of pTimeData (available buffer size). * \param timeDataFrameSize Frame size of input timedata * \param nChannels Pointer where the amount of input channels is * given and amount of output channels is returned. * \param frameSize Pointer where the amount of output samples is * returned into. * \param channelType Array were the corresponding channel type for * each output audio channel is stored into. * \param channelIndices Array were the corresponding channel type index * for each output audio channel is stored into. * \param mapDescr Channep map descriptor for output channel mapping * to be used (From MPEG PCE ordering to whatever is required). * * \return Error code. */ int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, INT_PCM *input, PCM_MPS *pTimeData, const int timeDataSize, int timeDataFrameSize, int *nChannels, int *frameSize, int sampleRate, AUDIO_OBJECT_TYPE coreCodec, AUDIO_CHANNEL_TYPE channelType[], UCHAR channelIndices[], const FDK_channelMapDescr *const mapDescr); /** * \brief Deallocate a MPEG Surround decoder instance. * \param pMpegSurroundDecoder A decoder handle. * \return No return value. */ void mpegSurroundDecoder_Close(CMpegSurroundDecoder *pMpegSurroundDecoder); /** * \brief Free config dependent MPEG Surround memory. * \param pMpegSurroundDecoder A decoder handle. * \return error. */ SACDEC_ERROR mpegSurroundDecoder_FreeMem( CMpegSurroundDecoder *pMpegSurroundDecoder); /** * \brief Set one single MPEG Surround decoder parameter. * * \param pMpegSurroundDecoder A MPEG Surrround decoder handle. Must not be * NULL pointer. * \param param Parameter to be set. See SACDEC_PARAM. * \param value Parameter value. See SACDEC_PARAM. * * \return 0 on sucess, and non-zero on failure. */ SACDEC_ERROR mpegSurroundDecoder_SetParam( CMpegSurroundDecoder *pMpegSurroundDecoder, const SACDEC_PARAM param, const INT value); /** * \brief Retrieve MPEG Surround decoder library info and fill info list with all depending library infos. * \param libInfo Pointer to library info list to be filled. * \return 0 on sucess, and non-zero on failure. **/ int mpegSurroundDecoder_GetLibInfo(LIB_INFO *libInfo); /** * \brief Set one single MPEG Surround decoder parameter. * * \param pMpegSurroundDecoder A valid MPEG Surrround decoder handle. * * \return The additional signal delay caused by the module. */ UINT mpegSurroundDecoder_GetDelay(const CMpegSurroundDecoder *self); /** * \brief Get info on whether the USAC pseudo LR feature is active. * * \param pMpegSurroundDecoder A valid MPEG Surrround decoder handle. * \param bsPseudoLr Pointer to return wether pseudo LR USAC feature * is used. * * \return 0 on sucess, and non-zero on failure. */ SACDEC_ERROR mpegSurroundDecoder_IsPseudoLR( CMpegSurroundDecoder *pMpegSurroundDecoder, int *bsPseudoLr); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* #ifndef SAC_DEC_LIB_H */