aboutsummaryrefslogtreecommitdiffstats
path: root/libSBRdec/src/pvc_dec.h
diff options
context:
space:
mode:
Diffstat (limited to 'libSBRdec/src/pvc_dec.h')
-rw-r--r--libSBRdec/src/pvc_dec.h238
1 files changed, 238 insertions, 0 deletions
diff --git a/libSBRdec/src/pvc_dec.h b/libSBRdec/src/pvc_dec.h
new file mode 100644
index 0000000..f5a467f
--- /dev/null
+++ b/libSBRdec/src/pvc_dec.h
@@ -0,0 +1,238 @@
+/* -----------------------------------------------------------------------------
+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*/