2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
|
|
/* -----------------------------------------------------------------------------------------------------------
|
|
|
|
|
Software License for The Fraunhofer FDK AAC Codec Library for Android
|
|
|
|
|
|
2013-08-09 02:26:40 +02:00
|
|
|
|
<EFBFBD> Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur F<EFBFBD>rderung der angewandten Forschung e.V.
|
2012-07-11 19:15:24 +02:00
|
|
|
|
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-4 AAC Decoder **************************
|
|
|
|
|
|
|
|
|
|
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 "sbrdecoder.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "aacdec_drc.h"
|
|
|
|
|
|
|
|
|
|
#include "pcmutils_lib.h"
|
2013-12-31 01:01:08 +01:00
|
|
|
|
#include "limiter.h"
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Capabilities flags */
|
|
|
|
|
#define CAPF_AAC_LC 0x00000001
|
|
|
|
|
#define CAPF_AAC_LD 0x00000002
|
|
|
|
|
#define CAPF_AAC_SCAL 0x00000004
|
|
|
|
|
#define CAPF_AAC_ER 0x00000008
|
|
|
|
|
#define CAPF_AAC_480 0x00000010
|
|
|
|
|
#define CAPF_AAC_512 0x00000020
|
|
|
|
|
#define CAPF_AAC_960 0x00000040
|
|
|
|
|
#define CAPF_AAC_1024 0x00000080
|
|
|
|
|
#define CAPF_AAC_HCR 0x00000100
|
|
|
|
|
#define CAPF_AAC_VCB11 0x00000200
|
|
|
|
|
#define CAPF_AAC_RVLC 0x00000400
|
|
|
|
|
#define CAPF_AAC_MPEG4 0x00000800 /* PNS */
|
|
|
|
|
#define CAPF_AAC_DRC 0x00001000
|
|
|
|
|
#define CAPF_AAC_CONCEAL 0x00002000
|
|
|
|
|
#define CAPF_AAC_DRM_BSFORMAT 0x00004000
|
|
|
|
|
#define CAPF_AAC_BSAC 0x00008000
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* AAC decoder (opaque toward userland) struct declaration */
|
|
|
|
|
struct AAC_DECODER_INSTANCE {
|
|
|
|
|
INT aacChannels; /*!< Amount of AAC decoder channels allocated. */
|
|
|
|
|
INT ascChannels; /*!< 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; /*!< Sampling Rate information table */
|
|
|
|
|
|
|
|
|
|
UCHAR frameOK; /*!< Will be unset if a consistency check, e.g. CRC etc. fails */
|
|
|
|
|
|
|
|
|
|
UINT flags; /*!< Flags for internal decoder use. DO NOT USE self::streaminfo::flags ! */
|
|
|
|
|
|
2013-12-28 01:13:22 +01:00
|
|
|
|
MP4_ELEMENT_ID elements[(8)]; /*!< Table where the element Id's are listed */
|
|
|
|
|
UCHAR elTags[(8)]; /*!< Table where the elements id Tags are listed */
|
|
|
|
|
UCHAR chMapping[(8)]; /*!< Table of MPEG canonical order to bitstream channel order mapping. */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
2013-12-28 01:13:22 +01:00
|
|
|
|
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). */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
/* See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a program_config_element() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const UCHAR (*channelOutputMapping)[8]; /*!< Table for MPEG canonical order to output channel order mapping. */
|
2013-12-28 01:13:22 +01:00
|
|
|
|
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. */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
|
|
CProgramConfig pce;
|
|
|
|
|
CStreamInfo streamInfo; /*!< pointer to StreamInfo data (read from the bitstream) */
|
2013-12-28 01:13:22 +01:00
|
|
|
|
CAacDecoderChannelInfo *pAacDecoderChannelInfo[(8)]; /*!< Temporal channel memory */
|
|
|
|
|
CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
|
|
CAacDecoderCommonData aacCommonData; /*!< Temporal shared data for all channels hooked into pAacDecoderChannelInfo */
|
|
|
|
|
|
|
|
|
|
CConcealParams concealCommonData;
|
2014-05-21 02:24:06 +02:00
|
|
|
|
|
|
|
|
|
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. */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 */
|
|
|
|
|
|
|
|
|
|
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 */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CAncData ancData; /*!< structure to handle ancillary data */
|
|
|
|
|
|
|
|
|
|
HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */
|
2013-12-31 01:01:08 +01:00
|
|
|
|
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. */
|
2012-07-11 19:15:24 +02:00
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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 stream-info elements */
|
|
|
|
|
LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self,
|
|
|
|
|
const CSAudioSpecificConfig *asc);
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\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,
|
|
|
|
|
INT_PCM *pTimeData,
|
|
|
|
|
const INT timeDataSize,
|
|
|
|
|
const INT interleaved
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/* 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 */
|