/* -----------------------------------------------------------------------------
|
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): Matthias Hildenbrand
|
|
Description: Decode Predictive Vector Coding Data
|
|
*******************************************************************************/
|
|
#ifndef PVC_DEC_H
|
#define PVC_DEC_H
|
|
#include "common_fix.h"
|
|
#define PVC_DIVMODE_BITS 3
|
#define PVC_REUSEPVCID_BITS 1
|
#define PVC_PVCID_BITS 7
|
#define PVC_GRIDINFO_BITS 1
|
|
#define MAX_PVC_ENVELOPES 2
|
#define PVC_NTIMESLOT 16
|
#define PVC_NBLOW 3 /* max. number of grouped QMF subbands below SBR range */
|
|
#define PVC_NBHIGH_MODE1 8
|
#define PVC_NBHIGH_MODE2 6
|
#define PVC_NBHIGH_MAX (PVC_NBHIGH_MODE1)
|
#define PVC_NS_MAX 16
|
|
/** Data for each PVC instance which needs to be persistent accross SBR frames
|
*/
|
typedef struct {
|
UCHAR kx_last; /**< Xover frequency of last frame */
|
UCHAR pvc_mode_last; /**< PVC mode of last frame */
|
UCHAR Esg_slot_index; /**< Ring buffer index to current Esg time slot */
|
UCHAR pvcBorder0; /**< Start SBR time slot of PVC frame */
|
FIXP_DBL Esg[PVC_NS_MAX][PVC_NBLOW]; /**< Esg(ksg,t) of current and 15
|
previous time slots (ring buffer) in
|
logarithmical domain */
|
} PVC_STATIC_DATA;
|
|
/** Data for each PVC instance which is valid during one SBR frame */
|
typedef struct {
|
UCHAR pvc_mode; /**< PVC mode 1 or 2, 0 means legacy SBR */
|
UCHAR pvcBorder0; /**< Start SBR time slot of PVC frame */
|
UCHAR kx; /**< Index of the first QMF subband in the SBR range */
|
UCHAR RATE; /**< Number of QMF subband samples per time slot (2 or 4) */
|
UCHAR ns; /**< Number of time slots for time-domain smoothing of Esg(ksg,t) */
|
const UCHAR
|
*pPvcID; /**< Pointer to prediction coefficient matrix index table */
|
UCHAR pastEsgSlotsAvail; /**< Number of past Esg(ksg,t) which are available
|
for smoothing filter */
|
const FIXP_SGL *pSCcoeffs; /**< Pointer to smoothing window table */
|
SCHAR
|
sg_offset_low[PVC_NBLOW + 1]; /**< Offset table for PVC grouping of SBR
|
subbands below SBR range */
|
SCHAR sg_offset_high_kx[PVC_NBHIGH_MAX + 1]; /**< Offset table for PVC
|
grouping of SBR subbands in
|
SBR range (relativ to kx) */
|
UCHAR nbHigh; /**< Number of grouped QMF subbands in the SBR range */
|
const SCHAR *pScalingCoef; /**< Pointer to scaling coeff table */
|
const UCHAR *pPVCTab1; /**< PVC mode 1 table */
|
const UCHAR *pPVCTab2; /**< PVC mode 2 table */
|
const UCHAR *pPVCTab1_dp; /**< Mapping of pvcID to PVC mode 1 table */
|
FIXP_DBL predEsg[PVC_NTIMESLOT]
|
[PVC_NBHIGH_MAX]; /**< Predicted Energy in linear domain */
|
int predEsg_exp[PVC_NTIMESLOT]; /**< Exponent of predicted Energy in linear
|
domain */
|
int predEsg_expMax; /**< Maximum of predEsg_exp[] */
|
} PVC_DYNAMIC_DATA;
|
|
/**
|
* \brief Initialize PVC data structures for current frame (call if pvcMode =
|
* 0,1,2)
|
* \param[in] pPvcStaticData Pointer to PVC persistent data
|
* \param[out] pPvcDynamicData Pointer to PVC dynamic data
|
* \param[in] pvcMode PVC mode 1 or 2, 0 means legacy SBR
|
* \param[in] ns Number of time slots for time-domain smoothing of Esg(ksg,t)
|
* \param[in] RATE Number of QMF subband samples per time slot (2 or 4)
|
* \param[in] kx Index of the first QMF subband in the SBR range
|
* \param[in] pvcBorder0 Start SBR time slot of PVC frame
|
* \param[in] pPvcID Pointer to array of PvcIDs read from bitstream
|
*/
|
int pvcInitFrame(PVC_STATIC_DATA *pPvcStaticData,
|
PVC_DYNAMIC_DATA *pPvcDynamicData, const UCHAR pvcMode,
|
const UCHAR ns, const int RATE, const int kx,
|
const int pvcBorder0, const UCHAR *pPvcID);
|
|
/**
|
* \brief Wrapper function for pvcDecodeTimeSlot() to decode PVC data of one
|
* frame (call if pvcMode = 1,2)
|
* \param[in,out] pPvcStaticData Pointer to PVC persistent data
|
* \param[in,out] pPvcDynamicData Pointer to PVC dynamic data
|
* \param[in] qmfBufferReal Pointer to array with real QMF subbands
|
* \param[in] qmfBufferImag Pointer to array with imag QMF subbands
|
* \param[in] overlap Number of QMF overlap slots
|
* \param[in] qmfExponentOverlap Exponent of qmfBuffer (low part) of overlap
|
* slots
|
* \param[in] qmfExponentCurrent Exponent of qmfBuffer (low part)
|
*/
|
void pvcDecodeFrame(PVC_STATIC_DATA *pPvcStaticData,
|
PVC_DYNAMIC_DATA *pPvcDynamicData, FIXP_DBL **qmfBufferReal,
|
FIXP_DBL **qmfBufferImag, const int overlap,
|
const int qmfExponentOverlap, const int qmfExponentCurrent);
|
|
/**
|
* \brief Decode PVC data for one SBR time slot (call if pvcMode = 1,2)
|
* \param[in,out] pPvcStaticData Pointer to PVC persistent data
|
* \param[in,out] pPvcDynamicData Pointer to PVC dynamic data
|
* \param[in] qmfBufferReal Pointer to array with real QMF subbands
|
* \param[in] qmfBufferImag Pointer to array with imag QMF subbands
|
* \param[in] qmfExponent Exponent of qmfBuffer of current time slot
|
* \param[in] pvcBorder0 Start SBR time slot of PVC frame
|
* \param[in] timeSlotNumber Number of current SBR time slot (0..15)
|
* \param[out] predictedEsgSlot Predicted Energy of current time slot
|
* \param[out] predictedEsg_exp Exponent of predicted Energy of current time
|
* slot
|
*/
|
void pvcDecodeTimeSlot(PVC_STATIC_DATA *pPvcStaticData,
|
PVC_DYNAMIC_DATA *pPvcDynamicData,
|
FIXP_DBL **qmfSlotReal, FIXP_DBL **qmfSlotImag,
|
const int qmfExponent, const int pvcBorder0,
|
const int timeSlotNumber, FIXP_DBL predictedEsgSlot[],
|
int *predictedEsg_exp);
|
|
/**
|
* \brief Finish the current PVC frame (call if pvcMode = 0,1,2)
|
* \param[in,out] pPvcStaticData Pointer to PVC persistent data
|
* \param[in,out] pPvcDynamicData Pointer to PVC dynamic data
|
*/
|
void pvcEndFrame(PVC_STATIC_DATA *pPvcStaticData,
|
PVC_DYNAMIC_DATA *pPvcDynamicData);
|
|
/**
|
* \brief Expand predicted PVC grouped energies to full QMF subband resolution
|
* \param[in] pPvcDynamicData Pointer to PVC dynamic data
|
* \param[in] timeSlot Number of current SBR time slot (0..15)
|
* \param[in] lengthOutputVector Lenght of output vector
|
* \param[out] pOutput Output array for predicted energies
|
* \param[out] pOutput_exp Exponent of predicted energies
|
*/
|
void expandPredEsg(const PVC_DYNAMIC_DATA *pPvcDynamicData, const int timeSlot,
|
const int lengthOutputVector, FIXP_DBL *pOutput,
|
SCHAR *pOutput_exp);
|
|
#endif /* PVC_DEC_H*/
|