Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /**************************** SBR decoder library ******************************
     96 
     97    Author(s):
     98 
     99    Description:
    100 
    101 *******************************************************************************/
    102 
    103 /*!
    104   \file
    105   \brief  Sbr decoder
    106 */
    107 #ifndef PSDEC_H
    108 #define PSDEC_H
    109 
    110 #include "sbrdecoder.h"
    111 #include "FDK_hybrid.h"
    112 
    113 #include "FDK_decorrelate.h"
    114 
    115 /* This PS decoder implements the baseline version. So it always uses the     */
    116 /* hybrid filter structure for 20 stereo bands and does not implemet IPD/OPD  */
    117 /* synthesis. The baseline version has to support the complete PS bitstream   */
    118 /* syntax. But IPD/OPD data is ignored and set to 0. If 34 stereo band config */
    119 /* is used in the bitstream for IIS/ICC the decoded parameters are mapped to  */
    120 /* 20 stereo bands.                                                           */
    121 
    122 #include "FDK_bitstream.h"
    123 
    124 #define SCAL_HEADROOM (2)
    125 
    126 #define PS_EXTENSION_SIZE_BITS (4)
    127 #define PS_EXTENSION_ESC_COUNT_BITS (8)
    128 
    129 #define NO_QMF_CHANNELS (64)
    130 #define MAX_NUM_COL (32)
    131 
    132 #define NO_QMF_BANDS_HYBRID20 (3)
    133 #define NO_SUB_QMF_CHANNELS (12)
    134 #define HYBRID_FILTER_DELAY (6)
    135 
    136 #define MAX_NO_PS_ENV (4 + 1) /* +1 needed for VAR_BORDER */
    137 
    138 #define NO_HI_RES_BINS (34)
    139 #define NO_MID_RES_BINS (20)
    140 #define NO_LOW_RES_BINS (10)
    141 
    142 #define NO_HI_RES_IID_BINS (NO_HI_RES_BINS)
    143 #define NO_HI_RES_ICC_BINS (NO_HI_RES_BINS)
    144 
    145 #define NO_MID_RES_IID_BINS (NO_MID_RES_BINS)
    146 #define NO_MID_RES_ICC_BINS (NO_MID_RES_BINS)
    147 
    148 #define NO_LOW_RES_IID_BINS (NO_LOW_RES_BINS)
    149 #define NO_LOW_RES_ICC_BINS (NO_LOW_RES_BINS)
    150 
    151 #define SUBQMF_GROUPS (10)
    152 #define QMF_GROUPS (12)
    153 
    154 //#define SUBQMF_GROUPS_HI_RES            ( 32 )
    155 //#define QMF_GROUPS_HI_RES               ( 18 )
    156 
    157 #define NO_IID_GROUPS (SUBQMF_GROUPS + QMF_GROUPS)
    158 //#define NO_IID_GROUPS_HI_RES            ( SUBQMF_GROUPS_HI_RES +
    159 // QMF_GROUPS_HI_RES )
    160 
    161 #define NO_IID_STEPS (7)       /* 1 .. + 7 */
    162 #define NO_IID_STEPS_FINE (15) /* 1 .. +15 */
    163 #define NO_ICC_STEPS (8)       /* 0 .. + 7 */
    164 
    165 #define NO_IID_LEVELS (2 * NO_IID_STEPS + 1)           /* - 7 ..  + 7 */
    166 #define NO_IID_LEVELS_FINE (2 * NO_IID_STEPS_FINE + 1) /* -15 ..  +15 */
    167 #define NO_ICC_LEVELS (NO_ICC_STEPS)                   /*   0 ..  + 7 */
    168 
    169 #define FIXP_SQRT05 ((FIXP_DBL)0x5a827980) /* 1/SQRT2 */
    170 
    171 struct PS_DEC_COEFFICIENTS {
    172   FIXP_DBL H11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    173   FIXP_DBL H12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    174   FIXP_DBL H21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    175   FIXP_DBL H22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    176 
    177   FIXP_DBL
    178   DeltaH11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    179   FIXP_DBL
    180   DeltaH12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    181   FIXP_DBL
    182   DeltaH21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    183   FIXP_DBL
    184   DeltaH22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */
    185 
    186   SCHAR
    187   aaIidIndexMapped[MAX_NO_PS_ENV]
    188                   [NO_HI_RES_IID_BINS]; /*!< The mapped IID index for all
    189                                            envelopes and all IID bins */
    190   SCHAR
    191   aaIccIndexMapped[MAX_NO_PS_ENV]
    192                   [NO_HI_RES_ICC_BINS]; /*!< The mapped ICC index for all
    193                                            envelopes and all ICC bins */
    194 };
    195 
    196 typedef enum { ppt_none = 0, ppt_mpeg = 1, ppt_drm = 2 } PS_PAYLOAD_TYPE;
    197 
    198 typedef struct {
    199   UCHAR bPsHeaderValid; /*!< set if new header is available from bitstream */
    200 
    201   UCHAR bEnableIid; /*!< One bit denoting the presence of IID parameters */
    202   UCHAR bEnableIcc; /*!< One bit denoting the presence of ICC parameters */
    203   UCHAR bEnableExt; /*!< The PS extension layer is enabled using the enable_ext
    204                        bit. If it is set to %1 the IPD and OPD parameters are
    205                        sent. If it is disabled, i.e. %0, the extension layer is
    206                        skipped.   */
    207 
    208   UCHAR
    209   modeIid;       /*!< The configuration of IID parameters (number of bands and
    210                       quantisation grid, iid_quant) is determined by iid_mode.   */
    211   UCHAR modeIcc; /*!< The configuration of Inter-channel Coherence parameters
    212                       (number of bands and quantisation grid) is determined by
    213                       icc_mode. */
    214 
    215   UCHAR freqResIid; /*!< 0=low, 1=mid or 2=high frequency resolution for iid */
    216   UCHAR freqResIcc; /*!< 0=low, 1=mid or 2=high frequency resolution for icc */
    217 
    218   UCHAR bFineIidQ; /*!< Use fine Iid quantisation. */
    219 
    220   UCHAR bFrameClass; /*!< The frame_class bit determines whether the parameter
    221                           positions of the current frame are uniformly spaced
    222                           accross the frame or they are defined using the
    223                         positions described by border_position.
    224                       */
    225 
    226   UCHAR noEnv; /*!< The number of envelopes per frame */
    227   UCHAR aEnvStartStop[MAX_NO_PS_ENV + 1]; /*!< In case of variable parameter
    228                                              spacing the parameter positions are
    229                                              determined by border_position */
    230 
    231   SCHAR abIidDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for IID, 0
    232                                        => freq           */
    233   SCHAR abIccDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for ICC, 0
    234                                        => freq           */
    235 
    236   SCHAR
    237   aaIidIndex[MAX_NO_PS_ENV]
    238             [NO_HI_RES_IID_BINS]; /*!< The IID index for all envelopes and
    239                                      all IID bins        */
    240   SCHAR
    241   aaIccIndex[MAX_NO_PS_ENV]
    242             [NO_HI_RES_ICC_BINS]; /*!< The ICC index for all envelopes and
    243                                      all ICC bins        */
    244 
    245 } MPEG_PS_BS_DATA;
    246 
    247 struct PS_DEC {
    248   SCHAR noSubSamples;
    249   SCHAR noChannels;
    250 
    251   SCHAR procFrameBased; /*!< Helper to detected switching from frame based to
    252                            slot based processing
    253                          */
    254 
    255   PS_PAYLOAD_TYPE
    256   bPsDataAvail[(1) + 1]; /*!< set if new data available from bitstream */
    257   UCHAR psDecodedPrv;    /*!< set if PS has been processed in the last frame */
    258 
    259   /* helpers for frame delay line */
    260   UCHAR bsLastSlot;  /*!< Index of last read slot.  */
    261   UCHAR bsReadSlot;  /*!< Index of current read slot for additional delay.  */
    262   UCHAR processSlot; /*!< Index of current slot for processing (need for add.
    263                         delay).   */
    264 
    265   union { /* Bitstream data */
    266     MPEG_PS_BS_DATA
    267     mpeg; /*!< Struct containing all MPEG specific PS data from bitstream.
    268            */
    269   } bsData[(1) + 1];
    270 
    271   shouldBeUnion { /* Static data */
    272     struct {
    273       SCHAR aIidPrevFrameIndex[NO_HI_RES_IID_BINS]; /*!< The IID index for
    274                                                        previous frame */
    275       SCHAR aIccPrevFrameIndex[NO_HI_RES_ICC_BINS]; /*!< The ICC index for
    276                                                        previous frame */
    277       UCHAR
    278       bPrevFrameFineIidQ; /*!< The IID quantization of the previous frame */
    279       UCHAR lastUsb; /*!< uppermost WMF delay band of last frame          */
    280 
    281       FIXP_DBL pHybridAnaStatesLFdmx
    282           [2 * 13 * NO_QMF_BANDS_HYBRID20]; /*!< Memory used in hybrid analysis
    283                                                  for filter states. */
    284       FDK_ANA_HYB_FILTER hybridAnalysis;
    285       FDK_SYN_HYB_FILTER hybridSynthesis[2];
    286 
    287       DECORR_DEC apDecor; /*!< Decorrelator instance. */
    288       FIXP_DBL decorrBufferCplx[(2 * ((825) + (373)))];
    289 
    290       FIXP_DBL h11rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy)
    291                                            coefficients */
    292       FIXP_DBL h12rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy)
    293                                            coefficients */
    294       FIXP_DBL h21rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy)
    295                                            coefficients */
    296       FIXP_DBL h22rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy)
    297                                            coefficients */
    298 
    299       PS_DEC_COEFFICIENTS
    300       *pCoef; /*!< temporal coefficients are on reusable scratch memory */
    301 
    302     } mpeg;
    303   }
    304   specificTo;
    305 };
    306 
    307 typedef struct PS_DEC *HANDLE_PS_DEC;
    308 
    309 int CreatePsDec(HANDLE_PS_DEC *h_PS_DEC, int aacSamplesPerFrame);
    310 
    311 int DeletePsDec(HANDLE_PS_DEC *h_PS_DEC);
    312 
    313 void PreparePsProcessing(HANDLE_PS_DEC h_ps_d,
    314                          const FIXP_DBL *const *const rIntBufferLeft,
    315                          const FIXP_DBL *const *const iIntBufferLeft,
    316                          const int scaleFactorLowBand);
    317 
    318 void initSlotBasedRotation(HANDLE_PS_DEC h_ps_d, int env, int usb);
    319 
    320 void ApplyPsSlot(
    321     HANDLE_PS_DEC h_ps_d,      /* parametric stereo decoder handle    */
    322     FIXP_DBL **rIntBufferLeft, /* real values of left qmf timeslot    */
    323     FIXP_DBL **iIntBufferLeft, /* imag values of left qmf timeslot    */
    324     FIXP_DBL *rIntBufferRight, /* real values of right qmf timeslot   */
    325     FIXP_DBL *iIntBufferRight, /* imag values of right qmf timeslot   */
    326     const int scaleFactorLowBand_no_ov, const int scaleFactorLowBand,
    327     const int scaleFactorHighBand, const int lsb, const int usb);
    328 
    329 #endif /* PSDEC_H */
    330