/* -----------------------------------------------------------------------------
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 */
