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

/**************************** AAC decoder library ******************************

   Author(s):   Josef Hoepfl

   Description:

*******************************************************************************/

#ifndef AACDECODER_H
#define AACDECODER_H

#include "common_fix.h"

#include "FDK_bitstream.h"

#include "channel.h"

#include "tpdec_lib.h"
#include "FDK_audio.h"

#include "block.h"

#include "genericStds.h"

#include "FDK_qmf_domain.h"

#include "sbrdecoder.h"

#include "aacdec_drc.h"

#include "pcmdmx_lib.h"

#include "FDK_drcDecLib.h"

#include "limiter.h"

#include "FDK_delay.h"

#define TIME_DATA_FLUSH_SIZE (128)
#define TIME_DATA_FLUSH_SIZE_SF (7)

#define AACDEC_MAX_NUM_PREROLL_AU_USAC (3)
#if (AACDEC_MAX_NUM_PREROLL_AU < 3)
#undef AACDEC_MAX_NUM_PREROLL_AU
#define AACDEC_MAX_NUM_PREROLL_AU AACDEC_MAX_NUM_PREROLL_AU_USAC
#endif

typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER;

enum { L = 0, R = 1 };

typedef struct {
  unsigned char *buffer;
  int bufferSize;
  int offset[8];
  int nrElements;
} CAncData;

typedef enum { NOT_DEFINED = -1, MODE_HQ = 0, MODE_LP = 1 } QMF_MODE;

typedef struct {
  int bsDelay;
} SBR_PARAMS;

enum {
  AACDEC_FLUSH_OFF = 0,
  AACDEC_RSV60_CFG_CHANGE_ATSC_FLUSH_ON = 1,
  AACDEC_RSV60_DASH_IPF_ATSC_FLUSH_ON = 2,
  AACDEC_USAC_DASH_IPF_FLUSH_ON = 3
};

enum {
  AACDEC_BUILD_UP_OFF = 0,
  AACDEC_RSV60_BUILD_UP_ON = 1,
  AACDEC_RSV60_BUILD_UP_ON_IN_BAND = 2,
  AACDEC_USAC_BUILD_UP_ON = 3,
  AACDEC_RSV60_BUILD_UP_IDLE = 4,
  AACDEC_RSV60_BUILD_UP_IDLE_IN_BAND = 5
};

typedef struct {
  /* Usac Extension Elements */
  USAC_EXT_ELEMENT_TYPE usacExtElementType[(3)];
  UINT usacExtElementDefaultLength[(3)];
  UCHAR usacExtElementPayloadFrag[(3)];
} CUsacCoreExtensions;

/* AAC decoder (opaque toward userland) struct declaration */
struct AAC_DECODER_INSTANCE {
  INT aacChannels; /*!< Amount of AAC decoder channels allocated.        */
  INT ascChannels[(1 *
                   1)]; /*!< Amount of AAC decoder channels signalled in ASC. */
  INT blockNumber;      /*!< frame counter                                    */

  INT nrOfLayers;

  INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved).
                          */

  HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */

  SamplingRateInfo
      samplingRateInfo[(1 * 1)]; /*!< Sampling Rate information table */

  UCHAR
  frameOK; /*!< Will be unset if a consistency check, e.g. CRC etc. fails */

  UINT flags[(1 * 1)]; /*!< Flags for internal decoder use. DO NOT USE
                          self::streaminfo::flags ! */
  UINT elFlags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
                1)]; /*!< Flags for internal decoder use (element specific). DO
                        NOT USE self::streaminfo::flags ! */

  MP4_ELEMENT_ID elements[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
                           1)]; /*!< Table where the element Id's are listed */
  UCHAR elTags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
                1)]; /*!< Table where the elements id Tags are listed      */
  UCHAR chMapping[((8) * 2)]; /*!< Table of MPEG canonical order to bitstream
                                 channel order mapping. */

  AUDIO_CHANNEL_TYPE channelType[(8)]; /*!< Audio channel type of each output
                                          audio channel (from 0 upto
                                          numChannels).           */
  UCHAR channelIndices[(8)]; /*!< Audio channel index for each output audio
                                channel (from 0 upto numChannels).         */
  /* See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a
   * program_config_element() */

  FDK_channelMapDescr mapDescr; /*!< Describes the output channel mapping. */
  UCHAR chMapIndex; /*!< Index to access one line of the channelOutputMapping
                       table. This is required because not all 8 channel
                       configurations have the same output mapping. */
  INT sbrDataLen;   /*!< Expected length of the SBR remaining in bitbuffer after
                         the AAC payload has been pared.   */

  CProgramConfig pce;
  CStreamInfo
      streamInfo; /*!< Pointer to StreamInfo data (read from the bitstream) */
  CAacDecoderChannelInfo
      *pAacDecoderChannelInfo[(8)]; /*!< Temporal channel memory */
  CAacDecoderStaticChannelInfo
      *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */

  FIXP_DBL *workBufferCore2;
  PCM_DEC *pTimeData2;
  INT timeData2Size;

  CpePersistentData *cpeStaticData[(
      3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) +
      1)]; /*!< Pointer to persistent data shared by both channels of a CPE.
This structure is allocated once for each CPE. */

  CConcealParams concealCommonData;
  CConcealmentMethod concealMethodUser;

  CUsacCoreExtensions usacCoreExt; /*!< Data and handles to extend USAC FD/LPD
                                      core decoder (SBR, MPS, ...) */
  UINT numUsacElements[(1 * 1)];
  UCHAR usacStereoConfigIndex[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1)];
  const CSUsacConfig *pUsacConfig[(1 * 1)];
  INT nbDiv; /*!< number of frame divisions in LPD-domain */

  UCHAR useLdQmfTimeAlign;

  INT aacChannelsPrev; /*!< The amount of AAC core channels of the last
                          successful decode call.         */
  AUDIO_CHANNEL_TYPE channelTypePrev[(8)]; /*!< Array holding the channelType
                                              values of the last successful
                                              decode call.    */
  UCHAR
  channelIndicesPrev[(8)]; /*!< Array holding the channelIndices values of
                              the last successful decode call. */

  UCHAR
  downscaleFactor; /*!< Variable to store a supported ELD downscale factor
                      of 1, 2, 3 or 4 */
  UCHAR downscaleFactorInBS; /*!< Variable to store the (not necessarily
                                supported) ELD downscale factor discovered in
                                the bitstream */

  HANDLE_SBRDECODER hSbrDecoder; /*!< SBR decoder handle. */
  UCHAR sbrEnabled;     /*!< flag to store if SBR has been detected     */
  UCHAR sbrEnabledPrev; /*!< flag to store if SBR has been detected from
                           previous frame */
  UCHAR psPossible;     /*!< flag to store if PS is possible            */
  SBR_PARAMS sbrParams; /*!< struct to store all sbr parameters         */

  UCHAR *pDrmBsBuffer; /*!< Pointer to dynamic buffer which is used to reverse
                          the bits of the DRM SBR payload */
  USHORT drmBsBufferSize; /*!< Size of the dynamic buffer which is used to
                             reverse the bits of the DRM SBR payload */
  FDK_QMF_DOMAIN
  qmfDomain; /*!< Instance of module for QMF domain data handling */

  QMF_MODE qmfModeCurr; /*!< The current QMF mode                       */
  QMF_MODE qmfModeUser; /*!< The QMF mode requested by the library user */

  HANDLE_AAC_DRC hDrcInfo; /*!< handle to DRC data structure               */
  INT metadataExpiry;      /*!< Metadata expiry time in milli-seconds.     */

  void *pMpegSurroundDecoder; /*!< pointer to mpeg surround decoder structure */
  UCHAR mpsEnableUser;        /*!< MPS enable user flag                       */
  UCHAR mpsEnableCurr;        /*!< MPS enable decoder state                   */
  UCHAR mpsApplicable;        /*!< MPS applicable                             */
  SCHAR mpsOutputMode; /*!< setting: normal = 0, binaural = 1, stereo = 2, 5.1ch
                          = 3 */
  INT mpsOutChannelsLast; /*!< The amount of channels returned by the last
                             successful MPS decoder call. */
  INT mpsFrameSizeLast;   /*!< The frame length returned by the last successful
                             MPS decoder call. */

  CAncData ancData; /*!< structure to handle ancillary data         */

  HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */

  TDLimiterPtr hLimiter;   /*!< Handle of time domain limiter.             */
  UCHAR limiterEnableUser; /*!< The limiter configuration requested by the
                              library user */
  UCHAR limiterEnableCurr; /*!< The current limiter configuration.         */
  FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */
  UINT extGainDelay;   /*!< Delay that must be accounted for extGain. */

  INT_PCM pcmOutputBuffer[(8) * (1024 * 2)];

  HANDLE_DRC_DECODER hUniDrcDecoder;
  UCHAR multibandDrcPresent;
  UCHAR numTimeSlots;
  UINT loudnessInfoSetPosition[3];
  SCHAR defaultTargetLoudness;

  INT_PCM
  *pTimeDataFlush[((8) * 2)]; /*!< Pointer to the flushed time data which
                                 will be used for the crossfade in case of
                                 an USAC DASH IPF config change */

  UCHAR flushStatus;     /*!< Indicates flush status: on|off */
  SCHAR flushCnt;        /*!< Flush frame counter */
  UCHAR buildUpStatus;   /*!< Indicates build up status: on|off */
  SCHAR buildUpCnt;      /*!< Build up frame counter */
  UCHAR hasAudioPreRoll; /*!< Indicates preRoll status: on|off */
  UINT prerollAULength[AACDEC_MAX_NUM_PREROLL_AU + 1]; /*!< Relative offset of
                                                          the prerollAU end
                                                          position to the AU
                                                          start position in the
                                                          bitstream */
  INT accessUnit; /*!< Number of the actual processed preroll accessUnit */
  UCHAR applyCrossfade; /*!< if set crossfade for seamless stream switching is
                           applied */

  FDK_SignalDelay usacResidualDelay; /*!< Delay residual signal to compensate
                                        for eSBR delay of DMX signal in case of
                                        stereoConfigIndex==2. */
};

#define AAC_DEBUG_EXTHLP \
  "\
--- AAC-Core ---\n\
    0x00010000 Header data\n\
    0x00020000 CRC data\n\
    0x00040000 Channel info\n\
    0x00080000 Section data\n\
    0x00100000 Scalefactor data\n\
    0x00200000 Pulse data\n\
    0x00400000 Tns data\n\
    0x00800000 Quantized spectrum\n\
    0x01000000 Requantized spectrum\n\
    0x02000000 Time output\n\
    0x04000000 Fatal errors\n\
    0x08000000 Buffer fullness\n\
    0x10000000 Average bitrate\n\
    0x20000000 Synchronization\n\
    0x40000000 Concealment\n\
    0x7FFF0000 all AAC-Core-Info\n\
"

/**
 * \brief Synchronise QMF mode for all modules using QMF data.
 * \param self decoder handle
 */
void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self);

/**
 * \brief Signal a bit stream interruption to the decoder
 * \param self decoder handle
 */
void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self);

/*!
  \brief Initialize ancillary buffer

  \ancData Pointer to ancillary data structure
  \buffer Pointer to (external) anc data buffer
  \size Size of the buffer pointed on by buffer

  \return  Error code
*/
AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData,
                                          unsigned char *buffer, int size);

/*!
  \brief Get one ancillary data element

  \ancData Pointer to ancillary data structure
  \index Index of the anc data element to get
  \ptr Pointer to a buffer receiving a pointer to the requested anc data element
  \size Pointer to a buffer receiving the length of the requested anc data
  element

  \return  Error code
*/
AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index,
                                         unsigned char **ptr, int *size);

/* initialization of aac decoder */
LINKSPEC_H HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat);

/* Initialization of channel elements */
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self,
                                              const CSAudioSpecificConfig *asc,
                                              UCHAR configMode,
                                              UCHAR *configChanged);
/*!
  \brief Decodes one aac frame

  The function decodes one aac frame. The decoding of coupling channel
  elements are not supported. The transport layer might signal, that the
  data of the current frame is invalid, e.g. as a result of a packet
  loss in streaming mode.
  The bitstream position of transportDec_GetBitstream(self->hInput) must
  be exactly the end of the access unit, including all byte alignment bits.
  For this purpose, the variable auStartAnchor is used.

  \return  error status
*/
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
    HANDLE_AACDECODER self, const UINT flags, FIXP_PCM *pTimeData,
    const INT timeDataSize, const int timeDataChannelOffset);

/* Free config dependent AAC memory */
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_FreeMem(HANDLE_AACDECODER self,
                                                 const int subStreamIndex);

/* Prepare crossfade for USAC DASH IPF config change */
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PrepareCrossFade(
    const INT_PCM *pTimeData, INT_PCM **pTimeDataFlush, const INT numChannels,
    const INT frameSize, const INT interleaved);

/* Apply crossfade for USAC DASH IPF config change */
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_ApplyCrossFade(
    INT_PCM *pTimeData, INT_PCM **pTimeDataFlush, const INT numChannels,
    const INT frameSize, const INT interleaved);

/* Set flush and build up mode */
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_CtrlCFGChange(HANDLE_AACDECODER self,
                                                       UCHAR flushStatus,
                                                       SCHAR flushCnt,
                                                       UCHAR buildUpStatus,
                                                       SCHAR buildUpCnt);

/* Parse preRoll Extension Payload */
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_PreRollExtensionPayloadParse(
    HANDLE_AACDECODER self, UINT *numPrerollAU, UINT *prerollAUOffset,
    UINT *prerollAULength);

/* Destroy aac decoder */
LINKSPEC_H void CAacDecoder_Close(HANDLE_AACDECODER self);

/* get streaminfo handle from decoder */
LINKSPEC_H CStreamInfo *CAacDecoder_GetStreamInfo(HANDLE_AACDECODER self);

#endif /* #ifndef AACDECODER_H */
