diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 20:15:44 +0200 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 20:15:44 +0200 | 
| commit | 14c7b800eaa23e9da7c92c7c4df397d0c191f097 (patch) | |
| tree | d840b6ec41ff74d1184ca1dcd7731d08f1e9ebbb /libSBRenc/src | |
| parent | 78a801e4d716c6f2403cc56cf6c5b6f138f24b2f (diff) | |
| download | ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.tar.gz ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.tar.bz2 ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.zip  | |
Remove FDK-AAC
Diffstat (limited to 'libSBRenc/src')
41 files changed, 0 insertions, 21206 deletions
diff --git a/libSBRenc/src/bit_sbr.cpp b/libSBRenc/src/bit_sbr.cpp deleted file mode 100644 index 963aeff..0000000 --- a/libSBRenc/src/bit_sbr.cpp +++ /dev/null @@ -1,1059 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  SBR bit writing routines   -*/ - - -#include "bit_sbr.h" - -#include "code_env.h" -#include "cmondata.h" -#include "sbr.h" - -#include "ps_main.h" - -typedef enum { -  SBR_ID_SCE = 1, -  SBR_ID_CPE -} SBR_ELEMENT_TYPE; - - -static INT encodeSbrData (HANDLE_SBR_ENV_DATA       sbrEnvDataLeft, -                          HANDLE_SBR_ENV_DATA       sbrEnvDataRight, -                          HANDLE_PARAMETRIC_STEREO  hParametricStereo, -                          HANDLE_COMMON_DATA        cmonData, -                          SBR_ELEMENT_TYPE          sbrElem, -                          INT                       coupling, -                          UINT                      sbrSyntaxFlags); - -static INT encodeSbrHeader (HANDLE_SBR_HEADER_DATA     sbrHeaderData, -                            HANDLE_SBR_BITSTREAM_DATA  sbrBitstreamData, -                            HANDLE_COMMON_DATA         cmonData); - - -static INT encodeSbrHeaderData (HANDLE_SBR_HEADER_DATA sbrHeaderData, -                                HANDLE_FDK_BITSTREAM   hBitStream); - -static INT encodeSbrSingleChannelElement (HANDLE_SBR_ENV_DATA      sbrEnvData, -                                          HANDLE_FDK_BITSTREAM     hBitStream -                                          ,HANDLE_PARAMETRIC_STEREO hParametricStereo -                                          ,UINT  sbrSyntaxFlags -                                          ); - - - -static INT encodeSbrChannelPairElement (HANDLE_SBR_ENV_DATA      sbrEnvDataLeft, -                                        HANDLE_SBR_ENV_DATA      sbrEnvDataRight, -                                        HANDLE_PARAMETRIC_STEREO hParametricStereo, -                                        HANDLE_FDK_BITSTREAM     hBitStream, -                                        INT                      coupling); - - -static INT encodeSbrGrid (HANDLE_SBR_ENV_DATA   sbrEnvData, -                          HANDLE_FDK_BITSTREAM  hBitStream); - -static int encodeLowDelaySbrGrid ( HANDLE_SBR_ENV_DATA sbrEnvData, -                                   HANDLE_FDK_BITSTREAM hBitStream, -                                   int transmitFreqs); - -static INT encodeSbrDtdf (HANDLE_SBR_ENV_DATA   sbrEnvData, -                          HANDLE_FDK_BITSTREAM  hBitStream); - -static INT writeNoiseLevelData (HANDLE_SBR_ENV_DATA   sbrEnvData, -                                HANDLE_FDK_BITSTREAM  hBitStream, -                                INT                   coupling); - -static INT writeEnvelopeData (HANDLE_SBR_ENV_DATA    sbrEnvData, -                              HANDLE_FDK_BITSTREAM   hBitStream, -                              INT                    coupling); - -static INT writeSyntheticCodingData (HANDLE_SBR_ENV_DATA  sbrEnvData, -                                     HANDLE_FDK_BITSTREAM hBitStream); - - -static INT encodeExtendedData (HANDLE_PARAMETRIC_STEREO hParametricStereo, -                               HANDLE_FDK_BITSTREAM     hBitStream); - - - -static INT getSbrExtendedDataSize (HANDLE_PARAMETRIC_STEREO  hParametricStereo); - -/***************************************************************************** - -    functionname: FDKsbrEnc_WriteEnvSingleChannelElement -    description:  writes pure SBR single channel data element -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -INT -FDKsbrEnc_WriteEnvSingleChannelElement( -                                       HANDLE_SBR_HEADER_DATA sbrHeaderData, -                                       HANDLE_PARAMETRIC_STEREO         hParametricStereo, -                                       HANDLE_SBR_BITSTREAM_DATA        sbrBitstreamData, -                                       HANDLE_SBR_ENV_DATA              sbrEnvData, -                                       HANDLE_COMMON_DATA               cmonData, -                                       UINT                             sbrSyntaxFlags -                                      ) - -{ -  INT payloadBits = 0; - -  cmonData->sbrHdrBits  = 0; -  cmonData->sbrDataBits = 0; - -  /* write pure sbr data */ -  if (sbrEnvData != NULL) { - -    /* write header */ -    payloadBits += encodeSbrHeader (sbrHeaderData, -                                    sbrBitstreamData, -                                    cmonData); - - -    /* write data */ -    payloadBits += encodeSbrData (sbrEnvData, -                                  NULL, -                                  hParametricStereo, -                                  cmonData, -                                  SBR_ID_SCE, -                                  0, -                                  sbrSyntaxFlags); - -  } -  return payloadBits; -} - -/***************************************************************************** - -    functionname: FDKsbrEnc_WriteEnvChannelPairElement -    description:  writes pure SBR channel pair data element -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -INT -FDKsbrEnc_WriteEnvChannelPairElement (HANDLE_SBR_HEADER_DATA     sbrHeaderData, -                                      HANDLE_PARAMETRIC_STEREO   hParametricStereo, -                                      HANDLE_SBR_BITSTREAM_DATA  sbrBitstreamData, -                                      HANDLE_SBR_ENV_DATA        sbrEnvDataLeft, -                                      HANDLE_SBR_ENV_DATA        sbrEnvDataRight, -                                      HANDLE_COMMON_DATA         cmonData, -                                      UINT                       sbrSyntaxFlags) - -{ -  INT payloadBits = 0; -  cmonData->sbrHdrBits  = 0; -  cmonData->sbrDataBits = 0; - -  /* write pure sbr data */ -  if ((sbrEnvDataLeft != NULL) && (sbrEnvDataRight != NULL)) { - -    /* write header */ -    payloadBits += encodeSbrHeader (sbrHeaderData, -                                    sbrBitstreamData, -                                    cmonData); - -    /* write data */ -    payloadBits += encodeSbrData (sbrEnvDataLeft, -                                  sbrEnvDataRight, -                                  hParametricStereo, -                                  cmonData, -                                  SBR_ID_CPE, -                                  sbrHeaderData->coupling, -                                  sbrSyntaxFlags); - -  } -  return payloadBits; -} - -INT -FDKsbrEnc_CountSbrChannelPairElement (HANDLE_SBR_HEADER_DATA     sbrHeaderData, -                                      HANDLE_PARAMETRIC_STEREO   hParametricStereo, -                                      HANDLE_SBR_BITSTREAM_DATA  sbrBitstreamData, -                                      HANDLE_SBR_ENV_DATA        sbrEnvDataLeft, -                                      HANDLE_SBR_ENV_DATA        sbrEnvDataRight, -                                      HANDLE_COMMON_DATA         cmonData, -                                      UINT                       sbrSyntaxFlags) -{ -  INT payloadBits; -  INT bitPos = FDKgetValidBits(&cmonData->sbrBitbuf); - -  payloadBits = FDKsbrEnc_WriteEnvChannelPairElement(sbrHeaderData, -                                           hParametricStereo, -                                           sbrBitstreamData, -                                           sbrEnvDataLeft, -                                           sbrEnvDataRight, -                                           cmonData, -                                           sbrSyntaxFlags); - -  FDKpushBack(&cmonData->sbrBitbuf, (FDKgetValidBits(&cmonData->sbrBitbuf) - bitPos) ); - -  return payloadBits; -} - - -void sbrEncoder_GetHeader(SBR_ENCODER   *sbrEncoder, -                          HANDLE_FDK_BITSTREAM hBs, -                          INT            element_index, -                          int            fSendHeaders) -{ -  int bits; - -  bits = encodeSbrHeaderData (&sbrEncoder->sbrElement[element_index]->sbrHeaderData, hBs); -     -  if (fSendHeaders == 0) { -    /* Prevent header being embedded into the SBR payload. */ -    sbrEncoder->sbrElement[element_index]->sbrBitstreamData.NrSendHeaderData = -1; -    sbrEncoder->sbrElement[element_index]->sbrBitstreamData.HeaderActive = 0; -    sbrEncoder->sbrElement[element_index]->sbrBitstreamData.CountSendHeaderData = -1; -  } -} - - -/***************************************************************************** - -    functionname: encodeSbrHeader -    description:  encodes SBR Header information -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrHeader (HANDLE_SBR_HEADER_DATA     sbrHeaderData, -                 HANDLE_SBR_BITSTREAM_DATA  sbrBitstreamData, -                 HANDLE_COMMON_DATA         cmonData) -{ -  INT payloadBits = 0; - -  if (sbrBitstreamData->HeaderActive) { -    payloadBits += FDKwriteBits (&cmonData->sbrBitbuf, 1, 1); -    payloadBits += encodeSbrHeaderData (sbrHeaderData, -                                        &cmonData->sbrBitbuf); -  } -  else { -    payloadBits += FDKwriteBits (&cmonData->sbrBitbuf, 0, 1); -  } - -  cmonData->sbrHdrBits = payloadBits; - -  return payloadBits; -} - - - -/***************************************************************************** - -    functionname: encodeSbrHeaderData -    description:  writes sbr_header() -                  bs_protocol_version through bs_header_extra_2 -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrHeaderData (HANDLE_SBR_HEADER_DATA sbrHeaderData, -                     HANDLE_FDK_BITSTREAM hBitStream) - -{ -  INT payloadBits = 0; -  if (sbrHeaderData != NULL) { -    payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_amp_res, -                              SI_SBR_AMP_RES_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_start_frequency, -                              SI_SBR_START_FREQ_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_stop_frequency, -                              SI_SBR_STOP_FREQ_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_xover_band, -                              SI_SBR_XOVER_BAND_BITS); - -    payloadBits += FDKwriteBits (hBitStream, 0, -                              SI_SBR_RESERVED_BITS); - -    payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->header_extra_1, -                              SI_SBR_HEADER_EXTRA_1_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->header_extra_2, -                              SI_SBR_HEADER_EXTRA_2_BITS); - - -    if (sbrHeaderData->header_extra_1) { -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->freqScale, -                                SI_SBR_FREQ_SCALE_BITS); -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->alterScale, -                                SI_SBR_ALTER_SCALE_BITS); -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_noise_bands, -                                SI_SBR_NOISE_BANDS_BITS); -    } /* sbrHeaderData->header_extra_1 */ - -    if (sbrHeaderData->header_extra_2) { -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_limiter_bands, -                                SI_SBR_LIMITER_BANDS_BITS); -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_limiter_gains, -                                SI_SBR_LIMITER_GAINS_BITS); -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_interpol_freq, -                                SI_SBR_INTERPOL_FREQ_BITS); -      payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_smoothing_length, -                                SI_SBR_SMOOTHING_LENGTH_BITS); - -    } /* sbrHeaderData->header_extra_2 */ -  } /* sbrHeaderData != NULL */ - -  return payloadBits; -} - - -/***************************************************************************** - -    functionname: encodeSbrData -    description:  encodes sbr Data information -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrData (HANDLE_SBR_ENV_DATA   sbrEnvDataLeft, -               HANDLE_SBR_ENV_DATA   sbrEnvDataRight, -               HANDLE_PARAMETRIC_STEREO   hParametricStereo, -               HANDLE_COMMON_DATA    cmonData, -               SBR_ELEMENT_TYPE      sbrElem, -               INT                   coupling, -               UINT                  sbrSyntaxFlags) -{ -  INT payloadBits = 0; - -  switch (sbrElem) { -  case SBR_ID_SCE: -    payloadBits += encodeSbrSingleChannelElement (sbrEnvDataLeft, &cmonData->sbrBitbuf, hParametricStereo, sbrSyntaxFlags); -    break; -  case SBR_ID_CPE: -    payloadBits += encodeSbrChannelPairElement (sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo, &cmonData->sbrBitbuf, coupling); -    break; -  default: -    /* we never should apply SBR to any other element type */ -    FDK_ASSERT (0); -  } - -  cmonData->sbrDataBits = payloadBits; - -  return payloadBits; -} - -#define MODE_FREQ_TANS                          1 -#define MODE_NO_FREQ_TRAN                       0 -#define LD_TRANSMISSION                         MODE_FREQ_TANS -static int encodeFreqs (int mode) { -    return ((mode & MODE_FREQ_TANS) ? 1 : 0); -} - - -/***************************************************************************** - -    functionname: encodeSbrSingleChannelElement -    description:  encodes sbr SCE information -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrSingleChannelElement (HANDLE_SBR_ENV_DATA   sbrEnvData, -                               HANDLE_FDK_BITSTREAM  hBitStream -                               ,HANDLE_PARAMETRIC_STEREO hParametricStereo -                               ,UINT  sbrSyntaxFlags -                               ) -{ -  INT i, payloadBits = 0; - -  payloadBits += FDKwriteBits (hBitStream, 0, SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */ - -  if (sbrEnvData->ldGrid) { -      if ( sbrEnvData->hSbrBSGrid->frameClass != FIXFIXonly ) { -        /* encode normal SbrGrid */ -        payloadBits += encodeSbrGrid (sbrEnvData, hBitStream); -      } else { -        /* use FIXFIXonly frame Grid */ -        payloadBits += encodeLowDelaySbrGrid ( sbrEnvData, hBitStream, encodeFreqs(LD_TRANSMISSION)); -      } -  } -  else -  { -    if (sbrSyntaxFlags & SBR_SYNTAX_SCALABLE) { -      payloadBits += FDKwriteBits (hBitStream, 1, SI_SBR_COUPLING_BITS); -    } -    payloadBits += encodeSbrGrid (sbrEnvData, hBitStream); -  } - -  payloadBits += encodeSbrDtdf (sbrEnvData, hBitStream); - -  for (i = 0; i < sbrEnvData->noOfnoisebands; i++) { -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS); -  } - -  payloadBits += writeEnvelopeData (sbrEnvData, hBitStream, 0); -  payloadBits += writeNoiseLevelData (sbrEnvData, hBitStream, 0); - -  payloadBits += writeSyntheticCodingData (sbrEnvData,hBitStream); - -  payloadBits += encodeExtendedData(hParametricStereo, hBitStream); - -  return payloadBits; -} - - -/***************************************************************************** - -    functionname: encodeSbrChannelPairElement -    description:  encodes sbr CPE information -    returns: -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrChannelPairElement (HANDLE_SBR_ENV_DATA   sbrEnvDataLeft, -                             HANDLE_SBR_ENV_DATA   sbrEnvDataRight, -                             HANDLE_PARAMETRIC_STEREO   hParametricStereo, -                             HANDLE_FDK_BITSTREAM  hBitStream, -                             INT                   coupling) -{ -  INT payloadBits = 0; -  INT i = 0; - -  payloadBits += FDKwriteBits (hBitStream, 0, SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */ - -  payloadBits += FDKwriteBits (hBitStream, coupling, SI_SBR_COUPLING_BITS); - -  if (coupling) { -    if (sbrEnvDataLeft->ldGrid) { -          if ( sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly ) { -            /* normal SbrGrid */ -            payloadBits += encodeSbrGrid (sbrEnvDataLeft, hBitStream); - -          } else { -              /* FIXFIXonly frame Grid */ -              payloadBits += encodeLowDelaySbrGrid ( sbrEnvDataLeft, hBitStream, encodeFreqs(LD_TRANSMISSION)); -          } -    } else -        payloadBits += encodeSbrGrid (sbrEnvDataLeft, hBitStream); - -    payloadBits += encodeSbrDtdf (sbrEnvDataLeft, hBitStream); -    payloadBits += encodeSbrDtdf (sbrEnvDataRight, hBitStream); - -    for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS); -    } - -    payloadBits += writeEnvelopeData  (sbrEnvDataLeft,  hBitStream,1); -    payloadBits += writeNoiseLevelData (sbrEnvDataLeft,  hBitStream,1); -    payloadBits += writeEnvelopeData  (sbrEnvDataRight, hBitStream,1); -    payloadBits += writeNoiseLevelData (sbrEnvDataRight, hBitStream,1); - -    payloadBits += writeSyntheticCodingData (sbrEnvDataLeft,hBitStream); -    payloadBits += writeSyntheticCodingData (sbrEnvDataRight,hBitStream); - -  } else { /* no coupling */ -    FDK_ASSERT(sbrEnvDataLeft->ldGrid == sbrEnvDataRight->ldGrid); - -    if (sbrEnvDataLeft->ldGrid || sbrEnvDataRight->ldGrid) { -    /* sbrEnvDataLeft (left channel) */ -      if ( sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) { -        /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */ -        /* normal SbrGrid */ -        payloadBits += encodeSbrGrid (sbrEnvDataLeft,  hBitStream); - -      } else { -        /* FIXFIXonly frame Grid */ -          payloadBits += encodeLowDelaySbrGrid ( sbrEnvDataLeft, hBitStream, encodeFreqs(LD_TRANSMISSION)); -      } - -      /* sbrEnvDataRight (right channel) */ -      if ( sbrEnvDataRight->hSbrBSGrid->frameClass != FIXFIXonly) { -        /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */ -        /* normal SbrGrid */ -        payloadBits += encodeSbrGrid (sbrEnvDataRight, hBitStream); - -      } else { -        /* FIXFIXonly frame Grid */ -          payloadBits += encodeLowDelaySbrGrid ( sbrEnvDataRight, hBitStream, encodeFreqs(LD_TRANSMISSION)); -      } -    } else -    { -        payloadBits += encodeSbrGrid (sbrEnvDataLeft,  hBitStream); -        payloadBits += encodeSbrGrid (sbrEnvDataRight, hBitStream); -    } -    payloadBits += encodeSbrDtdf (sbrEnvDataLeft,  hBitStream); -    payloadBits += encodeSbrDtdf (sbrEnvDataRight, hBitStream); - -    for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i], -                                SI_SBR_INVF_MODE_BITS); -    } -    for (i = 0; i < sbrEnvDataRight->noOfnoisebands; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvDataRight->sbr_invf_mode_vec[i], -                                SI_SBR_INVF_MODE_BITS); -    } - -    payloadBits += writeEnvelopeData  (sbrEnvDataLeft,  hBitStream,0); -    payloadBits += writeEnvelopeData  (sbrEnvDataRight, hBitStream,0); -    payloadBits += writeNoiseLevelData (sbrEnvDataLeft,  hBitStream,0); -    payloadBits += writeNoiseLevelData (sbrEnvDataRight, hBitStream,0); - -    payloadBits += writeSyntheticCodingData (sbrEnvDataLeft,hBitStream); -    payloadBits += writeSyntheticCodingData (sbrEnvDataRight,hBitStream); - -  } /* coupling */ - -  payloadBits += encodeExtendedData(hParametricStereo, hBitStream); - -  return payloadBits; -} - -static INT ceil_ln2(INT x) -{ -  INT tmp=-1; -  while((1<<++tmp) < x); -  return(tmp); -} - - -/***************************************************************************** - -    functionname: encodeSbrGrid -    description:  if hBitStream != NULL writes bits that describes the -                  time/frequency grouping of a frame; else counts them only -    returns:      number of bits written or counted -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrGrid (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream) -{ -  INT payloadBits = 0; -  INT i, temp; -  INT bufferFrameStart = sbrEnvData->hSbrBSGrid->bufferFrameStart; -  INT numberTimeSlots  = sbrEnvData->hSbrBSGrid->numberTimeSlots; - -  if (sbrEnvData->ldGrid) -    payloadBits += FDKwriteBits (hBitStream, -                                 sbrEnvData->hSbrBSGrid->frameClass, -                                 SBR_CLA_BITS_LD); -  else -    payloadBits += FDKwriteBits (hBitStream, -                                 sbrEnvData->hSbrBSGrid->frameClass, -                                 SBR_CLA_BITS); - -  switch (sbrEnvData->hSbrBSGrid->frameClass) { -  case FIXFIXonly: -    FDK_ASSERT(0 /* Fatal error in encodeSbrGrid! */); -    break; -  case FIXFIX: -    temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_env); -    payloadBits += FDKwriteBits (hBitStream, temp, SBR_ENV_BITS); -    if ((sbrEnvData->ldGrid) && (sbrEnvData->hSbrBSGrid->bs_num_env==1)) -      payloadBits += FDKwriteBits(hBitStream, sbrEnvData->currentAmpResFF, SI_SBR_AMP_RES_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_f[0], SBR_RES_BITS); - -    break; - -  case FIXVAR: -  case VARFIX: -    if (sbrEnvData->hSbrBSGrid->frameClass == FIXVAR) -      temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - (bufferFrameStart + numberTimeSlots); -    else -      temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - bufferFrameStart; - -    payloadBits += FDKwriteBits (hBitStream, temp, SBR_ABS_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->n, SBR_NUM_BITS); - -    for (i = 0; i < sbrEnvData->hSbrBSGrid->n; i++) { -      temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord[i] - 2) >> 1; -      payloadBits += FDKwriteBits (hBitStream, temp, SBR_REL_BITS); -    } - -    temp = ceil_ln2(sbrEnvData->hSbrBSGrid->n + 2); -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->p, temp); - -    for (i = 0; i < sbrEnvData->hSbrBSGrid->n + 1; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_f[i], -                                SBR_RES_BITS); -    } -    break; - -  case VARVAR: -    temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_0 - bufferFrameStart; -    payloadBits += FDKwriteBits (hBitStream, temp, SBR_ABS_BITS); -    temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_1 - (bufferFrameStart + numberTimeSlots); -    payloadBits += FDKwriteBits (hBitStream, temp, SBR_ABS_BITS); - -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_0, SBR_NUM_BITS); -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_1, SBR_NUM_BITS); - -    for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_0; i++) { -      temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_0[i] - 2) >> 1; -      payloadBits += FDKwriteBits (hBitStream, temp, SBR_REL_BITS); -    } - -    for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_1; i++) { -      temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_1[i] - 2) >> 1; -      payloadBits += FDKwriteBits (hBitStream, temp, SBR_REL_BITS); -    } - -    temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_rel_0 + -                             sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 2); -    payloadBits +=  FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->p, temp); - -    temp = sbrEnvData->hSbrBSGrid->bs_num_rel_0 + -           sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 1; - -    for (i = 0; i < temp; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_fLR[i], -                                SBR_RES_BITS); -    } -    break; -  } - -  return payloadBits; -} - -#define SBR_CLA_BITS_LD 1 -/***************************************************************************** - -    functionname: encodeLowDelaySbrGrid -    description:  if hBitStream != NULL writes bits that describes the -                  time/frequency grouping of a frame; -                  else counts them only -                  (this function only write the FIXFIXonly Bitstream data) -    returns:      number of bits written or counted -    input: -    output: - -*****************************************************************************/ -static int -encodeLowDelaySbrGrid (  HANDLE_SBR_ENV_DATA sbrEnvData, -                         HANDLE_FDK_BITSTREAM hBitStream, -                         int transmitFreqs -                       ) -{ -  int payloadBits = 0; -  int i; - -  /* write FIXFIXonly Grid */ -  /* write frameClass [1 bit] for FIXFIXonly Grid */ -  payloadBits += FDKwriteBits(hBitStream, 1, SBR_CLA_BITS_LD); - -  /* absolute Borders are fix: 0,X,X,X,nTimeSlots; so we dont have to transmit them */ -  /* only transmit the transient position! */ -  /* with this info (b1) we can reconstruct the Frame on Decoder side : */ -  /* border[0] = 0; border[1] = b1; border[2]=b1+2; border[3] = nrTimeSlots */ - -  /* use 3 or 4bits for transient border (border) */ -  if (sbrEnvData->hSbrBSGrid->numberTimeSlots == 8) -    payloadBits += FDKwriteBits ( hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 3); -  else -    payloadBits += FDKwriteBits ( hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 4); - -  if (transmitFreqs) { -    /* write FreqRes grid */ -    for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_env; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_f[i], SBR_RES_BITS); -    } -  } - -  return payloadBits; -} - -/***************************************************************************** - -    functionname: encodeSbrDtdf -    description:  writes bits that describes the direction of the envelopes of a frame -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -encodeSbrDtdf (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream) -{ -  INT i, payloadBits = 0, noOfNoiseEnvelopes; - -  noOfNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1; - -  for (i = 0; i < sbrEnvData->noOfEnvelopes; ++i) { -    payloadBits += FDKwriteBits (hBitStream, sbrEnvData->domain_vec[i], SBR_DIR_BITS); -  } -  for (i = 0; i < noOfNoiseEnvelopes; ++i) { -    payloadBits +=  FDKwriteBits (hBitStream, sbrEnvData->domain_vec_noise[i], SBR_DIR_BITS); -  } - -  return payloadBits; -} - - -/***************************************************************************** - -    functionname: writeNoiseLevelData -    description:  writes bits corresponding to the noise-floor-level -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -writeNoiseLevelData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, INT coupling) -{ -  INT j, i, payloadBits = 0; -  INT nNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1; - -  for (i = 0; i < nNoiseEnvelopes; i++) { -    switch (sbrEnvData->domain_vec_noise[i]) { -    case FREQ: -      if (coupling && sbrEnvData->balance) { -        payloadBits += FDKwriteBits (hBitStream, -                                  sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands], -                                  sbrEnvData->si_sbr_start_noise_bits_balance); -      } else { -        payloadBits += FDKwriteBits (hBitStream, -                                  sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands], -                                  sbrEnvData->si_sbr_start_noise_bits); -      } - -      for (j = 1 + i * sbrEnvData->noOfnoisebands; j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) { -        if (coupling) { -          if (sbrEnvData->balance) { -            /* coupling && balance */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableNoiseBalanceFreqC[sbrEnvData->sbr_noise_levels[j] + -                                                                            CODE_BOOK_SCF_LAV_BALANCE11], -                                      sbrEnvData->hufftableNoiseBalanceFreqL[sbrEnvData->sbr_noise_levels[j] + -                                                                            CODE_BOOK_SCF_LAV_BALANCE11]); -          } else { -            /* coupling && !balance */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableNoiseLevelFreqC[sbrEnvData->sbr_noise_levels[j] + -                                                                          CODE_BOOK_SCF_LAV11], -                                      sbrEnvData->hufftableNoiseLevelFreqL[sbrEnvData->sbr_noise_levels[j] + -                                                                          CODE_BOOK_SCF_LAV11]); -          } -        } else { -          /* !coupling */ -          payloadBits += FDKwriteBits (hBitStream, -                                    sbrEnvData->hufftableNoiseFreqC[sbrEnvData->sbr_noise_levels[j] + -                                                                   CODE_BOOK_SCF_LAV11], -                                    sbrEnvData->hufftableNoiseFreqL[sbrEnvData->sbr_noise_levels[j] + -                                                                   CODE_BOOK_SCF_LAV11]); -        } -      } -      break; - -    case TIME: -      for (j = i * sbrEnvData->noOfnoisebands; j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) { -        if (coupling) { -          if (sbrEnvData->balance) { -            /* coupling && balance */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableNoiseBalanceTimeC[sbrEnvData->sbr_noise_levels[j] + -                                                                            CODE_BOOK_SCF_LAV_BALANCE11], -                                      sbrEnvData->hufftableNoiseBalanceTimeL[sbrEnvData->sbr_noise_levels[j] + -                                                                            CODE_BOOK_SCF_LAV_BALANCE11]); -          } else { -            /* coupling && !balance */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] + -                                                                          CODE_BOOK_SCF_LAV11], -                                      sbrEnvData->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] + -                                                                          CODE_BOOK_SCF_LAV11]); -          } -        } else { -          /* !coupling */ -          payloadBits += FDKwriteBits (hBitStream, -                                    sbrEnvData->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] + -                                                                        CODE_BOOK_SCF_LAV11], -                                    sbrEnvData->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] + -                                                                        CODE_BOOK_SCF_LAV11]); -        } -      } -      break; -    } -  } -  return payloadBits; -} - - -/***************************************************************************** - -    functionname: writeEnvelopeData -    description:  writes bits corresponding to the envelope -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT -writeEnvelopeData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, INT coupling) -{ -  INT payloadBits = 0, j, i, delta; - -  for (j = 0; j < sbrEnvData->noOfEnvelopes; j++) { /* loop over all envelopes */ -    if (sbrEnvData->domain_vec[j] == FREQ) { -      if (coupling && sbrEnvData->balance) { -        payloadBits += FDKwriteBits (hBitStream, sbrEnvData->ienvelope[j][0], sbrEnvData->si_sbr_start_env_bits_balance); -      } else { -        payloadBits += FDKwriteBits (hBitStream, sbrEnvData->ienvelope[j][0], sbrEnvData->si_sbr_start_env_bits); -      } -    } - -    for (i = 1 - sbrEnvData->domain_vec[j]; i < sbrEnvData->noScfBands[j]; i++) { -      delta = sbrEnvData->ienvelope[j][i]; -      if (coupling && sbrEnvData->balance) { -        FDK_ASSERT (fixp_abs (delta) <= sbrEnvData->codeBookScfLavBalance); -      } else { -        FDK_ASSERT (fixp_abs (delta) <= sbrEnvData->codeBookScfLav); -      } -      if (coupling) { -        if (sbrEnvData->balance) { -          if (sbrEnvData->domain_vec[j]) { -            /* coupling && balance && TIME */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableBalanceTimeC[delta + sbrEnvData->codeBookScfLavBalance], -                                      sbrEnvData->hufftableBalanceTimeL[delta + sbrEnvData->codeBookScfLavBalance]); -          } else { -            /* coupling && balance && FREQ */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableBalanceFreqC[delta + sbrEnvData->codeBookScfLavBalance], -                                      sbrEnvData->hufftableBalanceFreqL[delta + sbrEnvData->codeBookScfLavBalance]); -          } -        } else { -          if (sbrEnvData->domain_vec[j]) { -            /* coupling && !balance && TIME */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableLevelTimeC[delta + sbrEnvData->codeBookScfLav], -                                      sbrEnvData->hufftableLevelTimeL[delta + sbrEnvData->codeBookScfLav]); -          } else { -            /* coupling && !balance && FREQ */ -            payloadBits += FDKwriteBits (hBitStream, -                                      sbrEnvData->hufftableLevelFreqC[delta + sbrEnvData->codeBookScfLav], -                                      sbrEnvData->hufftableLevelFreqL[delta + sbrEnvData->codeBookScfLav]); -          } -        } -      } else { -        if (sbrEnvData->domain_vec[j]) { -          /* !coupling && TIME */ -          payloadBits += FDKwriteBits (hBitStream, -                                    sbrEnvData->hufftableTimeC[delta + sbrEnvData->codeBookScfLav], -                                    sbrEnvData->hufftableTimeL[delta + sbrEnvData->codeBookScfLav]); -        } else { -          /* !coupling && FREQ */ -          payloadBits += FDKwriteBits (hBitStream, -                                    sbrEnvData->hufftableFreqC[delta + sbrEnvData->codeBookScfLav], -                                    sbrEnvData->hufftableFreqL[delta + sbrEnvData->codeBookScfLav]); -        } -      } -    } -  } -  return payloadBits; -} - - -/***************************************************************************** - -    functionname: encodeExtendedData -    description:  writes bits corresponding to the extended data -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT encodeExtendedData (HANDLE_PARAMETRIC_STEREO  hParametricStereo, -                               HANDLE_FDK_BITSTREAM hBitStream) -{ -  INT extDataSize; -  INT payloadBits = 0; - -  extDataSize = getSbrExtendedDataSize(hParametricStereo); - - -  if (extDataSize != 0) { -    INT maxExtSize = (1<<SI_SBR_EXTENSION_SIZE_BITS) - 1; -    INT writtenNoBits = 0; /* needed to byte align the extended data */ - -    payloadBits += FDKwriteBits (hBitStream, 1, SI_SBR_EXTENDED_DATA_BITS); -    FDK_ASSERT(extDataSize <= SBR_EXTENDED_DATA_MAX_CNT); - -    if (extDataSize < maxExtSize) { -      payloadBits += FDKwriteBits (hBitStream, extDataSize, SI_SBR_EXTENSION_SIZE_BITS); -    } else { -      payloadBits += FDKwriteBits (hBitStream, maxExtSize, SI_SBR_EXTENSION_SIZE_BITS); -      payloadBits += FDKwriteBits (hBitStream, extDataSize - maxExtSize, SI_SBR_EXTENSION_ESC_COUNT_BITS); -    } - -    /* parametric coding signalled here? */ -    if(hParametricStereo){ -      writtenNoBits += FDKwriteBits (hBitStream, EXTENSION_ID_PS_CODING, SI_SBR_EXTENSION_ID_BITS); -      writtenNoBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, hBitStream); -    } - -    payloadBits += writtenNoBits; - -    /* byte alignment */ -    writtenNoBits = writtenNoBits%8; -    if(writtenNoBits) -      payloadBits += FDKwriteBits(hBitStream, 0, (8 - writtenNoBits)); -  } else { -    payloadBits += FDKwriteBits (hBitStream, 0, SI_SBR_EXTENDED_DATA_BITS); -  } - -  return payloadBits; -} - - -/***************************************************************************** - -    functionname: writeSyntheticCodingData -    description:  writes bits corresponding to the "synthetic-coding"-extension -    returns:      number of bits written -    input: -    output: - -*****************************************************************************/ -static INT writeSyntheticCodingData (HANDLE_SBR_ENV_DATA  sbrEnvData, -                                     HANDLE_FDK_BITSTREAM hBitStream) - -{ -  INT i; -  INT payloadBits = 0; - -  payloadBits += FDKwriteBits (hBitStream, sbrEnvData->addHarmonicFlag, 1); - -  if (sbrEnvData->addHarmonicFlag) { -    for (i = 0; i < sbrEnvData->noHarmonics; i++) { -      payloadBits += FDKwriteBits (hBitStream, sbrEnvData->addHarmonic[i], 1); -    } -  } - -  return payloadBits; -} - -/***************************************************************************** - -    functionname: getSbrExtendedDataSize -    description:  counts the number of bits needed for encoding the -                  extended data (including extension id) - -    returns:      number of bits needed for the extended data -    input: -    output: - -*****************************************************************************/ -static INT -getSbrExtendedDataSize (HANDLE_PARAMETRIC_STEREO  hParametricStereo) -{ -  INT extDataBits = 0; - -  /* add your new extended data counting methods here */ - -  /* -    no extended data -  */ - -  if(hParametricStereo){ -    /* PS extended data */ -    extDataBits += SI_SBR_EXTENSION_ID_BITS; -    extDataBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, NULL); -  } - -  return (extDataBits+7) >> 3; -} - - - - - diff --git a/libSBRenc/src/bit_sbr.h b/libSBRenc/src/bit_sbr.h deleted file mode 100644 index 1ce2c1e..0000000 --- a/libSBRenc/src/bit_sbr.h +++ /dev/null @@ -1,256 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  SBR bit writing   -*/ -#ifndef __BIT_SBR_H -#define __BIT_SBR_H - -#include "sbr_def.h" -#include "cmondata.h" -#include "fram_gen.h" - -struct SBR_ENV_DATA; - -struct SBR_BITSTREAM_DATA -{ -  INT TotalBits; -  INT PayloadBits; -  INT FillBits; -  INT HeaderActive; -  INT NrSendHeaderData;            /**< input from commandline */ -  INT CountSendHeaderData;         /**< modulo count. If < 0 then no counting is done (no SBR headers) */ -}; - -typedef struct SBR_BITSTREAM_DATA  *HANDLE_SBR_BITSTREAM_DATA; - -struct SBR_HEADER_DATA -{ -  AMP_RES sbr_amp_res; -  INT sbr_start_frequency; -  INT sbr_stop_frequency; -  INT sbr_xover_band; -  INT sbr_noise_bands; -  INT sbr_data_extra; -  INT header_extra_1; -  INT header_extra_2; -  INT sbr_lc_stereo_mode; -  INT sbr_limiter_bands; -  INT sbr_limiter_gains; -  INT sbr_interpol_freq; -  INT sbr_smoothing_length; -  INT alterScale; -  INT freqScale; - -  /* -    element of channelpairelement -  */ -  INT coupling; -  INT prev_coupling; - -  /* -    element of singlechannelelement -  */ - -}; -typedef struct SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; - -struct SBR_ENV_DATA -{ - -  INT sbr_xpos_ctrl; -  INT freq_res_fixfix; - - -  INVF_MODE sbr_invf_mode; -  INVF_MODE sbr_invf_mode_vec[MAX_NUM_NOISE_VALUES]; - -  XPOS_MODE sbr_xpos_mode; - -  INT ienvelope[MAX_ENVELOPES][MAX_FREQ_COEFFS]; - -  INT codeBookScfLavBalance; -  INT codeBookScfLav; -  const INT *hufftableTimeC; -  const INT *hufftableFreqC; -  const UCHAR *hufftableTimeL; -  const UCHAR *hufftableFreqL; - -  const INT *hufftableLevelTimeC; -  const INT *hufftableBalanceTimeC; -  const INT *hufftableLevelFreqC; -  const INT *hufftableBalanceFreqC; -  const UCHAR *hufftableLevelTimeL; -  const UCHAR *hufftableBalanceTimeL; -  const UCHAR *hufftableLevelFreqL; -  const UCHAR *hufftableBalanceFreqL; - - -  const UCHAR *hufftableNoiseTimeL; -  const INT *hufftableNoiseTimeC; -  const UCHAR *hufftableNoiseFreqL; -  const INT *hufftableNoiseFreqC; - -  const UCHAR *hufftableNoiseLevelTimeL; -  const INT *hufftableNoiseLevelTimeC; -  const UCHAR *hufftableNoiseBalanceTimeL; -  const INT *hufftableNoiseBalanceTimeC; -  const UCHAR *hufftableNoiseLevelFreqL; -  const INT *hufftableNoiseLevelFreqC; -  const UCHAR *hufftableNoiseBalanceFreqL; -  const INT *hufftableNoiseBalanceFreqC; - -  HANDLE_SBR_GRID hSbrBSGrid; - -  INT noHarmonics; -  INT addHarmonicFlag; -  UCHAR addHarmonic[MAX_FREQ_COEFFS]; - - -  /* calculated helper vars */ -  INT si_sbr_start_env_bits_balance; -  INT si_sbr_start_env_bits; -  INT si_sbr_start_noise_bits_balance; -  INT si_sbr_start_noise_bits; - -  INT noOfEnvelopes; -  INT noScfBands[MAX_ENVELOPES]; -  INT domain_vec[MAX_ENVELOPES]; -  INT domain_vec_noise[MAX_ENVELOPES]; -  SCHAR sbr_noise_levels[MAX_FREQ_COEFFS]; -  INT noOfnoisebands; - -  INT balance; -  AMP_RES init_sbr_amp_res; -  AMP_RES currentAmpResFF; - -  /* extended data */ -  INT extended_data; -  INT extension_size; -  INT extension_id; -  UCHAR extended_data_buffer[SBR_EXTENDED_DATA_MAX_CNT]; - -  UCHAR ldGrid; -}; -typedef struct SBR_ENV_DATA *HANDLE_SBR_ENV_DATA; - - - -INT FDKsbrEnc_WriteEnvSingleChannelElement(struct SBR_HEADER_DATA    *sbrHeaderData, -                                 struct T_PARAMETRIC_STEREO *hParametricStereo, -                                 struct SBR_BITSTREAM_DATA *sbrBitstreamData, -                                 struct SBR_ENV_DATA       *sbrEnvData, -                                 struct COMMON_DATA        *cmonData, -                                 UINT                       sbrSyntaxFlags); - - -INT FDKsbrEnc_WriteEnvChannelPairElement(struct SBR_HEADER_DATA    *sbrHeaderData, -                               struct T_PARAMETRIC_STEREO *hParametricStereo, -                               struct SBR_BITSTREAM_DATA *sbrBitstreamData, -                               struct SBR_ENV_DATA       *sbrEnvDataLeft, -                               struct SBR_ENV_DATA       *sbrEnvDataRight, -                               struct COMMON_DATA        *cmonData, -                               UINT                       sbrSyntaxFlags); - - - -INT FDKsbrEnc_CountSbrChannelPairElement (struct SBR_HEADER_DATA     *sbrHeaderData, -                                struct T_PARAMETRIC_STEREO *hParametricStereo, -                                struct SBR_BITSTREAM_DATA  *sbrBitstreamData, -                                struct SBR_ENV_DATA        *sbrEnvDataLeft, -                                struct SBR_ENV_DATA        *sbrEnvDataRight, -                                struct COMMON_DATA         *cmonData, -                                UINT                        sbrSyntaxFlags); - - - -/* debugging and tuning functions */ - -/*#define SBR_ENV_STATISTICS */ - - -/*#define SBR_PAYLOAD_MONITOR*/ - -#endif diff --git a/libSBRenc/src/cmondata.h b/libSBRenc/src/cmondata.h deleted file mode 100644 index 32e6993..0000000 --- a/libSBRenc/src/cmondata.h +++ /dev/null @@ -1,110 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Core Coder's and SBR's shared data structure definition   -*/ -#ifndef __SBR_CMONDATA_H -#define __SBR_CMONDATA_H - -#include "FDK_bitstream.h" - - -struct COMMON_DATA { -  INT                   sbrHdrBits;             /**< number of SBR header bits */ -  INT                   sbrDataBits;            /**< number of SBR data bits */ -  INT                   sbrFillBits;            /**< number of SBR fill bits */ -  FDK_BITSTREAM         sbrBitbuf;              /**< the SBR data bitbuffer */ -  FDK_BITSTREAM         tmpWriteBitbuf;         /**< helper var for writing header*/ -  INT                   xOverFreq;              /**< the SBR crossover frequency */ -  INT                   dynBwEnabled;           /**< indicates if dynamic bandwidth is enabled */ -  INT                   sbrNumChannels;         /**< number of channels (meaning mono or stereo) */ -  INT                   dynXOverFreqEnc;        /**< encoder dynamic crossover frequency */ -}; - -typedef struct COMMON_DATA *HANDLE_COMMON_DATA; - - - -#endif diff --git a/libSBRenc/src/code_env.cpp b/libSBRenc/src/code_env.cpp deleted file mode 100644 index e1a28d5..0000000 --- a/libSBRenc/src/code_env.cpp +++ /dev/null @@ -1,641 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "code_env.h" -#include "sbr_rom.h" - -/***************************************************************************** - - functionname: FDKsbrEnc_InitSbrHuffmanTables - description:  initializes Huffman Tables dependent on chosen amp_res - returns:      error handle - input: - output: - -*****************************************************************************/ -INT -FDKsbrEnc_InitSbrHuffmanTables (HANDLE_SBR_ENV_DATA       sbrEnvData, -                      HANDLE_SBR_CODE_ENVELOPE  henv, -                      HANDLE_SBR_CODE_ENVELOPE  hnoise, -                      AMP_RES                   amp_res) -{ -  if ( (!henv)  ||  (!hnoise)  || (!sbrEnvData) ) -    return (1); /* not init. */ - -  sbrEnvData->init_sbr_amp_res = amp_res; - -  switch (amp_res) { -  case  SBR_AMP_RES_3_0: -    /*envelope data*/ - -    /*Level/Pan - coding */ -    sbrEnvData->hufftableLevelTimeC   = v_Huff_envelopeLevelC11T; -    sbrEnvData->hufftableLevelTimeL   = v_Huff_envelopeLevelL11T; -    sbrEnvData->hufftableBalanceTimeC = bookSbrEnvBalanceC11T; -    sbrEnvData->hufftableBalanceTimeL = bookSbrEnvBalanceL11T; - -    sbrEnvData->hufftableLevelFreqC   = v_Huff_envelopeLevelC11F; -    sbrEnvData->hufftableLevelFreqL   = v_Huff_envelopeLevelL11F; -    sbrEnvData->hufftableBalanceFreqC = bookSbrEnvBalanceC11F; -    sbrEnvData->hufftableBalanceFreqL = bookSbrEnvBalanceL11F; - -    /*Right/Left - coding */ -    sbrEnvData->hufftableTimeC        = v_Huff_envelopeLevelC11T; -    sbrEnvData->hufftableTimeL        = v_Huff_envelopeLevelL11T; -    sbrEnvData->hufftableFreqC        = v_Huff_envelopeLevelC11F; -    sbrEnvData->hufftableFreqL        = v_Huff_envelopeLevelL11F; - -    sbrEnvData->codeBookScfLavBalance  = CODE_BOOK_SCF_LAV_BALANCE11; -    sbrEnvData->codeBookScfLav         = CODE_BOOK_SCF_LAV11; - -    sbrEnvData->si_sbr_start_env_bits           = SI_SBR_START_ENV_BITS_AMP_RES_3_0; -    sbrEnvData->si_sbr_start_env_bits_balance   = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0; -    break; - -  case SBR_AMP_RES_1_5: -   /*envelope data*/ - -    /*Level/Pan - coding */ -    sbrEnvData->hufftableLevelTimeC   = v_Huff_envelopeLevelC10T; -    sbrEnvData->hufftableLevelTimeL   = v_Huff_envelopeLevelL10T; -    sbrEnvData->hufftableBalanceTimeC = bookSbrEnvBalanceC10T; -    sbrEnvData->hufftableBalanceTimeL = bookSbrEnvBalanceL10T; - -    sbrEnvData->hufftableLevelFreqC   = v_Huff_envelopeLevelC10F; -    sbrEnvData->hufftableLevelFreqL   = v_Huff_envelopeLevelL10F; -    sbrEnvData->hufftableBalanceFreqC = bookSbrEnvBalanceC10F; -    sbrEnvData->hufftableBalanceFreqL = bookSbrEnvBalanceL10F; - -    /*Right/Left - coding */ -    sbrEnvData->hufftableTimeC        = v_Huff_envelopeLevelC10T; -    sbrEnvData->hufftableTimeL        = v_Huff_envelopeLevelL10T; -    sbrEnvData->hufftableFreqC        = v_Huff_envelopeLevelC10F; -    sbrEnvData->hufftableFreqL        = v_Huff_envelopeLevelL10F; - -    sbrEnvData->codeBookScfLavBalance = CODE_BOOK_SCF_LAV_BALANCE10; -    sbrEnvData->codeBookScfLav = CODE_BOOK_SCF_LAV10; - -    sbrEnvData->si_sbr_start_env_bits           = SI_SBR_START_ENV_BITS_AMP_RES_1_5; -    sbrEnvData->si_sbr_start_env_bits_balance   = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5; -    break; - -  default: -    return (1); /* undefined amp_res mode */ -  } - -  /* these are common to both amp_res values */ -  /*Noise data*/ - -  /*Level/Pan - coding */ -  sbrEnvData->hufftableNoiseLevelTimeC   = v_Huff_NoiseLevelC11T; -  sbrEnvData->hufftableNoiseLevelTimeL   = v_Huff_NoiseLevelL11T; -  sbrEnvData->hufftableNoiseBalanceTimeC = bookSbrNoiseBalanceC11T; -  sbrEnvData->hufftableNoiseBalanceTimeL = bookSbrNoiseBalanceL11T; - -  sbrEnvData->hufftableNoiseLevelFreqC   = v_Huff_envelopeLevelC11F; -  sbrEnvData->hufftableNoiseLevelFreqL   = v_Huff_envelopeLevelL11F; -  sbrEnvData->hufftableNoiseBalanceFreqC = bookSbrEnvBalanceC11F; -  sbrEnvData->hufftableNoiseBalanceFreqL = bookSbrEnvBalanceL11F; - - -  /*Right/Left - coding */ -  sbrEnvData->hufftableNoiseTimeC        = v_Huff_NoiseLevelC11T; -  sbrEnvData->hufftableNoiseTimeL        = v_Huff_NoiseLevelL11T; -  sbrEnvData->hufftableNoiseFreqC        = v_Huff_envelopeLevelC11F; -  sbrEnvData->hufftableNoiseFreqL        = v_Huff_envelopeLevelL11F; - -  sbrEnvData->si_sbr_start_noise_bits         = SI_SBR_START_NOISE_BITS_AMP_RES_3_0; -  sbrEnvData->si_sbr_start_noise_bits_balance = SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0; - - -  /* init envelope tables and codebooks */ -  henv->codeBookScfLavBalanceTime = sbrEnvData->codeBookScfLavBalance; -  henv->codeBookScfLavBalanceFreq = sbrEnvData->codeBookScfLavBalance; -  henv->codeBookScfLavLevelTime = sbrEnvData->codeBookScfLav; -  henv->codeBookScfLavLevelFreq = sbrEnvData->codeBookScfLav; -  henv->codeBookScfLavTime = sbrEnvData->codeBookScfLav; -  henv->codeBookScfLavFreq = sbrEnvData->codeBookScfLav; - -  henv->hufftableLevelTimeL = sbrEnvData->hufftableLevelTimeL; -  henv->hufftableBalanceTimeL = sbrEnvData->hufftableBalanceTimeL; -  henv->hufftableTimeL = sbrEnvData->hufftableTimeL; -  henv->hufftableLevelFreqL = sbrEnvData->hufftableLevelFreqL; -  henv->hufftableBalanceFreqL = sbrEnvData->hufftableBalanceFreqL; -  henv->hufftableFreqL = sbrEnvData->hufftableFreqL; - -  henv->codeBookScfLavFreq = sbrEnvData->codeBookScfLav; -  henv->codeBookScfLavTime = sbrEnvData->codeBookScfLav; - -  henv->start_bits = sbrEnvData->si_sbr_start_env_bits; -  henv->start_bits_balance = sbrEnvData->si_sbr_start_env_bits_balance; - - -  /* init noise tables and codebooks */ - -  hnoise->codeBookScfLavBalanceTime = CODE_BOOK_SCF_LAV_BALANCE11; -  hnoise->codeBookScfLavBalanceFreq = CODE_BOOK_SCF_LAV_BALANCE11; -  hnoise->codeBookScfLavLevelTime = CODE_BOOK_SCF_LAV11; -  hnoise->codeBookScfLavLevelFreq = CODE_BOOK_SCF_LAV11; -  hnoise->codeBookScfLavTime = CODE_BOOK_SCF_LAV11; -  hnoise->codeBookScfLavFreq = CODE_BOOK_SCF_LAV11; - -  hnoise->hufftableLevelTimeL = sbrEnvData->hufftableNoiseLevelTimeL; -  hnoise->hufftableBalanceTimeL = sbrEnvData->hufftableNoiseBalanceTimeL; -  hnoise->hufftableTimeL = sbrEnvData->hufftableNoiseTimeL; -  hnoise->hufftableLevelFreqL = sbrEnvData->hufftableNoiseLevelFreqL; -  hnoise->hufftableBalanceFreqL = sbrEnvData->hufftableNoiseBalanceFreqL; -  hnoise->hufftableFreqL = sbrEnvData->hufftableNoiseFreqL; - - -  hnoise->start_bits = sbrEnvData->si_sbr_start_noise_bits; -  hnoise->start_bits_balance = sbrEnvData->si_sbr_start_noise_bits_balance; - -  /* No delta coding in time from the previous frame due to 1.5dB FIx-FIX rule */ -  henv->upDate = 0; -  hnoise->upDate = 0; -  return  (0); -} - -/******************************************************************************* - Functionname:  indexLow2High - ******************************************************************************* - - Description:   Nice small patch-functions in order to cope with non-factor-2 -                ratios between high-res and low-res - - Arguments:     INT offset, INT index, FREQ_RES res - - Return:        INT - -*******************************************************************************/ -static INT indexLow2High(INT offset, INT index, FREQ_RES res) -{ - -  if(res == FREQ_RES_LOW) -  { -    if (offset >= 0) -    { -        if (index < offset) -          return(index); -        else -          return(2*index - offset); -    } -    else -    { -        offset = -offset; -        if (index < offset) -          return(2*index+index); -        else -          return(2*index + offset); -    } -  } -  else -    return(index); -} - - - -/******************************************************************************* - Functionname:  mapLowResEnergyVal - ******************************************************************************* - - Description: - - Arguments:     INT currVal,INT* prevData, INT offset, INT index, FREQ_RES res - - Return:        none - -*******************************************************************************/ -static void mapLowResEnergyVal(SCHAR currVal, SCHAR* prevData, INT offset, INT index, FREQ_RES res) -{ - -  if(res == FREQ_RES_LOW) -  { -    if (offset >= 0) -    { -        if(index < offset) -            prevData[index] = currVal; -        else -        { -            prevData[2*index - offset] = currVal; -            prevData[2*index+1 - offset] = currVal; -        } -    } -    else -    { -        offset = -offset; -        if (index < offset) -        { -            prevData[3*index] = currVal; -            prevData[3*index+1] = currVal; -            prevData[3*index+2] = currVal; -        } -        else -        { -            prevData[2*index + offset] = currVal; -            prevData[2*index + 1 + offset] = currVal; -        } -    } -  } -  else -    prevData[index] = currVal; -} - - - -/******************************************************************************* - Functionname:  computeBits - ******************************************************************************* - - Description: - - Arguments:     INT delta, -                INT codeBookScfLavLevel, -                INT codeBookScfLavBalance, -                const UCHAR * hufftableLevel, -                const UCHAR * hufftableBalance, INT coupling, INT channel) - - Return:        INT - -*******************************************************************************/ -static INT -computeBits (SCHAR *delta, -             INT codeBookScfLavLevel, -             INT codeBookScfLavBalance, -             const UCHAR * hufftableLevel, -             const UCHAR * hufftableBalance, INT coupling, INT channel) -{ -  INT index; -  INT delta_bits = 0; - -  if (coupling) { -    if (channel == 1) -      { -        if (*delta < 0) -          index = fixMax(*delta, -codeBookScfLavBalance); -        else -          index = fixMin(*delta,  codeBookScfLavBalance); - -        if (index != *delta) { -          *delta = index; -          return (10000); -        } - -        delta_bits = hufftableBalance[index + codeBookScfLavBalance]; -      } -    else { -      if (*delta < 0) -        index = fixMax(*delta, -codeBookScfLavLevel); -      else -        index = fixMin(*delta,  codeBookScfLavLevel); - -      if (index != *delta) { -        *delta = index; -        return (10000); -      } -      delta_bits = hufftableLevel[index + codeBookScfLavLevel]; -    } -  } -  else { -    if (*delta < 0) -      index = fixMax(*delta, -codeBookScfLavLevel); -    else -      index = fixMin(*delta,  codeBookScfLavLevel); - -    if (index != *delta) { -      *delta = index; -      return (10000); -    } -    delta_bits = hufftableLevel[index + codeBookScfLavLevel]; -  } - -  return (delta_bits); -} - - - - -/******************************************************************************* - Functionname:  FDKsbrEnc_codeEnvelope - ******************************************************************************* - - Description: - - Arguments:     INT *sfb_nrg, -                const FREQ_RES *freq_res, -                SBR_CODE_ENVELOPE * h_sbrCodeEnvelope, -                INT *directionVec, INT scalable, INT nEnvelopes, INT channel, -                INT headerActive) - - Return:        none -                h_sbrCodeEnvelope->sfb_nrg_prev is modified ! -                sfb_nrg is modified -                h_sbrCodeEnvelope->update is modfied ! -                *directionVec is modified - -*******************************************************************************/ -void -FDKsbrEnc_codeEnvelope(SCHAR             *sfb_nrg, -                       const FREQ_RES    *freq_res, -                       SBR_CODE_ENVELOPE *h_sbrCodeEnvelope, -                       INT               *directionVec, -                       INT                coupling, -                       INT                nEnvelopes, -                       INT                channel, -                       INT                headerActive) -{ -  INT i, no_of_bands, band; -  FIXP_DBL tmp1,tmp2,tmp3,dF_edge_1stEnv; -  SCHAR *ptr_nrg; - -  INT codeBookScfLavLevelTime; -  INT codeBookScfLavLevelFreq; -  INT codeBookScfLavBalanceTime; -  INT codeBookScfLavBalanceFreq; -  const UCHAR *hufftableLevelTimeL; -  const UCHAR *hufftableBalanceTimeL; -  const UCHAR *hufftableLevelFreqL; -  const UCHAR *hufftableBalanceFreqL; - -  INT offset = h_sbrCodeEnvelope->offset; -  INT envDataTableCompFactor; - -  INT delta_F_bits = 0, delta_T_bits = 0; -  INT use_dT; - -  SCHAR delta_F[MAX_FREQ_COEFFS]; -  SCHAR delta_T[MAX_FREQ_COEFFS]; -  SCHAR last_nrg, curr_nrg; - -  tmp1 = FL2FXCONST_DBL(0.5f) >> (DFRACT_BITS-16-1); -  tmp2 = h_sbrCodeEnvelope->dF_edge_1stEnv >> (DFRACT_BITS-16); -  tmp3 = (FIXP_DBL)(((INT)(LONG)h_sbrCodeEnvelope->dF_edge_incr*h_sbrCodeEnvelope->dF_edge_incr_fac) >> (DFRACT_BITS-16)); - -  dF_edge_1stEnv = tmp1 + tmp2 + tmp3; - -  if (coupling) { -    codeBookScfLavLevelTime = h_sbrCodeEnvelope->codeBookScfLavLevelTime; -    codeBookScfLavLevelFreq = h_sbrCodeEnvelope->codeBookScfLavLevelFreq; -    codeBookScfLavBalanceTime = h_sbrCodeEnvelope->codeBookScfLavBalanceTime; -    codeBookScfLavBalanceFreq = h_sbrCodeEnvelope->codeBookScfLavBalanceFreq; -    hufftableLevelTimeL = h_sbrCodeEnvelope->hufftableLevelTimeL; -    hufftableBalanceTimeL = h_sbrCodeEnvelope->hufftableBalanceTimeL; -    hufftableLevelFreqL = h_sbrCodeEnvelope->hufftableLevelFreqL; -    hufftableBalanceFreqL = h_sbrCodeEnvelope->hufftableBalanceFreqL; -  } -  else { -    codeBookScfLavLevelTime = h_sbrCodeEnvelope->codeBookScfLavTime; -    codeBookScfLavLevelFreq = h_sbrCodeEnvelope->codeBookScfLavFreq; -    codeBookScfLavBalanceTime = h_sbrCodeEnvelope->codeBookScfLavTime; -    codeBookScfLavBalanceFreq = h_sbrCodeEnvelope->codeBookScfLavFreq; -    hufftableLevelTimeL = h_sbrCodeEnvelope->hufftableTimeL; -    hufftableBalanceTimeL = h_sbrCodeEnvelope->hufftableTimeL; -    hufftableLevelFreqL = h_sbrCodeEnvelope->hufftableFreqL; -    hufftableBalanceFreqL = h_sbrCodeEnvelope->hufftableFreqL; -  } - -  if(coupling == 1 && channel == 1) -    envDataTableCompFactor = 1;       /*should be one when the new huffman-tables are ready*/ -  else -    envDataTableCompFactor = 0; - - -  if (h_sbrCodeEnvelope->deltaTAcrossFrames == 0) -    h_sbrCodeEnvelope->upDate = 0; - -  /* no delta coding in time in case of a header */ -  if (headerActive) -    h_sbrCodeEnvelope->upDate = 0; - - -  for (i = 0; i < nEnvelopes; i++) -  { -    if (freq_res[i] == FREQ_RES_HIGH) -      no_of_bands = h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH]; -    else -      no_of_bands = h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW]; - - -    ptr_nrg = sfb_nrg; -    curr_nrg = *ptr_nrg; - -    delta_F[0] = curr_nrg >> envDataTableCompFactor; - -    if (coupling && channel == 1) -      delta_F_bits = h_sbrCodeEnvelope->start_bits_balance; -    else -      delta_F_bits = h_sbrCodeEnvelope->start_bits; - - -    if(h_sbrCodeEnvelope->upDate != 0) -    { -      delta_T[0] = (curr_nrg - h_sbrCodeEnvelope->sfb_nrg_prev[0]) >> envDataTableCompFactor; - -      delta_T_bits = computeBits (&delta_T[0], -                                  codeBookScfLavLevelTime, -                                  codeBookScfLavBalanceTime, -                                  hufftableLevelTimeL, -                                  hufftableBalanceTimeL, coupling, channel); -    } - - -    mapLowResEnergyVal(curr_nrg, h_sbrCodeEnvelope->sfb_nrg_prev, offset, 0, freq_res[i]); - -    /* ensure that nrg difference is not higher than codeBookScfLavXXXFreq */ -    if ( coupling && channel == 1 ) { -      for (band = no_of_bands - 1; band > 0; band--) { -        if ( ptr_nrg[band] - ptr_nrg[band-1] > codeBookScfLavBalanceFreq ) { -          ptr_nrg[band-1] = ptr_nrg[band] - codeBookScfLavBalanceFreq; -        } -      } -      for (band = 1; band < no_of_bands; band++) { -        if ( ptr_nrg[band-1] - ptr_nrg[band] > codeBookScfLavBalanceFreq ) { -          ptr_nrg[band] = ptr_nrg[band-1] - codeBookScfLavBalanceFreq; -        } -      } -    } -    else { -      for (band = no_of_bands - 1; band > 0; band--) { -        if ( ptr_nrg[band] - ptr_nrg[band-1] > codeBookScfLavLevelFreq ) { -          ptr_nrg[band-1] = ptr_nrg[band] - codeBookScfLavLevelFreq; -        } -      } -      for (band = 1; band < no_of_bands; band++) { -        if ( ptr_nrg[band-1] - ptr_nrg[band] > codeBookScfLavLevelFreq ) { -          ptr_nrg[band] = ptr_nrg[band-1] - codeBookScfLavLevelFreq; -        } -      } -    } - - -    /* Coding loop*/ -    for (band = 1; band < no_of_bands; band++) -    { -      last_nrg = (*ptr_nrg); -      ptr_nrg++; -      curr_nrg = (*ptr_nrg); - -      delta_F[band] = (curr_nrg - last_nrg) >> envDataTableCompFactor; - -      delta_F_bits += computeBits (&delta_F[band], -                                   codeBookScfLavLevelFreq, -                                   codeBookScfLavBalanceFreq, -                                   hufftableLevelFreqL, -                                   hufftableBalanceFreqL, coupling, channel); - -      if(h_sbrCodeEnvelope->upDate != 0) -      { -        delta_T[band] = curr_nrg - h_sbrCodeEnvelope->sfb_nrg_prev[indexLow2High(offset, band, freq_res[i])]; -        delta_T[band] = delta_T[band] >> envDataTableCompFactor; -      } - -      mapLowResEnergyVal(curr_nrg, h_sbrCodeEnvelope->sfb_nrg_prev, offset, band, freq_res[i]); - -      if(h_sbrCodeEnvelope->upDate != 0) -      { -        delta_T_bits += computeBits (&delta_T[band], -                                     codeBookScfLavLevelTime, -                                     codeBookScfLavBalanceTime, -                                     hufftableLevelTimeL, -                                     hufftableBalanceTimeL, coupling, channel); -      } -    } - -    /* Replace sfb_nrg with deltacoded samples and set flag */ -    if (i == 0) { -      INT tmp_bits; -      tmp_bits = (((delta_T_bits * dF_edge_1stEnv) >> (DFRACT_BITS-18)) + (FIXP_DBL)1) >> 1; -      use_dT = (h_sbrCodeEnvelope->upDate != 0 && (delta_F_bits > tmp_bits)); -    } -    else -      use_dT = (delta_T_bits < delta_F_bits && h_sbrCodeEnvelope->upDate != 0); - -    if (use_dT) -    { -      directionVec[i] = TIME; -      FDKmemcpy (sfb_nrg, delta_T, no_of_bands * sizeof (SCHAR)); -    } -    else { -      h_sbrCodeEnvelope->upDate = 0; -      directionVec[i] = FREQ; -      FDKmemcpy (sfb_nrg, delta_F, no_of_bands * sizeof (SCHAR)); -    } -    sfb_nrg += no_of_bands; -    h_sbrCodeEnvelope->upDate = 1; -  } - -} - - -/******************************************************************************* - Functionname:  FDKsbrEnc_InitSbrCodeEnvelope - ******************************************************************************* - - Description: - - Arguments: - - Return: - -*******************************************************************************/ -INT -FDKsbrEnc_InitSbrCodeEnvelope (HANDLE_SBR_CODE_ENVELOPE  h_sbrCodeEnvelope, -                       INT *nSfb, -                       INT deltaTAcrossFrames, -                       FIXP_DBL dF_edge_1stEnv, -                       FIXP_DBL dF_edge_incr) -{ - -  FDKmemclear(h_sbrCodeEnvelope,sizeof(SBR_CODE_ENVELOPE)); - -  h_sbrCodeEnvelope->deltaTAcrossFrames = deltaTAcrossFrames; -  h_sbrCodeEnvelope->dF_edge_1stEnv = dF_edge_1stEnv; -  h_sbrCodeEnvelope->dF_edge_incr = dF_edge_incr; -  h_sbrCodeEnvelope->dF_edge_incr_fac = 0; -  h_sbrCodeEnvelope->upDate = 0; -  h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW] = nSfb[FREQ_RES_LOW]; -  h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH] = nSfb[FREQ_RES_HIGH]; -  h_sbrCodeEnvelope->offset = 2*h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW] - h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH]; - -  return (0); -} diff --git a/libSBRenc/src/code_env.h b/libSBRenc/src/code_env.h deleted file mode 100644 index 50a365e..0000000 --- a/libSBRenc/src/code_env.h +++ /dev/null @@ -1,153 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  DPCM Envelope coding   -*/ - -#ifndef __CODE_ENV_H -#define __CODE_ENV_H - -#include "sbr_def.h" -#include "bit_sbr.h" -#include "fram_gen.h" - -typedef struct -{ -  INT offset; -  INT upDate; -  INT nSfb[2]; -  SCHAR sfb_nrg_prev[MAX_FREQ_COEFFS]; -  INT deltaTAcrossFrames; -  FIXP_DBL dF_edge_1stEnv; -  FIXP_DBL dF_edge_incr; -  INT dF_edge_incr_fac; - - -  INT codeBookScfLavTime; -  INT codeBookScfLavFreq; - -  INT codeBookScfLavLevelTime; -  INT codeBookScfLavLevelFreq; -  INT codeBookScfLavBalanceTime; -  INT codeBookScfLavBalanceFreq; - -  INT start_bits; -  INT start_bits_balance; - - -  const UCHAR *hufftableTimeL; -  const UCHAR *hufftableFreqL; - -  const UCHAR *hufftableLevelTimeL; -  const UCHAR *hufftableBalanceTimeL; -  const UCHAR *hufftableLevelFreqL; -  const UCHAR *hufftableBalanceFreqL; -} -SBR_CODE_ENVELOPE; -typedef SBR_CODE_ENVELOPE *HANDLE_SBR_CODE_ENVELOPE; - - - -void -FDKsbrEnc_codeEnvelope (SCHAR *sfb_nrg, -              const FREQ_RES *freq_res, -              SBR_CODE_ENVELOPE * h_sbrCodeEnvelope, -              INT *directionVec, INT coupling, INT nEnvelopes, INT channel, -              INT headerActive); - -INT -FDKsbrEnc_InitSbrCodeEnvelope (HANDLE_SBR_CODE_ENVELOPE h_sbrCodeEnvelope, -                       INT *nSfb, -                       INT deltaTAcrossFrames, -                       FIXP_DBL dF_edge_1stEnv, -                       FIXP_DBL dF_edge_incr); - -INT -FDKsbrEnc_InitSbrHuffmanTables (struct SBR_ENV_DATA*      sbrEnvData, -                      HANDLE_SBR_CODE_ENVELOPE  henv, -                      HANDLE_SBR_CODE_ENVELOPE  hnoise, -                      AMP_RES                   amp_res); - -#endif diff --git a/libSBRenc/src/env_bit.cpp b/libSBRenc/src/env_bit.cpp deleted file mode 100644 index ea31183..0000000 --- a/libSBRenc/src/env_bit.cpp +++ /dev/null @@ -1,250 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Remaining SBR Bit Writing Routines -*/ - -#include "env_bit.h" -#include "cmondata.h" - - -#ifndef min -#define min(a,b) ( a < b ? a:b) -#endif - -#ifndef max -#define max(a,b) ( a > b ? a:b) -#endif - -/* ***************************** crcAdvance **********************************/ -/** - * @fn - * @brief    updates crc data register - * @return   none - * - * This function updates the crc register - * - */ -static void crcAdvance(USHORT crcPoly, -                       USHORT crcMask, -                       USHORT *crc, -                       ULONG   bValue, -                       INT     bBits -                      ) -{ -  INT i; -  USHORT flag; - -  for (i=bBits-1; i>=0; i--) { -    flag = ((*crc) & crcMask) ? (1) : (0) ; -    flag ^= (bValue & (1<<i)) ? (1) : (0) ; - -    (*crc)<<=1; -    if(flag) (*crc) ^= crcPoly; -  } -} - - -/* ***************************** FDKsbrEnc_InitSbrBitstream **********************************/ -/** - * @fn - * @brief    Inittialisation of sbr bitstream, write of dummy header and CRC - * @return   none - * - * - * - */ - -INT  FDKsbrEnc_InitSbrBitstream(HANDLE_COMMON_DATA  hCmonData, -                                UCHAR              *memoryBase,      /*!< Pointer to bitstream buffer */ -                                INT                 memorySize,      /*!< Length of bitstream buffer in bytes */ -                                HANDLE_FDK_CRCINFO  hCrcInfo, -                                UINT                sbrSyntaxFlags)  /*!< SBR syntax flags */ -{ -  INT crcRegion = 0; - -  /* reset bit buffer */ -  FDKresetBitbuffer(&hCmonData->sbrBitbuf, BS_WRITER); - -  FDKinitBitStream(&hCmonData->tmpWriteBitbuf, memoryBase, -                   memorySize, 0, BS_WRITER); - -  if (sbrSyntaxFlags & SBR_SYNTAX_CRC) { -    if (sbrSyntaxFlags & SBR_SYNTAX_DRM_CRC) -    { /* Init and start CRC region */ -      FDKwriteBits (&hCmonData->sbrBitbuf, 0x0, SI_SBR_DRM_CRC_BITS); -      FDKcrcInit( hCrcInfo, 0x001d, 0xFFFF, SI_SBR_DRM_CRC_BITS ); -      crcRegion = FDKcrcStartReg( hCrcInfo, &hCmonData->sbrBitbuf, 0 ); -    } else { -      FDKwriteBits (&hCmonData->sbrBitbuf, 0x0, SI_SBR_CRC_BITS); -    } -  } - -  return (crcRegion); -} - - -/* ************************** FDKsbrEnc_AssembleSbrBitstream *******************************/ -/** - * @fn - * @brief    Formats the SBR payload - * @return   nothing - * - * Also the CRC will be calculated here. - * - */ - -void -FDKsbrEnc_AssembleSbrBitstream( HANDLE_COMMON_DATA  hCmonData, -                                HANDLE_FDK_CRCINFO  hCrcInfo, -                                INT                 crcRegion, -                                UINT                sbrSyntaxFlags) -{ -  USHORT crcReg =  SBR_CRCINIT; -  INT numCrcBits,i; - -  /* check if SBR is present */ -  if ( hCmonData==NULL ) -    return; - -  hCmonData->sbrFillBits = 0; /* Fill bits are written only for GA streams */ - -  if ( sbrSyntaxFlags & SBR_SYNTAX_DRM_CRC ) -  { -    /* -     * Calculate and write DRM CRC -     */ -    FDKcrcEndReg( hCrcInfo, &hCmonData->sbrBitbuf, crcRegion ); -    FDKwriteBits( &hCmonData->tmpWriteBitbuf, FDKcrcGetCRC(hCrcInfo)^0xFF, SI_SBR_DRM_CRC_BITS ); -  } -  else -  { -    if ( !(sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ) -    { -      /* Do alignment here, because its defined as part of the sbr_extension_data */ -      int sbrLoad = hCmonData->sbrHdrBits + hCmonData->sbrDataBits; - -      if ( sbrSyntaxFlags & SBR_SYNTAX_CRC ) { -        sbrLoad += SI_SBR_CRC_BITS; -      } - -      sbrLoad += 4;         /* Do byte Align with 4 bit offset. ISO/IEC 14496-3:2005(E) page 39. */ - -      hCmonData->sbrFillBits = (8 - (sbrLoad % 8)) % 8; - -      /* -        append fill bits -      */ -      FDKwriteBits(&hCmonData->sbrBitbuf, 0,  hCmonData->sbrFillBits ); - -      FDK_ASSERT(FDKgetValidBits(&hCmonData->sbrBitbuf) % 8 == 4); -    } - -    /* -      calculate crc -    */ -    if ( sbrSyntaxFlags & SBR_SYNTAX_CRC ) { -      FDK_BITSTREAM  tmpCRCBuf = hCmonData->sbrBitbuf; -      FDKresetBitbuffer( &tmpCRCBuf, BS_READER ); - -      numCrcBits = hCmonData->sbrHdrBits + hCmonData->sbrDataBits + hCmonData->sbrFillBits; - -      for(i=0;i<numCrcBits;i++){ -        INT bit; -        bit = FDKreadBits(&tmpCRCBuf,1); -        crcAdvance(SBR_CRC_POLY,SBR_CRC_MASK,&crcReg,bit,1); -      } -      crcReg &= (SBR_CRC_RANGE); - -      /* -       * Write CRC data. -       */ -      FDKwriteBits (&hCmonData->tmpWriteBitbuf, crcReg, SI_SBR_CRC_BITS); -    } -  } - -  FDKsyncCache(&hCmonData->tmpWriteBitbuf); -} - diff --git a/libSBRenc/src/env_bit.h b/libSBRenc/src/env_bit.h deleted file mode 100644 index 038a32a..0000000 --- a/libSBRenc/src/env_bit.h +++ /dev/null @@ -1,126 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Remaining SBR Bit Writing Routines -*/ - -#ifndef BIT_ENV_H -#define BIT_ENV_H - -#include "sbr_encoder.h" -#include "FDK_crc.h" - -/* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */ -#define SBR_CRC_POLY     (0x0233) -#define SBR_CRC_MASK     (0x0200) -#define SBR_CRC_RANGE    (0x03FF) -#define SBR_CRC_MAXREGS     1 -#define SBR_CRCINIT      (0x0) - - -#define SI_SBR_CRC_ENABLE_BITS                  0 -#define SI_SBR_CRC_BITS                        10 -#define SI_SBR_DRM_CRC_BITS                     8 - - -struct COMMON_DATA; - -INT FDKsbrEnc_InitSbrBitstream(struct COMMON_DATA  *hCmonData, -                               UCHAR               *memoryBase, -                               INT                  memorySize, -                               HANDLE_FDK_CRCINFO   hCrcInfo, -                               UINT                 sbrSyntaxFlags); - -void -FDKsbrEnc_AssembleSbrBitstream (struct COMMON_DATA  *hCmonData, -                                HANDLE_FDK_CRCINFO   hCrcInfo, -                                INT                  crcReg, -                                UINT                 sbrSyntaxFlags); - - - - - -#endif /* #ifndef BIT_ENV_H */ diff --git a/libSBRenc/src/env_est.cpp b/libSBRenc/src/env_est.cpp deleted file mode 100644 index e04fc71..0000000 --- a/libSBRenc/src/env_est.cpp +++ /dev/null @@ -1,1870 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "env_est.h" -#include "tran_det.h" - -#include "qmf.h" - -#include "fram_gen.h" -#include "bit_sbr.h" -#include "cmondata.h" -#include "sbr_ram.h" - - -#include "genericStds.h" - -#define QUANT_ERROR_THRES 200 -#define Y_NRG_SCALE 5 /* noCols = 32 -> shift(5) */ - - -static const UCHAR panTable[2][10] = { { 0, 2, 4, 6, 8,12,16,20,24}, -                                       { 0, 2, 4, 8,12, 0, 0, 0, 0 } }; -static const UCHAR maxIndex[2] = {9, 5}; - - -/***************************************************************************/ -/*! - -  \brief      Calculates energy form real and imaginary part of -              the QMF subsamples - -  \return     none - -****************************************************************************/ -LNK_SECTION_CODE_L1 -static void -FDKsbrEnc_getEnergyFromCplxQmfData(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */ -                                   FIXP_DBL **RESTRICT realValues,  /*!< the real part of the QMF subsamples */ -                                   FIXP_DBL **RESTRICT imagValues,  /*!< the imaginary part of the QMF subsamples */ -                                   INT   numberBands,               /*!< number of QMF bands */ -                                   INT   numberCols,                /*!< number of QMF subsamples */ -                                   INT   *qmfScale,                 /*!< sclefactor of QMF subsamples */ -                                   INT   *energyScale)              /*!< scalefactor of energies */ -{ -  int j, k; -  int scale; -  FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); - -  /* Get Scratch buffer */ -  C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2); - -  /* Get max possible scaling of QMF data */ -  scale = DFRACT_BITS; -  for (k=0; k<numberCols; k++) { -    scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), getScalefactor(imagValues[k], numberBands))); -  } - -  /* Tweak scaling stability for zero signal to non-zero signal transitions */ -  if (scale >= DFRACT_BITS-1) { -    scale = (FRACT_BITS-1-*qmfScale); -  } -  /* prevent scaling of QFM values to -1.f */ -  scale = fixMax(0,scale-1); - -  /* Update QMF scale */ -  *qmfScale += scale; - -  /* -     Calculate energy of each time slot pair, max energy -     and shift QMF values as far as possible to the left. -   */ -  { -    FIXP_DBL *nrgValues = tmpNrg; -    for (k=0; k<numberCols; k+=2) -    { -      /* Load band vector addresses of 2 consecutive timeslots */ -      FIXP_DBL *RESTRICT r0 = realValues[k]; -      FIXP_DBL *RESTRICT i0 = imagValues[k]; -      FIXP_DBL *RESTRICT r1 = realValues[k+1]; -      FIXP_DBL *RESTRICT i1 = imagValues[k+1]; -      for (j=0; j<numberBands; j++) -      { -        FIXP_DBL  energy; -        FIXP_DBL  tr0,tr1,ti0,ti1; - -        /* Read QMF values of 2 timeslots */ -        tr0 = r0[j]; tr1 = r1[j]; ti0 = i0[j]; ti1 = i1[j]; - -        /* Scale QMF Values and Calc Energy of both timeslots */ -        tr0 <<= scale; -        ti0 <<= scale; -        energy = fPow2AddDiv2(fPow2Div2(tr0), ti0) >> 1; - -        tr1 <<= scale; -        ti1 <<= scale; -        energy += fPow2AddDiv2(fPow2Div2(tr1), ti1) >> 1; - -        /* Write timeslot pair energy to scratch */ -        *nrgValues++ = energy; -        max_val = fixMax(max_val, energy); - -        /* Write back scaled QMF values */ -        r0[j] = tr0; r1[j] = tr1; i0[j] = ti0; i1[j] = ti1; -      } -    } -  } -  /* energyScale: scalefactor energies of current frame */ -  *energyScale = 2*(*qmfScale)-1;       /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ - -  /* Scale timeslot pair energies and write to output buffer */ -  scale = CountLeadingBits(max_val); -  { -  	FIXP_DBL *nrgValues = tmpNrg; -    for (k=0; k<numberCols>>1; k++) { -      scaleValues(energyValues[k], nrgValues, numberBands, scale); -      nrgValues += numberBands; -    } -    *energyScale += scale; -  } - -  /* Free Scratch buffer */ -  C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2); -} - -LNK_SECTION_CODE_L1 -static void -FDKsbrEnc_getEnergyFromCplxQmfDataFull(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */ -                                       FIXP_DBL **RESTRICT realValues,  /*!< the real part of the QMF subsamples */ -                                       FIXP_DBL **RESTRICT imagValues,  /*!< the imaginary part of the QMF subsamples */ -                                       int   numberBands,               /*!< number of QMF bands */ -                                       int   numberCols,                /*!< number of QMF subsamples */ -                                       int   *qmfScale,                 /*!< sclefactor of QMF subsamples */ -                                       int   *energyScale)              /*!< scalefactor of energies */ -{ -  int j, k; -  int scale; -  FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); - -  /* Get Scratch buffer */ -  C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2); - -  FDK_ASSERT(numberBands <= QMF_CHANNELS); -  FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS/2); - -  /* Get max possible scaling of QMF data */ -  scale = DFRACT_BITS; -  for (k=0; k<numberCols; k++) { -    scale = fixMin(scale, fixMin(getScalefactor(realValues[k], numberBands), getScalefactor(imagValues[k], numberBands))); -  } - -  /* Tweak scaling stability for zero signal to non-zero signal transitions */ -  if (scale >= DFRACT_BITS-1) { -    scale = (FRACT_BITS-1-*qmfScale); -  } -  /* prevent scaling of QFM values to -1.f */ -  scale = fixMax(0,scale-1); - -  /* Update QMF scale */ -  *qmfScale += scale; - -  /* -     Calculate energy of each time slot pair, max energy -     and shift QMF values as far as possible to the left. -   */ -  { -    FIXP_DBL *nrgValues = tmpNrg; -    for (k=0; k<numberCols; k++) -    { -      /* Load band vector addresses of 2 consecutive timeslots */ -      FIXP_DBL *RESTRICT r0 = realValues[k]; -      FIXP_DBL *RESTRICT i0 = imagValues[k]; -      for (j=0; j<numberBands; j++) -      { -        FIXP_DBL  energy; -        FIXP_DBL  tr0,ti0; - -        /* Read QMF values of 2 timeslots */ -        tr0 = r0[j]; ti0 = i0[j]; - -        /* Scale QMF Values and Calc Energy of both timeslots */ -        tr0 <<= scale; -        ti0 <<= scale; -        energy = fPow2AddDiv2(fPow2Div2(tr0), ti0); -        *nrgValues++ = energy; - -        max_val = fixMax(max_val, energy); - -        /* Write back scaled QMF values */ -        r0[j] = tr0; i0[j] = ti0; -      } -    } -  } -  /* energyScale: scalefactor energies of current frame */ -  *energyScale = 2*(*qmfScale)-1;       /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ - -  /* Scale timeslot pair energies and write to output buffer */ -  scale = CountLeadingBits(max_val); -  { -  	FIXP_DBL *nrgValues = tmpNrg; -    for (k=0; k<numberCols; k++) { -      scaleValues(energyValues[k], nrgValues, numberBands, scale); -      nrgValues += numberBands; -    } -    *energyScale += scale; -  } - -  /* Free Scratch buffer */ -  C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2); -} - -/***************************************************************************/ -/*! - -  \brief  Quantisation of the panorama value (balance) - -  \return the quantized pan value - -****************************************************************************/ -static INT -mapPanorama(INT nrgVal,     /*! integer value of the energy */ -            INT ampRes,     /*! amplitude resolution [1.5/3dB] */ -            INT *quantError /*! quantization error of energy val*/ -           ) -{ -  int i; -  INT min_val, val; -  UCHAR panIndex; -  INT sign; - -  sign = nrgVal > 0 ? 1 : -1; - -  nrgVal *= sign; - -  min_val = FDK_INT_MAX; -  panIndex = 0; -  for (i = 0; i < maxIndex[ampRes]; i++) { -    val = fixp_abs ((nrgVal - (INT)panTable[ampRes][i])); - -    if (val < min_val) { -      min_val = val; -      panIndex = i; -    } -  } - -  *quantError=min_val; - -  return panTable[ampRes][maxIndex[ampRes]-1] + sign * panTable[ampRes][panIndex]; -} - - -/***************************************************************************/ -/*! - -  \brief  Quantisation of the noise floor levels - -  \return void - -****************************************************************************/ -static void -sbrNoiseFloorLevelsQuantisation(SCHAR    *RESTRICT iNoiseLevels, /*! quantized noise levels */ -                                FIXP_DBL *RESTRICT NoiseLevels,  /*! the noise levels  */ -                                INT       coupling               /*! the coupling flag */ -                               ) -{ -  INT i; -  INT tmp, dummy; - -  /* Quantisation, similar to sfb quant... */ -  for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { -    /* tmp = NoiseLevels[i] > (PFLOAT)30.0f ? 30: (INT) (NoiseLevels[i] + (PFLOAT)0.5); */ -    /* 30>>6 = 0.46875 */ -    if ((FIXP_DBL)NoiseLevels[i] > FL2FXCONST_DBL(0.46875f)) { -      tmp = 30; -    } -    else { -      /* tmp = (INT)((FIXP_DBL)NoiseLevels[i] + (FL2FXCONST_DBL(0.5f)>>(*/ /* FRACT_BITS+ */ /* 6-1)));*/ -      /* tmp = tmp >> (DFRACT_BITS-1-6); */ /* conversion to integer happens here */ -      /* rounding is done by shifting one bit less than necessary to the right, adding '1' and then shifting the final bit */ -      tmp = ((((INT)NoiseLevels[i])>>(DFRACT_BITS-1-LD_DATA_SHIFT)) ); /* conversion to integer */ -			 if (tmp != 0) -			   tmp += 1; -    } - -    if (coupling) { -      tmp = tmp < -30 ? -30 : tmp; -      tmp = mapPanorama (tmp,1,&dummy); -    } -    iNoiseLevels[i] = tmp; -  } -} - -/***************************************************************************/ -/*! - -  \brief  Calculation of noise floor for coupling - -  \return void - -****************************************************************************/ -static void -coupleNoiseFloor(FIXP_DBL *RESTRICT noise_level_left, /*! noise level left  (modified)*/ -                 FIXP_DBL *RESTRICT noise_level_right /*! noise level right (modified)*/ -                ) -{ -  FIXP_DBL cmpValLeft,cmpValRight; -  INT i; -  FIXP_DBL temp1,temp2; - -  for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { - -    /* Calculation of the power function using ld64: -       z  = x^y; -       z' = CalcLd64(z) = y*CalcLd64(x)/64; -       z  = CalcInvLd64(z'); -    */ -    cmpValLeft  = NOISE_FLOOR_OFFSET_64 - noise_level_left[i]; -    cmpValRight = NOISE_FLOOR_OFFSET_64 - noise_level_right[i]; - -    if (cmpValRight < FL2FXCONST_DBL(0.0f)) { -      temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); -    } -    else { -      temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); -      temp1 = temp1 << (DFRACT_BITS-1-LD_DATA_SHIFT-1);  /* INT to fract conversion of result, if input of CalcInvLdData is positiv */ -    } - -    if (cmpValLeft < FL2FXCONST_DBL(0.0f)) { -      temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); -    } -    else { -      temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); -      temp2 = temp2 << (DFRACT_BITS-1-LD_DATA_SHIFT-1);  /* INT to fract conversion of result, if input of CalcInvLdData is positiv */ -    } - - -    if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) { -      noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1)))); /* no scaling needed! both values are dfract */ -      noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); -    } - -    if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) { -      noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ -      noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); -    } - -    if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) { -      noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>(7+1)) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ -      noise_level_right[i] = (CalcLdData(temp2) + FL2FXCONST_DBL(0.109375f)) - CalcLdData(temp1); -    } - -    if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) { -      noise_level_left[i]  = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>(7+1)))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ -      noise_level_right[i] = CalcLdData(temp2) - (CalcLdData(temp1) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ -    } -  } -} - -/***************************************************************************/ -/*! - -  \brief  Calculation of energy starting in lower band (li) up to upper band (ui) -          over slots (start_pos) to (stop_pos) - -  \return void - -****************************************************************************/ -static FIXP_DBL -getEnvSfbEnergy(INT li,              /*! lower band */ -                INT ui,              /*! upper band */ -                INT start_pos,       /*! start slot */ -                INT stop_pos,        /*! stop slot */ -                INT border_pos,      /*! slots scaling border */ -                FIXP_DBL **YBuffer,  /*! sfb energy buffer */ -                INT YBufferSzShift,  /*! Energy buffer index scale */ -                INT scaleNrg0,       /*! scaling of lower slots */ -                INT scaleNrg1)       /*! scaling of upper slots */ -{ -  /* use dynamic scaling for outer energy loop; -     energies are critical and every bit is important */ -  int sc0, sc1, k, l; - -  FIXP_DBL nrgSum, nrg1, nrg2, accu1, accu2; -  INT dynScale, dynScale1, dynScale2; -  if(ui-li==0) dynScale = DFRACT_BITS-1; -  else -  dynScale = CalcLdInt(ui-li)>>(DFRACT_BITS-1-LD_DATA_SHIFT); - -  sc0 = fixMin(scaleNrg0,Y_NRG_SCALE); sc1 = fixMin(scaleNrg1,Y_NRG_SCALE); -  /* dynScale{1,2} is set such that the right shift below is positive */ -  dynScale1 = fixMin((scaleNrg0-sc0),dynScale); -  dynScale2 = fixMin((scaleNrg1-sc1),dynScale); -  nrgSum = accu1 = accu2 = (FIXP_DBL)0; - -  for (k = li; k < ui; k++) { -    nrg1 = nrg2 = (FIXP_DBL)0; -    for (l = start_pos; l < border_pos; l++) { -      nrg1 += YBuffer[l>>YBufferSzShift][k] >> sc0; -    } -    for (; l < stop_pos; l++) { -      nrg2 += YBuffer[l>>YBufferSzShift][k] >> sc1; -    } -    accu1 += (nrg1>>dynScale1); -    accu2 += (nrg2>>dynScale2); -  } -  /* This shift factor is always positive. See comment above. */ -  nrgSum += ( accu1 >> fixMin((scaleNrg0-sc0-dynScale1),(DFRACT_BITS-1)) ) -          +  ( accu2 >> fixMin((scaleNrg1-sc1-dynScale2),(DFRACT_BITS-1)) ); - -  return nrgSum; -} - -/***************************************************************************/ -/*! - -  \brief  Energy compensation in missing harmonic mode - -  \return void - -****************************************************************************/ -static FIXP_DBL -mhLoweringEnergy(FIXP_DBL nrg, INT M) -{ -  /* -     Compensating for the fact that we in the decoder map the "average energy to every QMF -     band, and use this when we calculate the boost-factor. Since the mapped energy isn't -     the average energy but the maximum energy in case of missing harmonic creation, we will -     in the boost function calculate that too much limiting has been applied and hence we will -     boost the signal although it isn't called for. Hence we need to compensate for this by -     lowering the transmitted energy values for the sines so they will get the correct level -     after the boost is applied. -  */ -  if(M > 2){ -    INT tmpScale; -    tmpScale = CountLeadingBits(nrg); -    nrg <<= tmpScale; -    nrg = fMult(nrg, FL2FXCONST_DBL(0.398107267f)); /* The maximum boost is 1.584893, so the maximum attenuation should be square(1/1.584893) = 0.398107267 */ -    nrg >>= tmpScale; -  } -  else{ -    if(M > 1){ -      nrg >>= 1; -    } -  } - -  return nrg; -} - -/***************************************************************************/ -/*! - -  \brief  Energy compensation in none missing harmonic mode - -  \return void - -****************************************************************************/ -static FIXP_DBL nmhLoweringEnergy( -        FIXP_DBL nrg, -        const FIXP_DBL nrgSum, -        const INT nrgSum_scale, -        const INT M -        ) -{ -  if (nrg>FL2FXCONST_DBL(0)) { -    int sc=0; -    /* gain = nrgSum / (nrg*(M+1)) */ -    FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M+1)); -    sc += nrgSum_scale; - -    /* reduce nrg if gain smaller 1.f */ -    if ( !((sc>=0) && ( gain > ((FIXP_DBL)MAXVAL_DBL>>sc) )) ) { -      nrg = fMult(scaleValue(gain,sc), nrg); -    } -  } -  return nrg; -} - -/***************************************************************************/ -/*! - -  \brief  calculates the envelope values from the energies, depending on -          framing and stereo mode - -  \return void - -****************************************************************************/ -static void -calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft,  /*! energy buffer left */ -                      FIXP_DBL **RESTRICT YBufferRight, /*! energy buffer right */ -                      int *RESTRICT YBufferScaleLeft,   /*! scale energy buffer left */ -                      int *RESTRICT YBufferScaleRight,  /*! scale energy buffer right */ -                      const SBR_FRAME_INFO *frame_info, /*! frame info vector */ -                      SCHAR *RESTRICT sfb_nrgLeft,      /*! sfb energy buffer left */ -                      SCHAR *RESTRICT sfb_nrgRight,     /*! sfb energy buffer right */ -                      HANDLE_SBR_CONFIG_DATA h_con,     /*! handle to config data   */ -                      HANDLE_ENV_CHANNEL h_sbr,         /*! envelope channel handle */ -                      SBR_STEREO_MODE stereoMode,       /*! stereo coding mode */ -                      INT* maxQuantError,               /*! maximum quantization error, for panorama. */ -                      int YBufferSzShift)               /*! Energy buffer index scale */ - -{ -  int i, j, m = 0; -  INT no_of_bands, start_pos, stop_pos, li, ui; -  FREQ_RES freq_res; - -  INT ca = 2 - h_sbr->encEnvData.init_sbr_amp_res; -  INT oneBitLess = 0; -  if (ca == 2) -    oneBitLess = 1; /* LD_DATA_SHIFT => ld64 scaling; one bit less for rounding */ - -  INT quantError; -  INT nEnvelopes = frame_info->nEnvelopes; -  INT short_env = frame_info->shortEnv - 1; -  INT timeStep = h_sbr->sbrExtractEnvelope.time_step; -  INT commonScale,scaleLeft0,scaleLeft1; -  INT scaleRight0=0,scaleRight1=0; - -  commonScale = fixMin(YBufferScaleLeft[0],YBufferScaleLeft[1]); - -  if (stereoMode == SBR_COUPLING) { -    commonScale = fixMin(commonScale,YBufferScaleRight[0]); -    commonScale = fixMin(commonScale,YBufferScaleRight[1]); -  } - -  commonScale = commonScale - 7; - -  scaleLeft0 = YBufferScaleLeft[0] - commonScale; -  scaleLeft1 = YBufferScaleLeft[1] - commonScale ; -  FDK_ASSERT ((scaleLeft0 >= 0) && (scaleLeft1 >= 0)); - -  if (stereoMode == SBR_COUPLING) { -    scaleRight0 = YBufferScaleRight[0] - commonScale; -    scaleRight1 = YBufferScaleRight[1] - commonScale; -    FDK_ASSERT ((scaleRight0 >= 0) && (scaleRight1 >= 0)); -    *maxQuantError = 0; -  } - -  for (i = 0; i < nEnvelopes; i++) { - -    FIXP_DBL pNrgLeft[QMF_MAX_TIME_SLOTS]; -    FIXP_DBL pNrgRight[QMF_MAX_TIME_SLOTS]; -    int envNrg_scale; -    FIXP_DBL envNrgLeft  = FL2FXCONST_DBL(0.0f); -    FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f); -    int      missingHarmonic[QMF_MAX_TIME_SLOTS]; -    int      count[QMF_MAX_TIME_SLOTS]; - -    start_pos = timeStep * frame_info->borders[i]; -    stop_pos = timeStep * frame_info->borders[i + 1]; -    freq_res = frame_info->freqRes[i]; -    no_of_bands = h_con->nSfb[freq_res]; -    envNrg_scale = DFRACT_BITS-fNormz((FIXP_DBL)no_of_bands); - -    if (i == short_env) { -      stop_pos -= fixMax(2, timeStep);  /* consider at least 2 QMF slots less for short envelopes (envelopes just before transients) */ -    } - -    for (j = 0; j < no_of_bands; j++) { -      FIXP_DBL nrgLeft  = FL2FXCONST_DBL(0.0f); -      FIXP_DBL nrgRight = FL2FXCONST_DBL(0.0f); - -      li = h_con->freqBandTable[freq_res][j]; -      ui = h_con->freqBandTable[freq_res][j + 1]; - -      if(freq_res == FREQ_RES_HIGH){ -        if(j == 0 && ui-li > 1){ -          li++; -        } -      } -      else{ -        if(j == 0 && ui-li > 2){ -          li++; -        } -      } - -      /* -        Find out whether a sine will be missing in the scale-factor -        band that we're currently processing. -      */ -      missingHarmonic[j] = 0; - -      if(h_sbr->encEnvData.addHarmonicFlag){ - -        if(freq_res == FREQ_RES_HIGH){ -          if(h_sbr->encEnvData.addHarmonic[j]){    /*A missing sine in the current band*/ -            missingHarmonic[j] = 1; -          } -        } -        else{ -          INT i; -          INT startBandHigh = 0; -          INT stopBandHigh = 0; - -          while(h_con->freqBandTable[FREQ_RES_HIGH][startBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j]) -            startBandHigh++; -          while(h_con->freqBandTable[FREQ_RES_HIGH][stopBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j + 1]) -            stopBandHigh++; - -          for(i = startBandHigh; i<stopBandHigh; i++){ -            if(h_sbr->encEnvData.addHarmonic[i]){ -              missingHarmonic[j] = 1; -            } -          } -        } -      } - -      /* -        If a sine is missing in a scalefactorband, with more than one qmf channel -        use the nrg from the channel with the largest nrg rather than the mean. -        Compensate for the boost calculation in the decdoder. -      */ -      int border_pos = fixMin(stop_pos, h_sbr->sbrExtractEnvelope.YBufferWriteOffset<<YBufferSzShift); - -      if(missingHarmonic[j]){ - -        int k; -        count[j] = stop_pos - start_pos; -        nrgLeft = FL2FXCONST_DBL(0.0f); - -        for (k = li; k < ui; k++) { -          FIXP_DBL tmpNrg; -          tmpNrg = getEnvSfbEnergy(k, -                                   k+1, -                                   start_pos, -                                   stop_pos, -                                   border_pos, -                                   YBufferLeft, -                                   YBufferSzShift, -                                   scaleLeft0, -                                   scaleLeft1); - -          nrgLeft = fixMax(nrgLeft, tmpNrg); -        } - -        /* Energy lowering compensation */ -        nrgLeft = mhLoweringEnergy(nrgLeft, ui-li); - -        if (stereoMode == SBR_COUPLING) { - -          nrgRight = FL2FXCONST_DBL(0.0f); - -          for (k = li; k < ui; k++) { -            FIXP_DBL tmpNrg; -            tmpNrg = getEnvSfbEnergy(k, -                                     k+1, -                                     start_pos, -                                     stop_pos, -                                     border_pos, -                                     YBufferRight, -                                     YBufferSzShift, -                                     scaleRight0, -                                     scaleRight1); - -            nrgRight = fixMax(nrgRight, tmpNrg); -          } - -          /* Energy lowering compensation */ -          nrgRight = mhLoweringEnergy(nrgRight, ui-li); -        } -      } /* end missingHarmonic */ -      else{ -        count[j] = (stop_pos - start_pos) * (ui - li); - -        nrgLeft = getEnvSfbEnergy(li, -                                  ui, -                                  start_pos, -                                  stop_pos, -                                  border_pos, -                                  YBufferLeft, -                                  YBufferSzShift, -                                  scaleLeft0, -                                  scaleLeft1); - -        if (stereoMode == SBR_COUPLING) { -          nrgRight = getEnvSfbEnergy(li, -                                     ui, -                                     start_pos, -                                     stop_pos, -                                     border_pos, -                                     YBufferRight, -                                     YBufferSzShift, -                                     scaleRight0, -                                     scaleRight1); -        } -      } /* !missingHarmonic */ - -      /* save energies */ -      pNrgLeft[j]  = nrgLeft; -      pNrgRight[j] = nrgRight; -      envNrgLeft  += (nrgLeft>>envNrg_scale); -      envNrgRight += (nrgRight>>envNrg_scale); -    } /* j */ - -    for (j = 0; j < no_of_bands; j++) { - -      FIXP_DBL nrgLeft2 = FL2FXCONST_DBL(0.0f); -      FIXP_DBL nrgLeft  = pNrgLeft[j]; -      FIXP_DBL nrgRight = pNrgRight[j]; - -      /* None missing harmonic Energy lowering compensation */ -      if(!missingHarmonic[j] && h_sbr->fLevelProtect) { -        /* in case of missing energy in base band, -           reduce reference energy to prevent overflows in decoder output */ -        nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands); -        if (stereoMode == SBR_COUPLING) { -          nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, no_of_bands); -        } -      } - -      if (stereoMode == SBR_COUPLING) { -        /* calc operation later with log */ -        nrgLeft2 = nrgLeft; -        nrgLeft = (nrgRight + nrgLeft) >> 1; -      } - -      /* nrgLeft = f20_log2(nrgLeft / (PFLOAT)(count * h_sbr->sbrQmf.no_channels))+(PFLOAT)44; */ -      /* If nrgLeft == 0 then the Log calculations below do fail. */ -      if (nrgLeft > FL2FXCONST_DBL(0.0f)) -      { -        FIXP_DBL tmp0,tmp1,tmp2,tmp3; -        INT tmpScale; - -        tmpScale = CountLeadingBits(nrgLeft); -        nrgLeft = nrgLeft << tmpScale; - -        tmp0 = CalcLdData(nrgLeft);                                                       /* scaled by 1/64 */ -        tmp1 = ((FIXP_DBL) (commonScale+tmpScale)) << (DFRACT_BITS-1-LD_DATA_SHIFT-1);    /* scaled by 1/64 */ -        tmp2 = ((FIXP_DBL)(count[j]*h_con->noQmfBands)) << (DFRACT_BITS-1-14-1); -        tmp2 = CalcLdData(tmp2);                                                          /* scaled by 1/64 */ -        tmp3 = FL2FXCONST_DBL(0.6875f-0.21875f-0.015625f)>>1;                             /* scaled by 1/64 */ - -        nrgLeft = ((tmp0-tmp2)>>1) + (tmp3 - tmp1); -      } else { -        nrgLeft = FL2FXCONST_DBL(-1.0f); -      } - -      /* ld64 to integer conversion */ -      nrgLeft = fixMin(fixMax(nrgLeft,FL2FXCONST_DBL(0.0f)),(FL2FXCONST_DBL(0.5f)>>oneBitLess)); -      nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess-1); -      sfb_nrgLeft[m] = ((INT)nrgLeft+1)>>1; /* rounding */ - -      if (stereoMode == SBR_COUPLING) { -        FIXP_DBL scaleFract; -        int sc0, sc1; - -        nrgLeft2 = fixMax((FIXP_DBL)0x1, nrgLeft2); -        nrgRight = fixMax((FIXP_DBL)0x1, nrgRight); - -        sc0 = CountLeadingBits(nrgLeft2); -        sc1 = CountLeadingBits(nrgRight); - -        scaleFract = ((FIXP_DBL)(sc0-sc1)) << (DFRACT_BITS-1-LD_DATA_SHIFT); /* scale value in ld64 representation */ -        nrgRight = CalcLdData(nrgLeft2<<sc0) - CalcLdData(nrgRight<<sc1) - scaleFract; - -        /* ld64 to integer conversion */ -        nrgRight = (FIXP_DBL)(LONG)(nrgRight) >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess); -        nrgRight  = (nrgRight+(FIXP_DBL)1)>>1; /* rounding */ - -        sfb_nrgRight[m] = mapPanorama (nrgRight,h_sbr->encEnvData.init_sbr_amp_res,&quantError); - -        *maxQuantError = fixMax(quantError, *maxQuantError); -      } - -      m++; -    } /* j */ - -     /* Do energy compensation for sines that are present in two -         QMF-bands in the original, but will only occur in one band in -         the decoder due to the synthetic sine coding.*/ -    if (h_con->useParametricCoding) { -      m-=no_of_bands; -      for (j = 0; j < no_of_bands; j++) { -        if (freq_res==FREQ_RES_HIGH && h_sbr->sbrExtractEnvelope.envelopeCompensation[j]){ -          sfb_nrgLeft[m] -= (ca * fixp_abs((INT)h_sbr->sbrExtractEnvelope.envelopeCompensation[j])); -        } -        sfb_nrgLeft[m] = fixMax(0, sfb_nrgLeft[m]); -        m++; -      } -    } /* useParametricCoding */ - -  } /* i*/ -} - -/***************************************************************************/ -/*! - -  \brief  calculates the noise floor and the envelope values from the -          energies, depending on framing and stereo mode - -  FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the -  envelope and the noise floor. The function includes the following processes: - -  -Analysis subband filtering. -  -Encoding SA and pan parameters (if enabled). -  -Transient detection. - -****************************************************************************/ - -LNK_SECTION_CODE_L1 -void -FDKsbrEnc_extractSbrEnvelope1 ( -                    HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data   */ -                    HANDLE_SBR_HEADER_DATA sbrHeaderData, -                    HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, -                    HANDLE_ENV_CHANNEL hEnvChan, -                    HANDLE_COMMON_DATA hCmonData, -                    SBR_ENV_TEMP_DATA   *eData, -                    SBR_FRAME_TEMP_DATA *fData -                   ) -{ - -  HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; - -  if (sbrExtrEnv->YBufferSzShift == 0) -    FDKsbrEnc_getEnergyFromCplxQmfDataFull(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], -                                           sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, -                                           sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, -                                           h_con->noQmfBands, -                                           sbrExtrEnv->no_cols, -                                          &hEnvChan->qmfScale, -                                          &sbrExtrEnv->YBufferScale[1]); -  else -    FDKsbrEnc_getEnergyFromCplxQmfData(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], -                                       sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, -                                       sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, -                                       h_con->noQmfBands, -                                       sbrExtrEnv->no_cols, -                                      &hEnvChan->qmfScale, -                                      &sbrExtrEnv->YBufferScale[1]); - - - -  /* -    Precalculation of Tonality Quotas  COEFF Transform OK -  */ -  FDKsbrEnc_CalculateTonalityQuotas(&hEnvChan->TonCorr, -                                     sbrExtrEnv->rBuffer, -                                     sbrExtrEnv->iBuffer, -                                     h_con->freqBandTable[HI][h_con->nSfb[HI]], -                                     hEnvChan->qmfScale); - - - -  /* -    Transient detection COEFF Transform OK -  */ -  FDKsbrEnc_transientDetect(&hEnvChan->sbrTransientDetector, -                             sbrExtrEnv->YBuffer, -                             sbrExtrEnv->YBufferScale, -                             eData->transient_info, -                             sbrExtrEnv->YBufferWriteOffset, -                             sbrExtrEnv->YBufferSzShift, -                             sbrExtrEnv->time_step, -                             hEnvChan->SbrEnvFrame.frameMiddleSlot); - - - -  /* -    Generate flags for 2 env in a FIXFIX-frame. -    Remove this function to get always 1 env per FIXFIX-frame. -  */ - -  /* -    frame Splitter COEFF Transform OK -  */ -  FDKsbrEnc_frameSplitter(sbrExtrEnv->YBuffer, -                          sbrExtrEnv->YBufferScale, -                         &hEnvChan->sbrTransientDetector, -                          h_con->freqBandTable[1], -                          eData->transient_info, -                          sbrExtrEnv->YBufferWriteOffset, -                          sbrExtrEnv->YBufferSzShift, -                          h_con->nSfb[1], -                          sbrExtrEnv->time_step, -                          sbrExtrEnv->no_cols); - - -} - -/***************************************************************************/ -/*! - -  \brief  calculates the noise floor and the envelope values from the -          energies, depending on framing and stereo mode - -  FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the -  envelope and the noise floor. The function includes the following processes: - -  -Determine time/frequency division of current granule. -  -Sending transient info to bitstream. -  -Set amp_res to 1.5 dB if the current frame contains only one envelope. -  -Lock dynamic bandwidth frequency change if the next envelope not starts on a -  frame boundary. -  -MDCT transposer (needed to detect where harmonics will be missing). -  -Spectrum Estimation (used for pulse train and missing harmonics detection). -  -Pulse train detection. -  -Inverse Filtering detection. -  -Waveform Coding. -  -Missing Harmonics detection. -  -Extract envelope of current frame. -  -Noise floor estimation. -  -Noise floor quantisation and coding. -  -Encode envelope of current frame. -  -Send the encoded data to the bitstream. -  -Write to bitstream. - -****************************************************************************/ - -LNK_SECTION_CODE_L1 -void -FDKsbrEnc_extractSbrEnvelope2 ( -                    HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data   */ -                    HANDLE_SBR_HEADER_DATA sbrHeaderData, -                    HANDLE_PARAMETRIC_STEREO    hParametricStereo, -                    HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, -                    HANDLE_ENV_CHANNEL   h_envChan0, -                    HANDLE_ENV_CHANNEL   h_envChan1, -                    HANDLE_COMMON_DATA   hCmonData, -                    SBR_ENV_TEMP_DATA   *eData, -                    SBR_FRAME_TEMP_DATA *fData, -                    int                  clearOutput -                   ) -{ -  HANDLE_ENV_CHANNEL h_envChan[MAX_NUM_CHANNELS] = {h_envChan0, h_envChan1}; -  int ch, i, j, c, YSzShift = h_envChan[0]->sbrExtractEnvelope.YBufferSzShift; - -  SBR_STEREO_MODE stereoMode = h_con->stereoMode; -  int nChannels = h_con->nChannels; -  FDK_ASSERT(nChannels <= MAX_NUM_CHANNELS); -  const int *v_tuning; -  static const int v_tuningHEAAC[6] = { 0, 2, 4, 0, 0, 0 }; - -  static const int v_tuningELD[6] = { 0, 2, 3, 0, 0, 0 }; - -  if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) -    v_tuning = v_tuningELD; -  else -    v_tuning = v_tuningHEAAC; - - -  /* -    Select stereo mode. -  */ -  if (stereoMode == SBR_COUPLING) { -    if (eData[0].transient_info[1] && eData[1].transient_info[1]) { -      eData[0].transient_info[0] = fixMin(eData[1].transient_info[0], eData[0].transient_info[0]); -      eData[1].transient_info[0] = eData[0].transient_info[0]; -    } -    else { -      if (eData[0].transient_info[1] && !eData[1].transient_info[1]) { -        eData[1].transient_info[0] = eData[0].transient_info[0]; -      } -      else { -        if (!eData[0].transient_info[1] && eData[1].transient_info[1]) -          eData[0].transient_info[0] = eData[1].transient_info[0]; -        else { -          eData[0].transient_info[0] = fixMax(eData[1].transient_info[0], eData[0].transient_info[0]); -          eData[1].transient_info[0] = eData[0].transient_info[0]; -        } -      } -    } -  } - -  /* -    Determine time/frequency division of current granule -  */ -  eData[0].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[0]->SbrEnvFrame, -                                                     eData[0].transient_info, -                                                     h_envChan[0]->sbrExtractEnvelope.pre_transient_info, -                                                     h_envChan[0]->encEnvData.ldGrid, -                                                     v_tuning); - -  h_envChan[0]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; - -  /* AAC LD patch for transient prediction */ -  if (h_envChan[0]->encEnvData.ldGrid && eData[0].transient_info[2]) { -    /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/ -    h_envChan[0]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[0]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; -  } - - -  switch (stereoMode) { -  case SBR_LEFT_RIGHT: -  case SBR_SWITCH_LRC: -    eData[1].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[1]->SbrEnvFrame, -                                                       eData[1].transient_info, -                                                       h_envChan[1]->sbrExtractEnvelope.pre_transient_info, -                                                       h_envChan[1]->encEnvData.ldGrid, -                                                       v_tuning); - -    h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[1]->SbrEnvFrame.SbrGrid; - -    if (h_envChan[1]->encEnvData.ldGrid && eData[1].transient_info[2]) { -      /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/ -      h_envChan[1]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[1]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; -    } - -    /* compare left and right frame_infos */ -    if (eData[0].frame_info->nEnvelopes != eData[1].frame_info->nEnvelopes) { -      stereoMode = SBR_LEFT_RIGHT; -    } else { -      for (i = 0; i < eData[0].frame_info->nEnvelopes + 1; i++) { -        if (eData[0].frame_info->borders[i] != eData[1].frame_info->borders[i]) { -          stereoMode = SBR_LEFT_RIGHT; -          break; -        } -      } -      for (i = 0; i < eData[0].frame_info->nEnvelopes; i++) { -        if (eData[0].frame_info->freqRes[i] != eData[1].frame_info->freqRes[i]) { -          stereoMode = SBR_LEFT_RIGHT; -          break; -        } -      } -      if (eData[0].frame_info->shortEnv != eData[1].frame_info->shortEnv) { -        stereoMode = SBR_LEFT_RIGHT; -      } -    } -    break; -  case SBR_COUPLING: -    eData[1].frame_info = eData[0].frame_info; -    h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; -    break; -  case SBR_MONO: -    /* nothing to do */ -    break; -  default: -    FDK_ASSERT (0); -  } - - -  for (ch = 0; ch < nChannels;ch++) -  { -    HANDLE_ENV_CHANNEL hEnvChan = h_envChan[ch]; -    HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; -    SBR_ENV_TEMP_DATA *ed = &eData[ch]; - - -    /* -       Send transient info to bitstream and store for next call -    */ -    sbrExtrEnv->pre_transient_info[0] = ed->transient_info[0];/* tran_pos */ -    sbrExtrEnv->pre_transient_info[1] = ed->transient_info[1];/* tran_flag */ -    hEnvChan->encEnvData.noOfEnvelopes = ed->nEnvelopes = ed->frame_info->nEnvelopes;     /* number of envelopes of current frame */ - -    /* -      Check if the current frame is divided into one envelope only. If so, set the amplitude -      resolution to 1.5 dB, otherwise may set back to chosen value -    */ -   if( ( hEnvChan->encEnvData.hSbrBSGrid->frameClass == FIXFIX ) -        && ( ed->nEnvelopes == 1 ) ) -   { - -     if (hEnvChan->encEnvData.ldGrid) -       hEnvChan->encEnvData.currentAmpResFF = (AMP_RES)h_con->initAmpResFF; -     else -       hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5; - -     if ( hEnvChan->encEnvData.currentAmpResFF != hEnvChan->encEnvData.init_sbr_amp_res) { - -        FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData, -                                       &hEnvChan->sbrCodeEnvelope, -                                       &hEnvChan->sbrCodeNoiseFloor, -                                       hEnvChan->encEnvData.currentAmpResFF); -      } -    } -    else { -      if(sbrHeaderData->sbr_amp_res != hEnvChan->encEnvData.init_sbr_amp_res ) { - -        FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData, -                                       &hEnvChan->sbrCodeEnvelope, -                                       &hEnvChan->sbrCodeNoiseFloor, -                                       sbrHeaderData->sbr_amp_res); -      } -    } - -    if (!clearOutput) { - -      /* -        Tonality correction parameter extraction (inverse filtering level, noise floor additional sines). -      */ -      FDKsbrEnc_TonCorrParamExtr(&hEnvChan->TonCorr, -                                  hEnvChan->encEnvData.sbr_invf_mode_vec, -                                  ed->noiseFloor, -                                 &hEnvChan->encEnvData.addHarmonicFlag, -                                  hEnvChan->encEnvData.addHarmonic, -                                  sbrExtrEnv->envelopeCompensation, -                                  ed->frame_info, -                                  ed->transient_info, -                                  h_con->freqBandTable[HI], -                                  h_con->nSfb[HI], -                                  hEnvChan->encEnvData.sbr_xpos_mode, -                                  h_con->sbrSyntaxFlags); - -    } - -    /* Low energy in low band fix */ -    if ( hEnvChan->sbrTransientDetector.prevLowBandEnergy < hEnvChan->sbrTransientDetector.prevHighBandEnergy && hEnvChan->sbrTransientDetector.prevHighBandEnergy > FL2FX_DBL(0.03)) -    { -      int i; - -      hEnvChan->fLevelProtect = 1; - -      for (i=0; i<MAX_NUM_NOISE_VALUES; i++) -        hEnvChan->encEnvData.sbr_invf_mode_vec[i] = INVF_HIGH_LEVEL; -    } else { -      hEnvChan->fLevelProtect = 0; -    } - -    hEnvChan->encEnvData.sbr_invf_mode = hEnvChan->encEnvData.sbr_invf_mode_vec[0]; - -    hEnvChan->encEnvData.noOfnoisebands = hEnvChan->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; - - -  } /* ch */ - - - -   /* -      Save number of scf bands per envelope -    */ -  for (ch = 0; ch < nChannels;ch++) { -    for (i = 0; i < eData[ch].nEnvelopes; i++){ -      h_envChan[ch]->encEnvData.noScfBands[i] = -      (eData[ch].frame_info->freqRes[i] == FREQ_RES_HIGH ? h_con->nSfb[FREQ_RES_HIGH] : h_con->nSfb[FREQ_RES_LOW]); -    } -  } - -  /* -    Extract envelope of current frame. -  */ -  switch (stereoMode) { -  case SBR_MONO: -     calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, -                          h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, -                          eData[0].frame_info, eData[0].sfb_nrg, NULL, -                          h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); -    break; -  case SBR_LEFT_RIGHT: -    calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, -                          h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, -                          eData[0].frame_info, eData[0].sfb_nrg, NULL, -                          h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); -    calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, -                          h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, -                          eData[1].frame_info,eData[1].sfb_nrg, NULL, -                          h_con, h_envChan[1], SBR_MONO, NULL, YSzShift); -    break; -  case SBR_COUPLING: -    calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer, -                          h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale, -                          eData[0].frame_info, eData[0].sfb_nrg, eData[1].sfb_nrg, -                          h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift); -    break; -  case SBR_SWITCH_LRC: -    calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, -                          h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, -                          eData[0].frame_info, eData[0].sfb_nrg, NULL, -                          h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); -    calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, -                          h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, -                          eData[1].frame_info, eData[1].sfb_nrg, NULL, -                          h_con, h_envChan[1], SBR_MONO,NULL, YSzShift); -    calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer, -                          h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale, -                          eData[0].frame_info, eData[0].sfb_nrg_coupling, eData[1].sfb_nrg_coupling, -                          h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift); -    break; -  } - - - -  /* -    Noise floor quantisation and coding. -  */ - -  switch (stereoMode) { -  case SBR_MONO: -    sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, 0); - -    FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, -                           &h_envChan[0]->sbrCodeNoiseFloor, -                           h_envChan[0]->encEnvData.domain_vec_noise, 0, -                           (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                           sbrBitstreamData->HeaderActive); - -    break; -  case SBR_LEFT_RIGHT: -    sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); - -    FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, -                  &h_envChan[0]->sbrCodeNoiseFloor, -                  h_envChan[0]->encEnvData.domain_vec_noise, 0, -                  (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                  sbrBitstreamData->HeaderActive); - -    sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0); - -    FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, -                  &h_envChan[1]->sbrCodeNoiseFloor, -                  h_envChan[1]->encEnvData.domain_vec_noise, 0, -                  (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                  sbrBitstreamData->HeaderActive); - -    break; - -  case SBR_COUPLING: -    coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor); - -    sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); - -    FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, -                  &h_envChan[0]->sbrCodeNoiseFloor, -                  h_envChan[0]->encEnvData.domain_vec_noise, 1, -                  (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                  sbrBitstreamData->HeaderActive); - -    sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 1); - -    FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, -                  &h_envChan[1]->sbrCodeNoiseFloor, -                  h_envChan[1]->encEnvData.domain_vec_noise, 1, -                  (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, -                  sbrBitstreamData->HeaderActive); - -    break; -  case SBR_SWITCH_LRC: -    sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); -    sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0); -    coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor); -    sbrNoiseFloorLevelsQuantisation(eData[0].noise_level_coupling,eData[0].noiseFloor, 0); -    sbrNoiseFloorLevelsQuantisation(eData[1].noise_level_coupling,eData[1].noiseFloor, 1); -    break; -  } - - - -  /* -    Encode envelope of current frame. -  */ -  switch (stereoMode) { -  case SBR_MONO: -    sbrHeaderData->coupling = 0; -    h_envChan[0]->encEnvData.balance = 0; -    FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, -                  &h_envChan[0]->sbrCodeEnvelope, -                  h_envChan[0]->encEnvData.domain_vec, -                  sbrHeaderData->coupling, -                  eData[0].frame_info->nEnvelopes, 0, -                  sbrBitstreamData->HeaderActive); -    break; -  case SBR_LEFT_RIGHT: -    sbrHeaderData->coupling = 0; - -    h_envChan[0]->encEnvData.balance = 0; -    h_envChan[1]->encEnvData.balance = 0; - - -    FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, -                  &h_envChan[0]->sbrCodeEnvelope, -                  h_envChan[0]->encEnvData.domain_vec, -                  sbrHeaderData->coupling, -                  eData[0].frame_info->nEnvelopes, 0, -                  sbrBitstreamData->HeaderActive); -    FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, -                  &h_envChan[1]->sbrCodeEnvelope, -                  h_envChan[1]->encEnvData.domain_vec, -                  sbrHeaderData->coupling, -                  eData[1].frame_info->nEnvelopes, 0, -                  sbrBitstreamData->HeaderActive); -    break; -  case SBR_COUPLING: -    sbrHeaderData->coupling = 1; -    h_envChan[0]->encEnvData.balance = 0; -    h_envChan[1]->encEnvData.balance = 1; - -    FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, -                  &h_envChan[0]->sbrCodeEnvelope, -                  h_envChan[0]->encEnvData.domain_vec, -                  sbrHeaderData->coupling, -                  eData[0].frame_info->nEnvelopes, 0, -                  sbrBitstreamData->HeaderActive); -    FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, -                  &h_envChan[1]->sbrCodeEnvelope, -                  h_envChan[1]->encEnvData.domain_vec, -                  sbrHeaderData->coupling, -                  eData[1].frame_info->nEnvelopes, 1, -                  sbrBitstreamData->HeaderActive); -    break; -  case SBR_SWITCH_LRC: -    { -      INT payloadbitsLR; -      INT payloadbitsCOUPLING; - -      SCHAR sfbNrgPrevTemp[MAX_NUM_CHANNELS][MAX_FREQ_COEFFS]; -      SCHAR noisePrevTemp[MAX_NUM_CHANNELS][MAX_NUM_NOISE_COEFFS]; -      INT upDateNrgTemp[MAX_NUM_CHANNELS]; -      INT upDateNoiseTemp[MAX_NUM_CHANNELS]; -      INT domainVecTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; -      INT domainVecNoiseTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; - -      INT tempFlagRight = 0; -      INT tempFlagLeft = 0; - -      /* -         Store previous values, in order to be able to "undo" what is being done. -      */ - -      for(ch = 0; ch < nChannels;ch++){ -        FDKmemcpy (sfbNrgPrevTemp[ch], h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, -              MAX_FREQ_COEFFS * sizeof (SCHAR)); - -        FDKmemcpy (noisePrevTemp[ch], h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, -              MAX_NUM_NOISE_COEFFS * sizeof (SCHAR)); - -        upDateNrgTemp[ch] = h_envChan[ch]->sbrCodeEnvelope.upDate; -        upDateNoiseTemp[ch] = h_envChan[ch]->sbrCodeNoiseFloor.upDate; - -        /* -          forbid time coding in the first envelope in case of a different -          previous stereomode -        */ -        if(sbrHeaderData->prev_coupling){ -          h_envChan[ch]->sbrCodeEnvelope.upDate = 0; -          h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; -        } -      } /* ch */ - - -      /* -         Code ordinary Left/Right stereo -      */ -      FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, -                    &h_envChan[0]->sbrCodeEnvelope, -                    h_envChan[0]->encEnvData.domain_vec, 0, -                    eData[0].frame_info->nEnvelopes, 0, -                    sbrBitstreamData->HeaderActive); -      FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, -                    &h_envChan[1]->sbrCodeEnvelope, -                    h_envChan[1]->encEnvData.domain_vec, 0, -                    eData[1].frame_info->nEnvelopes, 0, -                    sbrBitstreamData->HeaderActive); - -      c = 0; -      for (i = 0; i < eData[0].nEnvelopes; i++) { -        for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) -          { -            h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg[c]; -            h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg[c]; -            c++; -          } -      } - - - -      FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, -                    &h_envChan[0]->sbrCodeNoiseFloor, -                    h_envChan[0]->encEnvData.domain_vec_noise, 0, -                    (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                    sbrBitstreamData->HeaderActive); - - -      for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) -        h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level[i]; - - -      FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, -                    &h_envChan[1]->sbrCodeNoiseFloor, -                    h_envChan[1]->encEnvData.domain_vec_noise, 0, -                    (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                    sbrBitstreamData->HeaderActive); - -      for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) -        h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level[i]; - - -      sbrHeaderData->coupling = 0; -      h_envChan[0]->encEnvData.balance = 0; -      h_envChan[1]->encEnvData.balance = 0; - -      payloadbitsLR = FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData, -                                                  hParametricStereo, -                                                  sbrBitstreamData, -                                                  &h_envChan[0]->encEnvData, -                                                  &h_envChan[1]->encEnvData, -                                                  hCmonData, -                                                  h_con->sbrSyntaxFlags); - -      /* -        swap saved stored with current values -      */ -      for(ch = 0; ch < nChannels;ch++){ -        INT   itmp; -        for(i=0;i<MAX_FREQ_COEFFS;i++){ -          /* -            swap sfb energies -          */ -          itmp =  h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]; -          h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]=sfbNrgPrevTemp[ch][i]; -          sfbNrgPrevTemp[ch][i]=itmp; -        } -        for(i=0;i<MAX_NUM_NOISE_COEFFS;i++){ -          /* -            swap noise energies -          */ -          itmp =  h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]; -          h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]=noisePrevTemp[ch][i]; -          noisePrevTemp[ch][i]=itmp; -       } -        /* swap update flags */ -        itmp  = h_envChan[ch]->sbrCodeEnvelope.upDate; -        h_envChan[ch]->sbrCodeEnvelope.upDate=upDateNrgTemp[ch]; -        upDateNrgTemp[ch] = itmp; - -        itmp =  h_envChan[ch]->sbrCodeNoiseFloor.upDate; -        h_envChan[ch]->sbrCodeNoiseFloor.upDate=upDateNoiseTemp[ch]; -        upDateNoiseTemp[ch]=itmp; - -        /* -            save domain vecs -        */ -        FDKmemcpy(domainVecTemp[ch],h_envChan[ch]->encEnvData.domain_vec,sizeof(INT)*MAX_ENVELOPES); -        FDKmemcpy(domainVecNoiseTemp[ch],h_envChan[ch]->encEnvData.domain_vec_noise,sizeof(INT)*MAX_ENVELOPES); - -        /* -          forbid time coding in the first envelope in case of a different -          previous stereomode -        */ - -        if(!sbrHeaderData->prev_coupling){ -          h_envChan[ch]->sbrCodeEnvelope.upDate = 0; -          h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; -        } -      } /* ch */ - - -      /* -         Coupling -       */ - -      FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg_coupling, eData[0].frame_info->freqRes, -                    &h_envChan[0]->sbrCodeEnvelope, -                    h_envChan[0]->encEnvData.domain_vec, 1, -                    eData[0].frame_info->nEnvelopes, 0, -                    sbrBitstreamData->HeaderActive); - -      FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg_coupling, eData[1].frame_info->freqRes, -                    &h_envChan[1]->sbrCodeEnvelope, -                    h_envChan[1]->encEnvData.domain_vec, 1, -                    eData[1].frame_info->nEnvelopes, 1, -                    sbrBitstreamData->HeaderActive); - - -      c = 0; -      for (i = 0; i < eData[0].nEnvelopes; i++) { -        for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) { -          h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg_coupling[c]; -          h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg_coupling[c]; -          c++; -        } -      } - -      FDKsbrEnc_codeEnvelope (eData[0].noise_level_coupling, fData->res, -                    &h_envChan[0]->sbrCodeNoiseFloor, -                    h_envChan[0]->encEnvData.domain_vec_noise, 1, -                    (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, -                     sbrBitstreamData->HeaderActive); - -      for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) -        h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level_coupling[i]; - - -      FDKsbrEnc_codeEnvelope (eData[1].noise_level_coupling, fData->res, -                    &h_envChan[1]->sbrCodeNoiseFloor, -                    h_envChan[1]->encEnvData.domain_vec_noise, 1, -                    (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, -                    sbrBitstreamData->HeaderActive); - -      for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) -        h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level_coupling[i]; - -      sbrHeaderData->coupling = 1; - -      h_envChan[0]->encEnvData.balance  = 0; -      h_envChan[1]->encEnvData.balance  = 1; - -      tempFlagLeft  = h_envChan[0]->encEnvData.addHarmonicFlag; -      tempFlagRight = h_envChan[1]->encEnvData.addHarmonicFlag; - -      payloadbitsCOUPLING = -        FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData, -                                    hParametricStereo, -                                    sbrBitstreamData, -                                    &h_envChan[0]->encEnvData, -                                    &h_envChan[1]->encEnvData, -                                    hCmonData, -                                    h_con->sbrSyntaxFlags); - - -      h_envChan[0]->encEnvData.addHarmonicFlag = tempFlagLeft; -      h_envChan[1]->encEnvData.addHarmonicFlag = tempFlagRight; - -      if (payloadbitsCOUPLING < payloadbitsLR) { - -          /* -            copy coded coupling envelope and noise data to l/r -          */ -          for(ch = 0; ch < nChannels;ch++){ -            SBR_ENV_TEMP_DATA *ed = &eData[ch]; -            FDKmemcpy (ed->sfb_nrg, ed->sfb_nrg_coupling, -                  MAX_NUM_ENVELOPE_VALUES * sizeof (SCHAR)); -            FDKmemcpy (ed->noise_level, ed->noise_level_coupling, -                  MAX_NUM_NOISE_VALUES * sizeof (SCHAR)); -          } - -          sbrHeaderData->coupling = 1; -          h_envChan[0]->encEnvData.balance  = 0; -          h_envChan[1]->encEnvData.balance  = 1; -      } -      else{ -          /* -            restore saved l/r items -          */ -          for(ch = 0; ch < nChannels;ch++){ - -            FDKmemcpy (h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, -                    sfbNrgPrevTemp[ch], MAX_FREQ_COEFFS * sizeof (SCHAR)); - -            h_envChan[ch]->sbrCodeEnvelope.upDate = upDateNrgTemp[ch]; - -            FDKmemcpy (h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, -                    noisePrevTemp[ch], MAX_NUM_NOISE_COEFFS * sizeof (SCHAR)); - -            FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec,domainVecTemp[ch],sizeof(INT)*MAX_ENVELOPES); -            FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec_noise,domainVecNoiseTemp[ch],sizeof(INT)*MAX_ENVELOPES); - -            h_envChan[ch]->sbrCodeNoiseFloor.upDate = upDateNoiseTemp[ch]; -          } - -          sbrHeaderData->coupling = 0; -          h_envChan[0]->encEnvData.balance  = 0; -          h_envChan[1]->encEnvData.balance  = 0; -        } -    } -    break; -  } /* switch */ - - -  /* tell the envelope encoders how long it has been, since we last sent -     a frame starting with a dF-coded envelope */ -  if (stereoMode == SBR_MONO ) { -    if (h_envChan[0]->encEnvData.domain_vec[0] == TIME) -      h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; -    else -      h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; -  } -  else { -    if (h_envChan[0]->encEnvData.domain_vec[0] == TIME || -        h_envChan[1]->encEnvData.domain_vec[0] == TIME) { -      h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; -      h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac++; -    } -    else { -      h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; -      h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac = 0; -    } -  } - -  /* -    Send the encoded data to the bitstream -  */ -  for(ch = 0; ch < nChannels;ch++){ -    SBR_ENV_TEMP_DATA *ed = &eData[ch]; -    c = 0; -    for (i = 0; i < ed->nEnvelopes; i++) { -      for (j = 0; j < h_envChan[ch]->encEnvData.noScfBands[i]; j++) { -        h_envChan[ch]->encEnvData.ienvelope[i][j] = ed->sfb_nrg[c]; - -        c++; -      } -    } -    for (i = 0; i < MAX_NUM_NOISE_VALUES; i++){ -      h_envChan[ch]->encEnvData.sbr_noise_levels[i] = ed->noise_level[i]; -    } -  }/* ch */ - - -  /* -    Write bitstream -  */ -  if (nChannels == 2) { -    FDKsbrEnc_WriteEnvChannelPairElement(sbrHeaderData, -                               hParametricStereo, -                               sbrBitstreamData, -                               &h_envChan[0]->encEnvData, -                               &h_envChan[1]->encEnvData, -                               hCmonData, -                               h_con->sbrSyntaxFlags); -  } -  else { -    FDKsbrEnc_WriteEnvSingleChannelElement(sbrHeaderData, -                                 hParametricStereo, -                                 sbrBitstreamData, -                                 &h_envChan[0]->encEnvData, -                                 hCmonData, -                                 h_con->sbrSyntaxFlags); -  } - -  /* -   * Update buffers. -   */ -  for (ch=0; ch<nChannels; ch++) -  { -      int YBufferLength = h_envChan[ch]->sbrExtractEnvelope.no_cols >> h_envChan[ch]->sbrExtractEnvelope.YBufferSzShift; -      for (i = 0; i < h_envChan[ch]->sbrExtractEnvelope.YBufferWriteOffset; i++) { -         FDKmemcpy(h_envChan[ch]->sbrExtractEnvelope.YBuffer[i], -                   h_envChan[ch]->sbrExtractEnvelope.YBuffer[i + YBufferLength], -                   sizeof(FIXP_DBL)*QMF_CHANNELS); -      } -      h_envChan[ch]->sbrExtractEnvelope.YBufferScale[0] = h_envChan[ch]->sbrExtractEnvelope.YBufferScale[1]; -  } - -  sbrHeaderData->prev_coupling = sbrHeaderData->coupling; -} - -/***************************************************************************/ -/*! - -  \brief  creates an envelope extractor handle - -  \return error status - -****************************************************************************/ -INT -FDKsbrEnc_CreateExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE  hSbrCut, -                                    INT channel -                                   ,INT chInEl -                                   ,UCHAR* dynamic_RAM -                         ) -{ -  INT i; -  FIXP_DBL* YBuffer = GetRam_Sbr_envYBuffer(channel); - -  FDKmemclear(hSbrCut,sizeof(SBR_EXTRACT_ENVELOPE)); -  hSbrCut->p_YBuffer = YBuffer; - - -  for (i = 0; i < (QMF_MAX_TIME_SLOTS>>1); i++) { -    hSbrCut->YBuffer[i] = YBuffer + (i*QMF_CHANNELS); -  } -  FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); -  INT n=0; -  for (; i < QMF_MAX_TIME_SLOTS; i++,n++) { -    hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS); -  } - -  FIXP_DBL* rBuffer = GetRam_Sbr_envRBuffer(0, dynamic_RAM); -  FIXP_DBL* iBuffer = GetRam_Sbr_envIBuffer(0, dynamic_RAM); - -  for (i = 0; i < QMF_MAX_TIME_SLOTS; i++) { -    hSbrCut->rBuffer[i] = rBuffer + (i*QMF_CHANNELS); -    hSbrCut->iBuffer[i] = iBuffer + (i*QMF_CHANNELS); -  } - -  return 0; -} - - -/***************************************************************************/ -/*! - -  \brief  Initialize an envelope extractor instance. - -  \return error status - -****************************************************************************/ -INT -FDKsbrEnc_InitExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE  hSbrCut, -                                  int no_cols, -                                  int no_rows, -                                  int start_index, -                                  int time_slots, -                                  int time_step, -                                  int tran_off, -                                  ULONG statesInitFlag -                                 ,int chInEl -                                 ,UCHAR* dynamic_RAM -                                 ,UINT sbrSyntaxFlags -                                  ) -{ -  int YBufferLength, rBufferLength; -  int i; - -  if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { -    int off = TRANSIENT_OFFSET_LD; -#ifndef FULL_DELAY -    hSbrCut->YBufferWriteOffset = (no_cols>>1)+off*time_step; -#else -    hSbrCut->YBufferWriteOffset = no_cols+off*time_step; -#endif -  } else -  { -    hSbrCut->YBufferWriteOffset = tran_off*time_step; -  } -  hSbrCut->rBufferReadOffset  = 0; - - -  YBufferLength = hSbrCut->YBufferWriteOffset + no_cols; -  rBufferLength = no_cols; - -  hSbrCut->pre_transient_info[0] = 0; -  hSbrCut->pre_transient_info[1] = 0; - - -  hSbrCut->no_cols = no_cols; -  hSbrCut->no_rows = no_rows; -  hSbrCut->start_index = start_index; - -  hSbrCut->time_slots = time_slots; -  hSbrCut->time_step = time_step; - -  FDK_ASSERT(no_rows        <=   QMF_CHANNELS); - -  /* Use half the Energy values if time step is 2 or greater */ -  if (time_step >= 2) -    hSbrCut->YBufferSzShift = 1; -  else -    hSbrCut->YBufferSzShift = 0; - -  YBufferLength               >>= hSbrCut->YBufferSzShift; -  hSbrCut->YBufferWriteOffset >>= hSbrCut->YBufferSzShift; - -  FDK_ASSERT(YBufferLength<=QMF_MAX_TIME_SLOTS); - -  FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); -  INT n=0; -  for (i=(QMF_MAX_TIME_SLOTS>>1); i < QMF_MAX_TIME_SLOTS; i++,n++) { -    hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS); -  } - -  if(statesInitFlag) { -    for (i=0; i<YBufferLength; i++) { -      FDKmemclear( hSbrCut->YBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); -    } -  } - -  for (i = 0; i < rBufferLength; i++) { -    FDKmemclear( hSbrCut->rBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); -    FDKmemclear( hSbrCut->iBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); -  } - -  FDKmemclear (hSbrCut->envelopeCompensation,sizeof(UCHAR)*MAX_FREQ_COEFFS); - -  if(statesInitFlag) { -    hSbrCut->YBufferScale[0] = hSbrCut->YBufferScale[1] = FRACT_BITS-1; -  } - -  return (0); -} - - - - -/***************************************************************************/ -/*! - -  \brief  deinitializes an envelope extractor handle - -  \return void - -****************************************************************************/ - -void -FDKsbrEnc_deleteExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut) -{ - -  if (hSbrCut) { -    FreeRam_Sbr_envYBuffer(&hSbrCut->p_YBuffer); -  } -} - -INT -FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr) -{ -  return hSbr->no_rows*((hSbr->YBufferWriteOffset)*2     /* mult 2 because nrg's are grouped half */ -                        - hSbr->rBufferReadOffset );       /* in reference hold half spec and calc nrg's on overlapped spec */ - -} - - - - diff --git a/libSBRenc/src/env_est.h b/libSBRenc/src/env_est.h deleted file mode 100644 index 5e632a4..0000000 --- a/libSBRenc/src/env_est.h +++ /dev/null @@ -1,224 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Envelope estimation structs and prototypes   -*/ -#ifndef __ENV_EST_H -#define __ENV_EST_H - -#include "sbr_def.h" -#include "sbr_encoder.h" /* SBR econfig structs */ -#include "ps_main.h" -#include "bit_sbr.h" -#include "fram_gen.h" -#include "tran_det.h" -#include "code_env.h" -#include "ton_corr.h" - -typedef struct -{ -  FIXP_DBL  *rBuffer[QMF_MAX_TIME_SLOTS]; -  FIXP_DBL  *iBuffer[QMF_MAX_TIME_SLOTS]; - -  FIXP_DBL  *p_YBuffer; - -  FIXP_DBL  *YBuffer[QMF_MAX_TIME_SLOTS]; -  int        YBufferScale[2]; - -  UCHAR envelopeCompensation[MAX_FREQ_COEFFS]; -  UCHAR pre_transient_info[2]; - - -  int YBufferWriteOffset; -  int YBufferSzShift; -  int rBufferReadOffset; - -  int no_cols; -  int no_rows; -  int start_index; - -  int time_slots; -  int time_step; -} -SBR_EXTRACT_ENVELOPE; -typedef SBR_EXTRACT_ENVELOPE *HANDLE_SBR_EXTRACT_ENVELOPE; - -struct ENV_CHANNEL -{ -  SBR_TRANSIENT_DETECTOR sbrTransientDetector; -  SBR_CODE_ENVELOPE sbrCodeEnvelope; -  SBR_CODE_ENVELOPE sbrCodeNoiseFloor; -  SBR_EXTRACT_ENVELOPE sbrExtractEnvelope; - - -  SBR_ENVELOPE_FRAME SbrEnvFrame; -  SBR_TON_CORR_EST   TonCorr; - -  struct SBR_ENV_DATA encEnvData; - -  int qmfScale; -  UCHAR fLevelProtect; -}; -typedef struct ENV_CHANNEL *HANDLE_ENV_CHANNEL; - -/************  Function Declarations ***************/ - -INT -FDKsbrEnc_CreateExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE  hSbrCut, -                                    INT channel -                                   ,INT chInEl -                                   ,UCHAR* dynamic_RAM -                         ); - - -INT -FDKsbrEnc_InitExtractSbrEnvelope ( -                          HANDLE_SBR_EXTRACT_ENVELOPE hSbr, -                          int no_cols, -                          int no_rows, -                          int start_index, -                          int time_slots, int time_step, int tran_off, -                          ULONG statesInitFlag -                         ,int chInEl -                         ,UCHAR* dynamic_RAM -                         ,UINT sbrSyntaxFlags -                         ); - -void FDKsbrEnc_deleteExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut); - -typedef struct { -    FREQ_RES res[MAX_NUM_NOISE_VALUES]; -    int maxQuantError; - -} SBR_FRAME_TEMP_DATA; - -typedef struct { -    const SBR_FRAME_INFO *frame_info; -    FIXP_DBL noiseFloor[MAX_NUM_NOISE_VALUES]; -    SCHAR sfb_nrg_coupling[MAX_NUM_ENVELOPE_VALUES]; /* only used if stereomode = SWITCH_L_R_C */ -    SCHAR sfb_nrg[MAX_NUM_ENVELOPE_VALUES]; -    SCHAR noise_level_coupling[MAX_NUM_NOISE_VALUES]; /* only used if stereomode = SWITCH_L_R_C */ -    SCHAR noise_level[MAX_NUM_NOISE_VALUES]; -    UCHAR transient_info[3]; -    UCHAR nEnvelopes; -} SBR_ENV_TEMP_DATA; - -/* - * Extract features from QMF data. Afterwards, the QMF data is not required anymore. - */ -void -FDKsbrEnc_extractSbrEnvelope1( -                   HANDLE_SBR_CONFIG_DATA    h_con, -                   HANDLE_SBR_HEADER_DATA    sbrHeaderData, -                   HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, -                   HANDLE_ENV_CHANNEL        h_envChan, -                   HANDLE_COMMON_DATA        cmonData, -                   SBR_ENV_TEMP_DATA   *eData, -                   SBR_FRAME_TEMP_DATA *fData -                    ); - - -/* - * Process the previously features extracted by FDKsbrEnc_extractSbrEnvelope1 - * and create/encode SBR envelopes. - */ -void -FDKsbrEnc_extractSbrEnvelope2( -                   HANDLE_SBR_CONFIG_DATA     h_con, -                   HANDLE_SBR_HEADER_DATA     sbrHeaderData, -                   HANDLE_PARAMETRIC_STEREO   hParametricStereo, -                   HANDLE_SBR_BITSTREAM_DATA  sbrBitstreamData, -                   HANDLE_ENV_CHANNEL         sbrEnvChannel0, -                   HANDLE_ENV_CHANNEL         sbrEnvChannel1, -                   HANDLE_COMMON_DATA         cmonData, -                   SBR_ENV_TEMP_DATA         *eData, -                   SBR_FRAME_TEMP_DATA       *fData, -                   int                        clearOutput -                   ); - -INT -FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr); - -#endif diff --git a/libSBRenc/src/fram_gen.cpp b/libSBRenc/src/fram_gen.cpp deleted file mode 100644 index 86c3c81..0000000 --- a/libSBRenc/src/fram_gen.cpp +++ /dev/null @@ -1,2053 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "fram_gen.h" -#include "sbr_misc.h" - -#include "genericStds.h" - -static const SBR_FRAME_INFO frameInfo1_2048 = { -            1, -            { 0, 16}, -            {FREQ_RES_HIGH}, -             0, -             1, -             {0, 16} }; - -static const SBR_FRAME_INFO frameInfo2_2048 = { -            2, -            { 0,  8, 16}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  8, 16} }; - -static const SBR_FRAME_INFO frameInfo4_2048 = { -            4, -            { 0,  4,  8, 12, 16}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  8, 16} }; - -static const SBR_FRAME_INFO frameInfo1_2304 = { -            1, -            { 0, 18}, -            {FREQ_RES_HIGH}, -            0, -            1, -            { 0, 18} }; - -static const SBR_FRAME_INFO frameInfo2_2304 = { -            2, -            { 0,  9, 18}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  9, 18} }; - -static const SBR_FRAME_INFO frameInfo4_2304 = { -            4, -            { 0,  5,  9, 14, 18}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  9, 18} }; - -static const SBR_FRAME_INFO frameInfo1_1920 = { -            1, -            { 0, 15}, -            {FREQ_RES_HIGH}, -            0, -            1, -            { 0, 15} }; - -static const SBR_FRAME_INFO frameInfo2_1920 = { -            2, -            { 0,  8, 15}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  8, 15} }; - -static const SBR_FRAME_INFO frameInfo4_1920 = { -            4, -            { 0,  4,  8, 12, 15}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  8, 15} }; - -static const SBR_FRAME_INFO frameInfo1_1152 = { -            1, -            { 0,  9}, -            {FREQ_RES_HIGH}, -            0, -            1, -            { 0,  9} }; - -static const SBR_FRAME_INFO frameInfo2_1152 = { -            2, -            { 0,  5,  9}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  5,  9} }; - -static const SBR_FRAME_INFO frameInfo4_1152 = { -            4, -            { 0,  2,  5, -              7,  9}, -            {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, -            0, -            2, -            { 0,  5,  9} }; - - -/* AACLD frame info */ -static const SBR_FRAME_INFO frameInfo1_512LD = { -                   1, -                   {0, 8}, -                   {FREQ_RES_HIGH}, -                   0, -                   1, -                   {0, 8}}; - -static const SBR_FRAME_INFO frameInfo2_512LD = { -                   2, -                   {0, 4, 8}, -                   {FREQ_RES_HIGH, FREQ_RES_HIGH}, -                   0, -                   2, -                   {0, 4, 8}}; - -static const SBR_FRAME_INFO frameInfo4_512LD = { -                   4, -                   {0, 2, 4, 6, 8}, -                   {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, -                   0, -                   2, -                   {0, 4, 8}}; - -static int -calcFillLengthMax (int tranPos,          /*!< input : transient position (ref: tran det) */ -                   int numberTimeSlots   /*!< input : number of timeslots */ -                   ); - -static void -fillFrameTran (const int *v_tuningSegm,      /*!< tuning: desired segment lengths */ -               const int *v_tuningFreq,      /*!< tuning: desired frequency resolutions */ -               int tran,                     /*!< input : position of transient */ -               int *v_bord,                  /*!< memNew: borders */ -               int *length_v_bord,           /*!< memNew: # borders */ -               int *v_freq,                  /*!< memNew: frequency resolutions */ -               int *length_v_freq,           /*!< memNew: # frequency resolutions */ -               int *bmin,                    /*!< hlpNew: first mandatory border */ -               int *bmax                     /*!< hlpNew: last  mandatory border */ -               ); - -static void fillFramePre (INT dmax, INT *v_bord, INT *length_v_bord, -                          INT *v_freq, INT *length_v_freq, INT bmin, -                          INT rest); - -static void fillFramePost (INT *parts, INT *d, INT dmax, INT *v_bord, -                           INT *length_v_bord, INT *v_freq, -                           INT *length_v_freq, INT bmax, -                           INT bufferFrameStart, INT numberTimeSlots, INT fmax); - -static void fillFrameInter (INT *nL, const int *v_tuningSegm, INT *v_bord, -                            INT *length_v_bord, INT bmin, INT *v_freq, -                            INT *length_v_freq, INT *v_bordFollow, -                            INT *length_v_bordFollow, INT *v_freqFollow, -                            INT *length_v_freqFollow, INT i_fillFollow, -                            INT dmin, INT dmax, INT numberTimeSlots); - -static void calcFrameClass (FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld, INT tranFlag, -                            INT *spreadFlag); - -static void specialCase (INT *spreadFlag, INT allowSpread, INT *v_bord, -                         INT *length_v_bord, INT *v_freq, INT *length_v_freq, -                         INT *parts, INT d); - -static void calcCmonBorder (INT *i_cmon, INT *i_tran, INT *v_bord, -                            INT *length_v_bord, INT tran, -                            INT bufferFrameStart, INT numberTimeSlots); - -static void keepForFollowUp (INT *v_bordFollow, INT *length_v_bordFollow, -                             INT *v_freqFollow, INT *length_v_freqFollow, -                             INT *i_tranFollow, INT *i_fillFollow, -                             INT *v_bord, INT *length_v_bord, INT *v_freq, -                             INT i_cmon, INT i_tran, INT parts, INT numberTimeSlots); - -static void calcCtrlSignal (HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass, -                            INT *v_bord, INT length_v_bord, INT *v_freq, -                            INT length_v_freq, INT i_cmon, INT i_tran, -                            INT spreadFlag, INT nL); - -static void ctrlSignal2FrameInfo (HANDLE_SBR_GRID hSbrGrid, -                                  HANDLE_SBR_FRAME_INFO hFrameInfo, -                                  INT freq_res_fixfix); - - -/* table for 8 time slot index */ -static const int envelopeTable_8 [8][5] = { -/* transientIndex  nEnv, tranIdx, shortEnv, border1, border2, ... */ -/* borders from left to right side; -1 = not in use */ -    /*[|T-|------]*/  { 2, 0, 0, 1, -1 }, -    /*[|-T-|-----]*/  { 2, 0, 0, 2, -1 }, -    /*[--|T-|----]*/  { 3, 1, 1, 2,  4 }, -    /*[---|T-|---]*/  { 3, 1, 1, 3,  5 }, -    /*[----|T-|--]*/  { 3, 1, 1, 4,  6 }, -    /*[-----|T--|]*/  { 2, 1, 1, 5, -1 }, -    /*[------|T-|]*/  { 2, 1, 1, 6, -1 }, -    /*[-------|T|]*/  { 2, 1, 1, 7, -1 }, -}; - -/* table for 16 time slot index */ -static const int envelopeTable_16 [16][6] = { -    /* transientIndex  nEnv, tranIdx, shortEnv, border1, border2, ... */ -    /* length from left to right side; -1 = not in use */ -    /*[|T---|------------|]*/ { 2, 0, 0, 4, -1, -1}, -    /*[|-T---|-----------|]*/ { 2, 0, 0, 5, -1, -1}, -    /*[|--|T---|----------]*/ { 3, 1, 1, 2,  6, -1}, -    /*[|---|T---|---------]*/ { 3, 1, 1, 3,  7, -1}, -    /*[|----|T---|--------]*/ { 3, 1, 1, 4,  8, -1}, -    /*[|-----|T---|-------]*/ { 3, 1, 1, 5,  9, -1}, -    /*[|------|T---|------]*/ { 3, 1, 1, 6, 10, -1}, -    /*[|-------|T---|-----]*/ { 3, 1, 1, 7, 11, -1}, -    /*[|--------|T---|----]*/ { 3, 1, 1, 8, 12, -1}, -    /*[|---------|T---|---]*/ { 3, 1, 1, 9, 13, -1}, -    /*[|----------|T---|--]*/ { 3, 1, 1,10, 14, -1}, -    /*[|-----------|T----|]*/ { 2, 1, 1,11, -1, -1}, -    /*[|------------|T---|]*/ { 2, 1, 1,12, -1, -1}, -    /*[|-------------|T--|]*/ { 2, 1, 1,13, -1, -1}, -    /*[|--------------|T-|]*/ { 2, 1, 1,14, -1, -1}, -    /*[|---------------|T|]*/ { 2, 1, 1,15, -1, -1}, -}; - -/* table for 15 time slot index */ -static const int envelopeTable_15 [15][6] = { -    /* transientIndex  nEnv, tranIdx, shortEnv, border1, border2, ... */ -    /* length from left to right side; -1 = not in use */ -    /*[|T---|------------]*/ { 2, 0, 0, 4, -1, -1}, -    /*[|-T---|-----------]*/ { 2, 0, 0, 5, -1, -1}, -    /*[|--|T---|---------]*/ { 3, 1, 1, 2,  6, -1}, -    /*[|---|T---|--------]*/ { 3, 1, 1, 3,  7, -1}, -    /*[|----|T---|-------]*/ { 3, 1, 1, 4,  8, -1}, -    /*[|-----|T---|------]*/ { 3, 1, 1, 5,  9, -1}, -    /*[|------|T---|-----]*/ { 3, 1, 1, 6, 10, -1}, -    /*[|-------|T---|----]*/ { 3, 1, 1, 7, 11, -1}, -    /*[|--------|T---|---]*/ { 3, 1, 1, 8, 12, -1}, -    /*[|---------|T---|--]*/ { 3, 1, 1, 9, 13, -1}, -    /*[|----------|T----|]*/ { 2, 1, 1,10, -1, -1}, -    /*[|-----------|T---|]*/ { 2, 1, 1,11, -1, -1}, -    /*[|------------|T--|]*/ { 2, 1, 1,12, -1, -1}, -    /*[|-------------|T-|]*/ { 2, 1, 1,13, -1, -1}, -    /*[|--------------|T|]*/ { 2, 1, 1,14, -1, -1}, -}; - -static const int minFrameTranDistance = 4; - -static const FREQ_RES freqRes_table_8[] = {FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, -  FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}; - -static const FREQ_RES freqRes_table_16[16] = { -    /* size of envelope */ -/* 0-4 */    FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, -/* 5-9 */    FREQ_RES_LOW, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, -/* 10-16 */  FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, -             FREQ_RES_HIGH }; - -static void generateFixFixOnly ( HANDLE_SBR_FRAME_INFO hSbrFrameInfo, -                                 HANDLE_SBR_GRID hSbrGrid, -                                 int tranPosInternal, -                                 int numberTimeSlots -                               ); - - -/*! -  Functionname: FDKsbrEnc_frameInfoGenerator - -  Description:  produces the FRAME_INFO struct for the current frame - -  Arguments:    hSbrEnvFrame          - pointer to sbr envelope handle -                v_pre_transient_info  - pointer to transient info vector -                v_transient_info      - pointer to previous transient info vector -                v_tuning              - pointer to tuning vector - - Return:      frame_info        - pointer to SBR_FRAME_INFO struct - -*******************************************************************************/ -HANDLE_SBR_FRAME_INFO -FDKsbrEnc_frameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, -                    UCHAR *v_transient_info, -                    UCHAR *v_transient_info_pre, -                    int ldGrid, -                    const int *v_tuning) -{ -  INT numEnv, tranPosInternal=0, bmin=0, bmax=0, parts, d, i_cmon=0, i_tran=0, nL; -  INT fmax = 0; - -  INT *v_bord = hSbrEnvFrame->v_bord; -  INT *v_freq = hSbrEnvFrame->v_freq; -  INT *v_bordFollow = hSbrEnvFrame->v_bordFollow; -  INT *v_freqFollow = hSbrEnvFrame->v_freqFollow; - - -  INT *length_v_bordFollow = &hSbrEnvFrame->length_v_bordFollow; -  INT *length_v_freqFollow = &hSbrEnvFrame->length_v_freqFollow; -  INT *length_v_bord = &hSbrEnvFrame->length_v_bord; -  INT *length_v_freq = &hSbrEnvFrame->length_v_freq; -  INT *spreadFlag = &hSbrEnvFrame->spreadFlag; -  INT *i_tranFollow = &hSbrEnvFrame->i_tranFollow; -  INT *i_fillFollow = &hSbrEnvFrame->i_fillFollow; -  FRAME_CLASS *frameClassOld = &hSbrEnvFrame->frameClassOld; -  FRAME_CLASS frameClass = FIXFIX; - - -  INT allowSpread = hSbrEnvFrame->allowSpread; -  INT numEnvStatic = hSbrEnvFrame->numEnvStatic; -  INT staticFraming = hSbrEnvFrame->staticFraming; -  INT dmin = hSbrEnvFrame->dmin; -  INT dmax = hSbrEnvFrame->dmax; - -  INT bufferFrameStart = hSbrEnvFrame->SbrGrid.bufferFrameStart; -  INT numberTimeSlots = hSbrEnvFrame->SbrGrid.numberTimeSlots; -  INT frameMiddleSlot = hSbrEnvFrame->frameMiddleSlot; - -  INT tranPos = v_transient_info[0]; -  INT tranFlag = v_transient_info[1]; - -  const int *v_tuningSegm = v_tuning; -  const int *v_tuningFreq = v_tuning + 3; - -  hSbrEnvFrame->v_tuningSegm = v_tuningSegm; -  INT freq_res_fixfix = hSbrEnvFrame->freq_res_fixfix; - -  if (ldGrid) { -    /* in case there was a transient at the very end of the previous frame, start with a transient envelope */ -    if(v_transient_info_pre[1] && (numberTimeSlots - v_transient_info_pre[0] < minFrameTranDistance)){ -      tranFlag = 1; -      tranPos  = 0; -    } -  } - -  /* -   * Synopsis: -   * -   * The frame generator creates the time-/frequency-grid for one SBR frame. -   * Input signals are provided by the transient detector and the frame -   * splitter (transientDetectNew() & FrameSplitter() in tran_det.c).  The -   * framing is controlled by adjusting tuning parameters stored in -   * FRAME_GEN_TUNING.  The parameter values are dependent on frame lengths -   * and bitrates, and may in the future be signal dependent. -   * -   * The envelope borders are stored for frame generator internal use in -   * aBorders.  The contents of aBorders represent positions along the time -   * axis given in the figures in fram_gen.h (the "frame-generator" rows). -   * The unit is "time slot".  The figures in fram_gen.h also define the -   * detection ranges for the transient detector.  For every border in -   * aBorders, there is a corresponding entry in aFreqRes, which defines the -   * frequency resolution of the envelope following (delimited by) the -   * border. -   * -   * When no transients are present, FIXFIX class frames are used.  The -   * frame splitter decides whether to use one or two envelopes in the -   * FIXFIX frame.  "Sparse transients" (separated by a few frames without -   * transients) are handeled by [FIXVAR, VARFIX] pairs or (depending on -   * tuning and transient position relative the nominal frame boundaries) -   * by [FIXVAR, VARVAR, VARFIX] triples.  "Tight transients" (in -   * consecutive frames) are handeled by [..., VARVAR, VARVAR, ...] -   * sequences. -   * -   * The generator assumes that transients are "sparse", and designs -   * borders for [FIXVAR, VARFIX] pairs right away, where the first frame -   * corresponds to the present frame.  At the next call of the generator -   * it is known whether the transient actually is "sparse" or not.  If -   * 'yes', the already calculated VARFIX borders are used.  If 'no', new -   * borders, meeting the requirements of the "tight" transient, are -   * calculated. -   * -   * The generator produces two outputs:  A "clear-text bitstream" stored in -   * SBR_GRID, and a straight-forward representation of the grid stored in -   * SBR_FRAME_INFO.  The former is subsequently converted to the actual -   * bitstream sbr_grid() (encodeSbrGrid() in bit_sbr.c).  The latter is -   * used by other encoder functions, such as the envelope estimator -   * (calculateSbrEnvelope() in env_est.c) and the noise floor and missing -   * harmonics detector (TonCorrParamExtr() in nf_est.c). -   */ - -  if (staticFraming) { -    /*-------------------------------------------------------------------------- -      Ignore transient detector -    ---------------------------------------------------------------------------*/ - -    frameClass = FIXFIX; -    numEnv = numEnvStatic;      /* {1,2,4,8} */ -    *frameClassOld = FIXFIX;    /* for change to dyn */ -    hSbrEnvFrame->SbrGrid.bs_num_env = numEnv; -    hSbrEnvFrame->SbrGrid.frameClass = frameClass; -  } -  else { -    /*-------------------------------------------------------------------------- -      Calculate frame class to use -    ---------------------------------------------------------------------------*/ -    calcFrameClass (&frameClass, frameClassOld, tranFlag, spreadFlag); - -    /* patch for new frame class FIXFIXonly for AAC LD */ -    if (tranFlag && ldGrid) { -      frameClass     = FIXFIXonly; -      *frameClassOld = FIXFIX; -    } - -    /* -     * every transient is processed below by inserting -     * -     * - one border at the onset of the transient -     * - one or more "decay borders" (after the onset of the transient) -     * - optionally one "attack border" (before the onset of the transient) -     * -     * those borders are referred to as "mandatory borders" and are -     * defined by the 'segmentLength' array in FRAME_GEN_TUNING -     * -     * the frequency resolutions of the corresponding envelopes are -     * defined by the 'segmentRes' array in FRAME_GEN_TUNING -     */ - -    /*-------------------------------------------------------------------------- -      Design frame (or follow-up old design) -    ---------------------------------------------------------------------------*/ -    if (tranFlag) {             /* Always for FixVar, often but not always for VarVar */ -      /*-------------------------------------------------------------------------- -        Design part of T/F-grid around the new transient -      ---------------------------------------------------------------------------*/ - -      tranPosInternal = frameMiddleSlot + tranPos + bufferFrameStart ;      /* FH 00-06-26 */ -      /* -        add mandatory borders around transient -      */ - -      fillFrameTran ( v_tuningSegm, -                      v_tuningFreq, -                      tranPosInternal, -                      v_bord, -                      length_v_bord, -                      v_freq, -                      length_v_freq, -                     &bmin, -                     &bmax ); - -      /* make sure we stay within the maximum SBR frame overlap */ -      fmax = calcFillLengthMax(tranPos, numberTimeSlots); -    } - -    switch (frameClass) { - -    case FIXFIXonly: -      FDK_ASSERT(ldGrid); -      tranPosInternal = tranPos; -      generateFixFixOnly ( &(hSbrEnvFrame->SbrFrameInfo), -                           &(hSbrEnvFrame->SbrGrid), -                           tranPosInternal, -                           numberTimeSlots -                           ); - -      return &(hSbrEnvFrame->SbrFrameInfo); - -    case FIXVAR: - -      /*-------------------------------------------------------------------------- -         Design remaining parts of T/F-grid (assuming next frame is VarFix) -      ---------------------------------------------------------------------------*/ - -      /*-------------------------------------------------------------------------- -        Fill region before new transient: -      ---------------------------------------------------------------------------*/ -      fillFramePre (dmax, v_bord, length_v_bord, v_freq, length_v_freq, -                    bmin, bmin - bufferFrameStart);     /* FH 00-06-26 */ - -      /*-------------------------------------------------------------------------- -        Fill region after new transient: -      ---------------------------------------------------------------------------*/ -      fillFramePost (&parts, &d, dmax, v_bord, length_v_bord, v_freq, -                     length_v_freq, bmax, bufferFrameStart, numberTimeSlots, fmax); - -      /*-------------------------------------------------------------------------- -        Take care of special case: -      ---------------------------------------------------------------------------*/ -      if (parts == 1 && d < dmin)       /* no fill, short last envelope */ -        specialCase (spreadFlag, allowSpread, v_bord, length_v_bord, -                     v_freq, length_v_freq, &parts, d); - -      /*-------------------------------------------------------------------------- -        Calculate common border (split-point) -      ---------------------------------------------------------------------------*/ -      calcCmonBorder (&i_cmon, &i_tran, v_bord, length_v_bord, tranPosInternal, -                      bufferFrameStart, numberTimeSlots);       /* FH 00-06-26 */ - -      /*-------------------------------------------------------------------------- -        Extract data for proper follow-up in next frame -      ---------------------------------------------------------------------------*/ -      keepForFollowUp (v_bordFollow, length_v_bordFollow, v_freqFollow, -                       length_v_freqFollow, i_tranFollow, i_fillFollow, -                       v_bord, length_v_bord, v_freq, i_cmon, i_tran, parts, numberTimeSlots);  /* FH 00-06-26 */ - -      /*-------------------------------------------------------------------------- -        Calculate control signal -      ---------------------------------------------------------------------------*/ -      calcCtrlSignal (&hSbrEnvFrame->SbrGrid, frameClass, -                      v_bord, *length_v_bord, v_freq, *length_v_freq, -                      i_cmon, i_tran, *spreadFlag, DC); -      break; -    case VARFIX: -      /*-------------------------------------------------------------------------- -        Follow-up old transient - calculate control signal -      ---------------------------------------------------------------------------*/ -      calcCtrlSignal (&hSbrEnvFrame->SbrGrid, frameClass, -                      v_bordFollow, *length_v_bordFollow, v_freqFollow, -                      *length_v_freqFollow, DC, *i_tranFollow, -                      *spreadFlag, DC); -      break; -    case VARVAR: -      if (*spreadFlag) {        /* spread across three frames */ -        /*-------------------------------------------------------------------------- -          Follow-up old transient - calculate control signal -        ---------------------------------------------------------------------------*/ -        calcCtrlSignal (&hSbrEnvFrame->SbrGrid, -                        frameClass, v_bordFollow, *length_v_bordFollow, -                        v_freqFollow, *length_v_freqFollow, DC, -                        *i_tranFollow, *spreadFlag, DC); - -        *spreadFlag = 0; - -        /*-------------------------------------------------------------------------- -          Extract data for proper follow-up in next frame -        ---------------------------------------------------------------------------*/ -        v_bordFollow[0] = hSbrEnvFrame->SbrGrid.bs_abs_bord_1 - numberTimeSlots; /* FH 00-06-26 */ -        v_freqFollow[0] = 1; -        *length_v_bordFollow = 1; -        *length_v_freqFollow = 1; - -        *i_tranFollow = -DC; -        *i_fillFollow = -DC; -      } -      else { -        /*-------------------------------------------------------------------------- -          Design remaining parts of T/F-grid (assuming next frame is VarFix) -          adapt or fill region before new transient: -        ---------------------------------------------------------------------------*/ -        fillFrameInter (&nL, v_tuningSegm, v_bord, length_v_bord, bmin, -                        v_freq, length_v_freq, v_bordFollow, -                        length_v_bordFollow, v_freqFollow, -                        length_v_freqFollow, *i_fillFollow, dmin, dmax, -                        numberTimeSlots); - -        /*-------------------------------------------------------------------------- -          Fill after transient: -        ---------------------------------------------------------------------------*/ -        fillFramePost (&parts, &d, dmax, v_bord, length_v_bord, v_freq, -                       length_v_freq, bmax, bufferFrameStart, numberTimeSlots, fmax); - -        /*-------------------------------------------------------------------------- -          Take care of special case: -        ---------------------------------------------------------------------------*/ -        if (parts == 1 && d < dmin)     /*% no fill, short last envelope */ -          specialCase (spreadFlag, allowSpread, v_bord, length_v_bord, -                       v_freq, length_v_freq, &parts, d); - -        /*-------------------------------------------------------------------------- -          Calculate common border (split-point) -        ---------------------------------------------------------------------------*/ -        calcCmonBorder (&i_cmon, &i_tran, v_bord, length_v_bord, tranPosInternal, -                        bufferFrameStart, numberTimeSlots); - -        /*-------------------------------------------------------------------------- -          Extract data for proper follow-up in next frame -        ---------------------------------------------------------------------------*/ -        keepForFollowUp (v_bordFollow, length_v_bordFollow, -                         v_freqFollow, length_v_freqFollow, -                         i_tranFollow, i_fillFollow, v_bord, -                         length_v_bord, v_freq, i_cmon, i_tran, parts, numberTimeSlots); - -        /*-------------------------------------------------------------------------- -          Calculate control signal -        ---------------------------------------------------------------------------*/ -        calcCtrlSignal (&hSbrEnvFrame->SbrGrid, -                        frameClass, v_bord, *length_v_bord, v_freq, -                        *length_v_freq, i_cmon, i_tran, 0, nL); -      } -      break; -    case FIXFIX: -      if (tranPos == 0) -        numEnv = 1; -      else -        numEnv = 2; - -      hSbrEnvFrame->SbrGrid.bs_num_env = numEnv; -      hSbrEnvFrame->SbrGrid.frameClass = frameClass; - -      break; -    default: -      FDK_ASSERT(0); -    } -  } - -  /*------------------------------------------------------------------------- -    Convert control signal to frame info struct -  ---------------------------------------------------------------------------*/ -  ctrlSignal2FrameInfo (&hSbrEnvFrame->SbrGrid, -                        &hSbrEnvFrame->SbrFrameInfo, -                        freq_res_fixfix); - -  return &hSbrEnvFrame->SbrFrameInfo; -} - - -/***************************************************************************/ -/*! -  \brief    Gnerates frame info for FIXFIXonly frame class used for low delay version - -  \return   nothing - ****************************************************************************/ -static void generateFixFixOnly ( HANDLE_SBR_FRAME_INFO hSbrFrameInfo, -                                 HANDLE_SBR_GRID hSbrGrid, -                                 int tranPosInternal, -                                 int numberTimeSlots -                               ) -{ -  int nEnv, i, k=0, tranIdx; -  const int *pTable = NULL; -  const FREQ_RES *freqResTable = NULL; - -  switch (numberTimeSlots) { -      case 8: -          pTable = envelopeTable_8[tranPosInternal]; -          freqResTable = freqRes_table_8; -          break; -      case 15: -          pTable = envelopeTable_15[tranPosInternal]; -          freqResTable = freqRes_table_16; -          break; -      case 16: -          pTable = envelopeTable_16[tranPosInternal]; -          freqResTable = freqRes_table_16; -          break; -  } - -  /* look number of envolpes in table */ -  nEnv = pTable[0]; -  /* look up envolpe distribution in table */ -  for (i=1; i<nEnv; i++) -    hSbrFrameInfo->borders[i] = pTable[i+2]; - -  /* open and close frame border */ -  hSbrFrameInfo->borders[0]    = 0; -  hSbrFrameInfo->borders[nEnv] = numberTimeSlots; - -  /* adjust segment-frequency-resolution according to the segment-length */ -  for (i=0; i<nEnv; i++){ -    k = hSbrFrameInfo->borders[i+1] - hSbrFrameInfo->borders[i]; -    hSbrFrameInfo->freqRes[i] = freqResTable[k]; -    hSbrGrid->v_f[i] = freqResTable[k]; -  } - -  hSbrFrameInfo->nEnvelopes = nEnv; -  hSbrFrameInfo->shortEnv   = pTable[2]; -  /* transient idx */ -  tranIdx = pTable[1]; - -  /* add noise floors */ -  hSbrFrameInfo->bordersNoise[0] = 0; -  hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[tranIdx?tranIdx:1]; -  hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; -  hSbrFrameInfo->nNoiseEnvelopes = 2; - -  hSbrGrid->frameClass = FIXFIXonly; -  hSbrGrid->bs_abs_bord = tranPosInternal; -  hSbrGrid->bs_num_env = nEnv; - -} - - - -/******************************************************************************* - Functionname:  FDKsbrEnc_initFrameInfoGenerator - ******************************************************************************* - - Description: - - Arguments:   hSbrEnvFrame  - pointer to sbr envelope handle -              allowSpread   - commandline parameter -              numEnvStatic  - commandline parameter -              staticFraming - commandline parameter - - Return:      none - -*******************************************************************************/ -void -FDKsbrEnc_initFrameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME  hSbrEnvFrame, -                          INT allowSpread, -                          INT numEnvStatic, -                          INT staticFraming, -                          INT timeSlots, -                          INT freq_res_fixfix -                          ,int ldGrid -                          ) - -{                               /* FH 00-06-26 */ - -  FDKmemclear(hSbrEnvFrame,sizeof(SBR_ENVELOPE_FRAME )); - - -  /* Initialisation */ -  hSbrEnvFrame->frameClassOld = FIXFIX; -  hSbrEnvFrame->spreadFlag = 0; - -  hSbrEnvFrame->allowSpread = allowSpread; -  hSbrEnvFrame->numEnvStatic = numEnvStatic; -  hSbrEnvFrame->staticFraming = staticFraming; -  hSbrEnvFrame->freq_res_fixfix = freq_res_fixfix; - -  hSbrEnvFrame->length_v_bord = 0; -  hSbrEnvFrame->length_v_bordFollow = 0; - -  hSbrEnvFrame->length_v_freq = 0; -  hSbrEnvFrame->length_v_freqFollow = 0; - -  hSbrEnvFrame->i_tranFollow = 0; -  hSbrEnvFrame->i_fillFollow = 0; - -  hSbrEnvFrame->SbrGrid.numberTimeSlots = timeSlots; - -  if (ldGrid) { -    /*case CODEC_AACLD:*/ -      hSbrEnvFrame->dmin = 2; -      hSbrEnvFrame->dmax = 16; -      hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_512LD; -  } else -  switch(timeSlots){ -    case NUMBER_TIME_SLOTS_1920: -      hSbrEnvFrame->dmin = 4; -      hSbrEnvFrame->dmax = 12; -      hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; -      hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1920; -    break; -    case NUMBER_TIME_SLOTS_2048: -      hSbrEnvFrame->dmin = 4; -      hSbrEnvFrame->dmax = 12; -      hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; -      hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2048; -    break; -    case NUMBER_TIME_SLOTS_1152: -      hSbrEnvFrame->dmin = 2; -      hSbrEnvFrame->dmax = 8; -      hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; -      hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1152; -    break; -    case NUMBER_TIME_SLOTS_2304: -      hSbrEnvFrame->dmin = 4; -      hSbrEnvFrame->dmax = 15; -      hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; -      hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2304; -    break; -    default: -      FDK_ASSERT(0); -  } - -} - - -/******************************************************************************* - Functionname:  fillFrameTran - ******************************************************************************* - - Description:  Add mandatory borders, as described by the tuning vector -               and the current transient position - - Arguments: -      modified: -              v_bord        - int pointer to v_bord vector -              length_v_bord - length of v_bord vector -              v_freq        - int pointer to v_freq vector -              length_v_freq - length of v_freq vector -              bmin          - int pointer to bmin (call by reference) -              bmax          - int pointer to bmax (call by reference) -      not modified: -              tran          - position of transient -              v_tuningSegm  - int pointer to v_tuningSegm vector -              v_tuningFreq  - int pointer to v_tuningFreq vector - - Return:      none - -*******************************************************************************/ -static void -fillFrameTran (const int *v_tuningSegm,      /*!< tuning: desired segment lengths */ -               const int *v_tuningFreq,      /*!< tuning: desired frequency resolutions */ -               int tran,                     /*!< input : position of transient */ -               int *v_bord,                  /*!< memNew: borders */ -               int *length_v_bord,           /*!< memNew: # borders */ -               int *v_freq,                  /*!< memNew: frequency resolutions */ -               int *length_v_freq,           /*!< memNew: # frequency resolutions */ -               int *bmin,                    /*!< hlpNew: first mandatory border */ -               int *bmax                     /*!< hlpNew: last  mandatory border */ -               ) -{ -  int bord, i; - -  *length_v_bord = 0; -  *length_v_freq = 0; - -  /* add attack env leading border (optional) */ -  if (v_tuningSegm[0]) { -    /* v_bord = [(Ba)] start of attack env */ -    FDKsbrEnc_AddRight (v_bord, length_v_bord, (tran - v_tuningSegm[0])); - -    /* v_freq = [(Fa)] res of attack env */ -    FDKsbrEnc_AddRight (v_freq, length_v_freq, v_tuningFreq[0]); -  } - -  /* add attack env trailing border/first decay env leading border */ -  bord = tran; -  FDKsbrEnc_AddRight (v_bord, length_v_bord, tran);   /* v_bord = [(Ba),Bd1] */ - -  /* add first decay env trailing border/2:nd decay env leading border */ -  if (v_tuningSegm[1]) { -    bord += v_tuningSegm[1]; - -    /* v_bord = [(Ba),Bd1,Bd2] */ -    FDKsbrEnc_AddRight (v_bord, length_v_bord, bord); - -    /* v_freq = [(Fa),Fd1] */ -    FDKsbrEnc_AddRight (v_freq, length_v_freq, v_tuningFreq[1]); -  } - -  /* add 2:nd decay env trailing border (optional) */ -  if (v_tuningSegm[2] != 0) { -    bord += v_tuningSegm[2]; - -    /* v_bord = [(Ba),Bd1, Bd2,(Bd3)] */ -    FDKsbrEnc_AddRight (v_bord, length_v_bord, bord); - -    /* v_freq = [(Fa),Fd1,(Fd2)] */ -    FDKsbrEnc_AddRight (v_freq, length_v_freq, v_tuningFreq[2]); -  } - -  /*  v_freq = [(Fa),Fd1,(Fd2),1] */ -  FDKsbrEnc_AddRight (v_freq, length_v_freq, 1); - - -  /*  calc min and max values of mandatory borders */ -  *bmin = v_bord[0]; -  for (i = 0; i < *length_v_bord; i++) -    if (v_bord[i] < *bmin) -      *bmin = v_bord[i]; - -  *bmax = v_bord[0]; -  for (i = 0; i < *length_v_bord; i++) -    if (v_bord[i] > *bmax) -      *bmax = v_bord[i]; - -} - - - -/******************************************************************************* - Functionname:  fillFramePre - ******************************************************************************* - - Description: Add borders before mandatory borders, if needed - - Arguments: -       modified: -              v_bord        - int pointer to v_bord vector -              length_v_bord - length of v_bord vector -              v_freq        - int pointer to v_freq vector -              length_v_freq - length of v_freq vector -       not modified: -              dmax          - int value -              bmin          - int value -              rest          - int value - - Return:      none - -*******************************************************************************/ -static void -fillFramePre (INT dmax, -              INT *v_bord, INT *length_v_bord, -              INT *v_freq, INT *length_v_freq, -              INT bmin, INT rest) -{ -  /* -    input state: -    v_bord = [(Ba),Bd1, Bd2 ,(Bd3)] -    v_freq = [(Fa),Fd1,(Fd2),1 ] -  */ - -  INT parts, d, j, S, s = 0, segm, bord; - -  /* -    start with one envelope -  */ - -  parts = 1; -  d = rest; - -  /* -    calc # of additional envelopes and corresponding lengths -  */ - -  while (d > dmax) { -    parts++; - -    segm = rest / parts; -    S = (segm - 2)>>1; -    s = fixMin (8, 2 * S + 2); -    d = rest - (parts - 1) * s; -  } - -  /* -    add borders before mandatory borders -  */ - -  bord = bmin; - -  for (j = 0; j <= parts - 2; j++) { -    bord = bord - s; - -    /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] */ -    FDKsbrEnc_AddLeft (v_bord, length_v_bord, bord); - -    /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1   ] */ -    FDKsbrEnc_AddLeft (v_freq, length_v_freq, 1); -  } -} - -/***************************************************************************/ -/*! -  \brief Overlap control - -  Calculate max length of trailing fill segments, such that we always get a -  border within the frame overlap region - -  \return void - -****************************************************************************/ -static int -calcFillLengthMax (int tranPos,          /*!< input : transient position (ref: tran det) */ -                   int numberTimeSlots   /*!< input : number of timeslots */ -                   ) -{ -  int fmax; - -  /* -    calculate transient position within envelope buffer -  */ -  switch (numberTimeSlots) -  { -    case NUMBER_TIME_SLOTS_2048: -        if (tranPos < 4) -          fmax = 6; -        else if (tranPos == 4 || tranPos == 5) -          fmax = 4; -        else -          fmax = 8; -        break; - -    case NUMBER_TIME_SLOTS_1920: -        if (tranPos < 4) -          fmax = 5; -        else if (tranPos == 4 || tranPos == 5) -          fmax = 3; -        else -          fmax = 7; -        break; - -    default: -        fmax = 8; -        break; -  } - -  return fmax; -} - -/******************************************************************************* - Functionname:  fillFramePost - ******************************************************************************* - - Description: -Add borders after mandatory borders, if needed -               Make a preliminary design of next frame, -               assuming no transient is present there - - Arguments: -       modified: -              parts         - int pointer to parts (call by reference) -              d             - int pointer to d (call by reference) -              v_bord        - int pointer to v_bord vector -              length_v_bord - length of v_bord vector -              v_freq        - int pointer to v_freq vector -              length_v_freq - length of v_freq vector -        not modified: -              bmax          - int value -              dmax          - int value - - Return:      none - -*******************************************************************************/ -static void -fillFramePost (INT *parts, INT *d, INT dmax, INT *v_bord, INT *length_v_bord, -               INT *v_freq, INT *length_v_freq, INT bmax, -               INT bufferFrameStart, INT numberTimeSlots, INT fmax) -{ -  INT j, rest, segm, S, s = 0, bord; - -  /* -    input state: -    v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] -    v_freq = [...,(1 ),(Fa),Fd1,(Fd2),1    ] -  */ - -  rest = bufferFrameStart + 2 * numberTimeSlots - bmax; -  *d = rest; - -  if (*d > 0) { -    *parts = 1;           /* start with one envelope */ - -    /* calc # of additional envelopes and corresponding lengths */ - -    while (*d > dmax) { -      *parts = *parts + 1; - -      segm = rest / (*parts); -      S = (segm - 2)>>1; -      s = fixMin (fmax, 2 * S + 2); -      *d = rest - (*parts - 1) * s; -    } - -    /* add borders after mandatory borders */ - -    bord = bmax; -    for (j = 0; j <= *parts - 2; j++) { -      bord += s; - -      /* v_bord =  [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3),(Bf)] */ -      FDKsbrEnc_AddRight (v_bord, length_v_bord, bord); - -      /* v_freq =  [...,(1 ),(Fa),Fd1,(Fd2), 1   , 1! ,1] */ -      FDKsbrEnc_AddRight (v_freq, length_v_freq, 1); -    } -  } -  else { -    *parts = 1; - -    /* remove last element from v_bord and v_freq */ - -    *length_v_bord = *length_v_bord - 1; -    *length_v_freq = *length_v_freq - 1; - -  } -} - - - -/******************************************************************************* - Functionname:  fillFrameInter - ******************************************************************************* - - Description: - - Arguments:   nL                  - -              v_tuningSegm        - -              v_bord              - -              length_v_bord       - -              bmin                - -              v_freq              - -              length_v_freq       - -              v_bordFollow        - -              length_v_bordFollow - -              v_freqFollow        - -              length_v_freqFollow - -              i_fillFollow        - -              dmin                - -              dmax                - - - Return:      none - -*******************************************************************************/ -static void -fillFrameInter (INT *nL, const int *v_tuningSegm, INT *v_bord, INT *length_v_bord, -                INT bmin, INT *v_freq, INT *length_v_freq, INT *v_bordFollow, -                INT *length_v_bordFollow, INT *v_freqFollow, -                INT *length_v_freqFollow, INT i_fillFollow, INT dmin, -                INT dmax, INT numberTimeSlots) -{ -  INT middle, b_new, numBordFollow, bordMaxFollow, i; - -  if (numberTimeSlots != NUMBER_TIME_SLOTS_1152) { - -    /* % remove fill borders: */ -    if (i_fillFollow >= 1) { -      *length_v_bordFollow = i_fillFollow; -      *length_v_freqFollow = i_fillFollow; -    } - -    numBordFollow = *length_v_bordFollow; -    bordMaxFollow = v_bordFollow[numBordFollow - 1]; - -    /* remove even more borders if needed */ -    middle = bmin - bordMaxFollow; -    while (middle < 0) { -      numBordFollow--; -      bordMaxFollow = v_bordFollow[numBordFollow - 1]; -      middle = bmin - bordMaxFollow; -    } - -    *length_v_bordFollow = numBordFollow; -    *length_v_freqFollow = numBordFollow; -    *nL = numBordFollow - 1; - -    b_new = *length_v_bord; - - -    if (middle <= dmax) { -      if (middle >= dmin) {       /* concatenate */ -        FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); -        FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); -      } - -      else { -        if (v_tuningSegm[0] != 0) {       /* remove one new border and concatenate */ -          *length_v_bord = b_new - 1; -          FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, -              *length_v_bordFollow); - -          *length_v_freq = b_new - 1; -          FDKsbrEnc_AddVecLeft (v_freq + 1, length_v_freq, v_freqFollow, -              *length_v_freqFollow); -        } -        else { -          if (*length_v_bordFollow > 1) { /* remove one old border and concatenate */ -            FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, -                *length_v_bordFollow - 1); -            FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, -                *length_v_bordFollow - 1); - -            *nL = *nL - 1; -          } -          else {                  /* remove new "transient" border and concatenate */ - -            for (i = 0; i < *length_v_bord - 1; i++) -              v_bord[i] = v_bord[i + 1]; - -            for (i = 0; i < *length_v_freq - 1; i++) -              v_freq[i] = v_freq[i + 1]; - -            *length_v_bord = b_new - 1; -            *length_v_freq = b_new - 1; - -            FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, -                *length_v_bordFollow); -            FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, -                *length_v_freqFollow); -          } -        } -      } -    } -    else {                        /* middle > dmax */ - -      fillFramePre (dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, -          middle); -      FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); -      FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); -    } - - -  } -  else { /* numberTimeSlots==NUMBER_TIME_SLOTS_1152 */ - -    INT l,m; - - -    /*------------------------------------------------------------------------ -      remove fill borders -      ------------------------------------------------------------------------*/ -    if (i_fillFollow >= 1) { -      *length_v_bordFollow = i_fillFollow; -      *length_v_freqFollow = i_fillFollow; -    } - -    numBordFollow = *length_v_bordFollow; -    bordMaxFollow = v_bordFollow[numBordFollow - 1]; - -    /*------------------------------------------------------------------------ -      remove more borders if necessary to eliminate overlap -      ------------------------------------------------------------------------*/ - -    /* check for overlap */ -    middle = bmin - bordMaxFollow; - -    /* intervals: -       i)             middle <  0     : overlap, must remove borders -       ii)       0 <= middle <  dmin  : no overlap but too tight, must remove borders -       iii)   dmin <= middle <= dmax  : ok, just concatenate -       iv)    dmax <= middle          : too wide, must add borders -     */ - -    /* first remove old non-fill-borders... */ -    while (middle < 0) { - -      /* ...but don't remove all of them */ -      if (numBordFollow == 1) -        break; - -      numBordFollow--; -      bordMaxFollow = v_bordFollow[numBordFollow - 1]; -      middle = bmin - bordMaxFollow; -    } - -    /* if this isn't enough, remove new non-fill borders */ -    if (middle < 0) -    { -      for (l = 0, m = 0 ; l < *length_v_bord ; l++) -      { -        if(v_bord[l]> bordMaxFollow) -        { -          v_bord[m] = v_bord[l]; -          v_freq[m] = v_freq[l]; -          m++; -        } -      } - -      *length_v_bord = l; -      *length_v_freq = l; - -      bmin = v_bord[0]; - -    } - -    /*------------------------------------------------------------------------ -      update modified follow-up data -      ------------------------------------------------------------------------*/ - -    *length_v_bordFollow = numBordFollow; -    *length_v_freqFollow = numBordFollow; - -    /* left relative borders correspond to follow-up */ -    *nL = numBordFollow - 1; - -    /*------------------------------------------------------------------------ -      take care of intervals ii through iv -      ------------------------------------------------------------------------*/ - -    /* now middle should be >= 0 */ -    middle = bmin - bordMaxFollow; - -    if (middle <= dmin)                                /* (ii) */ -    { -      b_new = *length_v_bord; - -      if (v_tuningSegm[0] != 0) -      { -        /* remove new "luxury" border and concatenate */ -        *length_v_bord = b_new - 1; -        FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, -            *length_v_bordFollow); - -        *length_v_freq = b_new - 1; -        FDKsbrEnc_AddVecLeft (v_freq + 1, length_v_freq, v_freqFollow, -            *length_v_freqFollow); - -      } -      else if (*length_v_bordFollow > 1) -      { -        /* remove old border and concatenate */ -        FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, -            *length_v_bordFollow - 1); -        FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, -            *length_v_bordFollow - 1); - -        *nL = *nL - 1; -      } -      else -      { -        /* remove new border and concatenate */ -        for (i = 0; i < *length_v_bord - 1; i++) -          v_bord[i] = v_bord[i + 1]; - -        for (i = 0; i < *length_v_freq - 1; i++) -          v_freq[i] = v_freq[i + 1]; - -        *length_v_bord = b_new - 1; -        *length_v_freq = b_new - 1; - -        FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, -            *length_v_bordFollow); -        FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, -            *length_v_freqFollow); -      } -    } -    else if ((middle >= dmin) && (middle <= dmax))      /* (iii) */ -    { -      /* concatenate */ -      FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); -      FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); - -    } -    else                           /* (iv) */ -    { -      fillFramePre (dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, -          middle); -      FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); -      FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); -    } -  } -} - - - -/******************************************************************************* - Functionname:  calcFrameClass - ******************************************************************************* - - Description: - - Arguments:  INT* frameClass, INT* frameClassOld, INT tranFlag, INT* spreadFlag) - - Return:      none - -*******************************************************************************/ -static void -calcFrameClass (FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld, INT tranFlag, -                INT *spreadFlag) -{ - -  switch (*frameClassOld) { -  case FIXFIXonly: -  case FIXFIX: -    if (tranFlag)  *frameClass = FIXVAR; -    else           *frameClass = FIXFIX; -    break; -  case FIXVAR: -    if (tranFlag) { *frameClass = VARVAR; *spreadFlag = 0; } -    else { -      if (*spreadFlag)  *frameClass = VARVAR; -      else              *frameClass = VARFIX; -    } -    break; -  case VARFIX: -    if (tranFlag)  *frameClass = FIXVAR; -    else           *frameClass = FIXFIX; -    break; -  case VARVAR: -    if (tranFlag) { *frameClass = VARVAR; *spreadFlag = 0; } -    else { -      if (*spreadFlag)  *frameClass = VARVAR; -      else              *frameClass = VARFIX; -    } -    break; -  }; - -  *frameClassOld = *frameClass; -} - - - -/******************************************************************************* - Functionname:  specialCase - ******************************************************************************* - - Description: - - Arguments:   spreadFlag -              allowSpread -              v_bord -              length_v_bord -              v_freq -              length_v_freq -              parts -              d - - Return:      none - -*******************************************************************************/ -static void -specialCase (INT *spreadFlag, INT allowSpread, INT *v_bord, -             INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT *parts, -             INT d) -{ -  INT L; - -  L = *length_v_bord; - -  if (allowSpread) {            /* add one "step 8" */ -    *spreadFlag = 1; -    FDKsbrEnc_AddRight (v_bord, length_v_bord, v_bord[L - 1] + 8); -    FDKsbrEnc_AddRight (v_freq, length_v_freq, 1); -    (*parts)++; -  } -  else { -    if (d == 1) {               /*  stretch one slot */ -      *length_v_bord = L - 1; -      *length_v_freq = L - 1; -    } -    else { -      if ((v_bord[L - 1] - v_bord[L - 2]) > 2) {        /* compress one quant step */ -        v_bord[L - 1] = v_bord[L - 1] - 2; -        v_freq[*length_v_freq - 1] = 0; /* use low res for short segment */ -      } -    } -  } -} - - - -/******************************************************************************* - Functionname:  calcCmonBorder - ******************************************************************************* - - Description: - - Arguments:   i_cmon -              i_tran -              v_bord -              length_v_bord -              tran - - Return:      none - -*******************************************************************************/ -static void -calcCmonBorder (INT *i_cmon, INT *i_tran, INT *v_bord, INT *length_v_bord, -                INT tran, INT bufferFrameStart, INT numberTimeSlots) -{                               /* FH 00-06-26 */ -  INT i; - -  for (i = 0; i < *length_v_bord; i++) -    if (v_bord[i] >= bufferFrameStart + numberTimeSlots) {      /* FH 00-06-26 */ -      *i_cmon = i; -      break; -    } - -  /* keep track of transient: */ -  for (i = 0; i < *length_v_bord; i++) -    if (v_bord[i] >= tran) { -      *i_tran = i; -      break; -    } -    else -      *i_tran = EMPTY; -} - -/******************************************************************************* - Functionname:  keepForFollowUp - ******************************************************************************* - - Description: - - Arguments:   v_bordFollow -              length_v_bordFollow -              v_freqFollow -              length_v_freqFollow -              i_tranFollow -              i_fillFollow -              v_bord -              length_v_bord -              v_freq -              i_cmon -              i_tran -              parts) - - Return:      none - -*******************************************************************************/ -static void -keepForFollowUp (INT *v_bordFollow, INT *length_v_bordFollow, -                 INT *v_freqFollow, INT *length_v_freqFollow, -                 INT *i_tranFollow, INT *i_fillFollow, INT *v_bord, -                 INT *length_v_bord, INT *v_freq, INT i_cmon, INT i_tran, -                 INT parts, INT numberTimeSlots) -{                               /* FH 00-06-26 */ -  INT L, i, j; - -  L = *length_v_bord; - -  (*length_v_bordFollow) = 0; -  (*length_v_freqFollow) = 0; - -  for (j = 0, i = i_cmon; i < L; i++, j++) { -    v_bordFollow[j] = v_bord[i] - numberTimeSlots;      /* FH 00-06-26 */ -    v_freqFollow[j] = v_freq[i]; -    (*length_v_bordFollow)++; -    (*length_v_freqFollow)++; -  } -  if (i_tran != EMPTY) -    *i_tranFollow = i_tran - i_cmon; -  else -    *i_tranFollow = EMPTY; -  *i_fillFollow = L - (parts - 1) - i_cmon; - -} - -/******************************************************************************* - Functionname:  calcCtrlSignal - ******************************************************************************* - - Description: - - Arguments:   hSbrGrid -              frameClass -              v_bord -              length_v_bord -              v_freq -              length_v_freq -              i_cmon -              i_tran -              spreadFlag -              nL - - Return:      none - -*******************************************************************************/ -static void -calcCtrlSignal (HANDLE_SBR_GRID hSbrGrid, -                FRAME_CLASS frameClass, INT *v_bord, INT length_v_bord, INT *v_freq, -                INT length_v_freq, INT i_cmon, INT i_tran, INT spreadFlag, -                INT nL) -{ - - -  INT i, r, a, n, p, b, aL, aR, ntot, nmax, nR; - -  INT *v_f = hSbrGrid->v_f; -  INT *v_fLR = hSbrGrid->v_fLR; -  INT *v_r = hSbrGrid->bs_rel_bord; -  INT *v_rL = hSbrGrid->bs_rel_bord_0; -  INT *v_rR = hSbrGrid->bs_rel_bord_1; - -  INT length_v_r = 0; -  INT length_v_rR = 0; -  INT length_v_rL = 0; - -  switch (frameClass) { -  case FIXVAR: -    /* absolute border: */ - -    a = v_bord[i_cmon]; - -    /* relative borders: */ -    length_v_r = 0; -    i = i_cmon; - -    while (i >= 1) { -      r = v_bord[i] - v_bord[i - 1]; -      FDKsbrEnc_AddRight (v_r, &length_v_r, r); -      i--; -    } - - -    /*  number of relative borders: */ -    n = length_v_r; - - -    /* freq res: */ -    for (i = 0; i < i_cmon; i++) -      v_f[i] = v_freq[i_cmon - 1 - i]; -    v_f[i_cmon] = 1; - -    /* pointer: */ -    p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0) ; - -    hSbrGrid->frameClass = frameClass; -    hSbrGrid->bs_abs_bord = a; -    hSbrGrid->n = n; -    hSbrGrid->p = p; - -    break; -  case VARFIX: -    /* absolute border: */ -    a = v_bord[0]; - -    /* relative borders: */ -    length_v_r = 0; - -    for (i = 1; i < length_v_bord; i++) { -      r = v_bord[i] - v_bord[i - 1]; -      FDKsbrEnc_AddRight (v_r, &length_v_r, r); -    } - -    /* number of relative borders: */ -    n = length_v_r; - -    /* freq res: */ -    FDKmemcpy (v_f, v_freq, length_v_freq * sizeof (INT)); - - -    /* pointer: */ -    p = (i_tran >= 0 && i_tran != EMPTY) ? (i_tran + 1) : (0) ; - -    hSbrGrid->frameClass = frameClass; -    hSbrGrid->bs_abs_bord = a; -    hSbrGrid->n = n; -    hSbrGrid->p = p; - -    break; -  case VARVAR: -    if (spreadFlag) { -      /* absolute borders: */ -      b = length_v_bord; - -      aL = v_bord[0]; -      aR = v_bord[b - 1]; - - -      /* number of relative borders:    */ -      ntot = b - 2; - -      nmax = 2;                 /* n: {0,1,2} */ -      if (ntot > nmax) { -        nL = nmax; -        nR = ntot - nmax; -      } -      else { -        nL = ntot; -        nR = 0; -      } - -      /* relative borders: */ -      length_v_rL = 0; -      for (i = 1; i <= nL; i++) { -        r = v_bord[i] - v_bord[i - 1]; -        FDKsbrEnc_AddRight (v_rL, &length_v_rL, r); -      } - -      length_v_rR = 0; -      i = b - 1; -      while (i >= b - nR) { -        r = v_bord[i] - v_bord[i - 1]; -        FDKsbrEnc_AddRight (v_rR, &length_v_rR, r); -        i--; -      } - -      /* pointer (only one due to constraint in frame info): */ -      p = (i_tran > 0 && i_tran != EMPTY) ? (b - i_tran) : (0) ; - -      /* freq res: */ - -      for (i = 0; i < b - 1; i++) -        v_fLR[i] = v_freq[i]; -    } -    else { - -      length_v_bord = i_cmon + 1; -      length_v_freq = i_cmon + 1; - - -      /* absolute borders: */ -      b = length_v_bord; - -      aL = v_bord[0]; -      aR = v_bord[b - 1]; - -      /* number of relative borders:   */ -      ntot = b - 2; -      nR = ntot - nL; - -      /* relative borders: */ -      length_v_rL = 0; -      for (i = 1; i <= nL; i++) { -        r = v_bord[i] - v_bord[i - 1]; -        FDKsbrEnc_AddRight (v_rL, &length_v_rL, r); -      } - -      length_v_rR = 0; -      i = b - 1; -      while (i >= b - nR) { -        r = v_bord[i] - v_bord[i - 1]; -        FDKsbrEnc_AddRight (v_rR, &length_v_rR, r); -        i--; -      } - -      /* pointer (only one due to constraint in frame info): */ -      p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0) ; - -      /* freq res: */ -      for (i = 0; i < b - 1; i++) -        v_fLR[i] = v_freq[i]; -    } - -    hSbrGrid->frameClass = frameClass; -    hSbrGrid->bs_abs_bord_0 = aL; -    hSbrGrid->bs_abs_bord_1 = aR; -    hSbrGrid->bs_num_rel_0 = nL; -    hSbrGrid->bs_num_rel_1 = nR; -    hSbrGrid->p = p; - -    break; - -  default: -    /* do nothing */ -    break; -  } -} - -/******************************************************************************* - Functionname:  createDefFrameInfo - ******************************************************************************* - - Description: Copies the default (static) frameInfo structs to the frameInfo -              passed by reference; only used for FIXFIX frames - - Arguments:   hFrameInfo             - HANLDE_SBR_FRAME_INFO -              nEnv                   - INT -              nTimeSlots             - INT - - Return:      none; hSbrFrameInfo contains a copy of the default frameInfo - - Written:     Andreas Schneider - Revised: -*******************************************************************************/ -static void -createDefFrameInfo(HANDLE_SBR_FRAME_INFO hSbrFrameInfo, INT nEnv, INT nTimeSlots) -{ -  switch (nEnv) { -  case 1: -    switch (nTimeSlots) { -    case NUMBER_TIME_SLOTS_1920: -      FDKmemcpy (hSbrFrameInfo, &frameInfo1_1920, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_2048: -      FDKmemcpy (hSbrFrameInfo, &frameInfo1_2048, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_1152: -      FDKmemcpy (hSbrFrameInfo, &frameInfo1_1152, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_2304: -      FDKmemcpy (hSbrFrameInfo, &frameInfo1_2304, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_512LD: -      FDKmemcpy (hSbrFrameInfo, &frameInfo1_512LD, sizeof (SBR_FRAME_INFO)); -      break; -    default: -      FDK_ASSERT(0); -    } -    break; -  case 2: -    switch (nTimeSlots) { -    case NUMBER_TIME_SLOTS_1920: -      FDKmemcpy (hSbrFrameInfo, &frameInfo2_1920, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_2048: -      FDKmemcpy (hSbrFrameInfo, &frameInfo2_2048, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_1152: -      FDKmemcpy (hSbrFrameInfo, &frameInfo2_1152, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_2304: -      FDKmemcpy (hSbrFrameInfo, &frameInfo2_2304, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_512LD: -      FDKmemcpy (hSbrFrameInfo, &frameInfo2_512LD, sizeof (SBR_FRAME_INFO)); -      break; -    default: -      FDK_ASSERT(0); -    } -    break; -  case 4: -    switch (nTimeSlots) { -    case NUMBER_TIME_SLOTS_1920: -      FDKmemcpy (hSbrFrameInfo, &frameInfo4_1920, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_2048: -      FDKmemcpy (hSbrFrameInfo, &frameInfo4_2048, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_1152: -      FDKmemcpy (hSbrFrameInfo, &frameInfo4_1152, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_2304: -      FDKmemcpy (hSbrFrameInfo, &frameInfo4_2304, sizeof (SBR_FRAME_INFO)); -      break; -    case NUMBER_TIME_SLOTS_512LD: -      FDKmemcpy (hSbrFrameInfo, &frameInfo4_512LD, sizeof (SBR_FRAME_INFO)); -      break; -    default: -      FDK_ASSERT(0); -    } -    break; -  default: -    FDK_ASSERT(0); -  } -} - - -/******************************************************************************* - Functionname:  ctrlSignal2FrameInfo - ******************************************************************************* - - Description: Calculates frame_info struct from control signal. - - Arguments:   hSbrGrid - source -              hSbrFrameInfo - destination - - Return:      void; hSbrFrameInfo contains the updated FRAME_INFO struct - -*******************************************************************************/ -static void -ctrlSignal2FrameInfo (HANDLE_SBR_GRID hSbrGrid, -                      HANDLE_SBR_FRAME_INFO hSbrFrameInfo, -                      INT freq_res_fixfix) -{ -  INT nEnv = 0, border = 0, i, k, p /*?*/; -  INT *v_r = hSbrGrid->bs_rel_bord; -  INT *v_f = hSbrGrid->v_f; - -  FRAME_CLASS frameClass = hSbrGrid->frameClass; -  INT bufferFrameStart   = hSbrGrid->bufferFrameStart; -  INT numberTimeSlots    = hSbrGrid->numberTimeSlots; - -  switch (frameClass) { -  case FIXFIX: -    createDefFrameInfo(hSbrFrameInfo, hSbrGrid->bs_num_env, numberTimeSlots); - -    /* At this point all frequency resolutions are set to FREQ_RES_HIGH, so -     * only if freq_res_fixfix is set to FREQ_RES_LOW, they all have to be -     * changed. -     * snd */ -    if (freq_res_fixfix == FREQ_RES_LOW) { -      for (i = 0; i < hSbrFrameInfo->nEnvelopes; i++) { -        hSbrFrameInfo->freqRes[i] = FREQ_RES_LOW; -      } -    } -    /* ELD: store current frequency resolution */ -    hSbrGrid->v_f[0] = hSbrFrameInfo->freqRes[0]; -    break; - -  case FIXVAR: -  case VARFIX: -    nEnv = hSbrGrid->n + 1;      /* read n [SBR_NUM_BITS bits] */ /*? snd*/ -    FDK_ASSERT(nEnv <= MAX_ENVELOPES_FIXVAR_VARFIX); - -    hSbrFrameInfo->nEnvelopes = nEnv; - -    border = hSbrGrid->bs_abs_bord; /* read the absolute border */ - -    if (nEnv == 1) -      hSbrFrameInfo->nNoiseEnvelopes = 1; -    else -      hSbrFrameInfo->nNoiseEnvelopes = 2; - -    break; - -  default: -    /* do nothing */ -    break; -  } - -  switch (frameClass) { -  case FIXVAR: -    hSbrFrameInfo->borders[0] = bufferFrameStart; /* start-position of 1st envelope */ - -    hSbrFrameInfo->borders[nEnv] = border; - -    for (k = 0, i = nEnv - 1; k < nEnv - 1; k++, i--) { -      border -= v_r[k]; -      hSbrFrameInfo->borders[i] = border; -    } - -    /* make either envelope nr. nEnv + 1 - p short; or don't shorten if p == 0 */ -    p = hSbrGrid->p; -    if (p == 0) { -      hSbrFrameInfo->shortEnv = 0; -    } else { -      hSbrFrameInfo->shortEnv = nEnv + 1 - p; -    } - -    for (k = 0, i = nEnv - 1; k < nEnv; k++, i--) { -      hSbrFrameInfo->freqRes[i] = (FREQ_RES)v_f[k]; -    } - -    /* if either there is no short envelope or the last envelope is short... */ -    if (p == 0 || p == 1) { -      hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; -    } else { -      hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; -    } - -    break; - -  case VARFIX: -    /* in this case 'border' indicates the start of the 1st envelope */ -    hSbrFrameInfo->borders[0] = border; - -    for (k = 0; k < nEnv - 1; k++) { -      border += v_r[k]; -      hSbrFrameInfo->borders[k + 1] = border; -    } - -    hSbrFrameInfo->borders[nEnv] = bufferFrameStart + numberTimeSlots; - -    p = hSbrGrid->p; -    if (p == 0 || p == 1) { -      hSbrFrameInfo->shortEnv = 0; -    } else { -      hSbrFrameInfo->shortEnv = p - 1; -    } - -    for (k = 0; k < nEnv; k++) { -      hSbrFrameInfo->freqRes[k] = (FREQ_RES)v_f[k]; -    } - -    switch (p) { -    case 0: -      hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[1]; -      break; -    case 1: -      hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; -      break; -    default: -      hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; -      break; -    } -    break; - -  case VARVAR: -    nEnv = hSbrGrid->bs_num_rel_0 + hSbrGrid->bs_num_rel_1 + 1; -    FDK_ASSERT(nEnv <= MAX_ENVELOPES_VARVAR); /* just to be sure */ -    hSbrFrameInfo->nEnvelopes = nEnv; - -    hSbrFrameInfo->borders[0] = border = hSbrGrid->bs_abs_bord_0; - -    for (k = 0, i = 1; k < hSbrGrid->bs_num_rel_0; k++, i++) { -      border += hSbrGrid->bs_rel_bord_0[k]; -      hSbrFrameInfo->borders[i] = border; -    } - -    border = hSbrGrid->bs_abs_bord_1; -    hSbrFrameInfo->borders[nEnv] = border; - -    for (k = 0, i = nEnv - 1; k < hSbrGrid->bs_num_rel_1; k++, i--) { -      border -= hSbrGrid->bs_rel_bord_1[k]; -      hSbrFrameInfo->borders[i] = border; -    } - -    p = hSbrGrid->p; -    if (p == 0) { -      hSbrFrameInfo->shortEnv = 0; -    } else { -      hSbrFrameInfo->shortEnv = nEnv + 1 - p; -    } - -    for (k = 0; k < nEnv; k++) { -      hSbrFrameInfo->freqRes[k] = (FREQ_RES)hSbrGrid->v_fLR[k]; -    } - -    if (nEnv == 1) { -      hSbrFrameInfo->nNoiseEnvelopes = 1; -      hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0; -      hSbrFrameInfo->bordersNoise[1] = hSbrGrid->bs_abs_bord_1; -    } else { -      hSbrFrameInfo->nNoiseEnvelopes = 2; -      hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0; - -      if (p == 0 || p == 1) { -        hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; -      } else { -        hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; -      } -      hSbrFrameInfo->bordersNoise[2] = hSbrGrid->bs_abs_bord_1; -    } -    break; - -  default: -    /* do nothing */ -    break; -  } - -  if (frameClass == VARFIX || frameClass == FIXVAR) { -    hSbrFrameInfo->bordersNoise[0] = hSbrFrameInfo->borders[0]; -    if (nEnv == 1) { -      hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv]; -    } else { -      hSbrFrameInfo->bordersNoise[2] = hSbrFrameInfo->borders[nEnv]; -    } -  } -} - diff --git a/libSBRenc/src/fram_gen.h b/libSBRenc/src/fram_gen.h deleted file mode 100644 index 3769266..0000000 --- a/libSBRenc/src/fram_gen.h +++ /dev/null @@ -1,305 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Framing generator prototypes and structs   -*/ -#ifndef _FRAM_GEN_H -#define _FRAM_GEN_H - -#include "sbr_def.h" /* for MAX_ENVELOPES and MAX_NOISE_ENVELOPES in struct FRAME_INFO and CODEC_TYPE */ - -#define MAX_ENVELOPES_VARVAR MAX_ENVELOPES /*!< worst case number of envelopes in a VARVAR frame */ -#define MAX_ENVELOPES_FIXVAR_VARFIX 4 /*!< worst case number of envelopes in VARFIX and FIXVAR frames */ -#define MAX_NUM_REL 3 /*!< maximum number of relative borders in any VAR frame */ - -/* SBR frame class definitions */ -typedef enum { -  FIXFIX = 0, /*!< bs_frame_class: leading and trailing frame borders are fixed */ -  FIXVAR,     /*!< bs_frame_class: leading frame border is fixed, trailing frame border is variable */ -  VARFIX,     /*!< bs_frame_class: leading frame border is variable, trailing frame border is fixed */ -  VARVAR      /*!< bs_frame_class: leading and trailing frame borders are variable */ -  ,FIXFIXonly  /*!< bs_frame_class: leading border fixed (0), trailing border fixed (nrTimeSlots) and encased borders are dynamically derived from the tranPos */ -}FRAME_CLASS; - - -/* helper constants */ -#define DC      4711        /*!< helper constant: don't care */ -#define EMPTY   (-99)       /*!< helper constant: empty */ - - -/* system constants: AAC+SBR, DRM Frame-Length */ -#define FRAME_MIDDLE_SLOT_1920  4 -#define NUMBER_TIME_SLOTS_1920  15 - -#define LD_PRETRAN_OFF           3 -#define FRAME_MIDDLE_SLOT_512LD  0 -#define NUMBER_TIME_SLOTS_512LD  8 -#define TRANSIENT_OFFSET_LD      0 - - - -/* -system constants: AAC+SBR or aacPRO (hybrid format), Standard Frame-Length, Multi-Rate ---------------------------------------------------------------------------- -Number of slots (numberTimeSlots): 16  (NUMBER_TIME_SLOTS_2048) -Detector-offset (frameMiddleSlot):  4 -Overlap                          :  3 -Buffer-offset                    :  8  (BUFFER_FRAME_START_2048 = 0) - - -                        |<------------tranPos---------->| -                |c|d|e|f|0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f| -        FixFix  |                               | -        FixVar  |                               :<- ->: -        VarFix  :<- ->:                         | -        VarVar  :<- ->:                         :<- ->: -                0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 -................................................................................ - -|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-| - -frame-generator:0                               16              24              32 -analysis-buffer:8                               24              32              40 -*/ -#define FRAME_MIDDLE_SLOT_2048  4 -#define NUMBER_TIME_SLOTS_2048  16 - - -/* -system constants: mp3PRO, Multi-Rate & Single-Rate --------------------------------------------------- -Number of slots (numberTimeSlots):  9    (NUMBER_TIME_SLOTS_1152) -Detector-offset (frameMiddleSlot):  4    (FRAME_MIDDLE_SLOT_1152) -Overlap                          :  3 -Buffer-offset                    :  4.5  (BUFFER_FRAME_START_1152 = 0) - - -                         |<----tranPos---->| -                 |5|6|7|8|0|1|2|3|4|5|6|7|8| -         FixFix  |                 | -         FixVar  |                 :<- ->: -         VarFix  :<- ->:           | -         VarVar  :<- ->:           :<- ->: -                 0 1 2 3 4 5 6 7 8 0 1 2 3 -        ............................................. - -        -|-|-|-|-B-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-| - -frame-generator: 0                 9       13        18 -analysis-buffer: 4.5               13.5              22.5 -*/ -#define FRAME_MIDDLE_SLOT_1152  4 -#define NUMBER_TIME_SLOTS_1152  9 - - -/* system constants: Layer2+SBR */ -#define FRAME_MIDDLE_SLOT_2304  8 -#define NUMBER_TIME_SLOTS_2304  18 - - -/*! -  \struct SBR_GRID -  \brief  sbr_grid() signals to be converted to bitstream elements - -  The variables hold the signals (e.g. lengths and numbers) in "clear text" -*/ - -typedef struct -{ -  /* system constants */ -  INT bufferFrameStart;     /*!< frame generator vs analysis buffer time alignment (currently set to 0, offset added elsewhere) */ -  INT numberTimeSlots;      /*!< number of SBR timeslots per frame */ - -  /* will be adjusted for every frame */ -  FRAME_CLASS frameClass;   /*!< SBR frame class  */ -  INT bs_num_env;           /*!< bs_num_env, number of envelopes for FIXFIX */ -  INT bs_abs_bord;          /*!< bs_abs_bord, absolute border for VARFIX and FIXVAR */ -  INT n;                    /*!< number of relative borders for VARFIX and FIXVAR   */ -  INT p;                    /*!< pointer-to-transient-border  */ -  INT bs_rel_bord[MAX_NUM_REL];         /*!< bs_rel_bord, relative borders for all VAR */ -  INT v_f[MAX_ENVELOPES_FIXVAR_VARFIX]; /*!< envelope frequency resolutions for FIXVAR and VARFIX  */ - -  INT bs_abs_bord_0;        /*!< bs_abs_bord_0, leading absolute border for VARVAR */ -  INT bs_abs_bord_1;        /*!< bs_abs_bord_1, trailing absolute border for VARVAR */ -  INT bs_num_rel_0;         /*!< bs_num_rel_0, number of relative borders associated with leading absolute border for VARVAR */ -  INT bs_num_rel_1;         /*!< bs_num_rel_1, number of relative borders associated with trailing absolute border for VARVAR */ -  INT bs_rel_bord_0[MAX_NUM_REL];       /*!< bs_rel_bord_0, relative borders associated with leading absolute border for VARVAR */ -  INT bs_rel_bord_1[MAX_NUM_REL];       /*!< bs_rel_bord_1, relative borders associated with trailing absolute border for VARVAR */ -  INT v_fLR[MAX_ENVELOPES_VARVAR];      /*!< envelope frequency resolutions for VARVAR  */ - -} -SBR_GRID; -typedef SBR_GRID *HANDLE_SBR_GRID; - - - -/*! -  \struct SBR_FRAME_INFO -  \brief  time/frequency grid description for one frame -*/ -typedef struct -{ -  INT nEnvelopes;                         /*!< number of envelopes */ -  INT borders[MAX_ENVELOPES+1];           /*!< envelope borders in SBR timeslots */ -  FREQ_RES freqRes[MAX_ENVELOPES];        /*!< frequency resolution of each envelope */ -  INT shortEnv;                           /*!< number of an envelope to be shortened (starting at 1) or 0 for no shortened envelope */ -  INT nNoiseEnvelopes;                    /*!< number of noise floors */ -  INT bordersNoise[MAX_NOISE_ENVELOPES+1];/*!< noise floor borders in SBR timeslots */ -} -SBR_FRAME_INFO; -/* WARNING: When rearranging the elements of this struct keep in mind that the static - * initializations in the corresponding C-file have to be rearranged as well! - * snd 2002/01/23 - */ -typedef SBR_FRAME_INFO *HANDLE_SBR_FRAME_INFO; - - -/*! -  \struct SBR_ENVELOPE_FRAME -  \brief  frame generator main struct - -  Contains tuning parameters, time/frequency grid description, sbr_grid() bitstream elements, and generator internal signals -*/ -typedef struct -{ -  /* system constants */ -  INT frameMiddleSlot;      /*!< transient detector offset in SBR timeslots */ - -  /* basic tuning parameters */ -  INT staticFraming;        /*!< 1: run static framing in time, i.e. exclusive use of bs_frame_class = FIXFIX */ -  INT numEnvStatic;         /*!< number of envelopes per frame for static framing */ -  INT freq_res_fixfix;      /*!< envelope frequency resolution to use for bs_frame_class = FIXFIX */ - -  /* expert tuning parameters */ -  const int *v_tuningSegm;  /*!< segment lengths to use around transient */ -  const int *v_tuningFreq;  /*!< frequency resolutions to use around transient */ -  INT dmin;                 /*!< minimum length of dependent segments */ -  INT dmax;                 /*!< maximum length of dependent segments */ -  INT allowSpread;          /*!< 1: allow isolated transient to influence grid of 3 consecutive frames */ - -  /* internally used signals */ -  FRAME_CLASS frameClassOld;                /*!< frame class used for previous frame */ -  INT spreadFlag;                           /*!< 1: use VARVAR instead of VARFIX to follow up old transient */ - -  INT v_bord[2 * MAX_ENVELOPES_VARVAR + 1]; /*!< borders for current frame and preliminary borders for next frame (fixed borders excluded) */ -  INT length_v_bord;                        /*!< helper variable: length of v_bord */ -  INT v_freq[2 * MAX_ENVELOPES_VARVAR + 1]; /*!< frequency resolutions for current frame and preliminary resolutions for next frame */ -  INT length_v_freq;                        /*!< helper variable: length of v_freq */ - -  INT v_bordFollow[MAX_ENVELOPES_VARVAR];   /*!< preliminary borders for current frame (calculated during previous frame) */ -  INT length_v_bordFollow;                  /*!< helper variable: length of v_bordFollow */ -  INT i_tranFollow;                         /*!< points to transient border in v_bordFollow (may be negative, see keepForFollowUp()) */ -  INT i_fillFollow;                         /*!< points to first fill border in v_bordFollow */ -  INT v_freqFollow[MAX_ENVELOPES_VARVAR];   /*!< preliminary frequency resolutions for current frame (calculated during previous frame) */ -  INT length_v_freqFollow;                  /*!< helper variable: length of v_freqFollow */ - - -  /* externally needed signals */ -  SBR_GRID         SbrGrid;         /*!< sbr_grid() signals to be converted to bitstream elements */ -  SBR_FRAME_INFO   SbrFrameInfo;    /*!< time/frequency grid description for one frame */ -} -SBR_ENVELOPE_FRAME; -typedef SBR_ENVELOPE_FRAME *HANDLE_SBR_ENVELOPE_FRAME; - - - -void -FDKsbrEnc_initFrameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME  hSbrEnvFrame, -                          INT allowSpread, -                          INT numEnvStatic, -                          INT staticFraming, -                          INT timeSlots, -                          INT freq_res_fixfix -                          ,int ldGrid -                          ); - -HANDLE_SBR_FRAME_INFO -FDKsbrEnc_frameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, -                    UCHAR *v_transient_info, -                    UCHAR *v_transient_info_pre, -                    int ldGrid, -                    const int *v_tuning); - -#endif diff --git a/libSBRenc/src/invf_est.cpp b/libSBRenc/src/invf_est.cpp deleted file mode 100644 index 32df6d9..0000000 --- a/libSBRenc/src/invf_est.cpp +++ /dev/null @@ -1,529 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "invf_est.h" -#include "sbr_misc.h" - -#include "genericStds.h" - -#define MAX_NUM_REGIONS 10 -#define SCALE_FAC_QUO   512.0f -#define SCALE_FAC_NRG   256.0f - -#ifndef min -#define min(a,b) ( a < b ? a:b) -#endif - -#ifndef max -#define max(a,b) ( a > b ? a:b) -#endif - -static const FIXP_DBL quantStepsSbr[4]  =  { 0x00400000, 0x02800000, 0x03800000, 0x04c00000 } ;    /* table scaled with SCALE_FAC_QUO */ -static const FIXP_DBL quantStepsOrig[4] =  { 0x00000000, 0x00c00000, 0x01c00000, 0x02800000 } ;    /* table scaled with SCALE_FAC_QUO */ -static const FIXP_DBL nrgBorders[4]     =  { 0x0c800000, 0x0f000000, 0x11800000, 0x14000000 } ;    /* table scaled with SCALE_FAC_NRG */ - -static const DETECTOR_PARAMETERS detectorParamsAAC = { -    quantStepsSbr, -    quantStepsOrig, -    nrgBorders, -    4,                              /* Number of borders SBR. */ -    4,                              /* Number of borders orig. */ -    4,                              /* Number of borders Nrg. */ -    {                               /* Region space. */ -      {INVF_MID_LEVEL,   INVF_LOW_LEVEL,  INVF_OFF,        INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_MID_LEVEL,   INVF_LOW_LEVEL,  INVF_OFF,        INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_MID_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /* regionSbr */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}  /*    |      */ -    },/*------------------------ regionOrig ---------------------------------*/ -    {                               /* Region space transient. */ -      {INVF_LOW_LEVEL,   INVF_LOW_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_LOW_LEVEL,   INVF_LOW_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_MID_LEVEL,  INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /* regionSbr */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}  /*    |      */ -    },/*------------------------ regionOrig ---------------------------------*/ -    {-4, -3, -2, -1, 0} /* Reduction factor of the inverse filtering for low energies.*/ -}; - -static const FIXP_DBL hysteresis = 0x00400000 ; /* Delta value for hysteresis. scaled with SCALE_FAC_QUO */ - -/* - * AAC+SBR PARAMETERS for Speech - *********************************/ -static const DETECTOR_PARAMETERS detectorParamsAACSpeech = { -    quantStepsSbr, -    quantStepsOrig, -    nrgBorders, -    4,                              /* Number of borders SBR. */ -    4,                              /* Number of borders orig. */ -    4,                              /* Number of borders Nrg. */ -    {                               /* Region space. */ -      {INVF_MID_LEVEL,   INVF_MID_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_MID_LEVEL,   INVF_MID_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_MID_LEVEL,  INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /* regionSbr */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}  /*    |      */ -    },/*------------------------ regionOrig ---------------------------------*/ -    {                               /* Region space transient. */ -      {INVF_MID_LEVEL,   INVF_MID_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_MID_LEVEL,   INVF_MID_LEVEL,  INVF_LOW_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_MID_LEVEL,  INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /* regionSbr */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}, /*    |      */ -      {INVF_HIGH_LEVEL,  INVF_HIGH_LEVEL, INVF_MID_LEVEL,  INVF_OFF, INVF_OFF}  /*    |      */ -    },/*------------------------ regionOrig ---------------------------------*/ -    {-4, -3, -2, -1, 0} /* Reduction factor of the inverse filtering for low energies.*/ -}; - -/* - * Smoothing filters. - ************************/ -typedef const FIXP_DBL FIR_FILTER[5]; - -static const FIR_FILTER fir_0 = { 0x7fffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } ; -static const FIR_FILTER fir_1 = { 0x2aaaaa80, 0x555554ff, 0x00000000, 0x00000000, 0x00000000 } ; -static const FIR_FILTER fir_2 = { 0x10000000, 0x30000000, 0x40000000, 0x00000000, 0x00000000 } ; -static const FIR_FILTER fir_3 = { 0x077f80e8, 0x199999a0, 0x2bb3b240, 0x33333340, 0x00000000 } ; -static const FIR_FILTER fir_4 = { 0x04130598, 0x0ebdb000, 0x1becfa60, 0x2697a4c0, 0x2aaaaa80 } ; - - -static const FIR_FILTER *const fir_table[5] = { -  &fir_0, -  &fir_1, -  &fir_2, -  &fir_3, -  &fir_4 -}; - -/**************************************************************************/ -/*! -  \brief     Calculates the values used for the detector. - - -  \return    none - -*/ -/**************************************************************************/ -static void -calculateDetectorValues(FIXP_DBL **quotaMatrixOrig,       /*!< Matrix holding the tonality values of the original. */ -                        SCHAR    *indexVector,            /*!< Index vector to obtain the patched data. */ -                        FIXP_DBL *nrgVector,              /*!< Energy vector. */ -                        DETECTOR_VALUES *detectorValues,  /*!< pointer to DETECTOR_VALUES struct. */ -                        INT startChannel,                 /*!< Start channel. */ -                        INT stopChannel,                  /*!< Stop channel. */ -                        INT startIndex,                   /*!< Start index. */ -                        INT stopIndex,                    /*!< Stop index. */ -                        INT numberOfStrongest             /*!< The number of sorted tonal components to be considered. */ -                        ) -{ -  INT i,temp, j; - -  const FIXP_DBL* filter = *fir_table[INVF_SMOOTHING_LENGTH]; -  FIXP_DBL origQuotaMeanStrongest, sbrQuotaMeanStrongest; -  FIXP_DBL origQuota, sbrQuota; -  FIXP_DBL invIndex, invChannel, invTemp; -  FIXP_DBL quotaVecOrig[64], quotaVecSbr[64]; - -  FDKmemclear(quotaVecOrig,64*sizeof(FIXP_DBL)); -  FDKmemclear(quotaVecSbr,64*sizeof(FIXP_DBL)); - -  invIndex = GetInvInt(stopIndex-startIndex); -  invChannel = GetInvInt(stopChannel-startChannel); - -  /* -   Calculate the mean value, over the current time segment, for the original, the HFR -   and the difference, over all channels in the current frequency range. -   NOTE: the averaging is done on the values quota/(1 - quota + RELAXATION). -   */ - -  /* The original, the sbr signal and the total energy */ -  detectorValues->avgNrg = FL2FXCONST_DBL(0.0f); -  for(j=startIndex; j<stopIndex; j++) { -    for(i=startChannel; i<stopChannel; i++) { -      quotaVecOrig[i] += fMult(quotaMatrixOrig[j][i], invIndex); - -      if(indexVector[i] != -1) -        quotaVecSbr[i] += fMult(quotaMatrixOrig[j][indexVector[i]], invIndex); -    } -    detectorValues->avgNrg += fMult(nrgVector[j], invIndex); -  } - -  /* -   Calculate the mean value, over the current frequency range, for the original, the HFR -   and the difference. Also calculate the same mean values for the three vectors, but only -   includeing the x strongest copmponents. -   */ - -  origQuota = FL2FXCONST_DBL(0.0f); -  sbrQuota  = FL2FXCONST_DBL(0.0f); -  for(i=startChannel; i<stopChannel; i++) { -    origQuota += fMultDiv2(quotaVecOrig[i], invChannel); -    sbrQuota  += fMultDiv2(quotaVecSbr[i], invChannel); -  } - -  /* -   Calculate the mean value for the x strongest components -  */ -  FDKsbrEnc_Shellsort_fract(quotaVecOrig+startChannel,stopChannel-startChannel); -  FDKsbrEnc_Shellsort_fract(quotaVecSbr+startChannel,stopChannel-startChannel); - -  origQuotaMeanStrongest = FL2FXCONST_DBL(0.0f); -  sbrQuotaMeanStrongest  = FL2FXCONST_DBL(0.0f); - -  temp = min(stopChannel - startChannel, numberOfStrongest); -  invTemp = GetInvInt(temp); - -  for(i=0; i<temp; i++) { -    origQuotaMeanStrongest += fMultDiv2(quotaVecOrig[i + stopChannel - temp], invTemp); -    sbrQuotaMeanStrongest  += fMultDiv2(quotaVecSbr[i + stopChannel - temp], invTemp); -  } - -  /* -   The value for the strongest component -  */ -  detectorValues->origQuotaMax = quotaVecOrig[stopChannel - 1]; -  detectorValues->sbrQuotaMax  = quotaVecSbr[stopChannel - 1]; - -  /* -   Buffer values -  */ -  FDKmemmove(detectorValues->origQuotaMean, detectorValues->origQuotaMean + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); -  FDKmemmove(detectorValues->sbrQuotaMean, detectorValues->sbrQuotaMean + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); -  FDKmemmove(detectorValues->origQuotaMeanStrongest, detectorValues->origQuotaMeanStrongest + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); -  FDKmemmove(detectorValues->sbrQuotaMeanStrongest, detectorValues->sbrQuotaMeanStrongest + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); - -  detectorValues->origQuotaMean[INVF_SMOOTHING_LENGTH]          = origQuota<<1; -  detectorValues->sbrQuotaMean[INVF_SMOOTHING_LENGTH]           = sbrQuota<<1; -  detectorValues->origQuotaMeanStrongest[INVF_SMOOTHING_LENGTH] = origQuotaMeanStrongest<<1; -  detectorValues->sbrQuotaMeanStrongest[INVF_SMOOTHING_LENGTH]  = sbrQuotaMeanStrongest<<1; - -  /* -   Filter values -  */ -  detectorValues->origQuotaMeanFilt = FL2FXCONST_DBL(0.0f); -  detectorValues->sbrQuotaMeanFilt = FL2FXCONST_DBL(0.0f); -  detectorValues->origQuotaMeanStrongestFilt = FL2FXCONST_DBL(0.0f); -  detectorValues->sbrQuotaMeanStrongestFilt = FL2FXCONST_DBL(0.0f); - -  for(i=0;i<INVF_SMOOTHING_LENGTH+1;i++) { -    detectorValues->origQuotaMeanFilt += fMult(detectorValues->origQuotaMean[i], filter[i]); -    detectorValues->sbrQuotaMeanFilt  += fMult(detectorValues->sbrQuotaMean[i], filter[i]); -    detectorValues->origQuotaMeanStrongestFilt += fMult(detectorValues->origQuotaMeanStrongest[i], filter[i]); -    detectorValues->sbrQuotaMeanStrongestFilt  += fMult(detectorValues->sbrQuotaMeanStrongest[i], filter[i]); -  } -} - -/**************************************************************************/ -/*! -  \brief     Returns the region in which the input value belongs. - - - -  \return    region. - -*/ -/**************************************************************************/ -static INT -findRegion(FIXP_DBL currVal,        /*!< The current value. */ -           const FIXP_DBL *borders, /*!< The border of the regions. */ -           const INT numBorders     /*!< The number of borders. */ -           ) -{ -  INT i; - -  if(currVal < borders[0]){ -    return 0; -  } - -  for(i = 1; i < numBorders; i++){ -    if( currVal >= borders[i-1] && currVal < borders[i]){ -      return i; -    } -  } - -  if(currVal >= borders[numBorders-1]){ -    return numBorders; -  } - -  return 0;  /* We never get here, it's just to avoid compiler warnings.*/ -} - -/**************************************************************************/ -/*! -  \brief     Makes a clever decision based on the quota vector. - - -  \return     decision on which invf mode to use - -*/ -/**************************************************************************/ -static INVF_MODE -decisionAlgorithm(const DETECTOR_PARAMETERS *detectorParams,     /*!< Struct with the detector parameters. */ -                  DETECTOR_VALUES *detectorValues,               /*!< Struct with the detector values. */ -                  INT transientFlag,                             /*!< Flag indicating if there is a transient present.*/ -                  INT* prevRegionSbr,                            /*!< The previous region in which the Sbr value was. */ -                  INT* prevRegionOrig                            /*!< The previous region in which the Orig value was. */ -                  ) -{ -  INT invFiltLevel, regionSbr, regionOrig, regionNrg; - -  /* -   Current thresholds. -   */ -  const FIXP_DBL *quantStepsSbr  = detectorParams->quantStepsSbr; -  const FIXP_DBL *quantStepsOrig = detectorParams->quantStepsOrig; -  const FIXP_DBL *nrgBorders     = detectorParams->nrgBorders; -  const INT numRegionsSbr     = detectorParams->numRegionsSbr; -  const INT numRegionsOrig    = detectorParams->numRegionsOrig; -  const INT numRegionsNrg     = detectorParams->numRegionsNrg; - -  FIXP_DBL quantStepsSbrTmp[MAX_NUM_REGIONS]; -  FIXP_DBL quantStepsOrigTmp[MAX_NUM_REGIONS]; - -  /* -   Current detector values. -   */ -  FIXP_DBL origQuotaMeanFilt; -  FIXP_DBL sbrQuotaMeanFilt; -  FIXP_DBL nrg; - -  /* 0.375 = 3.0 / 8.0; 0.31143075889 = log2(RELAXATION)/64.0; 0.625 = log(16)/64.0; 0.6875 = 44/64.0 */ -  origQuotaMeanFilt = (fMultDiv2(FL2FXCONST_DBL(2.f*0.375f), (FIXP_DBL)(CalcLdData(max(detectorValues->origQuotaMeanFilt,(FIXP_DBL)1)) + FL2FXCONST_DBL(0.31143075889f)))) << 0;  /* scaled by 1/2^9 */ -  sbrQuotaMeanFilt  = (fMultDiv2(FL2FXCONST_DBL(2.f*0.375f), (FIXP_DBL)(CalcLdData(max(detectorValues->sbrQuotaMeanFilt,(FIXP_DBL)1)) + FL2FXCONST_DBL(0.31143075889f)))) << 0;   /* scaled by 1/2^9 */ -  /* If energy is zero then we will get different results for different word lengths. */ -  nrg               = (fMultDiv2(FL2FXCONST_DBL(2.f*0.375f), (FIXP_DBL)(CalcLdData(detectorValues->avgNrg+(FIXP_DBL)1) + FL2FXCONST_DBL(0.0625f) + FL2FXCONST_DBL(0.6875f)))) << 0;     /* scaled by 1/2^8; 2^44 -> qmf energy scale */ - -  FDKmemcpy(quantStepsSbrTmp,quantStepsSbr,numRegionsSbr*sizeof(FIXP_DBL)); -  FDKmemcpy(quantStepsOrigTmp,quantStepsOrig,numRegionsOrig*sizeof(FIXP_DBL)); - -  if(*prevRegionSbr < numRegionsSbr) -    quantStepsSbrTmp[*prevRegionSbr] = quantStepsSbr[*prevRegionSbr] + hysteresis; -  if(*prevRegionSbr > 0) -    quantStepsSbrTmp[*prevRegionSbr - 1] = quantStepsSbr[*prevRegionSbr - 1] - hysteresis; - -  if(*prevRegionOrig < numRegionsOrig) -    quantStepsOrigTmp[*prevRegionOrig] = quantStepsOrig[*prevRegionOrig] + hysteresis; -  if(*prevRegionOrig > 0) -    quantStepsOrigTmp[*prevRegionOrig - 1] = quantStepsOrig[*prevRegionOrig - 1] - hysteresis; - -  regionSbr  = findRegion(sbrQuotaMeanFilt, quantStepsSbrTmp, numRegionsSbr); -  regionOrig = findRegion(origQuotaMeanFilt, quantStepsOrigTmp, numRegionsOrig); -  regionNrg  = findRegion(nrg,nrgBorders,numRegionsNrg); - -  *prevRegionSbr = regionSbr; -  *prevRegionOrig = regionOrig; - -  /* Use different settings if a transient is present*/ -  invFiltLevel = (transientFlag == 1) ? detectorParams->regionSpaceTransient[regionSbr][regionOrig] -                                      : detectorParams->regionSpace[regionSbr][regionOrig]; - -  /* Compensate for low energy.*/ -  invFiltLevel = max(invFiltLevel + detectorParams->EnergyCompFactor[regionNrg],0); - -  return (INVF_MODE) (invFiltLevel); -} - -/**************************************************************************/ -/*! -  \brief     Estiamtion of the inverse filtering level required -             in the decoder. - -   A second order LPC is calculated for every filterbank channel, using -   the covariance method. THe ratio between the energy of the predicted -   signal and the energy of the non-predictable signal is calcualted. - -  \return    none. - -*/ -/**************************************************************************/ -void -FDKsbrEnc_qmfInverseFilteringDetector(HANDLE_SBR_INV_FILT_EST hInvFilt,  /*!< Handle to the SBR_INV_FILT_EST struct. */ -                            FIXP_DBL **quotaMatrix,            /*!< The matrix holding the tonality values of the original. */ -                            FIXP_DBL *nrgVector,               /*!< The energy vector. */ -                            SCHAR    *indexVector,             /*!< Index vector to obtain the patched data. */ -                            INT startIndex,                    /*!< Start index. */ -                            INT stopIndex,                     /*!< Stop index. */ -                            INT transientFlag,                 /*!< Flag indicating if a transient is present or not.*/ -                            INVF_MODE* infVec                  /*!< Vector holding the inverse filtering levels. */ -                            ) -{ -  INT band; - -  /* -   * Do the inverse filtering level estimation. -   *****************************************************/ -  for(band = 0 ; band < hInvFilt->noDetectorBands; band++){ -    INT startChannel = hInvFilt->freqBandTableInvFilt[band]; -    INT stopChannel  = hInvFilt->freqBandTableInvFilt[band+1]; - - -    calculateDetectorValues( quotaMatrix, -                             indexVector, -                             nrgVector, -                            &hInvFilt->detectorValues[band], -                             startChannel, -                             stopChannel, -                             startIndex, -                             stopIndex, -                             hInvFilt->numberOfStrongest); - -    infVec[band]= decisionAlgorithm( hInvFilt->detectorParams, -                                    &hInvFilt->detectorValues[band], -                                     transientFlag, -                                    &hInvFilt->prevRegionSbr[band], -                                    &hInvFilt->prevRegionOrig[band]); -  } - -} - - -/**************************************************************************/ -/*! -  \brief     Initialize an instance of the inverse filtering level estimator. - - -  \return   errorCode, noError if successful. - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_initInvFiltDetector (HANDLE_SBR_INV_FILT_EST hInvFilt,   /*!< Pointer to a handle to the SBR_INV_FILT_EST struct. */ -                       INT* freqBandTableDetector,          /*!< Frequency band table for the inverse filtering. */ -                       INT numDetectorBands,                /*!< Number of inverse filtering bands. */ -                       UINT useSpeechConfig         /*!< Flag: adapt tuning parameters according to speech*/ -                       ) -{ -  INT i; - -  FDKmemclear( hInvFilt,sizeof(SBR_INV_FILT_EST)); - -  hInvFilt->detectorParams = (useSpeechConfig) ? &detectorParamsAACSpeech -                                               : &detectorParamsAAC ; - -  hInvFilt->noDetectorBandsMax = numDetectorBands; - -  /* -     Memory initialisation -  */ -  for(i=0;i<hInvFilt->noDetectorBandsMax;i++){ -    FDKmemclear(&hInvFilt->detectorValues[i], sizeof(DETECTOR_VALUES)); -    hInvFilt->prevInvfMode[i]   = INVF_OFF; -    hInvFilt->prevRegionOrig[i] = 0; -    hInvFilt->prevRegionSbr[i]  = 0; -  } - -  /* -  Reset the inverse fltering detector. -  */ -  FDKsbrEnc_resetInvFiltDetector(hInvFilt, -                       freqBandTableDetector, -                       hInvFilt->noDetectorBandsMax); - -  return (0); -} - - -/**************************************************************************/ -/*! -  \brief     resets sbr inverse filtering structure. - - - -  \return   errorCode, noError if successful. - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_resetInvFiltDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, /*!< Handle to the SBR_INV_FILT_EST struct. */ -                     INT* freqBandTableDetector,       /*!< Frequency band table for the inverse filtering. */ -                     INT numDetectorBands)             /*!< Number of inverse filtering bands. */ -{ - -  hInvFilt->numberOfStrongest     = 1; -  FDKmemcpy(hInvFilt->freqBandTableInvFilt,freqBandTableDetector,(numDetectorBands+1)*sizeof(INT)); -  hInvFilt->noDetectorBands = numDetectorBands; - -  return (0); -} - - diff --git a/libSBRenc/src/invf_est.h b/libSBRenc/src/invf_est.h deleted file mode 100644 index 2bd2a78..0000000 --- a/libSBRenc/src/invf_est.h +++ /dev/null @@ -1,175 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Inverse Filtering detection prototypes   -*/ -#ifndef _INV_FILT_DET_H -#define _INV_FILT_DET_H - -#include "sbr_encoder.h" -#include "sbr_def.h" - -#define INVF_SMOOTHING_LENGTH 2 - -typedef struct -{ -  const FIXP_DBL *quantStepsSbr; -  const FIXP_DBL *quantStepsOrig; -  const FIXP_DBL *nrgBorders; -  INT   numRegionsSbr; -  INT   numRegionsOrig; -  INT   numRegionsNrg; -  INVF_MODE regionSpace[5][5]; -  INVF_MODE regionSpaceTransient[5][5]; -  INT EnergyCompFactor[5]; - -}DETECTOR_PARAMETERS; - -typedef struct -{ -  FIXP_DBL  origQuotaMean[INVF_SMOOTHING_LENGTH+1]; -  FIXP_DBL  sbrQuotaMean[INVF_SMOOTHING_LENGTH+1]; -  FIXP_DBL  origQuotaMeanStrongest[INVF_SMOOTHING_LENGTH+1]; -  FIXP_DBL  sbrQuotaMeanStrongest[INVF_SMOOTHING_LENGTH+1]; - -  FIXP_DBL origQuotaMeanFilt; -  FIXP_DBL sbrQuotaMeanFilt; -  FIXP_DBL origQuotaMeanStrongestFilt; -  FIXP_DBL sbrQuotaMeanStrongestFilt; - -  FIXP_DBL origQuotaMax; -  FIXP_DBL sbrQuotaMax; - -  FIXP_DBL avgNrg; -}DETECTOR_VALUES; - - - -typedef struct -{ -  INT numberOfStrongest; - -  INT prevRegionSbr[MAX_NUM_NOISE_VALUES]; -  INT prevRegionOrig[MAX_NUM_NOISE_VALUES]; - -  INT freqBandTableInvFilt[MAX_NUM_NOISE_VALUES]; -  INT noDetectorBands; -  INT noDetectorBandsMax; - -  const DETECTOR_PARAMETERS *detectorParams; - -  INVF_MODE prevInvfMode[MAX_NUM_NOISE_VALUES]; -  DETECTOR_VALUES detectorValues[MAX_NUM_NOISE_VALUES]; - -  FIXP_DBL nrgAvg; -  FIXP_DBL wmQmf[MAX_NUM_NOISE_VALUES]; -} -SBR_INV_FILT_EST; - -typedef SBR_INV_FILT_EST *HANDLE_SBR_INV_FILT_EST; - -void -FDKsbrEnc_qmfInverseFilteringDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, -                            FIXP_DBL ** quotaMatrix, -                            FIXP_DBL *nrgVector, -                            SCHAR    *indexVector, -                            INT startIndex, -                            INT stopIndex, -                            INT transientFlag, -                            INVF_MODE* infVec); - -INT -FDKsbrEnc_initInvFiltDetector (HANDLE_SBR_INV_FILT_EST hInvFilt, -                       INT* freqBandTableDetector, -                       INT numDetectorBands, -                       UINT useSpeechConfig); - -INT -FDKsbrEnc_resetInvFiltDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, -                     INT* freqBandTableDetector, -                     INT numDetectorBands); - -#endif /* _QMF_INV_FILT_H */ - diff --git a/libSBRenc/src/mh_det.cpp b/libSBRenc/src/mh_det.cpp deleted file mode 100644 index 73d1b8b..0000000 --- a/libSBRenc/src/mh_det.cpp +++ /dev/null @@ -1,1451 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "mh_det.h" - -#include "sbr_ram.h" -#include "sbr_misc.h" - - -#include "genericStds.h" - -#define SFM_SHIFT 2     /* Attention: SFM_SCALE depends on SFM_SHIFT */ -#define SFM_SCALE (MAXVAL_DBL >> SFM_SHIFT)   /* 1.0 >> SFM_SHIFT */ - - -/*!< Detector Parameters for AAC core codec. */ -static const DETECTOR_PARAMETERS_MH paramsAac = { -9,                                             /*!< deltaTime */ -{ -FL2FXCONST_DBL(20.0f*RELAXATION_FLOAT),        /*!< thresHoldDiff */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT),        /*!< thresHoldDiffGuide */ -FL2FXCONST_DBL(15.0f*RELAXATION_FLOAT),        /*!< thresHoldTone */ -FL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT),        /*!< thresHoldToneGuide */ -FL2FXCONST_DBL(0.3f)>>SFM_SHIFT,               /*!< sfmThresSbr */ -FL2FXCONST_DBL(0.1f)>>SFM_SHIFT,               /*!< sfmThresOrig */ -FL2FXCONST_DBL(0.3f),                          /*!< decayGuideOrig */ -FL2FXCONST_DBL(0.5f),                          /*!< decayGuideDiff */ -FL2FXCONST_DBL(-0.000112993269),  /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ -FL2FXCONST_DBL(-0.000112993269),  /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ -FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */    /*!< derivThresAboveLD64 */ -}, -50                                             /*!< maxComp */ -}; - -/*!< Detector Parameters for AAC LD core codec. */ -static const DETECTOR_PARAMETERS_MH paramsAacLd = { -16,                                            /*!< Delta time. */ -{ -FL2FXCONST_DBL(25.0f*RELAXATION_FLOAT),        /*!< thresHoldDiff */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT),        /*!< tresHoldDiffGuide */ -FL2FXCONST_DBL(15.0f*RELAXATION_FLOAT),        /*!< thresHoldTone */ -FL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ -FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT),        /*!< thresHoldToneGuide */ -FL2FXCONST_DBL(0.3f)>>SFM_SHIFT,               /*!< sfmThresSbr */ -FL2FXCONST_DBL(0.1f)>>SFM_SHIFT,               /*!< sfmThresOrig */ -FL2FXCONST_DBL(0.3f),                          /*!< decayGuideOrig */ -FL2FXCONST_DBL(0.2f),                          /*!< decayGuideDiff */ -FL2FXCONST_DBL(-0.000112993269),  /* LD64(FL2FXCONST_DBL(0.995f)) */  /*!< derivThresMaxLD64 */ -FL2FXCONST_DBL(-0.000112993269),  /* LD64(FL2FXCONST_DBL(0.995f)) */  /*!< derivThresBelowLD64 */ -FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */     /*!< derivThresAboveLD64 */ -}, -50                                             /*!< maxComp */ -}; - - -/**************************************************************************/ -/*! -  \brief     Calculates the difference in tonality between original and SBR -             for a given time and frequency region. - -             The values for pDiffMapped2Scfb are scaled by RELAXATION - -  \return    none. - -*/ -/**************************************************************************/ -static void diff(FIXP_DBL *RESTRICT pTonalityOrig, -                 FIXP_DBL *pDiffMapped2Scfb, -                 const UCHAR *RESTRICT pFreqBandTable, -                 INT       nScfb, -                 SCHAR    *indexVector) -{ -  UCHAR i, ll, lu, k; -  FIXP_DBL maxValOrig, maxValSbr, tmp; -  INT scale; - -  for(i=0; i < nScfb; i++){ -    ll = pFreqBandTable[i]; -    lu = pFreqBandTable[i+1]; - -    maxValOrig = FL2FXCONST_DBL(0.0f); -    maxValSbr = FL2FXCONST_DBL(0.0f); - -    for(k=ll;k<lu;k++){ -      maxValOrig = fixMax(maxValOrig, pTonalityOrig[k]); -      maxValSbr = fixMax(maxValSbr, pTonalityOrig[indexVector[k]]); -    } - -    if ((maxValSbr >= RELAXATION)) { -        tmp = fDivNorm(maxValOrig, maxValSbr, &scale); -        pDiffMapped2Scfb[i] = scaleValue(fMult(tmp,RELAXATION_FRACT), fixMax(-(DFRACT_BITS-1),(scale-RELAXATION_SHIFT))); -    } -    else { -        pDiffMapped2Scfb[i] = maxValOrig; -    } -  } -} - - -/**************************************************************************/ -/*! -  \brief     Calculates a flatness measure of the tonality measures. - -  Calculation of the power function and using scalefactor for basis: -    Using log2: -    z  = (2^k * x)^y; -    z' = CalcLd(z) = y*CalcLd(x) + y*k; -    z  = CalcInvLd(z'); - -    Using ld64: -    z  = (2^k * x)^y; -    z' = CalcLd64(z) = y*CalcLd64(x)/64 + y*k/64; -    z  = CalcInvLd64(z'); - -  The values pSfmOrigVec and pSfmSbrVec are scaled by the factor 1/4.0 - -  \return    none. - -*/ -/**************************************************************************/ -static void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, -                                     SCHAR    *indexVector, -                                     FIXP_DBL *pSfmOrigVec, -                                     FIXP_DBL *pSfmSbrVec, -                                     const UCHAR *pFreqBandTable, -                                     INT       nSfb) -{ -  INT i,j; -  FIXP_DBL invBands,tmp1,tmp2; -  INT shiftFac0,shiftFacSum0; -  INT shiftFac1,shiftFacSum1; -  FIXP_DBL accu; - -  for(i=0;i<nSfb;i++) -  { -    INT ll = pFreqBandTable[i]; -    INT lu = pFreqBandTable[i+1]; -    pSfmOrigVec[i] = (FIXP_DBL)(MAXVAL_DBL>>2); -    pSfmSbrVec[i]  = (FIXP_DBL)(MAXVAL_DBL>>2); - -    if(lu - ll > 1){ -      FIXP_DBL amOrig,amTransp,gmOrig,gmTransp,sfmOrig,sfmTransp; -      invBands = GetInvInt(lu-ll); -      shiftFacSum0 = 0; -      shiftFacSum1 = 0; -      amOrig = amTransp = FL2FXCONST_DBL(0.0f); -      gmOrig = gmTransp = (FIXP_DBL)MAXVAL_DBL; - -      for(j= ll; j<lu; j++) { -        sfmOrig   = pQuotaBuffer[j]; -        sfmTransp = pQuotaBuffer[indexVector[j]]; - -        amOrig   += fMult(sfmOrig, invBands); -        amTransp += fMult(sfmTransp, invBands); - -        shiftFac0 = CountLeadingBits(sfmOrig); -        shiftFac1 = CountLeadingBits(sfmTransp); - -        gmOrig   = fMult(gmOrig, sfmOrig<<shiftFac0); -        gmTransp = fMult(gmTransp, sfmTransp<<shiftFac1); - -        shiftFacSum0 += shiftFac0; -        shiftFacSum1 += shiftFac1; -      } - -      if (gmOrig > FL2FXCONST_DBL(0.0f)) { - -        tmp1 = CalcLdData(gmOrig);      /* CalcLd64(x)/64 */ -        tmp1 = fMult(invBands, tmp1);   /* y*CalcLd64(x)/64 */ - -        /* y*k/64 */ -        accu = (FIXP_DBL)-shiftFacSum0 << (DFRACT_BITS-1-8); -        tmp2 = fMultDiv2(invBands, accu) << (2+1); - -        tmp2 = tmp1 + tmp2;             /* y*CalcLd64(x)/64 + y*k/64 */ -        gmOrig = CalcInvLdData(tmp2);   /* CalcInvLd64(z'); */ -      } -      else { -        gmOrig = FL2FXCONST_DBL(0.0f); -      } - -      if (gmTransp > FL2FXCONST_DBL(0.0f)) { - -        tmp1 = CalcLdData(gmTransp);    /* CalcLd64(x)/64 */ -        tmp1 = fMult(invBands, tmp1);   /* y*CalcLd64(x)/64 */ - -        /* y*k/64 */ -        accu = (FIXP_DBL)-shiftFacSum1 << (DFRACT_BITS-1-8); -        tmp2 = fMultDiv2(invBands, accu) << (2+1); - -        tmp2 = tmp1 + tmp2;             /* y*CalcLd64(x)/64 + y*k/64 */ -        gmTransp = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ -      } -      else { -        gmTransp = FL2FXCONST_DBL(0.0f); -      } -      if ( amOrig != FL2FXCONST_DBL(0.0f) ) -        pSfmOrigVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmOrig,amOrig,SFM_SCALE); - -      if ( amTransp != FL2FXCONST_DBL(0.0f) ) -        pSfmSbrVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmTransp,amTransp,SFM_SCALE); -    } -  } -} - -/**************************************************************************/ -/*! -  \brief     Calculates the input to the missing harmonics detection. - - -  \return    none. - -*/ -/**************************************************************************/ -static void calculateDetectorInput(FIXP_DBL **RESTRICT pQuotaBuffer,  /*!< Pointer to tonality matrix. */ -                                   SCHAR     *RESTRICT indexVector, -                                   FIXP_DBL **RESTRICT tonalityDiff, -                                   FIXP_DBL **RESTRICT pSfmOrig, -                                   FIXP_DBL **RESTRICT pSfmSbr, -                                   const UCHAR *freqBandTable, -                                   INT nSfb, -                                   INT noEstPerFrame, -                                   INT move) -{ -  INT est; - -  /* -  New estimate. -  */ -  for (est=0; est < noEstPerFrame; est++) { - -    diff(pQuotaBuffer[est+move], -         tonalityDiff[est+move], -         freqBandTable, -         nSfb, -         indexVector); - -    calculateFlatnessMeasure(pQuotaBuffer[est+ move], -                             indexVector, -                             pSfmOrig[est + move], -                             pSfmSbr[est + move], -                             freqBandTable, -                             nSfb); -  } -} - - -/**************************************************************************/ -/*! -  \brief     Checks that the detection is not due to a LP filter - -  This function determines if a newly detected missing harmonics is not -  in fact just a low-pass filtere input signal. If so, the detection is -  removed. - -  \return    none. - -*/ -/**************************************************************************/ -static void removeLowPassDetection(UCHAR *RESTRICT pAddHarmSfb, -                                   UCHAR **RESTRICT pDetectionVectors, -                                   INT start, -                                   INT stop, -                                   INT nSfb, -                                   const UCHAR *RESTRICT pFreqBandTable, -                                   FIXP_DBL *RESTRICT pNrgVector, -                                   THRES_HOLDS mhThresh) - -{ -  INT i,est; -  INT maxDerivPos = pFreqBandTable[nSfb]; -  INT numBands = pFreqBandTable[nSfb]; -  FIXP_DBL nrgLow,nrgHigh; -  FIXP_DBL nrgLD64,nrgLowLD64,nrgHighLD64,nrgDiffLD64; -  FIXP_DBL valLD64,maxValLD64,maxValAboveLD64; -  INT bLPsignal = 0; - -  maxValLD64 = FL2FXCONST_DBL(-1.0f); -  for(i = numBands - 1 - 2; i > pFreqBandTable[0];i--){ -    nrgLow  = pNrgVector[i]; -    nrgHigh = pNrgVector[i + 2]; - -    if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ -      nrgLowLD64 = CalcLdData(nrgLow>>1); -      nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); -      valLD64 = nrgDiffLD64-nrgLowLD64; -      if(valLD64 > maxValLD64){ -        maxDerivPos = i; -        maxValLD64 = valLD64; -      } -      if(maxValLD64 > mhThresh.derivThresMaxLD64) { -        break; -      } -    } -  } - -  /* Find the largest "gradient" above. (should be relatively flat, hence we expect a low value -     if the signal is LP.*/ -  maxValAboveLD64 = FL2FXCONST_DBL(-1.0f); -  for(i = numBands - 1 - 2; i > maxDerivPos + 2;i--){ -    nrgLow  = pNrgVector[i]; -    nrgHigh = pNrgVector[i + 2]; - -    if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ -		   nrgLowLD64 = CalcLdData(nrgLow>>1); -		   nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); -			 valLD64 = nrgDiffLD64-nrgLowLD64; -      if(valLD64 > maxValAboveLD64){ -        maxValAboveLD64 = valLD64; -      } -    } -		 else { -      if(nrgHigh != FL2FXCONST_DBL(0.0f) && nrgHigh > nrgLow){ -		     nrgHighLD64 = CalcLdData(nrgHigh>>1); -		     nrgDiffLD64 = CalcLdData((nrgHigh>>1)-(nrgLow>>1)); -			   valLD64 = nrgDiffLD64-nrgHighLD64; -        if(valLD64 > maxValAboveLD64){ -          maxValAboveLD64 = valLD64; -        } -      } -		 } -  } - -  if(maxValLD64 > mhThresh.derivThresMaxLD64 && maxValAboveLD64 < mhThresh.derivThresAboveLD64){ -    bLPsignal = 1; - -    for(i = maxDerivPos - 1; i > maxDerivPos - 5 && i >= 0 ; i--){ -      if(pNrgVector[i] != FL2FXCONST_DBL(0.0f) && pNrgVector[i] > pNrgVector[maxDerivPos + 2]){ -		     nrgDiffLD64 = CalcLdData((pNrgVector[i]>>1)-(pNrgVector[maxDerivPos + 2]>>1)); -				 nrgLD64 = CalcLdData(pNrgVector[i]>>1); -  			 valLD64 = nrgDiffLD64-nrgLD64; -        if(valLD64 < mhThresh.derivThresBelowLD64) { -          bLPsignal = 0; -          break; -        } -      } -      else{ -        bLPsignal = 0; -        break; -      } -    } -  } - -  if(bLPsignal){ -    for(i=0;i<nSfb;i++){ -      if(maxDerivPos >= pFreqBandTable[i] && maxDerivPos < pFreqBandTable[i+1]) -        break; -    } - -    if(pAddHarmSfb[i]){ -      pAddHarmSfb[i] = 0; -      for(est = start; est < stop ; est++){ -        pDetectionVectors[est][i] = 0; -      } -    } -  } -} - -/**************************************************************************/ -/*! -  \brief     Checks if it is allowed to detect a missing tone, that wasn't -             detected previously. - - -  \return    newDetectionAllowed flag. - -*/ -/**************************************************************************/ -static INT isDetectionOfNewToneAllowed(const SBR_FRAME_INFO *pFrameInfo, -                                       INT *pDetectionStartPos, -                                       INT noEstPerFrame, -                                       INT prevTransientFrame, -                                       INT prevTransientPos, -                                       INT prevTransientFlag, -                                       INT transientPosOffset, -                                       INT transientFlag, -                                       INT transientPos, -                                       INT deltaTime, -                                       HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector) -{ -  INT transientFrame, newDetectionAllowed; - - -  /* Determine if this is a frame where a transient starts... -   * If the transient flag was set the previous frame but not the -   * transient frame flag, the transient frame flag is set in the current frame. -   *****************************************************************************/ -  transientFrame = 0; -  if(transientFlag){ -    if(transientPos + transientPosOffset < pFrameInfo->borders[pFrameInfo->nEnvelopes]) -      transientFrame = 1; -      if(noEstPerFrame > 1){ -        if(transientPos + transientPosOffset > h_sbrMissingHarmonicsDetector->timeSlots >> 1){ -          *pDetectionStartPos = noEstPerFrame; -        } -        else{ -          *pDetectionStartPos = noEstPerFrame >> 1; -        } - -      } -      else{ -        *pDetectionStartPos = noEstPerFrame; -      } -  } -  else{ -    if(prevTransientFlag && !prevTransientFrame){ -      transientFrame = 1; -      *pDetectionStartPos = 0; -    } -  } - -  /* -   * Determine if detection of new missing harmonics are allowed. -   * If the frame contains a transient it's ok. If the previous -   * frame contained a transient it needs to be sufficiently close -   * to the start of the current frame. -   ****************************************************************/ -  newDetectionAllowed = 0; -  if(transientFrame){ -    newDetectionAllowed = 1; -  } -  else { -    if(prevTransientFrame && -       fixp_abs(pFrameInfo->borders[0] - (prevTransientPos + transientPosOffset - -                                     h_sbrMissingHarmonicsDetector->timeSlots)) < deltaTime) -      newDetectionAllowed = 1; -      *pDetectionStartPos = 0; -  } - -  h_sbrMissingHarmonicsDetector->previousTransientFlag  = transientFlag; -  h_sbrMissingHarmonicsDetector->previousTransientFrame = transientFrame; -  h_sbrMissingHarmonicsDetector->previousTransientPos   = transientPos; - -  return (newDetectionAllowed); -} - - -/**************************************************************************/ -/*! -  \brief     Cleans up the detection after a transient. - - -  \return    none. - -*/ -/**************************************************************************/ -static void transientCleanUp(FIXP_DBL **quotaBuffer, -                             INT nSfb, -                             UCHAR **detectionVectors, -                             UCHAR *pAddHarmSfb, -                             UCHAR *pPrevAddHarmSfb, -                             INT ** signBuffer, -                             const UCHAR *pFreqBandTable, -                             INT start, -                             INT stop, -                             INT newDetectionAllowed, -                             FIXP_DBL *pNrgVector, -                             THRES_HOLDS mhThresh) -{ -  INT i,j,li, ui,est; - -  for(est=start; est < stop; est++) { -    for(i=0; i<nSfb; i++) { -      pAddHarmSfb[i] = pAddHarmSfb[i] || detectionVectors[est][i]; -    } -  } - -  if(newDetectionAllowed == 1){ -    /* -     * Check for duplication of sines located -     * on the border of two scf-bands. -     *************************************************/ -    for(i=0;i<nSfb-1;i++) { -      li = pFreqBandTable[i]; -      ui = pFreqBandTable[i+1]; - -      /* detection in adjacent channels.*/ -      if(pAddHarmSfb[i] && pAddHarmSfb[i+1]) { -        FIXP_DBL maxVal1, maxVal2; -        INT maxPos1, maxPos2, maxPosTime1, maxPosTime2; - -        li = pFreqBandTable[i]; -        ui = pFreqBandTable[i+1]; - -        /* Find maximum tonality in the the two scf bands.*/ -        maxPosTime1 = start; -        maxPos1 = li; -        maxVal1 = quotaBuffer[start][li]; -        for(est = start; est < stop; est++){ -          for(j = li; j<ui; j++){ -            if(quotaBuffer[est][j] > maxVal1){ -              maxVal1 = quotaBuffer[est][j]; -              maxPos1 = j; -              maxPosTime1 = est; -            } -          } -        } - -        li = pFreqBandTable[i+1]; -        ui = pFreqBandTable[i+2]; - -        /* Find maximum tonality in the the two scf bands.*/ -        maxPosTime2 = start; -        maxPos2 = li; -        maxVal2 = quotaBuffer[start][li]; -        for(est = start; est < stop; est++){ -          for(j = li; j<ui; j++){ -            if(quotaBuffer[est][j] > maxVal2){ -              maxVal2 = quotaBuffer[est][j]; -              maxPos2 = j; -              maxPosTime2 = est; -            } -          } -        } - -        /* If the maximum values are in adjacent QMF-channels, we need to remove -           the lowest of the two.*/ -        if(maxPos2-maxPos1 < 2){ - -          if(pPrevAddHarmSfb[i] == 1 && pPrevAddHarmSfb[i+1] == 0){ -            /* Keep the lower, remove the upper.*/ -            pAddHarmSfb[i+1] = 0; -            for(est=start; est<stop; est++){ -              detectionVectors[est][i+1] = 0; -            } -          } -          else{ -            if(pPrevAddHarmSfb[i] == 0 && pPrevAddHarmSfb[i+1] == 1){ -              /* Keep the upper, remove the lower.*/ -              pAddHarmSfb[i] = 0; -              for(est=start; est<stop; est++){ -                detectionVectors[est][i] = 0; -              } -            } -            else{ -             /* If the maximum values are in adjacent QMF-channels, and if the signs indicate that it is the same sine, -                we need to remove the lowest of the two.*/ -              if(maxVal1 > maxVal2){ -                if(signBuffer[maxPosTime1][maxPos2] < 0 && signBuffer[maxPosTime1][maxPos1] > 0){ -                  /* Keep the lower, remove the upper.*/ -                  pAddHarmSfb[i+1] = 0; -                  for(est=start; est<stop; est++){ -                    detectionVectors[est][i+1] = 0; -                  } -                } -              } -              else{ -                if(signBuffer[maxPosTime2][maxPos2] < 0 && signBuffer[maxPosTime2][maxPos1] > 0){ -                  /* Keep the upper, remove the lower.*/ -                  pAddHarmSfb[i] = 0; -                  for(est=start; est<stop; est++){ -                    detectionVectors[est][i] = 0; -                  } -                } -              } -            } -          } -        } -      } -    } - -    /* Make sure that the detection is not the cut-off of a low pass filter. */ -    removeLowPassDetection(pAddHarmSfb, -                           detectionVectors, -                           start, -                           stop, -                           nSfb, -                           pFreqBandTable, -                           pNrgVector, -                           mhThresh); -  } -  else { -   /* -    * If a missing harmonic wasn't missing the previous frame -    * the transient-flag needs to be set in order to be allowed to detect it. -    *************************************************************************/ -    for(i=0;i<nSfb;i++){ -      if(pAddHarmSfb[i] - pPrevAddHarmSfb[i] > 0) -        pAddHarmSfb[i] = 0; -    } -  } -} - - -/**************************************************************************/ -/*! -  \brief     Do detection for one tonality estimate. - - -  \return    none. - -*/ -/**************************************************************************/ -static void detection(FIXP_DBL *quotaBuffer, -                      FIXP_DBL *pDiffVecScfb, -                      INT nSfb, -                      UCHAR *pHarmVec, -                      const UCHAR *pFreqBandTable, -                      FIXP_DBL *sfmOrig, -                      FIXP_DBL *sfmSbr, -                      GUIDE_VECTORS guideVectors, -                      GUIDE_VECTORS newGuideVectors, -                      THRES_HOLDS mhThresh) -{ - -  INT i,j,ll, lu; -  FIXP_DBL thresTemp,thresOrig; - -  /* -   * Do detection on the difference vector, i.e. the difference between -   * the original and the transposed. -   *********************************************************************/ -  for(i=0;i<nSfb;i++){ - -    thresTemp = (guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) -                  ? fixMax(fMult(mhThresh.decayGuideDiff,guideVectors.guideVectorDiff[i]), mhThresh.thresHoldDiffGuide) -                  : mhThresh.thresHoldDiff; - -    thresTemp = fixMin(thresTemp, mhThresh.thresHoldDiff); - -    if(pDiffVecScfb[i] > thresTemp){ -      pHarmVec[i] = 1; -      newGuideVectors.guideVectorDiff[i] = pDiffVecScfb[i]; -    } -    else{ -      /* If the guide wasn't zero, but the current level is to low, -         start tracking the decay on the tone in the original rather -         than the difference.*/ -      if(guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ -        guideVectors.guideVectorOrig[i] = mhThresh.thresHoldToneGuide; -      } -    } -  } - -  /* -   * Trace tones in the original signal that at one point -   * have been detected because they will be replaced by -   * multiple tones in the sbr signal. -   ****************************************************/ - -  for(i=0;i<nSfb;i++){ -    ll = pFreqBandTable[i]; -    lu = pFreqBandTable[i+1]; - -    thresOrig = fixMax(fMult(guideVectors.guideVectorOrig[i], mhThresh.decayGuideOrig), mhThresh.thresHoldToneGuide); -    thresOrig = fixMin(thresOrig, mhThresh.thresHoldTone); - -    if(guideVectors.guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)){ -      for(j= ll;j<lu;j++){ -        if(quotaBuffer[j] > thresOrig){ -          pHarmVec[i] = 1; -          newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; -        } -      } -    } -  } - -  /* -   * Check for multiple sines in the transposed signal, -   * where there is only one in the original. -   ****************************************************/ -  thresOrig = mhThresh.thresHoldTone; - -  for(i=0;i<nSfb;i++){ -    ll = pFreqBandTable[i]; -    lu = pFreqBandTable[i+1]; - -    if(pHarmVec[i] == 0){ -      if(lu -ll > 1){ -        for(j= ll;j<lu;j++){ -          if(quotaBuffer[j] > thresOrig && (sfmSbr[i] > mhThresh.sfmThresSbr && sfmOrig[i] < mhThresh.sfmThresOrig)){ -            pHarmVec[i] = 1; -            newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; -          } -        } -      } -      else{ -        if(i < nSfb -1){ -          ll = pFreqBandTable[i]; - -          if(i>0){ -            if(quotaBuffer[ll] > mhThresh.thresHoldTone && (pDiffVecScfb[i+1] < mhThresh.invThresHoldTone || pDiffVecScfb[i-1] < mhThresh.invThresHoldTone)){ -                pHarmVec[i] = 1; -                newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; -            } -          } -          else{ -            if(quotaBuffer[ll] > mhThresh.thresHoldTone && pDiffVecScfb[i+1] < mhThresh.invThresHoldTone){ -                pHarmVec[i] = 1; -                newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; -            } -          } -        } -      } -    } -  } -} - - -/**************************************************************************/ -/*! -  \brief     Do detection for every tonality estimate, using forward prediction. - - -  \return    none. - -*/ -/**************************************************************************/ -static void detectionWithPrediction(FIXP_DBL **quotaBuffer, -                                    FIXP_DBL **pDiffVecScfb, -                                    INT ** signBuffer, -                                    INT nSfb, -                                    const UCHAR* pFreqBandTable, -                                    FIXP_DBL **sfmOrig, -                                    FIXP_DBL **sfmSbr, -                                    UCHAR **detectionVectors, -                                    UCHAR *pPrevAddHarmSfb, -                                    GUIDE_VECTORS *guideVectors, -                                    INT noEstPerFrame, -                                    INT detectionStart, -                                    INT totNoEst, -                                    INT newDetectionAllowed, -                                    INT *pAddHarmFlag, -                                    UCHAR *pAddHarmSfb, -                                    FIXP_DBL *pNrgVector, -                                    const DETECTOR_PARAMETERS_MH *mhParams) -{ -  INT est = 0,i; -  INT start; - -  FDKmemclear(pAddHarmSfb,nSfb*sizeof(UCHAR)); - -  if(newDetectionAllowed){ - -    if(totNoEst > 1){ -      start = detectionStart; - -      if (start != 0) { -        FDKmemcpy(guideVectors[start].guideVectorDiff,guideVectors[0].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); -        FDKmemcpy(guideVectors[start].guideVectorOrig,guideVectors[0].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); -        FDKmemclear(guideVectors[start-1].guideVectorDetected,nSfb*sizeof(UCHAR)); -      } -    } -    else{ -      start = 0; -    } -  } -  else{ -    start = 0; -  } - - -  for(est = start; est < totNoEst; est++){ - -    /* -    * Do detection on the current frame using -    * guide-info from the previous. -    *******************************************/ -    if(est > 0){ -      FDKmemcpy(guideVectors[est].guideVectorDetected,detectionVectors[est-1],nSfb*sizeof(UCHAR)); -    } - -    FDKmemclear(detectionVectors[est], nSfb*sizeof(UCHAR)); - -    if(est < totNoEst-1){ -      FDKmemclear(guideVectors[est+1].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); -      FDKmemclear(guideVectors[est+1].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); -      FDKmemclear(guideVectors[est+1].guideVectorDetected,nSfb*sizeof(UCHAR)); - -      detection(quotaBuffer[est], -                pDiffVecScfb[est], -                nSfb, -                detectionVectors[est], -                pFreqBandTable, -                sfmOrig[est], -                sfmSbr[est], -                guideVectors[est], -                guideVectors[est+1], -                mhParams->thresHolds); -    } -    else{ -      FDKmemclear(guideVectors[est].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); -      FDKmemclear(guideVectors[est].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); -      FDKmemclear(guideVectors[est].guideVectorDetected,nSfb*sizeof(UCHAR)); - -      detection(quotaBuffer[est], -                pDiffVecScfb[est], -                nSfb, -                detectionVectors[est], -                pFreqBandTable, -                sfmOrig[est], -                sfmSbr[est], -                guideVectors[est], -                guideVectors[est], -                mhParams->thresHolds); -    } -  } - - -  /* Clean up the detection.*/ -  transientCleanUp(quotaBuffer, -                   nSfb, -                   detectionVectors, -                   pAddHarmSfb, -                   pPrevAddHarmSfb, -                   signBuffer, -                   pFreqBandTable, -                   start, -                   totNoEst, -                   newDetectionAllowed, -                   pNrgVector, -                   mhParams->thresHolds); - - -  /* Set flag... */ -  *pAddHarmFlag = 0; -  for(i=0; i<nSfb; i++){ -    if(pAddHarmSfb[i]){ -      *pAddHarmFlag = 1; -      break; -    } -  } - -  FDKmemcpy(pPrevAddHarmSfb, pAddHarmSfb, nSfb*sizeof(UCHAR)); -  FDKmemcpy(guideVectors[0].guideVectorDetected,pAddHarmSfb,nSfb*sizeof(INT)); - -  for(i=0; i<nSfb ; i++){ - -    guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); -    guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); - -    if(pAddHarmSfb[i] == 1){ -      /* If we had a detection use the guide-value in the next frame from the last estimate were the detection -      was done.*/ -      for(est=start; est < totNoEst; est++){ -        if(guideVectors[est].guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ -          guideVectors[0].guideVectorDiff[i] = guideVectors[est].guideVectorDiff[i]; -        } -        if(guideVectors[est].guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)){ -          guideVectors[0].guideVectorOrig[i] = guideVectors[est].guideVectorOrig[i]; -        } -      } -    } -  } - -} - - -/**************************************************************************/ -/*! -  \brief     Calculates a compensation vector for the energy data. - -  This function calculates a compensation vector for the energy data (i.e. -  envelope data) that is calculated elsewhere. This is since, one sine on -  the border of two scalefactor bands, will be replace by one sine in the -  middle of either scalefactor band. However, since the sine that is replaced -  will influence the energy estimate in both scalefactor bands (in the envelops -  calculation function) a compensation value is required in order to avoid -  noise substitution in the decoder next to the synthetic sine. - -  \return    none. - -*/ -/**************************************************************************/ -static void calculateCompVector(UCHAR *pAddHarmSfb, -                                FIXP_DBL **pTonalityMatrix, -                                INT ** pSignMatrix, -                                UCHAR *pEnvComp, -                                INT nSfb, -                                const UCHAR *freqBandTable, -                                INT totNoEst, -                                INT maxComp, -                                UCHAR *pPrevEnvComp, -                                INT newDetectionAllowed) -{ - -  INT scfBand,est,l,ll,lu,maxPosF,maxPosT; -  FIXP_DBL maxVal; -  INT compValue; -  FIXP_DBL tmp; - -  FDKmemclear(pEnvComp,nSfb*sizeof(UCHAR)); - -  for(scfBand=0; scfBand < nSfb; scfBand++){ - -    if(pAddHarmSfb[scfBand]){ /* A missing sine was detected */ -      ll = freqBandTable[scfBand]; -      lu = freqBandTable[scfBand+1]; - -      maxPosF = 0;                        /* First find the maximum*/ -      maxPosT = 0; -      maxVal = FL2FXCONST_DBL(0.0f); - -      for(est=0;est<totNoEst;est++){ -        for(l=ll; l<lu; l++){ -          if(pTonalityMatrix[est][l] > maxVal){ -            maxVal = pTonalityMatrix[est][l]; -            maxPosF = l; -            maxPosT = est; -          } -        } -      } - -      /* -       * If the maximum tonality is at the lower border of the -       * scalefactor band, we check the sign of the adjacent channels -       * to see if this sine is shared by the lower channel. If so, the -       * energy of the single sine will be present in two scalefactor bands -       * in the SBR data, which will cause problems in the decoder, when we -       * add a sine to just one of the channels. -       *********************************************************************/ -      if(maxPosF == ll && scfBand){ -        if(!pAddHarmSfb[scfBand - 1]) {     /* No detection below*/ -          if (pSignMatrix[maxPosT][maxPosF - 1] > 0 && pSignMatrix[maxPosT][maxPosF] < 0) { -            /* The comp value is calulated as the tonallity value, i.e we want to -               reduce the envelope data for this channel with as much as the tonality -               that is spread from the channel above. (ld64(RELAXATION) = 0.31143075889) */ -            tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF - 1]) + RELAXATION_LD64); -            tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1;  /* shift one bit less for rounding */ -            compValue = ((INT)(LONG)tmp) >> 1; - -						      /* limit the comp-value*/ -            if (compValue > maxComp) -              compValue = maxComp; - -            pEnvComp[scfBand-1] = compValue; -					     } -				    } -      } - -      /* -       * Same as above, but for the upper end of the scalefactor-band. -       ***************************************************************/ -      if(maxPosF == lu-1 && scfBand+1 < nSfb){        /* Upper border*/ -        if(!pAddHarmSfb[scfBand + 1]) { -          if (pSignMatrix[maxPosT][maxPosF] > 0 && pSignMatrix[maxPosT][maxPosF + 1] < 0) { -            tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF + 1]) + RELAXATION_LD64); -            tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1;  /* shift one bit less for rounding */ -            compValue = ((INT)(LONG)tmp) >> 1; - -            if (compValue > maxComp) -              compValue = maxComp; - -            pEnvComp[scfBand+1] = compValue; -					 } -				 } -      } -		 } -	 } - -  if(newDetectionAllowed == 0){ -    for(scfBand=0;scfBand<nSfb;scfBand++){ -      if(pEnvComp[scfBand] != 0 && pPrevEnvComp[scfBand] == 0) -        pEnvComp[scfBand] = 0; -    } -  } - -  /* remember the value for the next frame.*/ -  FDKmemcpy(pPrevEnvComp,pEnvComp,nSfb*sizeof(UCHAR)); -} - - -/**************************************************************************/ -/*! -  \brief     Detects where strong tonal components will be missing after -             HFR in the decoder. - - -  \return    none. - -*/ -/**************************************************************************/ -void -FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMHDet, -                               FIXP_DBL ** pQuotaBuffer, -                               INT ** pSignBuffer, -                               SCHAR* indexVector, -                               const SBR_FRAME_INFO *pFrameInfo, -                               const UCHAR* pTranInfo, -                               INT* pAddHarmonicsFlag, -                               UCHAR* pAddHarmonicsScaleFactorBands, -                               const UCHAR* freqBandTable, -                               INT nSfb, -                               UCHAR* envelopeCompensation, -                               FIXP_DBL *pNrgVector) -{ -  INT transientFlag = pTranInfo[1]; -  INT transientPos  = pTranInfo[0]; -  INT newDetectionAllowed; -  INT transientDetStart = 0; - -  UCHAR ** detectionVectors  = h_sbrMHDet->detectionVectors; -  INT move                = h_sbrMHDet->move; -  INT noEstPerFrame       = h_sbrMHDet->noEstPerFrame; -  INT totNoEst            = h_sbrMHDet->totNoEst; -  INT prevTransientFlag   = h_sbrMHDet->previousTransientFlag; -  INT prevTransientFrame  = h_sbrMHDet->previousTransientFrame; -  INT transientPosOffset  = h_sbrMHDet->transientPosOffset; -  INT prevTransientPos    = h_sbrMHDet->previousTransientPos; -  GUIDE_VECTORS* guideVectors = h_sbrMHDet->guideVectors; -  INT deltaTime = h_sbrMHDet->mhParams->deltaTime; -  INT maxComp = h_sbrMHDet->mhParams->maxComp; - -  int est; - -  /* -  Buffer values. -  */ -  FDK_ASSERT(move<=(MAX_NO_OF_ESTIMATES>>1)); -  FDK_ASSERT(noEstPerFrame<=(MAX_NO_OF_ESTIMATES>>1)); - -  FIXP_DBL *sfmSbr[MAX_NO_OF_ESTIMATES]; -  FIXP_DBL *sfmOrig[MAX_NO_OF_ESTIMATES]; -  FIXP_DBL *tonalityDiff[MAX_NO_OF_ESTIMATES]; - -  for (est=0; est < MAX_NO_OF_ESTIMATES/2; est++) { -    sfmSbr[est]       = h_sbrMHDet->sfmSbr[est]; -    sfmOrig[est]      = h_sbrMHDet->sfmOrig[est]; -    tonalityDiff[est] = h_sbrMHDet->tonalityDiff[est]; -  } - -  C_ALLOC_SCRATCH_START(scratch_mem, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); -  FIXP_DBL *scratch = scratch_mem; -  for (; est < MAX_NO_OF_ESTIMATES; est++) { -    sfmSbr[est]       = scratch; scratch+=MAX_FREQ_COEFFS; -    sfmOrig[est]      = scratch; scratch+=MAX_FREQ_COEFFS; -    tonalityDiff[est] = scratch; scratch+=MAX_FREQ_COEFFS; -  } - - - -  /* Determine if we're allowed to detect "missing harmonics" that wasn't detected before. -     In order to be allowed to do new detection, there must be a transient in the current -     frame, or a transient in the previous frame sufficiently close to the current frame. */ -  newDetectionAllowed = isDetectionOfNewToneAllowed(pFrameInfo, -                                                    &transientDetStart, -                                                    noEstPerFrame, -                                                    prevTransientFrame, -                                                    prevTransientPos, -                                                    prevTransientFlag, -                                                    transientPosOffset, -                                                    transientFlag, -                                                    transientPos, -                                                    deltaTime, -                                                    h_sbrMHDet); - -  /* Calulate the variables that will be used subsequently for the actual detection */ -  calculateDetectorInput(pQuotaBuffer, -                         indexVector, -                         tonalityDiff, -                         sfmOrig, -                         sfmSbr, -                         freqBandTable, -                         nSfb, -                         noEstPerFrame, -                         move); - -  /* Do the actual detection using information from previous detections */ -  detectionWithPrediction(pQuotaBuffer, -                          tonalityDiff, -                          pSignBuffer, -                          nSfb, -                          freqBandTable, -                          sfmOrig, -                          sfmSbr, -                          detectionVectors, -                          h_sbrMHDet->guideScfb, -                          guideVectors, -                          noEstPerFrame, -                          transientDetStart, -                          totNoEst, -                          newDetectionAllowed, -                          pAddHarmonicsFlag, -                          pAddHarmonicsScaleFactorBands, -                          pNrgVector, -                          h_sbrMHDet->mhParams); - -  /* Calculate the comp vector, so that the energy can be -     compensated for a sine between two QMF-bands. */ -  calculateCompVector(pAddHarmonicsScaleFactorBands, -                      pQuotaBuffer, -                      pSignBuffer, -                      envelopeCompensation, -                      nSfb, -                      freqBandTable, -                      totNoEst, -                      maxComp, -                      h_sbrMHDet->prevEnvelopeCompensation, -                      newDetectionAllowed); - -  for (est=0; est < move; est++) { -    FDKmemcpy(tonalityDiff[est], tonalityDiff[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -    FDKmemcpy(sfmOrig[est], sfmOrig[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -    FDKmemcpy(sfmSbr[est], sfmSbr[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -  } -  C_ALLOC_SCRATCH_END(scratch, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); - - -} - -/**************************************************************************/ -/*! -  \brief     Initialize an instance of the missing harmonics detector. - - -  \return    errorCode, noError if OK. - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_CreateSbrMissingHarmonicsDetector ( -                                   HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, -                                   INT chan) -{ -  HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; -  INT i; - -  UCHAR* detectionVectors    = GetRam_Sbr_detectionVectors(chan); -  UCHAR* guideVectorDetected = GetRam_Sbr_guideVectorDetected(chan); -  FIXP_DBL* guideVectorDiff  = GetRam_Sbr_guideVectorDiff(chan); -  FIXP_DBL* guideVectorOrig  = GetRam_Sbr_guideVectorOrig(chan); - -  FDKmemclear (hs,sizeof(SBR_MISSING_HARMONICS_DETECTOR)); - -  hs->prevEnvelopeCompensation = GetRam_Sbr_prevEnvelopeCompensation(chan); -  hs->guideScfb                = GetRam_Sbr_guideScfb(chan); - -  for(i=0; i<MAX_NO_OF_ESTIMATES; i++) { -    hs->guideVectors[i].guideVectorDiff = guideVectorDiff + (i*MAX_FREQ_COEFFS); -    hs->guideVectors[i].guideVectorOrig = guideVectorOrig + (i*MAX_FREQ_COEFFS); -    hs->detectionVectors[i] = detectionVectors + (i*MAX_FREQ_COEFFS); -    hs->guideVectors[i].guideVectorDetected = guideVectorDetected + (i*MAX_FREQ_COEFFS); -  } - -  return 0; -} - - -/**************************************************************************/ -/*! -  \brief     Initialize an instance of the missing harmonics detector. - - -  \return    errorCode, noError if OK. - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_InitSbrMissingHarmonicsDetector ( -                                   HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, -                                   INT sampleFreq, -                                   INT frameSize, -                                   INT nSfb, -                                   INT qmfNoChannels, -                                   INT totNoEst, -                                   INT move, -                                   INT noEstPerFrame, -                                   UINT sbrSyntaxFlags -                                  ) -{ -  HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; -  int i; - -  FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES); - -  if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) -  { -    switch(frameSize){ -    case 1024: -    case 512: -        hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; -        hs->timeSlots          = 16; -        break; -    case 960: -    case 480: -        hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; -        hs->timeSlots          = 15; -        break; -    default: -        return -1; -    } -  } else -  { -    switch(frameSize){ -    case 2048: -    case 1024: -        hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048; -        hs->timeSlots          = NUMBER_TIME_SLOTS_2048; -        break; -    case 1920: -    case 960: -        hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920; -        hs->timeSlots          = NUMBER_TIME_SLOTS_1920; -        break; -    default: -        return -1; -    } -  } - -  if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { -    hs->mhParams = ¶msAacLd; -  } else -  hs->mhParams = ¶msAac; - -  hs->qmfNoChannels = qmfNoChannels; -  hs->sampleFreq = sampleFreq; -  hs->nSfb = nSfb; - -  hs->totNoEst = totNoEst; -  hs->move = move; -  hs->noEstPerFrame = noEstPerFrame; - -  for(i=0; i<totNoEst; i++) { -    FDKmemclear (hs->guideVectors[i].guideVectorDiff,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -    FDKmemclear (hs->guideVectors[i].guideVectorOrig,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -    FDKmemclear (hs->detectionVectors[i],sizeof(UCHAR)*MAX_FREQ_COEFFS); -    FDKmemclear (hs->guideVectors[i].guideVectorDetected,sizeof(UCHAR)*MAX_FREQ_COEFFS); -  } - -  //for(i=0; i<totNoEst/2; i++) { -  for(i=0; i<MAX_NO_OF_ESTIMATES/2; i++) { -    FDKmemclear (hs->tonalityDiff[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -    FDKmemclear (hs->sfmOrig[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -    FDKmemclear (hs->sfmSbr[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); -  } - -  FDKmemclear ( hs->prevEnvelopeCompensation, sizeof(UCHAR)*MAX_FREQ_COEFFS); -  FDKmemclear ( hs->guideScfb, sizeof(UCHAR)*MAX_FREQ_COEFFS); - -  hs->previousTransientFlag = 0; -  hs->previousTransientFrame = 0; -  hs->previousTransientPos = 0; - -  return (0); -} - -/**************************************************************************/ -/*! -  \brief     Deletes an instance of the missing harmonics detector. - - -  \return    none. - -*/ -/**************************************************************************/ -void -FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet) -{ -  if (hSbrMHDet) { -    HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; - -    FreeRam_Sbr_detectionVectors(&hs->detectionVectors[0]); -    FreeRam_Sbr_guideVectorDetected(&hs->guideVectors[0].guideVectorDetected); -    FreeRam_Sbr_guideVectorDiff(&hs->guideVectors[0].guideVectorDiff); -    FreeRam_Sbr_guideVectorOrig(&hs->guideVectors[0].guideVectorOrig); -    FreeRam_Sbr_prevEnvelopeCompensation(&hs->prevEnvelopeCompensation); -    FreeRam_Sbr_guideScfb(&hs->guideScfb); - -  } -} - -/**************************************************************************/ -/*! -  \brief     Resets an instance of the missing harmonics detector. - - -  \return    error code, noError if OK. - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, -                                  INT nSfb) -{ -  int i; -  FIXP_DBL tempGuide[MAX_FREQ_COEFFS]; -  UCHAR tempGuideInt[MAX_FREQ_COEFFS]; -  INT nSfbPrev; - -  nSfbPrev = hSbrMissingHarmonicsDetector->nSfb; -  hSbrMissingHarmonicsDetector->nSfb = nSfb; - -  FDKmemcpy( tempGuideInt, hSbrMissingHarmonicsDetector->guideScfb, nSfbPrev * sizeof(UCHAR) ); - -  if ( nSfb > nSfbPrev ) { -    for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { -      hSbrMissingHarmonicsDetector->guideScfb[i] = 0; -    } - -    for ( i = 0; i < nSfbPrev; i++ ) { -      hSbrMissingHarmonicsDetector->guideScfb[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; -    } -  } -  else { -    for ( i = 0; i < nSfb; i++ ) { -      hSbrMissingHarmonicsDetector->guideScfb[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; -    } -  } - -  FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff, nSfbPrev * sizeof(FIXP_DBL) ); - -  if (nSfb > nSfbPrev ) { -    for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); -    } - -    for ( i = 0; i < nSfbPrev; i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i + (nSfb - nSfbPrev)] = tempGuide[i]; -    } -  } -  else { -    for ( i = 0; i < nSfb; i++  ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = tempGuide[i + (nSfbPrev-nSfb)]; -    } -  } - -  FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig, nSfbPrev * sizeof(FIXP_DBL) ); - -  if ( nSfb > nSfbPrev ) { -    for ( i = 0; i< (nSfb - nSfbPrev); i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); -    } - -    for ( i = 0; i < nSfbPrev; i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i + (nSfb - nSfbPrev)] = tempGuide[i]; -    } -  } -  else { -    for ( i = 0; i < nSfb; i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = tempGuide[i + (nSfbPrev-nSfb)]; -    } -  } - -  FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected, nSfbPrev * sizeof(UCHAR) ); - -  if ( nSfb > nSfbPrev ) { -    for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = 0; -    } - -    for ( i = 0; i < nSfbPrev; i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; -    } -  } -  else { -    for ( i = 0; i < nSfb; i++ ) { -      hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; -    } -  } - -  FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->prevEnvelopeCompensation, nSfbPrev * sizeof(UCHAR) ); - -  if ( nSfb > nSfbPrev ) { -    for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { -      hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = 0; -    } - -    for ( i = 0; i < nSfbPrev; i++ ) { -      hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; -    } -  } -  else { -    for ( i = 0; i < nSfb; i++ ) { -      hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; -    } -  } - -  return 0; -} - diff --git a/libSBRenc/src/mh_det.h b/libSBRenc/src/mh_det.h deleted file mode 100644 index 74c2a99..0000000 --- a/libSBRenc/src/mh_det.h +++ /dev/null @@ -1,196 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  missing harmonics detection header file   -*/ - -#ifndef __MH_DETECT_H -#define __MH_DETECT_H - -#include "sbr_encoder.h" -#include "fram_gen.h" - -typedef struct -{ -  FIXP_DBL thresHoldDiff;      /*!< threshold for tonality difference */ -  FIXP_DBL thresHoldDiffGuide; /*!< threshold for tonality difference for the guide */ -  FIXP_DBL thresHoldTone;      /*!< threshold for tonality for a sine */ -  FIXP_DBL invThresHoldTone; -  FIXP_DBL thresHoldToneGuide; /*!< threshold for tonality for a sine for the guide */ -  FIXP_DBL sfmThresSbr;        /*!< tonality flatness measure threshold for the SBR signal.*/ -  FIXP_DBL sfmThresOrig;       /*!< tonality flatness measure threshold for the original signal.*/ -  FIXP_DBL decayGuideOrig;     /*!< decay value of the tonality value of the guide for the tone. */ -  FIXP_DBL decayGuideDiff;     /*!< decay value of the tonality value of the guide for the tonality difference. */ -  FIXP_DBL derivThresMaxLD64;      /*!< threshold for detecting LP character in a signal. */ -  FIXP_DBL derivThresBelowLD64;    /*!< threshold for detecting LP character in a signal. */ -  FIXP_DBL derivThresAboveLD64;    /*!< threshold for detecting LP character in a signal. */ -}THRES_HOLDS; - -typedef struct -{ -  INT deltaTime;            /*!< maximum allowed transient distance (from frame border in number of qmf subband sample) -                                 for a frame to be considered a transient frame.*/ -  THRES_HOLDS thresHolds;   /*!< the thresholds used for detection. */ -  INT maxComp;              /*!< maximum alllowed compensation factor for the envelope data. */ -}DETECTOR_PARAMETERS_MH; - -typedef struct -{ -  FIXP_DBL *guideVectorDiff; -  FIXP_DBL *guideVectorOrig; -  UCHAR* guideVectorDetected; -}GUIDE_VECTORS; - - -typedef struct -{ -  INT qmfNoChannels; -  INT nSfb; -  INT sampleFreq; -  INT previousTransientFlag; -  INT previousTransientFrame; -  INT previousTransientPos; - -  INT noVecPerFrame; -  INT transientPosOffset; - -  INT move; -  INT totNoEst; -  INT noEstPerFrame; -  INT timeSlots; - -  UCHAR *guideScfb; -  UCHAR *prevEnvelopeCompensation; -  UCHAR *detectionVectors[MAX_NO_OF_ESTIMATES]; -  FIXP_DBL tonalityDiff[MAX_NO_OF_ESTIMATES/2][MAX_FREQ_COEFFS]; -  FIXP_DBL sfmOrig[MAX_NO_OF_ESTIMATES/2][MAX_FREQ_COEFFS]; -  FIXP_DBL sfmSbr[MAX_NO_OF_ESTIMATES/2][MAX_FREQ_COEFFS]; -  const DETECTOR_PARAMETERS_MH *mhParams; -  GUIDE_VECTORS guideVectors[MAX_NO_OF_ESTIMATES]; -} -SBR_MISSING_HARMONICS_DETECTOR; - -typedef SBR_MISSING_HARMONICS_DETECTOR *HANDLE_SBR_MISSING_HARMONICS_DETECTOR; - -void -FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector, -                               FIXP_DBL ** pQuotaBuffer, -                               INT ** pSignBuffer, -                               SCHAR *indexVector, -                               const SBR_FRAME_INFO *pFrameInfo, -                               const UCHAR* pTranInfo, -                               INT* pAddHarmonicsFlag, -                               UCHAR* pAddHarmonicsScaleFactorBands, -                               const UCHAR* freqBandTable, -                               INT nSfb, -                               UCHAR * envelopeCompensation, -                               FIXP_DBL *pNrgVector); - -INT -FDKsbrEnc_CreateSbrMissingHarmonicsDetector ( -                                   HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, -                                   INT chan); - -INT -FDKsbrEnc_InitSbrMissingHarmonicsDetector( -                                  HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector, -                                  INT sampleFreq, -                                  INT frameSize, -                                  INT nSfb, -                                  INT qmfNoChannels, -                                  INT totNoEst, -                                  INT move, -                                  INT noEstPerFrame, -                                  UINT sbrSyntaxFlags); - -void -FDKsbrEnc_DeleteSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector); - - -INT -FDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, -                                   INT nSfb); - -#endif diff --git a/libSBRenc/src/nf_est.cpp b/libSBRenc/src/nf_est.cpp deleted file mode 100644 index 7a3c022..0000000 --- a/libSBRenc/src/nf_est.cpp +++ /dev/null @@ -1,583 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "nf_est.h" - -#include "sbr_misc.h" - -#include "genericStds.h" - -/* smoothFilter[4]  = {0.05857864376269f, 0.2f, 0.34142135623731f, 0.4f}; */ -static const FIXP_DBL smoothFilter[4]  = { 0x077f813d, 0x19999995, 0x2bb3b1f5, 0x33333335 }; - -/* static const INT smoothFilterLength = 4; */ - -static const FIXP_DBL QuantOffset = (INT)0xfc000000;  /* ld64(0.25) */ - -#ifndef min -#define min(a,b) ( a < b ? a:b) -#endif - -#ifndef max -#define max(a,b) ( a > b ? a:b) -#endif - -#define NOISE_FLOOR_OFFSET_SCALING  (4) - - - -/**************************************************************************/ -/*! -  \brief     The function applies smoothing to the noise levels. - - - -  \return    none - -*/ -/**************************************************************************/ -static void -smoothingOfNoiseLevels(FIXP_DBL *NoiseLevels,        /*!< pointer to noise-floor levels.*/ -                       INT nEnvelopes,               /*!< Number of noise floor envelopes.*/ -                       INT noNoiseBands,             /*!< Number of noise bands for every noise floor envelope. */ -                       FIXP_DBL prevNoiseLevels[NF_SMOOTHING_LENGTH][MAX_NUM_NOISE_VALUES],/*!< Previous noise floor envelopes. */ -                       const FIXP_DBL *smoothFilter, /*!< filter used for smoothing the noise floor levels. */ -                       INT transientFlag)            /*!< flag indicating if a transient is present*/ - -{ -  INT i,band,env; -  FIXP_DBL accu; - -  for(env = 0; env < nEnvelopes; env++){ -    if(transientFlag){ -      for (i = 0; i < NF_SMOOTHING_LENGTH; i++){ -        FDKmemcpy(prevNoiseLevels[i],NoiseLevels+env*noNoiseBands,noNoiseBands*sizeof(FIXP_DBL)); -      } -    } -    else { -      for (i = 1; i < NF_SMOOTHING_LENGTH; i++){ -        FDKmemcpy(prevNoiseLevels[i - 1],prevNoiseLevels[i],noNoiseBands*sizeof(FIXP_DBL)); -      } -      FDKmemcpy(prevNoiseLevels[NF_SMOOTHING_LENGTH - 1],NoiseLevels+env*noNoiseBands,noNoiseBands*sizeof(FIXP_DBL)); -    } - -    for (band = 0; band < noNoiseBands; band++){ -      accu = FL2FXCONST_DBL(0.0f); -      for (i = 0; i < NF_SMOOTHING_LENGTH; i++){ -        accu += fMultDiv2(smoothFilter[i], prevNoiseLevels[i][band]); -      } -      FDK_ASSERT( (band + env*noNoiseBands) < MAX_NUM_NOISE_VALUES); -      NoiseLevels[band+ env*noNoiseBands] = accu<<1; -    } -  } -} - -/**************************************************************************/ -/*! -  \brief     Does the noise floor level estiamtion. - -  The noiseLevel samples are scaled by the factor 0.25 - -  \return    none - -*/ -/**************************************************************************/ -static void -qmfBasedNoiseFloorDetection(FIXP_DBL *noiseLevel,              /*!< Pointer to vector to store the noise levels in.*/ -                            FIXP_DBL ** quotaMatrixOrig,       /*!< Matrix holding the quota values of the original. */ -                            SCHAR *indexVector,                /*!< Index vector to obtain the patched data. */ -                            INT startIndex,                    /*!< Start index. */ -                            INT stopIndex,                     /*!< Stop index. */ -                            INT startChannel,                  /*!< Start channel of the current noise floor band.*/ -                            INT stopChannel,                   /*!< Stop channel of the current noise floor band. */ -                            FIXP_DBL ana_max_level,            /*!< Maximum level of the adaptive noise.*/ -                            FIXP_DBL noiseFloorOffset,         /*!< Noise floor offset. */ -                            INT missingHarmonicFlag,           /*!< Flag indicating if a strong tonal component is missing.*/ -                            FIXP_DBL weightFac,                /*!< Weightening factor for the difference between orig and sbr. */ -                            INVF_MODE diffThres,               /*!< Threshold value to control the inverse filtering decision.*/ -                            INVF_MODE inverseFilteringLevel)   /*!< Inverse filtering level of the current band.*/ -{ -  INT scale, l, k; -  FIXP_DBL meanOrig=FL2FXCONST_DBL(0.0f), meanSbr=FL2FXCONST_DBL(0.0f), diff; -  FIXP_DBL invIndex = GetInvInt(stopIndex-startIndex); -  FIXP_DBL invChannel = GetInvInt(stopChannel-startChannel); -  FIXP_DBL accu; - -   /* -   Calculate the mean value, over the current time segment, for the original, the HFR -   and the difference, over all channels in the current frequency range. -   */ - -  if(missingHarmonicFlag == 1){ -    for(l = startChannel; l < stopChannel;l++){ -      /* tonalityOrig */ -      accu = FL2FXCONST_DBL(0.0f); -      for(k = startIndex ; k < stopIndex; k++){ -        accu += fMultDiv2(quotaMatrixOrig[k][l], invIndex); -      } -      meanOrig = fixMax(meanOrig,(accu<<1)); - -      /* tonalitySbr */ -      accu = FL2FXCONST_DBL(0.0f); -      for(k = startIndex ; k < stopIndex; k++){ -        accu += fMultDiv2(quotaMatrixOrig[k][indexVector[l]], invIndex); -      } -      meanSbr  = fixMax(meanSbr,(accu<<1)); - -    } -  } -  else{ -    for(l = startChannel; l < stopChannel;l++){ -      /* tonalityOrig */ -      accu = FL2FXCONST_DBL(0.0f); -      for(k = startIndex ; k < stopIndex; k++){ -        accu += fMultDiv2(quotaMatrixOrig[k][l], invIndex); -      } -      meanOrig += fMult((accu<<1), invChannel); - -      /* tonalitySbr */ -      accu = FL2FXCONST_DBL(0.0f); -      for(k = startIndex ; k < stopIndex; k++){ -        accu += fMultDiv2(quotaMatrixOrig[k][indexVector[l]], invIndex); -      } -      meanSbr  += fMult((accu<<1), invChannel); -    } -  } - -  /* Small fix to avoid noise during silent passages.*/ -  if( meanOrig <= FL2FXCONST_DBL(0.000976562f*RELAXATION_FLOAT) && -      meanSbr <= FL2FXCONST_DBL(0.000976562f*RELAXATION_FLOAT) ) -  { -    meanOrig = FL2FXCONST_DBL(101.5936673f*RELAXATION_FLOAT); -    meanSbr  = FL2FXCONST_DBL(101.5936673f*RELAXATION_FLOAT); -  } - -  meanOrig = fixMax(meanOrig,RELAXATION); -  meanSbr  = fixMax(meanSbr,RELAXATION); - -  if (missingHarmonicFlag == 1 || -      inverseFilteringLevel == INVF_MID_LEVEL || -      inverseFilteringLevel == INVF_LOW_LEVEL || -      inverseFilteringLevel == INVF_OFF || -      inverseFilteringLevel <= diffThres) -  { -    diff = RELAXATION; -  } -  else { -    accu = fDivNorm(meanSbr, meanOrig, &scale); - -    diff = fixMax( RELAXATION, -                   fMult(RELAXATION_FRACT,fMult(weightFac,accu)) >>( RELAXATION_SHIFT-scale ) ) ; -  } - -  /* -   * noise Level is now a positive value, i.e. -   * the more harmonic the signal is the higher noise level, -   * this makes no sense so we change the sign. -   *********************************************************/ -  accu = fDivNorm(diff, meanOrig, &scale); -  scale -= 2; - -  if ( (scale>0) && (accu > ((FIXP_DBL)MAXVAL_DBL)>>scale) ) { -    *noiseLevel = (FIXP_DBL)MAXVAL_DBL; -  } -  else { -    *noiseLevel = scaleValue(accu, scale); -  } - -  /* -   * Add a noise floor offset to compensate for bias in the detector -   *****************************************************************/ -  if(!missingHarmonicFlag) -    *noiseLevel = fMult(*noiseLevel, noiseFloorOffset)<<(NOISE_FLOOR_OFFSET_SCALING); - -  /* -   * check to see that we don't exceed the maximum allowed level -   **************************************************************/ -  *noiseLevel = fixMin(*noiseLevel, ana_max_level);     /* ana_max_level is scaled with factor 0.25 */ -} - -/**************************************************************************/ -/*! -  \brief     Does the noise floor level estiamtion. -  The function calls the Noisefloor estimation function -  for the time segments decided based upon the transient -  information. The block is always divided into one or two segments. - - -  \return    none - -*/ -/**************************************************************************/ -void -FDKsbrEnc_sbrNoiseFloorEstimateQmf(HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -                         const SBR_FRAME_INFO *frame_info,   /*!< Time frequency grid of the current frame. */ -                         FIXP_DBL *noiseLevels,              /*!< Pointer to vector to store the noise levels in.*/ -                         FIXP_DBL **quotaMatrixOrig,         /*!< Matrix holding the quota values of the original. */ -                         SCHAR    *indexVector,              /*!< Index vector to obtain the patched data. */ -                         INT missingHarmonicsFlag,           /*!< Flag indicating if a strong tonal component will be missing. */ -                         INT startIndex,                     /*!< Start index. */ -                         int numberOfEstimatesPerFrame,      /*!< The number of tonality estimates per frame. */ -                         int transientFrame,                 /*!< A flag indicating if a transient is present. */ -                         INVF_MODE* pInvFiltLevels,          /*!< Pointer to the vector holding the inverse filtering levels. */ -                         UINT sbrSyntaxFlags -                         ) - -{ - -  INT nNoiseEnvelopes, startPos[2], stopPos[2], env, band; - -  INT noNoiseBands      = h_sbrNoiseFloorEstimate->noNoiseBands; -  INT *freqBandTable    = h_sbrNoiseFloorEstimate->freqBandTableQmf; - -  nNoiseEnvelopes = frame_info->nNoiseEnvelopes; - -  if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { -    nNoiseEnvelopes = 1; -    startPos[0] = startIndex; -    stopPos[0]  = startIndex + min(numberOfEstimatesPerFrame,2); -  } else -  if(nNoiseEnvelopes == 1){ -    startPos[0] = startIndex; -    stopPos[0]  = startIndex + 2; -  } -  else{ -    startPos[0] = startIndex; -    stopPos[0]  = startIndex + 1; -    startPos[1] = startIndex + 1; -    stopPos[1]  = startIndex + 2; -  } - -  /* -   * Estimate the noise floor. -   **************************************/ -  for(env = 0; env < nNoiseEnvelopes; env++){ -    for(band = 0; band < noNoiseBands; band++){ -      FDK_ASSERT( (band + env*noNoiseBands) < MAX_NUM_NOISE_VALUES); -      qmfBasedNoiseFloorDetection(&noiseLevels[band + env*noNoiseBands], -                                  quotaMatrixOrig, -                                  indexVector, -                                  startPos[env], -                                  stopPos[env], -                                  freqBandTable[band], -                                  freqBandTable[band+1], -                                  h_sbrNoiseFloorEstimate->ana_max_level, -                                  h_sbrNoiseFloorEstimate->noiseFloorOffset[band], -                                  missingHarmonicsFlag, -                                  h_sbrNoiseFloorEstimate->weightFac, -                                  h_sbrNoiseFloorEstimate->diffThres, -                                  pInvFiltLevels[band]); -    } -  } - - -  /* -   * Smoothing of the values. -   **************************/ -  smoothingOfNoiseLevels(noiseLevels, -                         nNoiseEnvelopes, -                         h_sbrNoiseFloorEstimate->noNoiseBands, -                         h_sbrNoiseFloorEstimate->prevNoiseLevels, -                         h_sbrNoiseFloorEstimate->smoothFilter, -                         transientFrame); - - -  /* quantisation*/ -  for(env = 0; env < nNoiseEnvelopes; env++){ -    for(band = 0; band < noNoiseBands; band++){ -      FDK_ASSERT( (band + env*noNoiseBands) < MAX_NUM_NOISE_VALUES); -      noiseLevels[band + env*noNoiseBands] = -         (FIXP_DBL)NOISE_FLOOR_OFFSET_64 - (FIXP_DBL)CalcLdData(noiseLevels[band + env*noNoiseBands]+(FIXP_DBL)1) + QuantOffset; -    } -  } -} - -/**************************************************************************/ -/*! -  \brief - - -  \return    errorCode, noError if successful - -*/ -/**************************************************************************/ -static INT -downSampleLoRes(INT *v_result,              /*!<    */ -                INT num_result,             /*!<    */ -                const UCHAR *freqBandTableRef,/*!<    */ -                INT num_Ref)                /*!<    */ -{ -  INT step; -  INT i,j; -  INT org_length,result_length; -  INT v_index[MAX_FREQ_COEFFS/2]; - -  /* init */ -  org_length=num_Ref; -  result_length=num_result; - -  v_index[0]=0;	/* Always use left border */ -  i=0; -  while(org_length > 0)	/* Create downsample vector */ -    { -      i++; -      step=org_length/result_length; /* floor; */ -      org_length=org_length - step; -      result_length--; -      v_index[i]=v_index[i-1]+step; -    } - -  if(i != num_result )	/* Should never happen */ -    return (1);/* error downsampling */ - -  for(j=0;j<=i;j++)	/* Use downsample vector to index LoResolution vector. */ -    { -      v_result[j]=freqBandTableRef[v_index[j]]; -    } - -  return (0); -} - -/**************************************************************************/ -/*! -  \brief    Initialize an instance of the noise floor level estimation module. - - -  \return    errorCode, noError if successful - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_InitSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE  h_sbrNoiseFloorEstimate,   /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -                             INT ana_max_level,                       /*!< Maximum level of the adaptive noise. */ -                             const UCHAR *freqBandTable,      /*!< Frequany band table. */ -                             INT nSfb,                                /*!< Number of frequency bands. */ -                             INT noiseBands,                          /*!< Number of noise bands per octave. */ -                             INT noiseFloorOffset,                    /*!< Noise floor offset. */ -                             INT timeSlots,                           /*!< Number of time slots in a frame. */ -                             UINT useSpeechConfig             /*!< Flag: adapt tuning parameters according to speech */ -                            ) -{ -  INT i, qexp, qtmp; -  FIXP_DBL tmp, exp; - -  FDKmemclear(h_sbrNoiseFloorEstimate,sizeof(SBR_NOISE_FLOOR_ESTIMATE)); - -  h_sbrNoiseFloorEstimate->smoothFilter = smoothFilter; -  if (useSpeechConfig) { -    h_sbrNoiseFloorEstimate->weightFac = (FIXP_DBL)MAXVAL_DBL; -    h_sbrNoiseFloorEstimate->diffThres = INVF_LOW_LEVEL; -  } -  else { -    h_sbrNoiseFloorEstimate->weightFac = FL2FXCONST_DBL(0.25f); -    h_sbrNoiseFloorEstimate->diffThres = INVF_MID_LEVEL; -  } - -  h_sbrNoiseFloorEstimate->timeSlots     = timeSlots; -  h_sbrNoiseFloorEstimate->noiseBands    = noiseBands; - -  /* h_sbrNoiseFloorEstimate->ana_max_level is scaled by 0.25  */ -  switch(ana_max_level) -  { -  case 6: -      h_sbrNoiseFloorEstimate->ana_max_level = (FIXP_DBL)MAXVAL_DBL; -      break; -  case 3: -      h_sbrNoiseFloorEstimate->ana_max_level = FL2FXCONST_DBL(0.5); -      break; -  case -3: -      h_sbrNoiseFloorEstimate->ana_max_level = FL2FXCONST_DBL(0.125); -      break; -  default: -      /* Should not enter here */ -      h_sbrNoiseFloorEstimate->ana_max_level = (FIXP_DBL)MAXVAL_DBL; -      break; -  } - -  /* -    calculate number of noise bands and allocate -  */ -  if(FDKsbrEnc_resetSbrNoiseFloorEstimate(h_sbrNoiseFloorEstimate,freqBandTable,nSfb)) -    return(1); - -  if(noiseFloorOffset == 0) { -    tmp = ((FIXP_DBL)MAXVAL_DBL)>>NOISE_FLOOR_OFFSET_SCALING; -  } -  else { -    /* noiseFloorOffset has to be smaller than 12, because -       the result of the calculation below must be smaller than 1: -       (2^(noiseFloorOffset/3))*2^4<1                                        */ -    FDK_ASSERT(noiseFloorOffset<12); - -    /* Assumes the noise floor offset in tuning table are in q31    */ -    /* Change the qformat here when non-zero values would be filled */ -    exp = fDivNorm((FIXP_DBL)noiseFloorOffset, 3, &qexp); -    tmp = fPow(2, DFRACT_BITS-1, exp, qexp, &qtmp); -    tmp = scaleValue(tmp, qtmp-NOISE_FLOOR_OFFSET_SCALING); -  } - -  for(i=0;i<h_sbrNoiseFloorEstimate->noNoiseBands;i++) { -    h_sbrNoiseFloorEstimate->noiseFloorOffset[i] = tmp; -  } - -  return (0); -} - -/**************************************************************************/ -/*! -  \brief     Resets the current instance of the noise floor estiamtion -          module. - - -  \return    errorCode, noError if successful - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_resetSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -                            const UCHAR *freqBandTable,             /*!< Frequany band table. */ -                            INT nSfb)                             /*!< Number of bands in the frequency band table. */ -{ -    INT k2,kx; - -    /* -    * Calculate number of noise bands -    ***********************************/ -    k2=freqBandTable[nSfb]; -    kx=freqBandTable[0]; -    if(h_sbrNoiseFloorEstimate->noiseBands == 0){ -        h_sbrNoiseFloorEstimate->noNoiseBands = 1; -    } -    else{ -        /* -        * Calculate number of noise bands 1,2 or 3 bands/octave -        ********************************************************/ -        FIXP_DBL tmp, ratio, lg2; -        INT ratio_e, qlg2, nNoiseBands; - -        ratio = fDivNorm(k2, kx, &ratio_e); -        lg2 = fLog2(ratio, ratio_e, &qlg2); -        tmp = fMult((FIXP_DBL)(h_sbrNoiseFloorEstimate->noiseBands<<24), lg2); -        tmp = scaleValue(tmp, qlg2-23); - -        nNoiseBands = (INT)((tmp + (FIXP_DBL)1) >> 1); - - -        if (nNoiseBands > MAX_NUM_NOISE_COEFFS ) { -          nNoiseBands = MAX_NUM_NOISE_COEFFS; -        } - -        if( nNoiseBands == 0 ) { -          nNoiseBands = 1; -        } - -        h_sbrNoiseFloorEstimate->noNoiseBands = nNoiseBands; - -    } - - -    return(downSampleLoRes(h_sbrNoiseFloorEstimate->freqBandTableQmf, -        h_sbrNoiseFloorEstimate->noNoiseBands, -        freqBandTable,nSfb)); -} - -/**************************************************************************/ -/*! -  \brief     Deletes the current instancce of the noise floor level -  estimation module. - - -  \return    none - -*/ -/**************************************************************************/ -void -FDKsbrEnc_deleteSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate)  /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -{ - -  if (h_sbrNoiseFloorEstimate) { -    /* -      nothing to do -    */ -  } -} diff --git a/libSBRenc/src/nf_est.h b/libSBRenc/src/nf_est.h deleted file mode 100644 index d407274..0000000 --- a/libSBRenc/src/nf_est.h +++ /dev/null @@ -1,147 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Noise floor estimation structs and prototypes   -*/ - -#ifndef __NF_EST_H -#define __NF_EST_H - -#include "sbr_encoder.h" -#include "fram_gen.h" - -#define NF_SMOOTHING_LENGTH 4                   /*!< Smoothing length of the noise floors. */ - -typedef struct -{ -  FIXP_DBL prevNoiseLevels[NF_SMOOTHING_LENGTH][MAX_NUM_NOISE_VALUES]; /*!< The previous noise levels. */ -  FIXP_DBL noiseFloorOffset[MAX_NUM_NOISE_VALUES];   /*!< Noise floor offset, scaled with NOISE_FLOOR_OFFSET_SCALING */ -  const FIXP_DBL *smoothFilter;                      /*!< Smoothing filter to use. */ -  FIXP_DBL ana_max_level;                            /*!< Max level allowed.   */ -  FIXP_DBL weightFac;                                /*!< Weightening factor for the difference between orig and sbr. */ -  INT freqBandTableQmf[MAX_NUM_NOISE_VALUES + 1]; /*!< Frequncy band table for the noise floor bands.*/ -  INT noNoiseBands;                               /*!< Number of noisebands. */ -  INT noiseBands;                                 /*!< NoiseBands switch 4 bit.*/ -  INT timeSlots;                                  /*!< Number of timeslots in a frame. */ -  INVF_MODE diffThres;                            /*!< Threshold value to control the inverse filtering decision */ -} -SBR_NOISE_FLOOR_ESTIMATE; - -typedef SBR_NOISE_FLOOR_ESTIMATE *HANDLE_SBR_NOISE_FLOOR_ESTIMATE; - -void -FDKsbrEnc_sbrNoiseFloorEstimateQmf(HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -                         const SBR_FRAME_INFO *frame_info,   /*!< Time frequency grid of the current frame. */ -                         FIXP_DBL *noiseLevels,              /*!< Pointer to vector to store the noise levels in.*/ -                         FIXP_DBL **quotaMatrixOrig,         /*!< Matrix holding the quota values of the original. */ -                         SCHAR* indexVector,                 /*!< Index vector to obtain the patched data. */ -                         INT missingHarmonicsFlag,           /*!< Flag indicating if a strong tonal component will be missing. */ -                         INT startIndex,                     /*!< Start index. */ -                         int numberOfEstimatesPerFrame,      /*!< The number of tonality estimates per frame. */ -                         INT transientFrame,                 /*!< A flag indicating if a transient is present. */ -                         INVF_MODE* pInvFiltLevels,          /*!< Pointer to the vector holding the inverse filtering levels. */ -                         UINT sbrSyntaxFlags -                         ); - -INT -FDKsbrEnc_InitSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE  h_sbrNoiseFloorEstimate,   /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -                             INT ana_max_level,                       /*!< Maximum level of the adaptive noise. */ -                             const UCHAR *freqBandTable,      /*!< Frequany band table. */ -                             INT nSfb,                                /*!< Number of frequency bands. */ -                             INT noiseBands,                          /*!< Number of noise bands per octave. */ -                             INT noiseFloorOffset,                    /*!< Noise floor offset. */ -                             INT timeSlots,                           /*!< Number of time slots in a frame. */ -                             UINT useSpeechConfig             /*!< Flag: adapt tuning parameters according to speech */ -                             ); - -INT -FDKsbrEnc_resetSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ -                            const UCHAR *freqBandTable,   /*!< Frequany band table. */ -                            INT nSfb);                            /*!< Number of bands in the frequency band table. */ - -void -FDKsbrEnc_deleteSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate); /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ - -#endif diff --git a/libSBRenc/src/ps_bitenc.cpp b/libSBRenc/src/ps_bitenc.cpp deleted file mode 100644 index 8a42a20..0000000 --- a/libSBRenc/src/ps_bitenc.cpp +++ /dev/null @@ -1,696 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial author:       N. Rettelbach -   contents/description: Parametric Stereo bitstream encoder - -******************************************************************************/ - -#include "ps_main.h" - - -#include "ps_const.h" -#include "ps_bitenc.h" - -static -inline UCHAR FDKsbrEnc_WriteBits_ps(HANDLE_FDK_BITSTREAM hBitStream, UINT value, -                                    const UINT numberOfBits) -{ -  /* hBitStream == NULL happens here intentionally */ -  if(hBitStream!=NULL){ -    FDKwriteBits(hBitStream, value, numberOfBits); -  } -  return numberOfBits; -} - -#define SI_SBR_EXTENSION_SIZE_BITS              4 -#define SI_SBR_EXTENSION_ESC_COUNT_BITS         8 -#define SI_SBR_EXTENSION_ID_BITS                2 -#define EXTENSION_ID_PS_CODING                  2 -#define PS_EXT_ID_V0                            0 - -static const INT iidDeltaCoarse_Offset = 14; -static const INT iidDeltaCoarse_MaxVal = 28; -static const INT iidDeltaFine_Offset = 30; -static const INT iidDeltaFine_MaxVal = 60; - -/* PS Stereo Huffmantable: iidDeltaFreqCoarse */ -static const UINT iidDeltaFreqCoarse_Length[] = -{ -  17,    17,    17,    17,    16,  15,    13,    10,     9,     7, -   6,     5,     4,     3,     1,   3,     4,     5,     6,     6, -   8,    11,    13,    14,    14,  15,    17,    18,    18 -}; -static const UINT iidDeltaFreqCoarse_Code[]  = -{ -  0x0001fffb,  0x0001fffc,  0x0001fffd,  0x0001fffa,  0x0000fffc,  0x00007ffc,  0x00001ffd,  0x000003fe,  0x000001fe,  0x0000007e, -  0x0000003c,  0x0000001d,  0x0000000d,  0x00000005,  0000000000,  0x00000004,  0x0000000c,  0x0000001c,  0x0000003d,  0x0000003e, -  0x000000fe,  0x000007fe,  0x00001ffc,  0x00003ffc,  0x00003ffd,  0x00007ffd,  0x0001fffe,  0x0003fffe,  0x0003ffff -}; - -/* PS Stereo Huffmantable: iidDeltaFreqFine */ -static const UINT iidDeltaFreqFine_Length[] = -{ -  18,    18,    18,    18,    18,  18,    18,    18,    18,    17, -  18,    17,    17,    16,    16,  15,    14,    14,    13,    12, -  12,    11,    10,    10,     8,   7,     6,     5,     4,     3, -   1,     3,     4,     5,     6,   7,     8,     9,    10,    11, -  11,    12,    13,    14,    14,  15,    16,    16,    17,    17, -  18,    17,    18,    18,    18,  18,    18,    18,    18,    18, -  18 -}; -static const UINT iidDeltaFreqFine_Code[] = -{ -  0x0001feb4,  0x0001feb5,  0x0001fd76,  0x0001fd77,  0x0001fd74,  0x0001fd75,  0x0001fe8a,  0x0001fe8b,  0x0001fe88,  0x0000fe80, -  0x0001feb6,  0x0000fe82,  0x0000feb8,  0x00007f42,  0x00007fae,  0x00003faf,  0x00001fd1,  0x00001fe9,  0x00000fe9,  0x000007ea, -  0x000007fb,  0x000003fb,  0x000001fb,  0x000001ff,  0x0000007c,  0x0000003c,  0x0000001c,  0x0000000c,  0000000000,  0x00000001, -  0x00000001,  0x00000002,  0x00000001,  0x0000000d,  0x0000001d,  0x0000003d,  0x0000007d,  0x000000fc,  0x000001fc,  0x000003fc, -  0x000003f4,  0x000007eb,  0x00000fea,  0x00001fea,  0x00001fd6,  0x00003fd0,  0x00007faf,  0x00007f43,  0x0000feb9,  0x0000fe83, -  0x0001feb7,  0x0000fe81,  0x0001fe89,  0x0001fe8e,  0x0001fe8f,  0x0001fe8c,  0x0001fe8d,  0x0001feb2,  0x0001feb3,  0x0001feb0, -  0x0001feb1 -}; - -/* PS Stereo Huffmantable: iidDeltaTimeCoarse */ -static const UINT iidDeltaTimeCoarse_Length[] = -{ -  19,    19,    19,    20,    20,  20,    17,    15,    12,    10, -   8,     6,     4,     2,     1,   3,     5,     7,     9,    11, -  13,    14,    17,    19,    20,  20,    20,    20,    20 -}; -static const UINT iidDeltaTimeCoarse_Code[] = -{ -  0x0007fff9,  0x0007fffa,  0x0007fffb,  0x000ffff8,  0x000ffff9,  0x000ffffa,  0x0001fffd,  0x00007ffe,  0x00000ffe,  0x000003fe, -  0x000000fe,  0x0000003e,  0x0000000e,  0x00000002,  0000000000,  0x00000006,  0x0000001e,  0x0000007e,  0x000001fe,  0x000007fe, -  0x00001ffe,  0x00003ffe,  0x0001fffc,  0x0007fff8,  0x000ffffb,  0x000ffffc,  0x000ffffd,  0x000ffffe,  0x000fffff -}; - -/* PS Stereo Huffmantable: iidDeltaTimeFine */ -static const UINT iidDeltaTimeFine_Length[] = -{ -  16,    16,    16,    16,    16,  16,    16,    16,    16,    15, -  15,    15,    15,    15,    15,  14,    14,    13,    13,    13, -  12,    12,    11,    10,     9,   9,     7,     6,     5,     3, -   1,     2,     5,     6,     7,   8,     9,    10,    11,    11, -  12,    12,    13,    13,    14,  14,    15,    15,    15,    15, -  16,    16,    16,    16,    16,  16,    16,    16,    16,    16, -  16 -}; -static const UINT iidDeltaTimeFine_Code[] = -{ -  0x00004ed4,  0x00004ed5,  0x00004ece,  0x00004ecf,  0x00004ecc,  0x00004ed6,  0x00004ed8,  0x00004f46,  0x00004f60,  0x00002718, -  0x00002719,  0x00002764,  0x00002765,  0x0000276d,  0x000027b1,  0x000013b7,  0x000013d6,  0x000009c7,  0x000009e9,  0x000009ed, -  0x000004ee,  0x000004f7,  0x00000278,  0x00000139,  0x0000009a,  0x0000009f,  0x00000020,  0x00000011,  0x0000000a,  0x00000003, -  0x00000001,  0000000000,  0x0000000b,  0x00000012,  0x00000021,  0x0000004c,  0x0000009b,  0x0000013a,  0x00000279,  0x00000270, -  0x000004ef,  0x000004e2,  0x000009ea,  0x000009d8,  0x000013d7,  0x000013d0,  0x000027b2,  0x000027a2,  0x0000271a,  0x0000271b, -  0x00004f66,  0x00004f67,  0x00004f61,  0x00004f47,  0x00004ed9,  0x00004ed7,  0x00004ecd,  0x00004ed2,  0x00004ed3,  0x00004ed0, -  0x00004ed1 -}; - -static const INT iccDelta_Offset =  7; -static const INT iccDelta_MaxVal = 14; -/* PS Stereo Huffmantable: iccDeltaFreq */ -static const UINT iccDeltaFreq_Length[] = -{ -  14,    14,    12,    10,     7,   5,     3,     1,     2,     4, -   6,     8,     9,    11,    13 -}; -static const UINT iccDeltaFreq_Code[] = -{ -  0x00003fff,  0x00003ffe,  0x00000ffe,  0x000003fe,  0x0000007e,  0x0000001e,  0x00000006,  0000000000,  0x00000002,  0x0000000e, -  0x0000003e,  0x000000fe,  0x000001fe,  0x000007fe,  0x00001ffe -}; - -/* PS Stereo Huffmantable: iccDeltaTime */ -static const UINT iccDeltaTime_Length[] = -{ -  14,    13,    11,     9,     7,   5,     3,     1,     2,     4, -   6,     8,    10,    12,    14 -}; -static const UINT iccDeltaTime_Code[] = -{ -  0x00003ffe,  0x00001ffe,  0x000007fe,  0x000001fe,  0x0000007e,  0x0000001e,  0x00000006,  0000000000,  0x00000002,  0x0000000e, -  0x0000003e,  0x000000fe,  0x000003fe,  0x00000ffe,  0x00003fff -}; - - - -static const INT ipdDelta_Offset = 0; -static const INT ipdDelta_MaxVal = 7; -/* PS Stereo Huffmantable: ipdDeltaFreq */ -static const UINT ipdDeltaFreq_Length[] = -{ -   1,     3,     4,     4,     4,   4,     4,     4 -}; -static const UINT ipdDeltaFreq_Code[] = -{ -  0x00000001,  0000000000,  0x00000006,  0x00000004,  0x00000002,  0x00000003,  0x00000005,  0x00000007 -}; - -/* PS Stereo Huffmantable: ipdDeltaTime */ -static const UINT ipdDeltaTime_Length[] = -{ -   1,     3,     4,     5,     5,   4,     4,     3 -}; -static const UINT ipdDeltaTime_Code[] = -{ -  0x00000001,  0x00000002,  0x00000002,  0x00000003,  0x00000002,  0000000000,  0x00000003,  0x00000003 -}; - - -static const INT opdDelta_Offset = 0; -static const INT opdDelta_MaxVal = 7; -/* PS Stereo Huffmantable: opdDeltaFreq */ -static const UINT opdDeltaFreq_Length[] = -{ -   1,     3,     4,     4,     5,   5,     4,     3 -}; -static const UINT opdDeltaFreq_Code[] = -{ -  0x00000001,  0x00000001,  0x00000006,  0x00000004,  0x0000000f,  0x0000000e,  0x00000005,  0000000000, -}; - -/* PS Stereo Huffmantable: opdDeltaTime */ -static const UINT opdDeltaTime_Length[] = -{ -   1,     3,     4,     5,     5,   4,     4,     3 -}; -static const UINT opdDeltaTime_Code[] = -{ -  0x00000001,  0x00000002,  0x00000001,  0x00000007,  0x00000006,  0000000000,  0x00000002,  0x00000003 -}; - -static const INT psBands[] = -{ -  PS_BANDS_COARSE, -  PS_BANDS_MID -}; - -static INT getNoBands(UINT mode) -{ -  if(mode>=6) -    return 0; - -  if(mode>=3) -    mode = mode-3; - -  return psBands[mode]; -} - -static INT getIIDRes(INT iidMode) -{ -  if(iidMode<3) -    return PS_IID_RES_COARSE; -  else -    return PS_IID_RES_FINE; -} - -static INT -encodeDeltaFreq(HANDLE_FDK_BITSTREAM hBitBuf, -                const INT          *val, -                const INT           nBands, -                const UINT *codeTable, -                const UINT *lengthTable, -                const INT           tableOffset, -                const INT           maxVal, -                INT                *error) -{ -  INT bitCnt = 0; -  INT lastVal = 0; -  INT band; - -  for(band=0;band<nBands;band++) { -    INT delta = (val[band] - lastVal) + tableOffset; -    lastVal = val[band]; -    if( (delta>maxVal) || (delta<0) ) { -      *error = 1; -      delta = delta>0?maxVal:0; -    } -    bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, codeTable[delta], lengthTable[delta]); -  } - -  return bitCnt; -} - -static INT -encodeDeltaTime(HANDLE_FDK_BITSTREAM hBitBuf, -                const INT          *val, -                const INT          *valLast, -                const INT           nBands, -                const UINT *codeTable, -                const UINT *lengthTable, -                const INT           tableOffset, -                const INT           maxVal, -                INT                *error) -{ -  INT bitCnt = 0; -  INT band; - -  for(band=0;band<nBands;band++) { -    INT delta = (val[band] - valLast[band]) + tableOffset; -    if( (delta>maxVal) || (delta<0) ) { -      *error = 1; -      delta = delta>0?maxVal:0; -    } -    bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, codeTable[delta], lengthTable[delta]); -  } - -  return bitCnt; -} - -INT FDKsbrEnc_EncodeIid(HANDLE_FDK_BITSTREAM     hBitBuf, -              const INT               *iidVal, -              const INT               *iidValLast, -              const INT                nBands, -              const PS_IID_RESOLUTION  res, -              const PS_DELTA           mode, -              INT                     *error) -{ -  const UINT *codeTable; -  const UINT *lengthTable; -  INT bitCnt = 0; - -  bitCnt = 0; - -  switch(mode) { -  case PS_DELTA_FREQ: -    switch(res) { -    case PS_IID_RES_COARSE: -      codeTable   = iidDeltaFreqCoarse_Code; -      lengthTable = iidDeltaFreqCoarse_Length; -      bitCnt += encodeDeltaFreq(hBitBuf, iidVal, nBands, codeTable, -                                lengthTable, iidDeltaCoarse_Offset, -                                iidDeltaCoarse_MaxVal, error); -    break; -    case PS_IID_RES_FINE: -      codeTable   = iidDeltaFreqFine_Code; -      lengthTable = iidDeltaFreqFine_Length; -      bitCnt += encodeDeltaFreq(hBitBuf, iidVal, nBands, codeTable, -                                lengthTable, iidDeltaFine_Offset, -                                iidDeltaFine_MaxVal, error); -    break; -    default: -      *error = 1; -    } -    break; - -  case PS_DELTA_TIME: -    switch(res) { -    case PS_IID_RES_COARSE: -      codeTable   = iidDeltaTimeCoarse_Code; -      lengthTable = iidDeltaTimeCoarse_Length; -      bitCnt += encodeDeltaTime(hBitBuf, iidVal, iidValLast, nBands, codeTable, -                                lengthTable, iidDeltaCoarse_Offset, -                                iidDeltaCoarse_MaxVal, error); -    break; -    case PS_IID_RES_FINE: -      codeTable   = iidDeltaTimeFine_Code; -      lengthTable = iidDeltaTimeFine_Length; -      bitCnt += encodeDeltaTime(hBitBuf, iidVal, iidValLast, nBands, codeTable, -                                lengthTable, iidDeltaFine_Offset, -                                iidDeltaFine_MaxVal, error); -    break; -    default: -      *error = 1; -    } -    break; - -  default: -    *error = 1; -  } - -  return bitCnt; -} - - -INT FDKsbrEnc_EncodeIcc(HANDLE_FDK_BITSTREAM hBitBuf, -              const INT      *iccVal, -              const INT      *iccValLast, -              const INT       nBands, -              const PS_DELTA  mode, -              INT            *error) -{ -  const UINT *codeTable; -  const UINT *lengthTable; -  INT bitCnt = 0; - -  switch(mode) { -  case PS_DELTA_FREQ: -    codeTable   = iccDeltaFreq_Code; -    lengthTable = iccDeltaFreq_Length; -    bitCnt += encodeDeltaFreq(hBitBuf, iccVal, nBands, codeTable, -                              lengthTable, iccDelta_Offset, iccDelta_MaxVal, error); -    break; - -  case PS_DELTA_TIME: -    codeTable   = iccDeltaTime_Code; -    lengthTable = iccDeltaTime_Length; - -    bitCnt += encodeDeltaTime(hBitBuf, iccVal, iccValLast, nBands, codeTable, -                              lengthTable, iccDelta_Offset, iccDelta_MaxVal, error); -    break; - -  default: -    *error = 1; -  } - -  return bitCnt; -} - -INT FDKsbrEnc_EncodeIpd(HANDLE_FDK_BITSTREAM hBitBuf, -              const INT      *ipdVal, -              const INT      *ipdValLast, -              const INT       nBands, -              const PS_DELTA  mode, -              INT            *error) -{ -  const UINT *codeTable; -  const UINT *lengthTable; -  INT bitCnt = 0; - -  switch(mode) { -  case PS_DELTA_FREQ: -    codeTable   = ipdDeltaFreq_Code; -    lengthTable = ipdDeltaFreq_Length; -    bitCnt += encodeDeltaFreq(hBitBuf, ipdVal, nBands, codeTable, -                              lengthTable, ipdDelta_Offset, ipdDelta_MaxVal, error); -    break; - -  case PS_DELTA_TIME: -    codeTable   = ipdDeltaTime_Code; -    lengthTable = ipdDeltaTime_Length; - -    bitCnt += encodeDeltaTime(hBitBuf, ipdVal, ipdValLast, nBands, codeTable, -                              lengthTable, ipdDelta_Offset, ipdDelta_MaxVal, error); -    break; - -  default: -    *error = 1; -  } - -  return bitCnt; -} - -INT FDKsbrEnc_EncodeOpd(HANDLE_FDK_BITSTREAM hBitBuf, -              const INT      *opdVal, -              const INT      *opdValLast, -              const INT       nBands, -              const PS_DELTA  mode, -              INT            *error) -{ -  const UINT *codeTable; -  const UINT *lengthTable; -  INT bitCnt = 0; - -  switch(mode) { -  case PS_DELTA_FREQ: -    codeTable   = opdDeltaFreq_Code; -    lengthTable = opdDeltaFreq_Length; -    bitCnt += encodeDeltaFreq(hBitBuf, opdVal, nBands, codeTable, -                              lengthTable, opdDelta_Offset, opdDelta_MaxVal, error); -    break; - -  case PS_DELTA_TIME: -    codeTable   = opdDeltaTime_Code; -    lengthTable = opdDeltaTime_Length; - -    bitCnt += encodeDeltaTime(hBitBuf, opdVal, opdValLast, nBands, codeTable, -                              lengthTable, opdDelta_Offset, opdDelta_MaxVal, error); -    break; - -  default: -    *error = 1; -  } - -  return bitCnt; -} - -static INT encodeIpdOpd(HANDLE_PS_OUT        psOut, -                        HANDLE_FDK_BITSTREAM hBitBuf ) -{ -  INT bitCnt = 0; -  INT error  = 0; -  INT env; - -  FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->enableIpdOpd, 1); - -  if(psOut->enableIpdOpd==1) { -    INT *ipdLast = psOut->ipdLast; -    INT *opdLast = psOut->opdLast; - -    for(env=0; env<psOut->nEnvelopes; env++) { -      bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaIPD[env], 1); -      bitCnt += FDKsbrEnc_EncodeIpd( hBitBuf, -                           psOut->ipd[env], -                           ipdLast, -                           getNoBands((UINT)psOut->iidMode), -                           psOut->deltaIPD[env], -                           &error); - -      bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaOPD[env], 1); -      bitCnt += FDKsbrEnc_EncodeOpd( hBitBuf, -                           psOut->opd[env], -                           opdLast, -                           getNoBands((UINT)psOut->iidMode), -                           psOut->deltaOPD[env], -                           &error ); -    } -    /* reserved bit */ -    bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, 0, 1); -  } - - -  return bitCnt; -} - -static INT getEnvIdx(const INT nEnvelopes, const INT frameClass) -{ -  INT envIdx = 0; - -  switch(nEnvelopes) { -  case 0: -    envIdx = 0; -    break; - -  case 1: -    if (frameClass==0) -      envIdx = 1; -    else -      envIdx = 0; -    break; - -  case 2: -    if (frameClass==0) -      envIdx = 2; -    else -      envIdx = 1; -    break; - -  case 3: -    envIdx = 2; -    break; - -  case 4: -    envIdx = 3; -    break; - -  default: -    /* unsupported number of envelopes */ -    envIdx = 0; -  } - -  return envIdx; -} - - -static INT encodePSExtension(const HANDLE_PS_OUT   psOut, -                             HANDLE_FDK_BITSTREAM  hBitBuf ) -{ -  INT bitCnt = 0; - -  if(psOut->enableIpdOpd==1) { -    INT ipdOpdBits = 0; -    INT extSize = (2 + encodeIpdOpd(psOut,NULL)+7)>>3; - -    if(extSize<15) { -      bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf,  extSize, 4); -    } -    else { -      bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf,          15 , 4); -      bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, (extSize-15), 8); -    } - -    /* write ipd opd data */ -    ipdOpdBits += FDKsbrEnc_WriteBits_ps(hBitBuf, PS_EXT_ID_V0, 2); -    ipdOpdBits += encodeIpdOpd(psOut, hBitBuf ); - -    /* byte align the ipd opd data  */ -    if(ipdOpdBits%8) -      ipdOpdBits += FDKsbrEnc_WriteBits_ps(hBitBuf, 0, (8-(ipdOpdBits%8)) ); - -    bitCnt += ipdOpdBits; -  } - -  return (bitCnt); -} - -INT FDKsbrEnc_WritePSBitstream(const HANDLE_PS_OUT   psOut, -                               HANDLE_FDK_BITSTREAM  hBitBuf ) -{ -  INT psExtEnable = 0; -  INT bitCnt = 0; -  INT error = 0; -  INT env; - -  if(psOut != NULL){ - -    /* PS HEADER */ -    bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->enablePSHeader, 1); - -    if(psOut->enablePSHeader) { - -      bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->enableIID, 1); -      if(psOut->enableIID) { -        bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->iidMode, 3); -      } -      bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->enableICC, 1); -      if(psOut->enableICC) { -        bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->iccMode, 3); -      } -      if(psOut->enableIpdOpd) { -        psExtEnable = 1; -      } -      bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psExtEnable, 1); -    } - -    /* Frame class, number of envelopes */ -    bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->frameClass, 1); -    bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, getEnvIdx(psOut->nEnvelopes, psOut->frameClass), 2); - -    if(psOut->frameClass==1) { -      for(env=0; env<psOut->nEnvelopes; env++) { -        bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->frameBorder[env], 5); -      } -    } - -    if(psOut->enableIID==1) { -      INT *iidLast = psOut->iidLast; -      for(env=0; env<psOut->nEnvelopes; env++) { -        bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaIID[env], 1); -        bitCnt += FDKsbrEnc_EncodeIid( hBitBuf, -                             psOut->iid[env], -                             iidLast, -                             getNoBands((UINT)psOut->iidMode), -                             (PS_IID_RESOLUTION)getIIDRes(psOut->iidMode), -                             psOut->deltaIID[env], -                             &error ); - -        iidLast = psOut->iid[env]; -      } -    } - -    if(psOut->enableICC==1) { -      INT *iccLast = psOut->iccLast; -      for(env=0; env<psOut->nEnvelopes; env++) { -        bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaICC[env], 1); -        bitCnt += FDKsbrEnc_EncodeIcc( hBitBuf, -                             psOut->icc[env], -                             iccLast, -                             getNoBands((UINT)psOut->iccMode), -                             psOut->deltaICC[env], -                             &error); - -        iccLast = psOut->icc[env]; -      } -    } - -    if(psExtEnable!=0) { -      bitCnt += encodePSExtension(psOut, hBitBuf); -    } - -  } /* if(psOut != NULL) */ - -  return bitCnt; -} - diff --git a/libSBRenc/src/ps_bitenc.h b/libSBRenc/src/ps_bitenc.h deleted file mode 100644 index e98fe58..0000000 --- a/libSBRenc/src/ps_bitenc.h +++ /dev/null @@ -1,177 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial author:       N. Rettelbach -   contents/description: Parametric Stereo bitstream encoder - -******************************************************************************/ - -#include "ps_main.h" -#include "ps_const.h" -#include "FDK_bitstream.h" - -#ifndef PS_BITENC_H -#define PS_BITENC_H - -typedef struct T_PS_OUT { - -  INT         enablePSHeader; -  INT         enableIID; -  INT         iidMode; -  INT         enableICC; -  INT         iccMode; -  INT         enableIpdOpd; - -  INT         frameClass; -  INT         nEnvelopes; -  /* ENV data */ -  INT         frameBorder[PS_MAX_ENVELOPES]; - -  /* iid data  */ -  PS_DELTA    deltaIID[PS_MAX_ENVELOPES]; -  INT         iid[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT         iidLast[PS_MAX_BANDS]; - -  /* icc data  */ -  PS_DELTA    deltaICC[PS_MAX_ENVELOPES]; -  INT         icc[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT         iccLast[PS_MAX_BANDS]; - -  /* ipd data  */ -  PS_DELTA    deltaIPD[PS_MAX_ENVELOPES]; -  INT         ipd[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT         ipdLast[PS_MAX_BANDS]; - -  /* opd data  */ -  PS_DELTA    deltaOPD[PS_MAX_ENVELOPES]; -  INT         opd[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT         opdLast[PS_MAX_BANDS]; - -} PS_OUT, *HANDLE_PS_OUT; - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -INT FDKsbrEnc_EncodeIid(HANDLE_FDK_BITSTREAM  hBitBuf, -                        const INT      *iidVal, -                        const INT      *iidValLast, -                        const INT       nBands, -                        const PS_IID_RESOLUTION res, -                        const PS_DELTA  mode, -                        INT            *error); - -INT FDKsbrEnc_EncodeIcc(HANDLE_FDK_BITSTREAM  hBitBuf, -                        const INT      *iccVal, -                        const INT      *iccValLast, -                        const INT       nBands, -                        const PS_DELTA  mode, -                        INT            *error); - -INT FDKsbrEnc_EncodeIpd(HANDLE_FDK_BITSTREAM  hBitBuf, -                        const INT      *ipdVal, -                        const INT      *ipdValLast, -                        const INT       nBands, -                        const PS_DELTA  mode, -                        INT            *error); - -INT FDKsbrEnc_EncodeOpd(HANDLE_FDK_BITSTREAM  hBitBuf, -                        const INT      *opdVal, -                        const INT      *opdValLast, -                        const INT       nBands, -                        const PS_DELTA  mode, -                        INT            *error); - -INT FDKsbrEnc_WritePSBitstream(const HANDLE_PS_OUT   psOut, -                               HANDLE_FDK_BITSTREAM  hBitBuf); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif  /* #ifndef PS_BITENC_H */ diff --git a/libSBRenc/src/ps_const.h b/libSBRenc/src/ps_const.h deleted file mode 100644 index 633d210..0000000 --- a/libSBRenc/src/ps_const.h +++ /dev/null @@ -1,148 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial author:       N. Rettelbach -   contents/description: Parametric Stereo constants - -******************************************************************************/ - -#ifndef PS_CONST_H -#define PS_CONST_H - -#define MAX_PS_CHANNELS          (  2 ) -#define HYBRID_MAX_QMF_BANDS     (  3 ) -#define HYBRID_FILTER_LENGTH     ( 13 ) -#define HYBRID_FILTER_DELAY      ( (HYBRID_FILTER_LENGTH-1)/2 ) - -#define  HYBRID_FRAMESIZE        ( QMF_MAX_TIME_SLOTS ) -#define  HYBRID_READ_OFFSET      ( 10 ) - -#define MAX_HYBRID_BANDS         ( (QMF_CHANNELS-HYBRID_MAX_QMF_BANDS+10) ) - - -typedef enum { -  PS_RES_COARSE  = 0, -  PS_RES_MID     = 1, -  PS_RES_FINE    = 2 -} PS_RESOLUTION; - -typedef enum { -  PS_BANDS_COARSE  = 10, -  PS_BANDS_MID     = 20, -  PS_MAX_BANDS     = PS_BANDS_MID -} PS_BANDS; - -typedef enum { -  PS_IID_RES_COARSE=0, -  PS_IID_RES_FINE -} PS_IID_RESOLUTION; - -typedef enum { -  PS_ICC_ROT_A=0, -  PS_ICC_ROT_B -} PS_ICC_ROTATION_MODE; - -typedef enum { -  PS_DELTA_FREQ, -  PS_DELTA_TIME -} PS_DELTA; - - -typedef enum { -  PS_MAX_ENVELOPES = 4 - -} PS_CONSTS; - -typedef enum { -    PSENC_OK                    = 0x0000,   /*!< No error happened. All fine. */ -    PSENC_INVALID_HANDLE        = 0x0020,   /*!< Handle passed to function call was invalid. */ -    PSENC_MEMORY_ERROR          = 0x0021,   /*!< Memory allocation failed. */ -    PSENC_INIT_ERROR            = 0x0040,   /*!< General initialization error. */ -    PSENC_ENCODE_ERROR          = 0x0060    /*!< The encoding process was interrupted by an unexpected error. */ - -} FDK_PSENC_ERROR; - - -#endif diff --git a/libSBRenc/src/ps_encode.cpp b/libSBRenc/src/ps_encode.cpp deleted file mode 100644 index 2ae2788..0000000 --- a/libSBRenc/src/ps_encode.cpp +++ /dev/null @@ -1,1054 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial Authors:      M. Neuendorf, N. Rettelbach, M. Multrus -   Contents/Description: PS parameter extraction, encoding - -******************************************************************************/ -/*! -  \file -  \brief  PS parameter extraction, encoding functions   -*/ - -#include "ps_main.h" - - -#include "sbr_ram.h" -#include "ps_encode.h" - -#include "qmf.h" - -#include "ps_const.h" -#include "sbr_misc.h" - -#include "genericStds.h" - -inline void FDKsbrEnc_addFIXP_DBL(const FIXP_DBL *X, const FIXP_DBL *Y, FIXP_DBL *Z, INT n) -{ -  for (INT i=0; i<n; i++) -    Z[i] = (X[i]>>1) + (Y[i]>>1); -} - -#define LOG10_2_10             3.01029995664f /* 10.0f*log10(2.f) */ - -static const INT iidGroupBordersLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES + 1] = -{ -  0, 1, 2, 3, 4, 5,    /* 6 subqmf subbands - 0th qmf subband */ -  6, 7,                /* 2 subqmf subbands - 1st qmf subband */ -  8, 9,                /* 2 subqmf subbands - 2nd qmf subband */ -  10, 11, 12, 13, 14, 15, 16, 18, 21, 25, 30, 42, 71 -}; - -static const UCHAR iidGroupWidthLdLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = -{ -  0, 0, 0, 0, 0, 0, -  0, 0, -  0, 0, -  0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 4, 5 -}; - - -static const INT subband2parameter20[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = -{ -  1, 0, 0, 1, 2, 3,   /* 6 subqmf subbands - 0th qmf subband */ -  4, 5,               /* 2 subqmf subbands - 1st qmf subband */ -  6, 7,               /* 2 subqmf subbands - 2nd qmf subband */ -  8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 -}; - - -typedef enum { -  MAX_TIME_DIFF_FRAMES = 20, -  MAX_PS_NOHEADER_CNT  = 10, -  MAX_NOENV_CNT        = 10, -  DO_NOT_USE_THIS_MODE = 0x7FFFFF -} __PS_CONSTANTS; - - - -static const FIXP_DBL iidQuant_fx[15] = { -  0xce000000, 0xdc000000, 0xe4000000, 0xec000000, 0xf2000000, 0xf8000000, 0xfc000000, 0x00000000, -  0x04000000, 0x08000000, 0x0e000000, 0x14000000, 0x1c000000, 0x24000000, 0x32000000 -}; - -static const FIXP_DBL iidQuantFine_fx[31] = { -  0x9c000001, 0xa6000001, 0xb0000001, 0xba000001, 0xc4000000, 0xce000000, 0xd4000000, 0xda000000, -  0xe0000000, 0xe6000000, 0xec000000, 0xf0000000, 0xf4000000, 0xf8000000, 0xfc000000, 0x00000000, -  0x04000000, 0x08000000, 0x0c000000, 0x10000000, 0x14000000, 0x1a000000, 0x20000000, 0x26000000, -  0x2c000000, 0x32000000, 0x3c000000, 0x45ffffff, 0x4fffffff, 0x59ffffff, 0x63ffffff -}; - - - -static const FIXP_DBL iccQuant[8] = { -  0x7fffffff, 0x77ef9d7f, 0x6babc97f, 0x4ceaf27f, 0x2f0ed3c0, 0x00000000, 0xb49ba601, 0x80000000 -}; - -static FDK_PSENC_ERROR InitPSData( -        HANDLE_PS_DATA            hPsData -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if(hPsData == NULL) { -    error = PSENC_INVALID_HANDLE; -  } -  else { -    int i, env; -    FDKmemclear(hPsData,sizeof(PS_DATA)); - -    for (i=0; i<PS_MAX_BANDS; i++) { -      hPsData->iidIdxLast[i] = 0; -      hPsData->iccIdxLast[i] = 0; -    } - -    hPsData->iidEnable    = hPsData->iidEnableLast = 0; -    hPsData->iccEnable    = hPsData->iccEnableLast = 0; -    hPsData->iidQuantMode = hPsData->iidQuantModeLast = PS_IID_RES_COARSE; -    hPsData->iccQuantMode = hPsData->iccQuantModeLast = PS_ICC_ROT_A; - -    for(env=0; env<PS_MAX_ENVELOPES; env++) { -      hPsData->iccDiffMode[env] = PS_DELTA_FREQ; -      hPsData->iccDiffMode[env] = PS_DELTA_FREQ; - -      for (i=0; i<PS_MAX_BANDS; i++) { -        hPsData->iidIdx[env][i] = 0; -        hPsData->iccIdx[env][i] = 0; -      } -    } - -    hPsData->nEnvelopesLast = 0; - -    hPsData->headerCnt  = MAX_PS_NOHEADER_CNT; -    hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; -    hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; -    hPsData->noEnvCnt   = MAX_NOENV_CNT; -  } - -  return error; -} - -static FIXP_DBL quantizeCoef( const FIXP_DBL *RESTRICT input, -                              const INT       nBands, -                              const FIXP_DBL *RESTRICT quantTable, -                              const INT       idxOffset, -                              const INT       nQuantSteps, -                              INT            *RESTRICT quantOut) -{ -  INT idx, band; -  FIXP_DBL quantErr = FL2FXCONST_DBL(0.f); - -  for (band=0; band<nBands;band++) { -    for(idx=0; idx<nQuantSteps-1; idx++){ -      if( fixp_abs((input[band]>>1)-(quantTable[idx+1]>>1)) > -          fixp_abs((input[band]>>1)-(quantTable[idx]>>1)) ) -      { -        break; -      } -    } -    quantErr      += (fixp_abs(input[band]-quantTable[idx])>>PS_QUANT_SCALE);   /* don't scale before subtraction; diff smaller (64-25)/64 */ -    quantOut[band] = idx - idxOffset; -  } - -  return quantErr; -} - -static INT getICCMode(const INT nBands, -                      const INT rotType) -{ -  INT mode = 0; - -  switch(nBands) { -  case PS_BANDS_COARSE: -    mode = PS_RES_COARSE; -    break; -  case PS_BANDS_MID: -    mode = PS_RES_MID; -    break; -  default: -    mode = 0; -  } -  if(rotType==PS_ICC_ROT_B){ -    mode += 3; -  } - -  return mode; -} - - -static INT getIIDMode(const INT nBands, -                      const INT iidRes) -{ -  INT mode = 0; - -  switch(nBands) { -  case PS_BANDS_COARSE: -    mode = PS_RES_COARSE; -    break; -  case PS_BANDS_MID: -    mode = PS_RES_MID; -    break; -  default: -    mode = 0; -    break; -  } - -  if(iidRes == PS_IID_RES_FINE){ -    mode += 3; -  } - -  return mode; -} - - -static INT envelopeReducible(FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                             FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                             INT psBands, -                             INT nEnvelopes) -{ -  #define THRESH_SCALE     7 - -  INT reducible = 1; /* true */ -  INT e = 0, b = 0; -  FIXP_DBL dIid = FL2FXCONST_DBL(0.f); -  FIXP_DBL dIcc = FL2FXCONST_DBL(0.f); - -  FIXP_DBL iidErrThreshold, iccErrThreshold; -  FIXP_DBL iidMeanError, iccMeanError; - -  /* square values to prevent sqrt, -     multiply bands to prevent division; bands shifted DFRACT_BITS instead (DFRACT_BITS-1) because fMultDiv2 used*/ -  iidErrThreshold = fMultDiv2 ( FL2FXCONST_DBL(6.5f*6.5f/(IID_SCALE_FT*IID_SCALE_FT)), (FIXP_DBL)(psBands<<((DFRACT_BITS)-THRESH_SCALE)) ); -  iccErrThreshold = fMultDiv2 ( FL2FXCONST_DBL(0.75f*0.75f),                           (FIXP_DBL)(psBands<<((DFRACT_BITS)-THRESH_SCALE)) ); - -  if (nEnvelopes <= 1) { -    reducible = 0; -  } else { - -    /* mean error criterion */ -    for (e=0; (e < nEnvelopes/2) && (reducible!=0 ) ; e++) { -      iidMeanError = iccMeanError = FL2FXCONST_DBL(0.f); -      for(b=0; b<psBands; b++) { -        dIid = (iid[2*e][b]>>1) - (iid[2*e+1][b]>>1);   /* scale 1 bit; squared -> 2 bit */ -        dIcc = (icc[2*e][b]>>1) - (icc[2*e+1][b]>>1); -        iidMeanError += fPow2Div2(dIid)>>(5-1);    /* + (bands=20) scale = 5 */ -        iccMeanError += fPow2Div2(dIcc)>>(5-1); -      }                                                 /* --> scaling = 7 bit = THRESH_SCALE !! */ - -      /* instead sqrt values are squared! -         instead of division, multiply threshold with psBands -         scaling necessary!! */ - -      /* quit as soon as threshold is reached */ -      if ( (iidMeanError > (iidErrThreshold)) || -           (iccMeanError > (iccErrThreshold)) ) { -        reducible = 0; -      } -    } -  } /* nEnvelopes != 1 */ - -  return reducible; -} - - -static void processIidData(PS_DATA       *psData, -                           FIXP_DBL       iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                           const INT      psBands, -                           const INT      nEnvelopes, -                           const FIXP_DBL quantErrorThreshold) -{ -  INT iidIdxFine  [PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT iidIdxCoarse[PS_MAX_ENVELOPES][PS_MAX_BANDS]; - -  FIXP_DBL errIID = FL2FXCONST_DBL(0.f); -  FIXP_DBL errIIDFine = FL2FXCONST_DBL(0.f); -  INT   bitsIidFreq = 0; -  INT   bitsIidTime = 0; -  INT   bitsFineTot = 0; -  INT   bitsCoarseTot = 0; -  INT   error = 0; -  INT   env, band; -  INT   diffMode[PS_MAX_ENVELOPES], diffModeFine[PS_MAX_ENVELOPES]; -  INT loudnDiff = 0; -  INT iidTransmit = 0; - -  bitsIidFreq = bitsIidTime = 0; - -  /* Quantize IID coefficients */ -  for(env=0;env<nEnvelopes; env++) { -    errIID     += quantizeCoef(iid[env], psBands, iidQuant_fx,      7, 15, iidIdxCoarse[env]); -    errIIDFine += quantizeCoef(iid[env], psBands, iidQuantFine_fx, 15, 31, iidIdxFine[env]); -  } - -  /* normalize error to number of envelopes, ps bands -     errIID /= psBands*nEnvelopes; -     errIIDFine /= psBands*nEnvelopes; */ - - -  /* Check if IID coefficients should be used in this frame */ -  psData->iidEnable = 0; -  for(env=0;env<nEnvelopes; env++) { -    for(band=0;band<psBands;band++) { -      loudnDiff   += fixp_abs(iidIdxCoarse[env][band]); -      iidTransmit ++; -    } -  } - -  if(loudnDiff > fMultI(FL2FXCONST_DBL(0.7f),iidTransmit)){    /* 0.7f empiric value */ -    psData->iidEnable = 1; -  } - -  /* if iid not active -> RESET data */ -  if(psData->iidEnable==0) { -    psData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; -    for(env=0;env<nEnvelopes; env++) { -      psData->iidDiffMode[env] = PS_DELTA_FREQ; -      FDKmemclear(psData->iidIdx[env], sizeof(INT)*psBands); -    } -    return; -  } - -  /* count COARSE quantization bits for first envelope*/ -  bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], NULL, psBands, PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); - -  if( (psData->iidTimeCnt>=MAX_TIME_DIFF_FRAMES) || (psData->iidQuantModeLast==PS_IID_RES_FINE) ) { -    bitsIidTime     = DO_NOT_USE_THIS_MODE; -  } -  else { -    bitsIidTime     = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], psData->iidIdxLast, psBands, PS_IID_RES_COARSE, PS_DELTA_TIME, &error); -  } - -  /* decision DELTA_FREQ vs DELTA_TIME */ -  if(bitsIidTime>bitsIidFreq) { -    diffMode[0]   = PS_DELTA_FREQ; -    bitsCoarseTot = bitsIidFreq; -  } -  else { -    diffMode[0]   = PS_DELTA_TIME; -    bitsCoarseTot = bitsIidTime; -  } - -  /* count COARSE quantization bits for following envelopes*/ -  for(env=1;env<nEnvelopes; env++) { -    bitsIidFreq  = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[env], NULL,                psBands, PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); -    bitsIidTime  = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[env], iidIdxCoarse[env-1], psBands, PS_IID_RES_COARSE, PS_DELTA_TIME, &error); - -    /* decision DELTA_FREQ vs DELTA_TIME */ -    if(bitsIidTime>bitsIidFreq) { -      diffMode[env]  = PS_DELTA_FREQ; -      bitsCoarseTot += bitsIidFreq; -    } -    else { -      diffMode[env]  = PS_DELTA_TIME; -      bitsCoarseTot += bitsIidTime; -    } -  } - - -  /* count FINE quantization bits for first envelope*/ -  bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0],   NULL, psBands, PS_IID_RES_FINE,   PS_DELTA_FREQ, &error); - -  if( (psData->iidTimeCnt>=MAX_TIME_DIFF_FRAMES) || (psData->iidQuantModeLast==PS_IID_RES_COARSE) ) { -    bitsIidTime = DO_NOT_USE_THIS_MODE; -  } -  else { -    bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0],  psData->iidIdxLast, psBands, PS_IID_RES_FINE, PS_DELTA_TIME, &error); -  } - -  /* decision DELTA_FREQ vs DELTA_TIME */ -  if(bitsIidTime>bitsIidFreq) { -    diffModeFine[0]   = PS_DELTA_FREQ; -    bitsFineTot       = bitsIidFreq; -  } -  else { -    diffModeFine[0]   = PS_DELTA_TIME; -    bitsFineTot       = bitsIidTime; -  } - -  /* count FINE quantization bits for following envelopes*/ -  for(env=1;env<nEnvelopes; env++) { -    bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[env],   NULL,              psBands, PS_IID_RES_FINE, PS_DELTA_FREQ, &error); -    bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[env],   iidIdxFine[env-1], psBands, PS_IID_RES_FINE, PS_DELTA_TIME, &error); - -    /* decision DELTA_FREQ vs DELTA_TIME */ -    if(bitsIidTime>bitsIidFreq) { -      diffModeFine[env]  = PS_DELTA_FREQ; -      bitsFineTot += bitsIidFreq; -    } -    else { -      diffModeFine[env]  = PS_DELTA_TIME; -      bitsFineTot       += bitsIidTime; -    } -  } - -  if(bitsFineTot == bitsCoarseTot){ -    /* if same number of bits is needed, use the quantization with lower error */ -    if(errIIDFine < errIID){ -      bitsCoarseTot = DO_NOT_USE_THIS_MODE; -    } else { -      bitsFineTot = DO_NOT_USE_THIS_MODE; -    } -  } else { -    /* const FIXP_DBL minThreshold = FL2FXCONST_DBL(0.2f/(IID_SCALE_FT*PS_QUANT_SCALE_FT)*(psBands*nEnvelopes)); */ -    const FIXP_DBL minThreshold = (FIXP_DBL)((LONG)0x00019999 * (psBands*nEnvelopes)); - -    /* decision RES_FINE vs RES_COARSE                 */ -    /* test if errIIDFine*quantErrorThreshold < errIID */ -    /* shiftVal 2 comes from scaling of quantErrorThreshold */ -    if(fixMax(((errIIDFine>>1)+(minThreshold>>1))>>1, fMult(quantErrorThreshold,errIIDFine)) < (errIID>>2) ) { -      bitsCoarseTot = DO_NOT_USE_THIS_MODE; -    } -    else if(fixMax(((errIID>>1)+(minThreshold>>1))>>1, fMult(quantErrorThreshold,errIID)) < (errIIDFine>>2) ) { -      bitsFineTot = DO_NOT_USE_THIS_MODE; -    } -  } - -  /* decision RES_FINE vs RES_COARSE */ -  if(bitsFineTot<bitsCoarseTot) { -    psData->iidQuantMode = PS_IID_RES_FINE; -    for(env=0;env<nEnvelopes; env++) { -      psData->iidDiffMode[env] = diffModeFine[env]; -      FDKmemcpy(psData->iidIdx[env], iidIdxFine[env], psBands*sizeof(INT)); -    } -  } -  else { -    psData->iidQuantMode = PS_IID_RES_COARSE; -    for(env=0;env<nEnvelopes; env++) { -      psData->iidDiffMode[env] = diffMode[env]; -      FDKmemcpy(psData->iidIdx[env], iidIdxCoarse[env], psBands*sizeof(INT)); -    } -  } - -  /* Count DELTA_TIME encoding streaks */ -  for(env=0;env<nEnvelopes; env++) { -    if(psData->iidDiffMode[env]==PS_DELTA_TIME) -      psData->iidTimeCnt++; -    else -      psData->iidTimeCnt=0; -  } -} - - -static INT similarIid(PS_DATA   *psData, -                      const INT  psBands, -                      const INT  nEnvelopes) -{ -  const INT diffThr = (psData->iidQuantMode == PS_IID_RES_COARSE) ? 2 : 3; -  const INT sumDiffThr = diffThr * psBands/4; -  INT similar = 0; -  INT diff    = 0; -  INT sumDiff = 0; -  INT env = 0; -  INT b   = 0; -  if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes==1)) { -    similar = 1; -    for (env=0; env<nEnvelopes; env++) { -      sumDiff = 0; -      b = 0; -      do { -        diff = fixp_abs(psData->iidIdx[env][b] - psData->iidIdxLast[b]); -        sumDiff += diff; -        if ( (diff > diffThr) /* more than x quantization steps in any band */ -             || (sumDiff > sumDiffThr) ) {  /* more than x quantisations steps overall difference */ -          similar = 0; -        } -        b++; -      } while ((b<psBands) && (similar>0)); -    } -  } /* nEnvelopes==1  */ - -  return similar; -} - - -static INT similarIcc(PS_DATA *psData, -                      const INT    psBands, -                      const INT    nEnvelopes) -{ -  const INT diffThr = 2; -  const INT sumDiffThr = diffThr * psBands/4; -  INT similar = 0; -  INT diff    = 0; -  INT sumDiff = 0; -  INT env = 0; -  INT b   = 0; -  if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes==1)) { -    similar = 1; -    for (env=0; env<nEnvelopes; env++) { -      sumDiff = 0; -      b = 0; -      do { -        diff = fixp_abs(psData->iccIdx[env][b] - psData->iccIdxLast[b]); -        sumDiff += diff; -        if ( (diff > diffThr) /* more than x quantisation step in any band */ -             || (sumDiff > sumDiffThr) ) {  /* more than x quantisations steps overall difference */ -          similar = 0; -        } -        b++; -      } while ((b<psBands) && (similar>0)); -    } -  } /* nEnvelopes==1  */ - -  return similar; -} - -static void processIccData(PS_DATA   *psData, -                           FIXP_DBL   icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], /* const input values: unable to declare as const, since it does not poINT to const memory */ -                           const INT  psBands, -                           const INT  nEnvelopes) -{ -  FIXP_DBL errICC = FL2FXCONST_DBL(0.f); -  INT   env, band; -  INT   bitsIccFreq, bitsIccTime; -  INT   error = 0; -  INT   inCoherence=0, iccTransmit=0; -  INT  *iccIdxLast; - -  iccIdxLast = psData->iccIdxLast; - -  /* Quantize ICC coefficients */ -  for(env=0;env<nEnvelopes; env++) { -    errICC += quantizeCoef(icc[env], psBands, iccQuant, 0, 8, psData->iccIdx[env]); -  } - -  /* Check if ICC coefficients should be used */ -  psData->iccEnable = 0; -  for(env=0;env<nEnvelopes; env++) { -    for(band=0;band<psBands;band++) { -      inCoherence += psData->iccIdx[env][band]; -      iccTransmit ++; -    } -  } -  if(inCoherence > fMultI(FL2FXCONST_DBL(0.5f),iccTransmit)){   /* 0.5f empiric value */ -    psData->iccEnable = 1; -  } - -  if(psData->iccEnable==0) { -    psData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; -    for(env=0;env<nEnvelopes; env++) { -      psData->iccDiffMode[env] = PS_DELTA_FREQ; -      FDKmemclear(psData->iccIdx[env], sizeof(INT)*psBands); -    } -    return; -  } - -  for(env=0;env<nEnvelopes; env++) { -    bitsIccFreq  = FDKsbrEnc_EncodeIcc(NULL, psData->iccIdx[env],   NULL,       psBands, PS_DELTA_FREQ, &error); - -    if(psData->iccTimeCnt<MAX_TIME_DIFF_FRAMES) { -      bitsIccTime  = FDKsbrEnc_EncodeIcc(NULL, psData->iccIdx[env], iccIdxLast, psBands, PS_DELTA_TIME, &error); -    } -    else { -      bitsIccTime  = DO_NOT_USE_THIS_MODE; -    } - -    if(bitsIccFreq>bitsIccTime) { -      psData->iccDiffMode[env] = PS_DELTA_TIME; -      psData->iccTimeCnt++; -    } -    else { -      psData->iccDiffMode[env] = PS_DELTA_FREQ; -      psData->iccTimeCnt=0; -    } -    iccIdxLast = psData->iccIdx[env]; -  } -} - -static void calculateIID(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         INT   nEnvelopes, -                         INT   psBands) -{ -  INT i=0; -  INT env=0; -  for(env=0; env<nEnvelopes;env++) { -    for (i=0; i<psBands; i++) { - -      /* iid[env][i] = 10.0f*(float)log10(pwrL[env][i]/pwrR[env][i]); -      */ -      FIXP_DBL IID = fMultDiv2( FL2FXCONST_DBL(LOG10_2_10/IID_SCALE_FT), (ldPwrL[env][i]-ldPwrR[env][i]) ); - -      IID = fixMin( IID, (FIXP_DBL)(MAXVAL_DBL>>(LD_DATA_SHIFT+1)) ); -      IID = fixMax( IID, (FIXP_DBL)(MINVAL_DBL>>(LD_DATA_SHIFT+1)) ); -      iid[env][i] = IID << (LD_DATA_SHIFT+1); -    } -  } -} - -static void calculateICC(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], -                         INT   nEnvelopes, -                         INT   psBands) -{ -  INT i = 0; -  INT env = 0; -  INT border = psBands; - -  switch (psBands) { -  case PS_BANDS_COARSE: -    border = 5; -    break; -  case PS_BANDS_MID: -    border = 11; -    break; -  default: -    break; -  } - -  for(env=0; env<nEnvelopes;env++) { -    for (i=0; i<border; i++) { - -      /* icc[env][i] = min( pwrCr[env][i] / (float) sqrt(pwrL[env][i] * pwrR[env][i]) , 1.f); -      */ -      FIXP_DBL ICC, invNrg = CalcInvLdData ( -((ldPwrL[env][i]>>1) + (ldPwrR[env][i]>>1) + (FIXP_DBL)1) ); -      INT      scale, invScale = CountLeadingBits(invNrg); - -      scale = (DFRACT_BITS-1) - invScale; -      ICC = fMult(pwrCr[env][i], invNrg<<invScale) ; -      icc[env][i] = SATURATE_LEFT_SHIFT(ICC, scale, DFRACT_BITS); -    } - -    for (; i<psBands; i++) { -      INT sc1, sc2; -      FIXP_DBL cNrgR, cNrgI, ICC; - -      sc1 = CountLeadingBits( fixMax(fixp_abs(pwrCr[env][i]),fixp_abs(pwrCi[env][i])) ) ; -      cNrgR = fPow2Div2((pwrCr[env][i]<<sc1));       /* squared nrg's expect explicit scaling */ -      cNrgI = fPow2Div2((pwrCi[env][i]<<sc1)); - -      ICC = CalcInvLdData( (CalcLdData((cNrgR + cNrgI)>>1)>>1) - (FIXP_DBL)((sc1-1)<<(DFRACT_BITS-1-LD_DATA_SHIFT)) ); - -      FIXP_DBL invNrg = CalcInvLdData ( -((ldPwrL[env][i]>>1) + (ldPwrR[env][i]>>1) + (FIXP_DBL)1) ); -      sc1 = CountLeadingBits(invNrg); -      invNrg <<= sc1; - -      sc2 = CountLeadingBits(ICC); -      ICC = fMult(ICC<<sc2,invNrg); - -      sc1 = ( (DFRACT_BITS-1) - sc1 - sc2 ); -      if (sc1 < 0) { -          ICC >>= -sc1; -      } -      else { -          if (ICC >= ((FIXP_DBL)MAXVAL_DBL>>sc1) ) -              ICC = (FIXP_DBL)MAXVAL_DBL; -          else -              ICC <<= sc1; -      } - -      icc[env][i] = ICC; -    } -  } -} - -void FDKsbrEnc_initPsBandNrgScale(HANDLE_PS_ENCODE hPsEncode) -{ -  INT group, bin; -  INT nIidGroups   = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; - -  FDKmemclear(hPsEncode->psBandNrgScale, PS_MAX_BANDS*sizeof(SCHAR)); - -  for (group=0; group < nIidGroups; group++) { -    /* Translate group to bin */ -    bin = hPsEncode->subband2parameterIndex[group]; - -    /* Translate from 20 bins to 10 bins */ -    if (hPsEncode->psEncMode == PS_BANDS_COARSE) { -      bin = bin>>1; -    } - -    hPsEncode->psBandNrgScale[bin] = (hPsEncode->psBandNrgScale[bin]==0) -                          ? (hPsEncode->iidGroupWidthLd[group] + 5) -                          : (fixMax(hPsEncode->iidGroupWidthLd[group],hPsEncode->psBandNrgScale[bin]) + 1) ; - -  } -} - -FDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode( -        HANDLE_PS_ENCODE         *phPsEncode -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if (phPsEncode==NULL) { -    error = PSENC_INVALID_HANDLE; -  } -  else { -    HANDLE_PS_ENCODE hPsEncode = NULL; -    if (NULL==(hPsEncode = GetRam_PsEncode())) { -      error = PSENC_MEMORY_ERROR; -      goto bail; -    } -    FDKmemclear(hPsEncode,sizeof(PS_ENCODE)); -    *phPsEncode = hPsEncode; /* return allocated handle */ -  } -bail: -  return error; -} - -FDK_PSENC_ERROR FDKsbrEnc_InitPSEncode( -        HANDLE_PS_ENCODE          hPsEncode, -        const PS_BANDS            psEncMode, -        const FIXP_DBL            iidQuantErrorThreshold -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if (NULL==hPsEncode) { -    error = PSENC_INVALID_HANDLE; -  } -  else { -    if (PSENC_OK != (InitPSData(&hPsEncode->psData))) { -      goto bail; -    } - -    switch(psEncMode){ -      case PS_BANDS_COARSE: -      case PS_BANDS_MID: -        hPsEncode->nQmfIidGroups    = QMF_GROUPS_LO_RES; -        hPsEncode->nSubQmfIidGroups = SUBQMF_GROUPS_LO_RES; -        FDKmemcpy(hPsEncode->iidGroupBorders,        iidGroupBordersLoRes, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups + 1)*sizeof(INT)); -        FDKmemcpy(hPsEncode->subband2parameterIndex, subband2parameter20,  (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups)    *sizeof(INT)); -        FDKmemcpy(hPsEncode->iidGroupWidthLd,        iidGroupWidthLdLoRes, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups)    *sizeof(UCHAR)); -        break; -      default: -        error = PSENC_INIT_ERROR; -        goto bail; -    } - -    hPsEncode->psEncMode = psEncMode; -    hPsEncode->iidQuantErrorThreshold = iidQuantErrorThreshold; -    FDKsbrEnc_initPsBandNrgScale(hPsEncode); -  } -bail: -  return error; -} - - -FDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode( -        HANDLE_PS_ENCODE         *phPsEncode -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if (NULL !=phPsEncode) { -    FreeRam_PsEncode(phPsEncode); -  } - -  return error; -} - -typedef struct { -  FIXP_DBL pwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  FIXP_DBL pwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS]; - -} PS_PWR_DATA; - - -FDK_PSENC_ERROR FDKsbrEnc_PSEncode( -        HANDLE_PS_ENCODE          hPsEncode, -        HANDLE_PS_OUT             hPsOut, -        UCHAR                    *dynBandScale, -        UINT                      maxEnvelopes, -        FIXP_DBL                 *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], -        const INT                 frameSize, -        const INT                 sendHeader -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  HANDLE_PS_DATA hPsData = &hPsEncode->psData; -  FIXP_DBL iid [PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  FIXP_DBL icc [PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  int envBorder[PS_MAX_ENVELOPES+1]; - -  int group, bin, col, subband, band; -  int i = 0; - -  int env = 0; -  int psBands      = (int) hPsEncode->psEncMode; -  int nIidGroups   = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; -  int nEnvelopes   = fixMin(maxEnvelopes, (UINT)PS_MAX_ENVELOPES); - -  C_ALLOC_SCRATCH_START(pwrData, PS_PWR_DATA, 1); - -  for(env=0; env<nEnvelopes+1;env++) { -    envBorder[env] = fMultI(GetInvInt(nEnvelopes),frameSize*env); -  } - -  for(env=0; env<nEnvelopes;env++) { - -    /* clear energy array */ -    for (band=0; band<psBands; band++) { -      pwrData->pwrL[env][band] = pwrData->pwrR[env][band] = pwrData->pwrCr[env][band] = pwrData->pwrCi[env][band] = FIXP_DBL(1); -    } - -    /**** calculate energies and correlation ****/ - -    /* start with hybrid data */ -    for (group=0; group < nIidGroups; group++) { -      /* Translate group to bin */ -      bin = hPsEncode->subband2parameterIndex[group]; - -      /* Translate from 20 bins to 10 bins */ -      if (hPsEncode->psEncMode == PS_BANDS_COARSE) { -        bin >>= 1; -      } - -      /* determine group border */ -      int bScale = hPsEncode->psBandNrgScale[bin]; - -      FIXP_DBL pwrL_env_bin = pwrData->pwrL[env][bin]; -      FIXP_DBL pwrR_env_bin = pwrData->pwrR[env][bin]; -      FIXP_DBL pwrCr_env_bin = pwrData->pwrCr[env][bin]; -      FIXP_DBL pwrCi_env_bin = pwrData->pwrCi[env][bin]; - -      int scale = (int)dynBandScale[bin]; -      for (col=envBorder[env]; col<envBorder[env+1]; col++) { -        for (subband = hPsEncode->iidGroupBorders[group]; subband < hPsEncode->iidGroupBorders[group+1]; subband++) { -          FIXP_QMF l_real = (hybridData[col][0][0][subband]) << scale; -          FIXP_QMF l_imag = (hybridData[col][0][1][subband]) << scale; -          FIXP_QMF r_real = (hybridData[col][1][0][subband]) << scale; -          FIXP_QMF r_imag = (hybridData[col][1][1][subband]) << scale; - -          pwrL_env_bin  += (fPow2Div2(l_real) + fPow2Div2(l_imag)) >> bScale; -          pwrR_env_bin  += (fPow2Div2(r_real) + fPow2Div2(r_imag)) >> bScale; -          pwrCr_env_bin += (fMultDiv2(l_real, r_real) + fMultDiv2(l_imag, r_imag)) >> bScale; -          pwrCi_env_bin += (fMultDiv2(r_real, l_imag) - fMultDiv2(l_real, r_imag)) >> bScale; -        } -      } -      /* assure, nrg's of left and right channel are not negative; necessary on 16 bit multiply units */ -      pwrData->pwrL[env][bin] = fixMax((FIXP_DBL)0,pwrL_env_bin); -      pwrData->pwrR[env][bin] = fixMax((FIXP_DBL)0,pwrR_env_bin); - -      pwrData->pwrCr[env][bin] = pwrCr_env_bin; -      pwrData->pwrCi[env][bin] = pwrCi_env_bin; - -    } /* nIidGroups */ - -    /* calc logarithmic energy */ -    LdDataVector(pwrData->pwrL[env], pwrData->ldPwrL[env], psBands); -    LdDataVector(pwrData->pwrR[env], pwrData->ldPwrR[env], psBands); - -  } /* nEnvelopes */ - -  /* calculate iid and icc */ -  calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); -  calculateICC(pwrData->ldPwrL, pwrData->ldPwrR, pwrData->pwrCr, pwrData->pwrCi, icc, nEnvelopes, psBands); - -  /*** Envelope Reduction ***/ -  while (envelopeReducible(iid,icc,psBands,nEnvelopes)) { -    int e=0; -    /* sum energies of two neighboring envelopes */ -    nEnvelopes >>= 1; -    for (e=0; e<nEnvelopes; e++) { -      FDKsbrEnc_addFIXP_DBL(pwrData->pwrL[2*e], pwrData->pwrL[2*e+1], pwrData->pwrL[e], psBands); -      FDKsbrEnc_addFIXP_DBL(pwrData->pwrR[2*e], pwrData->pwrR[2*e+1], pwrData->pwrR[e], psBands); -      FDKsbrEnc_addFIXP_DBL(pwrData->pwrCr[2*e],pwrData->pwrCr[2*e+1],pwrData->pwrCr[e],psBands); -      FDKsbrEnc_addFIXP_DBL(pwrData->pwrCi[2*e],pwrData->pwrCi[2*e+1],pwrData->pwrCi[e],psBands); - -      /* calc logarithmic energy */ -      LdDataVector(pwrData->pwrL[e], pwrData->ldPwrL[e], psBands); -      LdDataVector(pwrData->pwrR[e], pwrData->ldPwrR[e], psBands); - -      /* reduce number of envelopes and adjust borders */ -      envBorder[e] = envBorder[2*e]; -    } -    envBorder[nEnvelopes] = envBorder[2*nEnvelopes]; - -    /* re-calculate iid and icc */ -    calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); -    calculateICC(pwrData->ldPwrL, pwrData->ldPwrR, pwrData->pwrCr, pwrData->pwrCi, icc, nEnvelopes, psBands); -  } - - -  /*  */ -  if(sendHeader) { -    hPsData->headerCnt  = MAX_PS_NOHEADER_CNT; -    hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; -    hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; -    hPsData->noEnvCnt   = MAX_NOENV_CNT; -  } - -  /*** Parameter processing, quantisation etc ***/ -  processIidData(hPsData, iid, psBands, nEnvelopes, hPsEncode->iidQuantErrorThreshold); -  processIccData(hPsData, icc, psBands, nEnvelopes); - - -  /*** Initialize output struct ***/ - -  /* PS Header on/off ? */ -  if( (hPsData->headerCnt<MAX_PS_NOHEADER_CNT) -       && ( (hPsData->iidQuantMode == hPsData->iidQuantModeLast) && (hPsData->iccQuantMode == hPsData->iccQuantModeLast) ) -       && ( (hPsData->iidEnable    == hPsData->iidEnableLast)    && (hPsData->iccEnable    == hPsData->iccEnableLast)  ) ) { -    hPsOut->enablePSHeader = 0; -  } -  else { -    hPsOut->enablePSHeader = 1; -    hPsData->headerCnt = 0; -  } - -  /* nEnvelopes = 0 ? */ -  if ( (hPsData->noEnvCnt < MAX_NOENV_CNT) -       && (similarIid(hPsData, psBands, nEnvelopes)) -       && (similarIcc(hPsData, psBands, nEnvelopes)) ) { -    hPsOut->nEnvelopes = nEnvelopes = 0; -    hPsData->noEnvCnt++; -  } else { -    hPsData->noEnvCnt = 0; -  } - - -  if (nEnvelopes>0) { - -    hPsOut->enableIID      = hPsData->iidEnable; -    hPsOut->iidMode        = getIIDMode(psBands, hPsData->iidQuantMode); - -    hPsOut->enableICC      = hPsData->iccEnable; -    hPsOut->iccMode        = getICCMode(psBands, hPsData->iccQuantMode); - -    hPsOut->enableIpdOpd  = 0; -    hPsOut->frameClass    = 0; -    hPsOut->nEnvelopes    = nEnvelopes; - -    for(env=0; env<nEnvelopes; env++) { -      hPsOut->frameBorder[env] = envBorder[env+1]; -    } - -    for(env=0; env<hPsOut->nEnvelopes; env++) { -      hPsOut->deltaIID[env] = (PS_DELTA)hPsData->iidDiffMode[env]; - -      for(band=0; band<psBands; band++) { -        hPsOut->iid[env][band] = hPsData->iidIdx[env][band]; -      } -    } - -    for(env=0; env<hPsOut->nEnvelopes; env++) { -      hPsOut->deltaICC[env] = (PS_DELTA)hPsData->iccDiffMode[env]; -      for(band=0; band<psBands; band++) { -        hPsOut->icc[env][band] = hPsData->iccIdx[env][band]; -      } -    } - -    /* IPD OPD not supported right now */ -    FDKmemclear(hPsOut->ipd, PS_MAX_ENVELOPES*PS_MAX_BANDS*sizeof(PS_DELTA)); -    for(env=0; env<PS_MAX_ENVELOPES; env++) { -      hPsOut->deltaIPD[env] = PS_DELTA_FREQ; -      hPsOut->deltaOPD[env] = PS_DELTA_FREQ; -    } - -    FDKmemclear(hPsOut->ipdLast, PS_MAX_BANDS*sizeof(INT)); -    FDKmemclear(hPsOut->opdLast, PS_MAX_BANDS*sizeof(INT)); - -    for(band=0; band<PS_MAX_BANDS; band++) { -      hPsOut->iidLast[band] = hPsData->iidIdxLast[band]; -      hPsOut->iccLast[band] = hPsData->iccIdxLast[band]; -    } - -    /* save iids and iccs for differential time coding in the next frame */ -    hPsData->nEnvelopesLast   = nEnvelopes; -    hPsData->iidEnableLast    = hPsData->iidEnable; -    hPsData->iccEnableLast    = hPsData->iccEnable; -    hPsData->iidQuantModeLast = hPsData->iidQuantMode; -    hPsData->iccQuantModeLast = hPsData->iccQuantMode; -    for (i=0; i<psBands; i++) { -      hPsData->iidIdxLast[i] = hPsData->iidIdx[nEnvelopes-1][i]; -      hPsData->iccIdxLast[i] = hPsData->iccIdx[nEnvelopes-1][i]; -    } -  } /* Envelope > 0 */ - -  C_ALLOC_SCRATCH_END(pwrData, PS_PWR_DATA, 1) - -  return error; -} - diff --git a/libSBRenc/src/ps_encode.h b/libSBRenc/src/ps_encode.h deleted file mode 100644 index f728d47..0000000 --- a/libSBRenc/src/ps_encode.h +++ /dev/null @@ -1,187 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial author:       M. Neuendorf, N. Rettelbach, M. Multrus -   contents/description: PS Parameter extraction, encoding - -******************************************************************************/ -/*! -  \file -  \brief  PS parameter extraction, encoding functions   -*/ - -#ifndef __INCLUDED_PS_ENCODE_H -#define __INCLUDED_PS_ENCODE_H - -#include "ps_const.h" -#include "ps_bitenc.h" - - -#define IID_SCALE_FT      (64.f)    /* maxVal in Quant tab is +/- 50 */ -#define IID_SCALE         6         /* maxVal in Quant tab is +/- 50 */ -#define IID_MAXVAL        (1<<IID_SCALE) - -#define PS_QUANT_SCALE_FT (64.f)     /* error smaller (64-25)/64 * 20 bands * 4 env -> QuantScale 64 */ -#define PS_QUANT_SCALE    6          /* error smaller (64-25)/64 * 20 bands * 4 env -> QuantScale 6 bit */ - - -#define QMF_GROUPS_LO_RES      12 -#define SUBQMF_GROUPS_LO_RES   10 -#define QMF_GROUPS_HI_RES      18 -#define SUBQMF_GROUPS_HI_RES   30 - - -typedef struct T_PS_DATA { - -  INT iidEnable; -  INT iidEnableLast; -  INT iidQuantMode; -  INT iidQuantModeLast; -  INT iidDiffMode[PS_MAX_ENVELOPES]; -  INT iidIdx     [PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT iidIdxLast [PS_MAX_BANDS]; - -  INT iccEnable; -  INT iccEnableLast; -  INT iccQuantMode; -  INT iccQuantModeLast; -  INT iccDiffMode[PS_MAX_ENVELOPES]; -  INT iccIdx     [PS_MAX_ENVELOPES][PS_MAX_BANDS]; -  INT iccIdxLast [PS_MAX_BANDS]; - -  INT nEnvelopesLast; - -  INT headerCnt; -  INT iidTimeCnt; -  INT iccTimeCnt; -  INT noEnvCnt; - -} PS_DATA, *HANDLE_PS_DATA; - - -typedef struct T_PS_ENCODE{ - -  PS_DATA         psData; - -  PS_BANDS        psEncMode; -  INT             nQmfIidGroups; -  INT             nSubQmfIidGroups; -  INT             iidGroupBorders[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES + 1]; -  INT             subband2parameterIndex[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES]; -  UCHAR           iidGroupWidthLd[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES]; -  FIXP_DBL        iidQuantErrorThreshold; - -  UCHAR           psBandNrgScale [PS_MAX_BANDS]; - -} PS_ENCODE; - - -typedef struct T_PS_ENCODE *HANDLE_PS_ENCODE; - -FDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode( -        HANDLE_PS_ENCODE         *phPsEncode -        ); - -FDK_PSENC_ERROR FDKsbrEnc_InitPSEncode( -        HANDLE_PS_ENCODE          hPsEncode, -        const PS_BANDS            psEncMode, -        const FIXP_DBL            iidQuantErrorThreshold -        ); - -FDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode( -        HANDLE_PS_ENCODE         *phPsEncode -        ); - -FDK_PSENC_ERROR FDKsbrEnc_PSEncode( -        HANDLE_PS_ENCODE          hPsEncode, -        HANDLE_PS_OUT             hPsOut, -        UCHAR                    *dynBandScale, -        UINT                      maxEnvelopes, -        FIXP_DBL                 *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], -        const INT                 frameSize, -        const INT                 sendHeader -        ); - -#endif diff --git a/libSBRenc/src/ps_main.cpp b/libSBRenc/src/ps_main.cpp deleted file mode 100644 index ab183e2..0000000 --- a/libSBRenc/src/ps_main.cpp +++ /dev/null @@ -1,618 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial Authors:      M. Multrus -   Contents/Description: PS Wrapper, Downmix - -******************************************************************************/ - -#include "ps_main.h" - - -/* Includes ******************************************************************/ - -#include "ps_const.h" -#include "ps_bitenc.h" - -#include "sbr_ram.h" - -/*--------------- function declarations --------------------*/ -static void psFindBestScaling( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        FIXP_DBL                 *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], -        UCHAR                    *dynBandScale, -        FIXP_QMF                 *maxBandValue, -        SCHAR                    *dmxScale -        ); - -/*------------- function definitions ----------------*/ -FDK_PSENC_ERROR PSEnc_Create( -        HANDLE_PARAMETRIC_STEREO *phParametricStereo -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if (phParametricStereo==NULL) { -    error = PSENC_INVALID_HANDLE; -  } -  else { -    int i; -    HANDLE_PARAMETRIC_STEREO hParametricStereo = NULL; - -    if (NULL==(hParametricStereo = GetRam_ParamStereo())) { -      error = PSENC_MEMORY_ERROR; -      goto bail; -    } -    FDKmemclear(hParametricStereo, sizeof(PARAMETRIC_STEREO)); - -    if (PSENC_OK != (error = FDKsbrEnc_CreatePSEncode(&hParametricStereo->hPsEncode))) { -      goto bail; -    } - -    for (i=0; i<MAX_PS_CHANNELS; i++) { -      if (FDKhybridAnalysisOpen( -            &hParametricStereo->fdkHybAnaFilter[i], -             hParametricStereo->__staticHybAnaStatesLF[i], -             sizeof(hParametricStereo->__staticHybAnaStatesLF[i]), -             hParametricStereo->__staticHybAnaStatesHF[i], -             sizeof(hParametricStereo->__staticHybAnaStatesHF[i]) -             ) !=0 ) -      { -        error = PSENC_MEMORY_ERROR; -        goto bail; -      } -    } - -    *phParametricStereo = hParametricStereo; /* return allocated handle */ -  } -bail: -  return error; -} - -FDK_PSENC_ERROR PSEnc_Init( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        const HANDLE_PSENC_CONFIG hPsEncConfig, -        INT                       noQmfSlots, -        INT                       noQmfBands -       ,UCHAR                    *dynamic_RAM -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if ( (NULL==hParametricStereo) || (NULL==hPsEncConfig) ) { -    error = PSENC_INVALID_HANDLE; -  } -  else { -    int ch, i; - -    hParametricStereo->initPS = 1; -    hParametricStereo->noQmfSlots = noQmfSlots; -    hParametricStereo->noQmfBands = noQmfBands; - -    /* clear delay lines */ -    FDKmemclear(hParametricStereo->qmfDelayLines, sizeof(hParametricStereo->qmfDelayLines)); - -    hParametricStereo->qmfDelayScale = FRACT_BITS-1; - -    /* create configuration for hybrid filter bank */ -    for (ch=0; ch<MAX_PS_CHANNELS; ch++) { -      FDKhybridAnalysisInit( -            &hParametricStereo->fdkHybAnaFilter[ch], -             THREE_TO_TEN, -             QMF_CHANNELS, -             QMF_CHANNELS, -             1 -             ); -    } /* ch */ - -    FDKhybridSynthesisInit( -          &hParametricStereo->fdkHybSynFilter, -           THREE_TO_TEN, -           QMF_CHANNELS, -           QMF_CHANNELS -           ); - -    /* determine average delay */ -    hParametricStereo->psDelay = (HYBRID_FILTER_DELAY*hParametricStereo->noQmfBands); - -    if ( (hPsEncConfig->maxEnvelopes < PSENC_NENV_1) || (hPsEncConfig->maxEnvelopes > PSENC_NENV_MAX) ) { -      hPsEncConfig->maxEnvelopes = PSENC_NENV_DEFAULT; -    } -    hParametricStereo->maxEnvelopes = hPsEncConfig->maxEnvelopes; - -    if (PSENC_OK != (error = FDKsbrEnc_InitPSEncode(hParametricStereo->hPsEncode, (PS_BANDS) hPsEncConfig->nStereoBands, hPsEncConfig->iidQuantErrorThreshold))){ -      goto bail; -    } - -    for (ch = 0; ch<MAX_PS_CHANNELS; ch ++) { -      FIXP_DBL *pDynReal = GetRam_Sbr_envRBuffer (ch, dynamic_RAM); -      FIXP_DBL *pDynImag = GetRam_Sbr_envIBuffer (ch, dynamic_RAM); - -      for (i=0; i<HYBRID_FRAMESIZE; i++) { -        hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][ch][0] = &pDynReal[i*MAX_HYBRID_BANDS]; -        hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][ch][1] = &pDynImag[i*MAX_HYBRID_BANDS];; -      } - -      for (i=0; i<HYBRID_READ_OFFSET; i++) { -        hParametricStereo->pHybridData[i][ch][0] = hParametricStereo->__staticHybridData[i][ch][0]; -        hParametricStereo->pHybridData[i][ch][1] = hParametricStereo->__staticHybridData[i][ch][1]; -      } -    } /* ch */ - -    /* clear static hybrid buffer */ -    FDKmemclear(hParametricStereo->__staticHybridData, sizeof(hParametricStereo->__staticHybridData)); - -    /* clear bs buffer */ -    FDKmemclear(hParametricStereo->psOut, sizeof(hParametricStereo->psOut)); - -    hParametricStereo->psOut[0].enablePSHeader = 1; /* write ps header in first frame */ - -    /* clear scaling buffer */ -    FDKmemclear(hParametricStereo->dynBandScale, sizeof(UCHAR)*PS_MAX_BANDS); -    FDKmemclear(hParametricStereo->maxBandValue, sizeof(FIXP_QMF)*PS_MAX_BANDS); - -  } /* valid handle */ -bail: -  return error; -} - - -FDK_PSENC_ERROR PSEnc_Destroy( -        HANDLE_PARAMETRIC_STEREO *phParametricStereo -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if (NULL!=phParametricStereo) { -    HANDLE_PARAMETRIC_STEREO hParametricStereo = *phParametricStereo; -    if(hParametricStereo != NULL){ -      FDKsbrEnc_DestroyPSEncode(&hParametricStereo->hPsEncode); -      FreeRam_ParamStereo(phParametricStereo); -    } -  } - -  return error; -} - -static FDK_PSENC_ERROR ExtractPSParameters( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        const int                 sendHeader, -        FIXP_DBL                 *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2] -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if (hParametricStereo == NULL) { -    error = PSENC_INVALID_HANDLE; -  } -  else { -    /* call ps encode function */ -    if (hParametricStereo->initPS){ -      hParametricStereo->psOut[1] = hParametricStereo->psOut[0]; -    } -    hParametricStereo->psOut[0] = hParametricStereo->psOut[1]; - -    if (PSENC_OK != (error = FDKsbrEnc_PSEncode( -            hParametricStereo->hPsEncode, -           &hParametricStereo->psOut[1], -            hParametricStereo->dynBandScale, -            hParametricStereo->maxEnvelopes, -            hybridData, -            hParametricStereo->noQmfSlots, -            sendHeader))) -    { -      goto bail; -    } - -    if (hParametricStereo->initPS) { -      hParametricStereo->psOut[0] = hParametricStereo->psOut[1]; -      hParametricStereo->initPS = 0; -    } -  } -bail: -  return error; -} - - -static FDK_PSENC_ERROR DownmixPSQmfData( -       HANDLE_PARAMETRIC_STEREO  hParametricStereo, -       HANDLE_QMF_FILTER_BANK    sbrSynthQmf, -       FIXP_QMF       **RESTRICT mixRealQmfData, -       FIXP_QMF       **RESTRICT mixImagQmfData, -       INT_PCM                  *downsampledOutSignal, -       FIXP_DBL                 *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], -       const INT                 noQmfSlots, -       const INT                 psQmfScale[MAX_PS_CHANNELS], -       SCHAR                    *qmfScale -       ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; - -  if(hParametricStereo == NULL){ -    error = PSENC_INVALID_HANDLE; -  } -  else { -    int n, k; -    C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS) - -    /* define scalings */ -    int dynQmfScale = fixMax(0, hParametricStereo->dmxScale-1); /* scale one bit more for addition of left and right */ -    int downmixScale = psQmfScale[0] - dynQmfScale; -    const FIXP_DBL maxStereoScaleFactor = MAXVAL_DBL; /* 2.f/2.f */ - -    for (n = 0; n<noQmfSlots; n++) { - -      FIXP_DBL tmpHybrid[2][MAX_HYBRID_BANDS]; - -      for(k = 0; k<71; k++){ -          int dynScale, sc; /* scaling */ -          FIXP_QMF tmpLeftReal, tmpRightReal, tmpLeftImag, tmpRightImag; -          FIXP_DBL tmpScaleFactor, stereoScaleFactor; - -          tmpLeftReal  = hybridData[n][0][0][k]; -          tmpLeftImag  = hybridData[n][0][1][k]; -          tmpRightReal = hybridData[n][1][0][k]; -          tmpRightImag = hybridData[n][1][1][k]; - -          sc = fixMax(0,CntLeadingZeros( fixMax(fixMax(fixp_abs(tmpLeftReal),fixp_abs(tmpLeftImag)),fixMax(fixp_abs(tmpRightReal),fixp_abs(tmpRightImag))) )-2); - -          tmpLeftReal  <<= sc; tmpLeftImag  <<= sc; -          tmpRightReal <<= sc; tmpRightImag <<= sc; -          dynScale = fixMin(sc-dynQmfScale,DFRACT_BITS-1); - -          /* calc stereo scale factor to avoid loss of energy in bands                                                 */ -          /* stereo scale factor = min(2.0f, sqrt( (abs(l(k, n)^2 + abs(r(k, n)^2 )))/(0.5f*abs(l(k, n) + r(k, n))) )) */ -          stereoScaleFactor = fPow2Div2(tmpLeftReal)  + fPow2Div2(tmpLeftImag) -                            + fPow2Div2(tmpRightReal) + fPow2Div2(tmpRightImag) ; - -          /* might be that tmpScaleFactor becomes negative, so fabs(.) */ -          tmpScaleFactor    = fixp_abs(stereoScaleFactor + fMult(tmpLeftReal,tmpRightReal) + fMult(tmpLeftImag,tmpRightImag)); - -          /* min(2.0f, sqrt(stereoScaleFactor/(0.5f*tmpScaleFactor)))  */ -          if ( (stereoScaleFactor>>1) < fMult(maxStereoScaleFactor,tmpScaleFactor) ) { - -              int sc_num   = CountLeadingBits(stereoScaleFactor) ; -              int sc_denum = CountLeadingBits(tmpScaleFactor) ; -              sc       = -(sc_num-sc_denum); - -              tmpScaleFactor = schur_div((stereoScaleFactor<<(sc_num))>>1, -                                          tmpScaleFactor<<sc_denum, -                                          16) ; - -              /* prevent odd scaling for next sqrt calculation */ -              if (sc&0x1) { -                sc++; -                tmpScaleFactor>>=1; -              } -              stereoScaleFactor = sqrtFixp(tmpScaleFactor); -              stereoScaleFactor <<= (sc>>1); -          } -          else { -              stereoScaleFactor = maxStereoScaleFactor; -          } - -          /* write data to hybrid output */ -          tmpHybrid[0][k] = fMultDiv2(stereoScaleFactor, (FIXP_QMF)(tmpLeftReal + tmpRightReal))>>dynScale; -          tmpHybrid[1][k] = fMultDiv2(stereoScaleFactor, (FIXP_QMF)(tmpLeftImag + tmpRightImag))>>dynScale; - -      } /* hybrid bands - k */ - -      FDKhybridSynthesisApply( -            &hParametricStereo->fdkHybSynFilter, -             tmpHybrid[0], -             tmpHybrid[1], -             mixRealQmfData[n], -             mixImagQmfData[n]); - -      qmfSynthesisFilteringSlot( -            sbrSynthQmf, -            mixRealQmfData[n], -            mixImagQmfData[n], -            downmixScale-7, -            downmixScale-7, -            downsampledOutSignal+(n*sbrSynthQmf->no_channels), -            1, -            pWorkBuffer); - -    } /* slots */ - -    *qmfScale = -downmixScale + 7; - -    C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS) - -  { -    const INT noQmfSlots2 = hParametricStereo->noQmfSlots>>1; -    const int noQmfBands  = hParametricStereo->noQmfBands; - -    INT scale, i, j, slotOffset; - -    FIXP_QMF tmp[2][QMF_CHANNELS]; - -    for (i=0; i<noQmfSlots2; i++) { -      FDKmemcpy(tmp[0], hParametricStereo->qmfDelayLines[0][i], noQmfBands*sizeof(FIXP_QMF)); -      FDKmemcpy(tmp[1], hParametricStereo->qmfDelayLines[1][i], noQmfBands*sizeof(FIXP_QMF)); - -      FDKmemcpy(hParametricStereo->qmfDelayLines[0][i], mixRealQmfData[i+noQmfSlots2], noQmfBands*sizeof(FIXP_QMF)); -      FDKmemcpy(hParametricStereo->qmfDelayLines[1][i], mixImagQmfData[i+noQmfSlots2], noQmfBands*sizeof(FIXP_QMF)); - -      FDKmemcpy(mixRealQmfData[i+noQmfSlots2], mixRealQmfData[i], noQmfBands*sizeof(FIXP_QMF)); -      FDKmemcpy(mixImagQmfData[i+noQmfSlots2], mixImagQmfData[i], noQmfBands*sizeof(FIXP_QMF)); - -      FDKmemcpy(mixRealQmfData[i], tmp[0], noQmfBands*sizeof(FIXP_QMF)); -      FDKmemcpy(mixImagQmfData[i], tmp[1], noQmfBands*sizeof(FIXP_QMF)); -    } - -    if (hParametricStereo->qmfDelayScale > *qmfScale) { -      scale = hParametricStereo->qmfDelayScale - *qmfScale; -      slotOffset = 0; -    } -    else { -      scale = *qmfScale - hParametricStereo->qmfDelayScale; -      slotOffset = noQmfSlots2; -    } - -    for (i=0; i<noQmfSlots2; i++) { -      for (j=0; j<noQmfBands; j++) { -        mixRealQmfData[i+slotOffset][j] >>= scale; -        mixImagQmfData[i+slotOffset][j] >>= scale; -      } -    } - -    scale = *qmfScale; -    *qmfScale = FDKmin(*qmfScale, hParametricStereo->qmfDelayScale); -    hParametricStereo->qmfDelayScale = scale; -  } - -  } /* valid handle */ - -  return error; -} - - -INT FDKsbrEnc_PSEnc_WritePSData( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        HANDLE_FDK_BITSTREAM      hBitstream -        ) -{ -  return ( (hParametricStereo!=NULL) ? FDKsbrEnc_WritePSBitstream(&hParametricStereo->psOut[0], hBitstream) : 0 ); -} - - -FDK_PSENC_ERROR FDKsbrEnc_PSEnc_ParametricStereoProcessing( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        INT_PCM                  *samples[2], -        UINT                      timeInStride, -        QMF_FILTER_BANK         **hQmfAnalysis, -        FIXP_QMF **RESTRICT       downmixedRealQmfData, -        FIXP_QMF **RESTRICT       downmixedImagQmfData, -        INT_PCM                  *downsampledOutSignal, -        HANDLE_QMF_FILTER_BANK    sbrSynthQmf, -        SCHAR                    *qmfScale, -        const int                 sendHeader -        ) -{ -  FDK_PSENC_ERROR error = PSENC_OK; -  INT psQmfScale[MAX_PS_CHANNELS] = {0}; -  int psCh, i; -  C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS) - -  for (psCh = 0; psCh<MAX_PS_CHANNELS; psCh ++) { - -    for (i = 0; i < hQmfAnalysis[psCh]->no_col; i++) { - -      qmfAnalysisFilteringSlot( -          hQmfAnalysis[psCh], -         &pWorkBuffer[2*QMF_CHANNELS], /* qmfReal[QMF_CHANNELS] */ -         &pWorkBuffer[3*QMF_CHANNELS], /* qmfImag[QMF_CHANNELS] */ -          samples[psCh]+i*(hQmfAnalysis[psCh]->no_channels*timeInStride), -          timeInStride, -         &pWorkBuffer[0*QMF_CHANNELS]  /* qmf workbuffer 2*QMF_CHANNELS */ -          ); - -      FDKhybridAnalysisApply( -         &hParametricStereo->fdkHybAnaFilter[psCh], -         &pWorkBuffer[2*QMF_CHANNELS],  /* qmfReal[QMF_CHANNELS] */ -         &pWorkBuffer[3*QMF_CHANNELS],  /* qmfImag[QMF_CHANNELS] */ -          hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][psCh][0], -          hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][psCh][1] -          ); - -    } /* no_col loop  i  */ - -    psQmfScale[psCh] = hQmfAnalysis[psCh]->outScalefactor; - -  } /* for psCh */ - -  C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS) - -  /* find best scaling in new QMF and Hybrid data */ -  psFindBestScaling( hParametricStereo, -                    &hParametricStereo->pHybridData[HYBRID_READ_OFFSET], -                     hParametricStereo->dynBandScale, -                     hParametricStereo->maxBandValue, -                    &hParametricStereo->dmxScale ) ; - - -  /* extract the ps parameters */ -  if(PSENC_OK != (error = ExtractPSParameters(hParametricStereo, sendHeader, &hParametricStereo->pHybridData[0]))){ -    goto bail; -  } - -  /* save hybrid date for next frame */ -  for (i=0; i<HYBRID_READ_OFFSET; i++) { -    FDKmemcpy(hParametricStereo->pHybridData[i][0][0], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][0][0], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* left, real */ -    FDKmemcpy(hParametricStereo->pHybridData[i][0][1], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][0][1], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* left, imag */ -    FDKmemcpy(hParametricStereo->pHybridData[i][1][0], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][1][0], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* right, real */ -    FDKmemcpy(hParametricStereo->pHybridData[i][1][1], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][1][1], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* right, imag */ -  } - -  /* downmix and hybrid synthesis */ -  if (PSENC_OK != (error = DownmixPSQmfData(hParametricStereo, sbrSynthQmf, downmixedRealQmfData, downmixedImagQmfData, downsampledOutSignal, &hParametricStereo->pHybridData[HYBRID_READ_OFFSET], hParametricStereo->noQmfSlots, psQmfScale, qmfScale))) { -    goto bail; -  } - -bail: - -  return error; -} - -static void psFindBestScaling( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        FIXP_DBL                 *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], -        UCHAR                    *dynBandScale, -        FIXP_QMF                 *maxBandValue, -        SCHAR                    *dmxScale -        ) -{ -  HANDLE_PS_ENCODE hPsEncode      =  hParametricStereo->hPsEncode; - -  INT group, bin, col, band; -  const INT frameSize  = hParametricStereo->noQmfSlots; -  const INT psBands    = (INT) hPsEncode->psEncMode; -  const INT nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; - -  /* group wise scaling */ -  FIXP_QMF maxVal [2][PS_MAX_BANDS]; -  FIXP_QMF maxValue = FL2FXCONST_DBL(0.f); - -  FDKmemclear(maxVal, sizeof(maxVal)); - -  /* start with hybrid data */ -  for (group=0; group < nIidGroups; group++) { -    /* Translate group to bin */ -    bin = hPsEncode->subband2parameterIndex[group]; - -    /* Translate from 20 bins to 10 bins */ -    if (hPsEncode->psEncMode == PS_BANDS_COARSE) { -      bin >>= 1; -    } - -    /* QMF downmix scaling */ -    { -      FIXP_QMF tmp = maxVal[0][bin]; -      int i; -      for (col=0; col<frameSize-HYBRID_READ_OFFSET; col++) { -        for (i = hPsEncode->iidGroupBorders[group]; i < hPsEncode->iidGroupBorders[group+1]; i++) { -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][0][i])); -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][1][i])); -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][0][i])); -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][1][i])); -        } -      } -      maxVal[0][bin] = tmp; - -      tmp = maxVal[1][bin]; -      for (col=frameSize-HYBRID_READ_OFFSET; col<frameSize; col++) { -        for (i = hPsEncode->iidGroupBorders[group]; i < hPsEncode->iidGroupBorders[group+1]; i++) { -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][0][i])); -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][1][i])); -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][0][i])); -          tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][1][i])); -        } -      } -      maxVal[1][bin] = tmp; -    } -  } /* nIidGroups */ - -  /* convert maxSpec to maxScaling, find scaling space */ -  for (band=0; band<psBands; band++) { -#ifndef MULT_16x16 -    dynBandScale[band] = CountLeadingBits(fixMax(maxVal[0][band],maxBandValue[band])); -#else -    dynBandScale[band] = fixMax(0,CountLeadingBits(fixMax(maxVal[0][band],maxBandValue[band]))-FRACT_BITS); -#endif -    maxValue = fixMax(maxValue,fixMax(maxVal[0][band],maxVal[1][band])); -    maxBandValue[band] = fixMax(maxVal[0][band], maxVal[1][band]); -  } - -  /* calculate maximal scaling for QMF downmix */ -#ifndef MULT_16x16 -  *dmxScale = fixMin(DFRACT_BITS, CountLeadingBits(maxValue)); -#else -  *dmxScale = fixMax(0,fixMin(FRACT_BITS, CountLeadingBits(FX_QMF2FX_DBL(maxValue)))); -#endif - -} - diff --git a/libSBRenc/src/ps_main.h b/libSBRenc/src/ps_main.h deleted file mode 100644 index 21b32ff..0000000 --- a/libSBRenc/src/ps_main.h +++ /dev/null @@ -1,271 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*****************************  MPEG Audio Encoder  *************************** - -   Initial Authors:      Markus Multrus -   Contents/Description: PS Wrapper, Downmix header file - -******************************************************************************/ - -#ifndef __INCLUDED_PS_MAIN_H -#define __INCLUDED_PS_MAIN_H - -/* Includes ******************************************************************/ -#include "sbr_def.h" -#include "qmf.h" -#include "ps_encode.h" -#include "FDK_bitstream.h" -#include "FDK_hybrid.h" - - -/* Data Types ****************************************************************/ -typedef enum { -  PSENC_STEREO_BANDS_INVALID = 0, -  PSENC_STEREO_BANDS_10      = 10, -  PSENC_STEREO_BANDS_20      = 20 - -} PSENC_STEREO_BANDS_CONFIG; - -typedef enum { -  PSENC_NENV_1               = 1, -  PSENC_NENV_2               = 2, -  PSENC_NENV_4               = 4, -  PSENC_NENV_DEFAULT         = PSENC_NENV_2, -  PSENC_NENV_MAX             = PSENC_NENV_4 - -} PSENC_NENV_CONFIG; - -typedef struct { -  UINT                        bitrateFrom;   /* inclusive */ -  UINT                        bitrateTo;     /* exclusive */ -  PSENC_STEREO_BANDS_CONFIG   nStereoBands; -  PSENC_NENV_CONFIG           nEnvelopes; -  LONG                        iidQuantErrorThreshold;  /* quantization threshold to switch between coarse and fine iid quantization */ - -} psTuningTable_t; - -/* Function / Class Declarations *********************************************/ - -typedef struct T_PARAMETRIC_STEREO { -  HANDLE_PS_ENCODE            hPsEncode; -  PS_OUT                      psOut[2]; - -  FIXP_DBL                    __staticHybridData[HYBRID_READ_OFFSET][MAX_PS_CHANNELS][2][MAX_HYBRID_BANDS]; -  FIXP_DBL                   *pHybridData[HYBRID_READ_OFFSET+HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2]; - -  FIXP_QMF                    qmfDelayLines[2][QMF_MAX_TIME_SLOTS>>1][QMF_CHANNELS]; -  int                         qmfDelayScale; - -  INT                         psDelay; -  UINT                        maxEnvelopes; -  UCHAR                       dynBandScale[PS_MAX_BANDS]; -  FIXP_DBL                    maxBandValue[PS_MAX_BANDS]; -  SCHAR                       dmxScale; -  INT                         initPS; -  INT                         noQmfSlots; -  INT                         noQmfBands; - -  FIXP_DBL                    __staticHybAnaStatesLF[MAX_PS_CHANNELS][2*HYBRID_FILTER_LENGTH*HYBRID_MAX_QMF_BANDS]; -  FIXP_DBL                    __staticHybAnaStatesHF[MAX_PS_CHANNELS][2*HYBRID_FILTER_DELAY*(QMF_CHANNELS-HYBRID_MAX_QMF_BANDS)]; -  FDK_ANA_HYB_FILTER          fdkHybAnaFilter[MAX_PS_CHANNELS]; -  FDK_SYN_HYB_FILTER          fdkHybSynFilter; - -} PARAMETRIC_STEREO; - - -typedef struct T_PSENC_CONFIG { -  INT                         frameSize; -  INT                         qmfFilterMode; -  INT                         sbrPsDelay; -  PSENC_STEREO_BANDS_CONFIG   nStereoBands; -  PSENC_NENV_CONFIG           maxEnvelopes; -  FIXP_DBL                    iidQuantErrorThreshold; - -} PSENC_CONFIG, *HANDLE_PSENC_CONFIG; - -typedef struct T_PARAMETRIC_STEREO *HANDLE_PARAMETRIC_STEREO; - - -/** - * \brief  Create a parametric stereo encoder instance. - * - * \param phParametricStereo    A pointer to a parametric stereo handle to be allocated. Initialized on return. - * - * \return - *          - PSENC_OK, on succes. - *          - PSENC_INVALID_HANDLE, PSENC_MEMORY_ERROR, on failure. - */ -FDK_PSENC_ERROR PSEnc_Create( -        HANDLE_PARAMETRIC_STEREO *phParametricStereo -        ); - - -/** - * \brief  Initialize a parametric stereo encoder instance. - * - * \param hParametricStereo     Meta Data handle. - * \param hPsEncConfig          Filled parametric stereo configuration structure. - * \param noQmfSlots            Number of slots within one audio frame. - * \param noQmfBands            Number of QMF bands. - * \param dynamic_RAM           Pointer to preallocated workbuffer. - * - * \return - *          - PSENC_OK, on succes. - *          - PSENC_INVALID_HANDLE, PSENC_INIT_ERROR, on failure. - */ -FDK_PSENC_ERROR PSEnc_Init( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        const HANDLE_PSENC_CONFIG hPsEncConfig, -        INT                       noQmfSlots, -        INT                       noQmfBands -       ,UCHAR                    *dynamic_RAM -        ); - - -/** - * \brief  Destroy parametric stereo encoder instance. - * - * Deallocate instance and free whole memory. - * - * \param phParametricStereo    Pointer to the parametric stereo handle to be deallocated. - * - * \return - *          - PSENC_OK, on succes. - *          - PSENC_INVALID_HANDLE, on failure. - */ -FDK_PSENC_ERROR PSEnc_Destroy( -        HANDLE_PARAMETRIC_STEREO *phParametricStereo -        ); - - -/** - * \brief  Apply parametric stereo processing. - * - * \param hParametricStereo     Meta Data handle. - * \param samples               Pointer to 2 channel audio input signal. - * \param timeInStride,         Stride factor of input buffer. - * \param hQmfAnalysis,         Pointer to QMF analysis filterbanks. - * \param downmixedRealQmfData  Pointer to real QMF buffer to be written to. - * \param downmixedImagQmfData  Pointer to imag QMF buffer to be written to. - * \param downsampledOutSignal  Pointer to buffer where to write downmixed timesignal. - * \param sbrSynthQmf           Pointer to QMF synthesis filterbank. - * \param qmfScale              Return scaling factor of the qmf data. - * \param sendHeader            Signal whether to write header data. - * - * \return - *          - PSENC_OK, on succes. - *          - PSENC_INVALID_HANDLE, PSENC_ENCODE_ERROR, on failure. - */ -FDK_PSENC_ERROR FDKsbrEnc_PSEnc_ParametricStereoProcessing( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        INT_PCM                  *samples[2], -        UINT                      timeInStride, -        QMF_FILTER_BANK         **hQmfAnalysis, -        FIXP_QMF **RESTRICT       downmixedRealQmfData, -        FIXP_QMF **RESTRICT       downmixedImagQmfData, -        INT_PCM                  *downsampledOutSignal, -        HANDLE_QMF_FILTER_BANK    sbrSynthQmf, -        SCHAR                    *qmfScale, -        const int                 sendHeader -        ); - - -/** - * \brief  Write parametric stereo bitstream. - * - * Write ps_data() element to bitstream and return number of written bits. - * Returns number of written bits only, if hBitstream == NULL. - * - * \param hParametricStereo     Meta Data handle. - * \param hBitstream            Bitstream buffer handle. - * - * \return - *          - number of written bits. - */ -INT FDKsbrEnc_PSEnc_WritePSData( -        HANDLE_PARAMETRIC_STEREO  hParametricStereo, -        HANDLE_FDK_BITSTREAM      hBitstream -        ); - -#endif /* __INCLUDED_PS_MAIN_H */ diff --git a/libSBRenc/src/resampler.cpp b/libSBRenc/src/resampler.cpp deleted file mode 100644 index 4adb243..0000000 --- a/libSBRenc/src/resampler.cpp +++ /dev/null @@ -1,507 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  FDK resampler tool box:  -  \author M. Werner -*/ - -#include "resampler.h" - -#include "genericStds.h" - - -/**************************************************************************/ -/*                   BIQUAD Filter Specifications                         */ -/**************************************************************************/ - -#define B1 0 -#define B2 1 -#define A1 2 -#define A2 3 - -#define BQC(x) FL2FXCONST_SGL(x/2) - - -struct FILTER_PARAM { -  const FIXP_SGL *coeffa;    /*! SOS matrix One row/section. Scaled using BQC(). Order of coefficients: B1,B2,A1,A2. B0=A0=1.0 */ -  FIXP_DBL g;                /*! overall gain */ -  int Wc;                    /*! normalized passband bandwidth at input samplerate * 1000 */ -  int noCoeffs;              /*! number of filter coeffs */ -  int delay;                 /*! delay in samples at input samplerate */ -}; - -#define BIQUAD_COEFSTEP 4 - -/** - *\brief Low Pass - Wc = 0,5, order 30, Stop Band -96dB. Wc criteria is "almost 0dB passband", not the usual -3db gain point. - [b,a]=cheby2(30,96,0.505) - [sos,g]=tf2sos(b,a) - bandwidth 0.48 - */ -static const FIXP_SGL sos48[] = { - BQC(1.98941075681938),   BQC(0.999999996890811), BQC(0.863264527201963),     BQC( 0.189553799960663), - BQC(1.90733804822445),   BQC(1.00000001736189),  BQC(0.836321575841691),     BQC( 0.203505809266564), - BQC(1.75616665495325),   BQC(0.999999946079721), BQC(0.784699225121588),     BQC( 0.230471265506986), - BQC(1.55727745512726),   BQC(1.00000011737815),  BQC(0.712515423588351),     BQC( 0.268752723900498), - BQC(1.33407591943643),   BQC(0.999999795953228), BQC(0.625059117330989),     BQC( 0.316194685288965), - BQC(1.10689898412458),   BQC(1.00000035057114),  BQC(0.52803514366398),      BQC( 0.370517843224669), - BQC(0.89060371078454),   BQC(0.999999343962822), BQC(0.426920462165257),     BQC( 0.429608200207746), - BQC(0.694438261209433),  BQC( 1.0000008629792),  BQC(0.326530699561716),     BQC( 0.491714450654174), - BQC(0.523237800935322),  BQC(1.00000101349782),  BQC(0.230829556274851),     BQC( 0.555559034843281), - BQC(0.378631165929563),  BQC(0.99998986482665),  BQC(0.142906422036095),     BQC( 0.620338874442411), - BQC(0.260786911308437),  BQC(1.00003261460178),  BQC(0.0651008576256505),    BQC( 0.685759923926262), - BQC(0.168409429188098),  BQC(0.999933049695828), BQC(-0.000790067789975562), BQC( 0.751905896602325), - BQC(0.100724533818628),  BQC(1.00009472669872),  BQC(-0.0533772830257041),   BQC( 0.81930744384525), - BQC(0.0561434357867363), BQC(0.999911636304276), BQC(-0.0913550299236405),   BQC( 0.88883625875915), - BQC(0.0341680678662057), BQC(1.00003667508676),  BQC(-0.113405185536697),    BQC( 0.961756638268446) -}; - -#ifdef RS_BIQUAD_SCATTERGAIN -static const FIXP_DBL g48 = FL2FXCONST_DBL(0.67436532061161992682404480717671 - 0.001); -#else -static const FIXP_DBL g48 = FL2FXCONST_DBL(0.002712866530047) - (FIXP_DBL)0x8000; -#endif - -static const struct FILTER_PARAM param_set48 = { -  sos48, -  g48, -  480, -  15, -  4 /* LF 2 */ -}; - -/** - *\brief Low Pass - Wc = 0,5, order 24, Stop Band -96dB. Wc criteria is "almost 0dB passband", not the usual -3db gain point. - [b,a]=cheby2(24,96,0.5) - [sos,g]=tf2sos(b,a) - bandwidth 0.45 - */ -static const FIXP_SGL sos45[] = { -  BQC(1.982962601444),     BQC(1.00000000007504),  BQC(0.646113303737836),   BQC( 0.10851149979981), -  BQC(1.85334094281111),   BQC(0.999999999677192), BQC(0.612073220102006),   BQC( 0.130022141698044), -  BQC(1.62541051415425),   BQC(1.00000000080398),  BQC(0.547879702855959),   BQC( 0.171165825133192), -  BQC(1.34554656923247),   BQC(0.9999999980169),   BQC(0.460373914508491),   BQC( 0.228677463376354), -  BQC(1.05656568503116),   BQC(1.00000000569363),  BQC(0.357891894038287),   BQC( 0.298676843912185), -  BQC(0.787967587877312),  BQC(0.999999984415017), BQC(0.248826893211877),   BQC( 0.377441803512978), -  BQC(0.555480971120497),  BQC(1.00000003583307),  BQC(0.140614263345315),   BQC( 0.461979302213679), -  BQC(0.364986207070964),  BQC(0.999999932084303), BQC(0.0392669446074516),  BQC( 0.55033451180825), -  BQC(0.216827267631558),  BQC(1.00000010534682),  BQC(-0.0506232228865103), BQC( 0.641691581560946), -  BQC(0.108951672277119),  BQC(0.999999871167516), BQC(-0.125584840183225),  BQC( 0.736367748771803), -  BQC(0.0387988607229035), BQC(1.00000011205574),  BQC(-0.182814849097974),  BQC( 0.835802108714964), -  BQC(0.0042866175809225), BQC(0.999999954830813), BQC(-0.21965740617151),   BQC( 0.942623047782363) -}; - -#ifdef RS_BIQUAD_SCATTERGAIN -static const FIXP_DBL g45 = FL2FXCONST_DBL(0.60547428891341319051142629706723 - 0.001); -#else -static const FIXP_DBL g45 = FL2FXCONST_DBL(0.00242743980909524) - (FIXP_DBL)0x8000; -#endif - -static const struct FILTER_PARAM param_set45 = { -  sos45, -  g45, -  450, -  12, -  4 /* LF 2 */ -}; - -/* - Created by Octave 2.1.73, Mon Oct 13 17:31:32 2008 CEST - Wc = 0,5, order 16, Stop Band -96dB damping. - [b,a]=cheby2(16,96,0.5) - [sos,g]=tf2sos(b,a) - bandwidth = 0.41 - */ - -static const FIXP_SGL sos41[] = -{ -  BQC(1.96193625292),       BQC(0.999999999999964), BQC(0.169266178786789),   BQC(0.0128823300475907), -  BQC(1.68913437662092),    BQC(1.00000000000053),  BQC(0.124751503206552),   BQC(0.0537472273950989), -  BQC(1.27274692366017),    BQC(0.999999999995674), BQC(0.0433108625178357),  BQC(0.131015753236317), -  BQC(0.85214175088395),    BQC(1.00000000001813),  BQC(-0.0625658152550408), BQC(0.237763778993806), -  BQC(0.503841579939009),   BQC(0.999999999953223), BQC(-0.179176128722865),  BQC(0.367475236424474), -  BQC(0.249990711986162),   BQC(1.00000000007952),  BQC(-0.294425165824676),  BQC(0.516594857170212), -  BQC(0.087971668680286),   BQC(0.999999999915528), BQC(-0.398956566777928),  BQC(0.686417767801123), -  BQC(0.00965373325350294), BQC(1.00000000003744),  BQC(-0.48579173764817),   BQC(0.884931534239068) -}; - -#ifdef RS_BIQUAD_SCATTERGAIN -static const FIXP_DBL g41 = FL2FXCONST_DBL(0.44578514476476679750811222123569); -#else -static const FIXP_DBL g41 = FL2FXCONST_DBL(0.00155956951169248); -#endif - -static const struct FILTER_PARAM param_set41 = { -  sos41, -  g41, -  410, -  8, -  5 /* LF 3 */ -}; - -/* - # Created by Octave 2.1.73, Mon Oct 13 17:55:33 2008 CEST - Wc = 0,5, order 12, Stop Band -96dB damping. - [b,a]=cheby2(12,96,0.5); - [sos,g]=tf2sos(b,a) -*/ -static const FIXP_SGL sos35[] = -{ -  BQC(1.93299325235762),   BQC(0.999999999999985), BQC(-0.140733187246596), BQC(0.0124139497836062), -  BQC(1.4890416764109),    BQC(1.00000000000011),  BQC(-0.198215402588504), BQC(0.0746730616584138), -  BQC(0.918450161309795),  BQC(0.999999999999619), BQC(-0.30133912791941),  BQC(0.192276468839529), -  BQC(0.454877024246818),  BQC(1.00000000000086),  BQC(-0.432337328809815), BQC(0.356852933642815), -  BQC(0.158017147118507),  BQC(0.999999999998876), BQC(-0.574817494249777), BQC(0.566380436970833), -  BQC(0.0171834649478749), BQC(1.00000000000055),  BQC(-0.718581178041165), BQC(0.83367484487889) -}; - -#ifdef RS_BIQUAD_SCATTERGAIN -static const FIXP_DBL g35 = FL2FXCONST_DBL(0.34290853574973898694521267606792); -#else -static const FIXP_DBL g35 = FL2FXCONST_DBL(0.00162580994125131); -#endif - -static const struct FILTER_PARAM param_set35 = { -  sos35, -  g35, -  350, -  6, -  4 -}; - -/* - # Created by Octave 2.1.73, Mon Oct 13 18:15:38 2008 CEST - Wc = 0,5, order 8, Stop Band -96dB damping. - [b,a]=cheby2(8,96,0.5); - [sos,g]=tf2sos(b,a) -*/ -static const FIXP_SGL sos25[] = -{ -  BQC(1.85334094301225),   BQC(1.0),               BQC(-0.702127214212663), BQC(0.132452403998767), -  BQC(1.056565682167),     BQC(0.999999999999997), BQC(-0.789503667880785), BQC(0.236328693569128), -  BQC(0.364986307455489),  BQC(0.999999999999996), BQC(-0.955191189843375), BQC(0.442966457936379), -  BQC(0.0387985751642125), BQC(1.0),               BQC(-1.19817786088084),  BQC(0.770493895456328) -}; - -#ifdef RS_BIQUAD_SCATTERGAIN -static const FIXP_DBL g25 = FL2FXCONST_DBL(0.17533917408936346960080259950471); -#else -static const FIXP_DBL g25 = FL2FXCONST_DBL(0.000945182835294559); -#endif - -static const struct FILTER_PARAM param_set25 = { -  sos25, -  g25, -  250, -  4, -  5 -}; - -/* Must be sorted in descending order */ -static const struct FILTER_PARAM *const filter_paramSet[] = { -  ¶m_set48, -  ¶m_set45, -  ¶m_set41, -  ¶m_set35, -  ¶m_set25 -}; - - -/**************************************************************************/ -/*                         Resampler Functions                            */ -/**************************************************************************/ - - -/*! -  \brief   Reset downsampler instance and clear delay lines - -  \return  success of operation -*/ - -INT FDKaacEnc_InitDownsampler(DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ -                              int Wc,                   /*!< normalized cutoff freq * 1000*  */ -                              int ratio)                /*!< downsampler ratio (only 2 supported at the momment) */ - -{ -  UINT i; -  const struct FILTER_PARAM *currentSet=NULL; - -  FDK_ASSERT(ratio == 2); -  FDKmemclear(DownSampler->downFilter.states, sizeof(DownSampler->downFilter.states)); -  DownSampler->downFilter.ptr   =   0; - -  /* -    find applicable parameter set -  */ -  currentSet = filter_paramSet[0]; -  for(i=1;i<sizeof(filter_paramSet)/sizeof(struct FILTER_PARAM *);i++){ -    if (filter_paramSet[i]->Wc <= Wc) { -      break; -    } -    currentSet = filter_paramSet[i]; -  } - -  DownSampler->downFilter.coeffa = currentSet->coeffa; - - -  DownSampler->downFilter.gain = currentSet->g; -  FDK_ASSERT(currentSet->noCoeffs <= MAXNR_SECTIONS*2); - -  DownSampler->downFilter.noCoeffs = currentSet->noCoeffs; -  DownSampler->delay = currentSet->delay; -  DownSampler->downFilter.Wc = currentSet->Wc; - -  DownSampler->ratio =   ratio; -  DownSampler->pending = ratio-1; -  return(1); -} - - -/*! -  \brief   faster simple folding operation -           Filter: -           H(z) = A(z)/B(z) -           with -           A(z) = a[0]*z^0 + a[1]*z^1 + a[2]*z^2 ... a[n]*z^n - -  \return  filtered value -*/ - -static inline INT_PCM AdvanceFilter(LP_FILTER *downFilter,  /*!< pointer to iir filter instance */ -                                     INT_PCM  *pInput,          /*!< input of filter                */ -                                     int downRatio, -                                     int inStride) -{ -  INT_PCM output; -  int i, n; - - -#ifdef RS_BIQUAD_SCATTERGAIN -#define BIQUAD_SCALE 3 -#else -#define BIQUAD_SCALE 12 -#endif - -  FIXP_DBL y = FL2FXCONST_DBL(0.0f); -  FIXP_DBL input; - -  for (n=0; n<downRatio; n++) -  { -    FIXP_BQS (*states)[2] = downFilter->states; -    const FIXP_SGL *coeff = downFilter->coeffa; -    int s1,s2; - -    s1 = downFilter->ptr; -    s2 = s1 ^ 1; - -#if (SAMPLE_BITS == 16) -    input =  ((FIXP_DBL)pInput[n*inStride]) << (DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE); -#elif (SAMPLE_BITS == 32) -    input =  pInput[n*inStride] >> BIQUAD_SCALE; -#else -#error NOT IMPLEMENTED -#endif - -#ifndef RS_BIQUAD_SCATTERGAIN /* Merged Direct form I */ - -    FIXP_BQS state1, state2, state1b, state2b; - -    state1 = states[0][s1]; -    state2 = states[0][s2]; - -    /* Loop over sections */ -    for (i=0; i<downFilter->noCoeffs; i++) -    { -      FIXP_DBL state0; - -      /* Load merged states (from next section) */ -      state1b = states[i+1][s1]; -      state2b = states[i+1][s2]; - -      state0 = input  + fMult(state1, coeff[B1]) + fMult(state2, coeff[B2]); -      y      = state0 - fMult(state1b, coeff[A1]) - fMult(state2b, coeff[A2]); - -      /* Store new feed forward merge state */ -      states[i+1][s2] = y<<1; -      /* Store new feed backward state */ -      states[i][s2] = input<<1; - -      /* Feedback output to next section. */ -      input = y; - -      /* Transfer merged states */ -      state1 = state1b; -      state2 = state2b; - -      /* Step to next coef set */ -      coeff += BIQUAD_COEFSTEP; -    } -    downFilter->ptr ^= 1; -  } -  /* Apply global gain */ -  y = fMult(y, downFilter->gain); - -#else /* Direct form II */ - -    /* Loop over sections */ -    for (i=0; i<downFilter->noCoeffs; i++) -    { -      FIXP_BQS state1, state2; -      FIXP_DBL state0; - -      /* Load states */ -      state1 = states[i][s1]; -      state2 = states[i][s2]; - -      state0 = input  - fMult(state1, coeff[A1]) - fMult(state2, coeff[A2]); -      y = state0      + fMult(state1, coeff[B1]) + fMult(state2, coeff[B2]); -      /* Apply scattered gain */ -      y = fMult(y, downFilter->gain); - -      /* Store new state in normalized form */ -#ifdef RS_BIQUAD_STATES16 -      /* Do not saturate any state value ! The result would be unacceptable. Rounding makes SNR around 10dB better. */ -      states[i][s2] = (FIXP_BQS)(LONG)((state0 + (FIXP_DBL)(1<<(DFRACT_BITS-FRACT_BITS-2))) >> (DFRACT_BITS-FRACT_BITS-1)); -#else -      states[i][s2] = state0<<1; -#endif - -      /* Feedback output to next section. */ -      input=y; - -      /* Step to next coef set */ -      coeff += BIQUAD_COEFSTEP; -    } -    downFilter->ptr ^= 1; -  } - -#endif - -  /* Apply final gain/scaling to output */ -#if (SAMPLE_BITS == 16) -  output = (INT_PCM) SATURATE_RIGHT_SHIFT(y+(FIXP_DBL)(1<<(DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE-1)), DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE, SAMPLE_BITS); -  //output = (INT_PCM) SATURATE_RIGHT_SHIFT(y, DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE, SAMPLE_BITS); -#else -  output = SATURATE_LEFT_SHIFT(y, BIQUAD_SCALE, SAMPLE_BITS); -#endif - - -  return output; -} - - - - -/*! -  \brief   FDKaacEnc_Downsample numInSamples of type INT_PCM -           Returns number of output samples in numOutSamples - -  \return  success of operation -*/ - -INT FDKaacEnc_Downsample(DOWNSAMPLER *DownSampler,  /*!< pointer to downsampler instance */ -                         INT_PCM *inSamples,        /*!< pointer to input samples */ -                         INT numInSamples,          /*!< number  of input samples  */ -                         INT inStride,              /*!< increment of input samples */ -                         INT_PCM *outSamples,       /*!< pointer to output samples */ -                         INT *numOutSamples,        /*!< pointer tp number of output samples */ -                         INT outStride              /*!< increment of output samples */ -                         ) -{ -    INT i; -    *numOutSamples=0; - -    for(i=0; i<numInSamples; i+=DownSampler->ratio) -    { -      *outSamples = AdvanceFilter(&(DownSampler->downFilter), &inSamples[i*inStride], DownSampler->ratio, inStride); -      outSamples += outStride; -    } -    *numOutSamples = numInSamples/DownSampler->ratio; - -    return 0; -} - diff --git a/libSBRenc/src/resampler.h b/libSBRenc/src/resampler.h deleted file mode 100644 index 0192970..0000000 --- a/libSBRenc/src/resampler.h +++ /dev/null @@ -1,151 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#ifndef __RESAMPLER_H -#define __RESAMPLER_H -/*! -  \file -  \brief  Fixed Point Resampler Tool Box   -*/ - -#include "common_fix.h" - - -/**************************************************************************/ -/*                         BIQUAD Filter Structure                           */ -/**************************************************************************/ - -#define MAXNR_SECTIONS  (15) - -#ifdef RS_BIQUAD_STATES16 -typedef FIXP_SGL FIXP_BQS; -#else -typedef FIXP_DBL FIXP_BQS; -#endif - -typedef struct -{ -  FIXP_BQS states[MAXNR_SECTIONS+1][2];   /*! state buffer */ -  const FIXP_SGL *coeffa;               /*! pointer to filter coeffs */ -  FIXP_DBL gain;                        /*! overall gain factor */ -  int Wc;                               /*! normalized cutoff freq * 1000 */ -  int noCoeffs;                         /*! number of filter coeffs sets */ -  int ptr;                              /*! index to rinbuffers */ -} LP_FILTER; - - -/**************************************************************************/ -/*                        Downsampler Structure                           */ -/**************************************************************************/ - -typedef struct -{ -  LP_FILTER downFilter;           /*! filter instance */ -  int ratio;                      /*! downsampling ration */ -  int delay;                      /*! downsampling delay (source fs)   */ -  int pending;                    /*! number of pending output samples */ -} DOWNSAMPLER; - - -/** - * \brief Initialized a given downsampler structure. - */ -INT FDKaacEnc_InitDownsampler(DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ -                              INT Wc,                   /*!< normalized cutoff freq * 1000 */ -                              INT ratio);               /*!< downsampler ratio */ - -/** - * \brief Downsample a set of audio samples. numInSamples must be at least equal to the - *        downsampler ratio. - */ -INT FDKaacEnc_Downsample(DOWNSAMPLER *DownSampler,  /*!< pointer to downsampler instance */ -                         INT_PCM *inSamples,        /*!< pointer to input samples */ -                         INT numInSamples,          /*!< number  of input samples  */ -                         INT inStride,              /*!< increment of input samples      */ -                         INT_PCM *outSamples,       /*!< pointer to output samples */ -                         INT *numOutSamples,        /*!< pointer tp number of output samples */ -                         INT outstride);            /*!< increment of output samples */ - - - -#endif /* __RESAMPLER_H */ diff --git a/libSBRenc/src/sbr.h b/libSBRenc/src/sbr.h deleted file mode 100644 index c74ad2a..0000000 --- a/libSBRenc/src/sbr.h +++ /dev/null @@ -1,166 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Main SBR structs definitions   -*/ - -#ifndef __SBR_H -#define __SBR_H - -#include "fram_gen.h" -#include "bit_sbr.h" -#include "tran_det.h" -#include "code_env.h" -#include "env_est.h" -#include "cmondata.h" - -#include "qmf.h" -#include "resampler.h" - -#include "ton_corr.h" - - -/* SBR bitstream delay */ -  #define DELAY_FRAMES 2 - - -typedef struct SBR_CHANNEL { -    struct ENV_CHANNEL        hEnvChannel; -    //INT_PCM                  *pDSOutBuffer;            /**< Pointer to downsampled audio output of SBR encoder */ -    DOWNSAMPLER               downSampler; - -} SBR_CHANNEL; -typedef SBR_CHANNEL* HANDLE_SBR_CHANNEL; - -typedef struct SBR_ELEMENT { -    HANDLE_SBR_CHANNEL        sbrChannel[2]; -    QMF_FILTER_BANK          *hQmfAnalysis[2]; -    SBR_CONFIG_DATA           sbrConfigData; -    SBR_HEADER_DATA           sbrHeaderData; -    SBR_BITSTREAM_DATA        sbrBitstreamData; -    COMMON_DATA               CmonData; -    INT                       dynXOverFreqDelay[5];    /**< to delay a frame (I don't like it that much that way - hrc) */ -    SBR_ELEMENT_INFO          elInfo; - -    UCHAR                     payloadDelayLine[1+DELAY_FRAMES][MAX_PAYLOAD_SIZE]; -    UINT                      payloadDelayLineSize[1+DELAY_FRAMES];                 /* Sizes in bits */ - -} SBR_ELEMENT, *HANDLE_SBR_ELEMENT; - -typedef struct SBR_ENCODER -{ -  HANDLE_SBR_ELEMENT   sbrElement[(8)]; -  HANDLE_SBR_CHANNEL   pSbrChannel[(8)]; -  QMF_FILTER_BANK      QmfAnalysis[(8)]; -  DOWNSAMPLER          lfeDownSampler; -  int                  lfeChIdx;                 /* -1 default for no lfe, else assign channel index */ -  int                  noElements;               /* Number of elements */ -  int                  nChannels;                /* Total channel count across all elements. */ -  int                  frameSize;                /* SBR framelength. */ -  int                  bufferOffset;             /* Offset for SBR parameter extraction in time domain input buffer. */ -  int                  downsampledOffset;        /* Offset of downsampled/mixed output for core encoder. */ -  int                  downmixSize;              /* Size in samples of downsampled/mixed output for core encoder. */ -  INT                  downSampleFactor;         /* Sampling rate relation between the SBR and the core encoder. */ -  int                  fTimeDomainDownsampling;  /* Flag signalling time domain downsampling instead of QMF downsampling. */ -  int                  nBitstrDelay;             /* Amount of SBR frames to be delayed in bitstream domain. */ -  INT                  estimateBitrate;          /* estimate bitrate of SBR encoder */ -  INT                  inputDataDelay;           /* delay caused by downsampler, in/out buffer at sbrEncoder_EncodeFrame */ - -  UCHAR* dynamicRam; -  UCHAR* pSBRdynamic_RAM; - -  HANDLE_PARAMETRIC_STEREO  hParametricStereo; -  QMF_FILTER_BANK           qmfSynthesisPS; - -  /* parameters describing allocation volume of present instance */ -  INT                  maxElements; -  INT                  maxChannels; -  INT                  supportPS; - - -} SBR_ENCODER; - - -#endif /* __SBR_H */ diff --git a/libSBRenc/src/sbr_def.h b/libSBRenc/src/sbr_def.h deleted file mode 100644 index 8b7cfc6..0000000 --- a/libSBRenc/src/sbr_def.h +++ /dev/null @@ -1,279 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  SBR main definitions   -*/ -#ifndef __SBR_DEF_H -#define __SBR_DEF_H - -#include "common_fix.h" - -#define noError 0 -#define HANDLE_ERROR_INFO INT -#define ERROR(a,b) 1 -#define handBack - -/* #define SBR_ENV_STATISTICS_BITRATE */ -#undef SBR_ENV_STATISTICS_BITRATE - -/* #define SBR_ENV_STATISTICS */ -#undef SBR_ENV_STATISTICS - -/* #define SBR_PAYLOAD_MONITOR */ -#undef SBR_PAYLOAD_MONITOR - -#define SWAP(a,b)                               tempr=a, a=b, b=tempr -#define TRUE  1 -#define FALSE 0 - - -/* Constants */ -#define EPS                                     1e-12 -#define LOG2                                    0.69314718056f  /* natural logarithm of 2 */ -#define ILOG2                                   1.442695041f    /* 1/LOG2 */ -#define RELAXATION_FLOAT                        (1e-6f) -#define RELAXATION                              (FL2FXCONST_DBL(RELAXATION_FLOAT)) -#define RELAXATION_FRACT                        (FL2FXCONST_DBL(0.524288f))     /* 0.524288f is fractional part of RELAXATION */ -#define RELAXATION_SHIFT                        (19) -#define RELAXATION_LD64                         (FL2FXCONST_DBL(0.31143075889f))/* (ld64(RELAXATION) */ - -/************  Definitions ***************/ -#define SBR_COMP_MODE_DELTA                     0 -#define SBR_COMP_MODE_CTS                       1 - -#define MAX_NUM_CHANNELS                        2 - -#define MAX_NOISE_ENVELOPES                     2 -#define MAX_NUM_NOISE_COEFFS                    5 -#define MAX_NUM_NOISE_VALUES                    (MAX_NUM_NOISE_COEFFS*MAX_NOISE_ENVELOPES) - -#define MAX_NUM_ENVELOPE_VALUES                 (MAX_ENVELOPES * MAX_FREQ_COEFFS) -#define MAX_ENVELOPES                           5 -#define MAX_FREQ_COEFFS                         48 - -#define MAX_FREQ_COEFFS_FS44100                 35 -#define MAX_FREQ_COEFFS_FS48000                 32 - - -#define QMF_CHANNELS                            64 -#define QMF_FILTER_LENGTH                      640 -#define QMF_MAX_TIME_SLOTS                      32 -#define NO_OF_ESTIMATES_LC                      4 -#define NO_OF_ESTIMATES_LD                      3 -#define MAX_NO_OF_ESTIMATES                     4 - - -#define NOISE_FLOOR_OFFSET                      6 -#define NOISE_FLOOR_OFFSET_64                   (FL2FXCONST_DBL(0.09375f)) - -#define LOW_RES                                 0 -#define HIGH_RES                                1 - -#define LO                                      0 -#define HI                                      1 - -#define LENGTH_SBR_FRAME_INFO                   35      /* 19 */ - -#define SBR_NSFB_LOW_RES                        9       /*  8 */ -#define SBR_NSFB_HIGH_RES                       18      /* 16 */ - - -#define SBR_XPOS_CTRL_DEFAULT                   2 - -#define SBR_FREQ_SCALE_DEFAULT                  2 -#define SBR_ALTER_SCALE_DEFAULT                 1 -#define SBR_NOISE_BANDS_DEFAULT                 2 - -#define SBR_LIMITER_BANDS_DEFAULT               2 -#define SBR_LIMITER_GAINS_DEFAULT               2 -#define SBR_LIMITER_GAINS_INFINITE              3 -#define SBR_INTERPOL_FREQ_DEFAULT               1 -#define SBR_SMOOTHING_LENGTH_DEFAULT            0 - - -/* sbr_header */ -#define SI_SBR_AMP_RES_BITS                     1 -#define SI_SBR_COUPLING_BITS                    1 -#define SI_SBR_START_FREQ_BITS                  4 -#define SI_SBR_STOP_FREQ_BITS                   4 -#define SI_SBR_XOVER_BAND_BITS                  3 -#define SI_SBR_RESERVED_BITS                    2 -#define SI_SBR_DATA_EXTRA_BITS                  1 -#define SI_SBR_HEADER_EXTRA_1_BITS              1 -#define SI_SBR_HEADER_EXTRA_2_BITS              1 - -/* sbr_header extra 1 */ -#define SI_SBR_FREQ_SCALE_BITS                  2 -#define SI_SBR_ALTER_SCALE_BITS                 1 -#define SI_SBR_NOISE_BANDS_BITS                 2 - -/* sbr_header extra 2 */ -#define SI_SBR_LIMITER_BANDS_BITS               2 -#define SI_SBR_LIMITER_GAINS_BITS               2 -#define SI_SBR_INTERPOL_FREQ_BITS               1 -#define SI_SBR_SMOOTHING_LENGTH_BITS            1 - -/* sbr_grid */ -#define SBR_CLA_BITS                            2   /*!< size of bs_frame_class */ -#define SBR_CLA_BITS_LD                         1   /*!< size of bs_frame_class */ -#define SBR_ENV_BITS                            2   /*!< size of bs_num_env_raw */ -#define SBR_ABS_BITS                            2   /*!< size of bs_abs_bord_raw for HE-AAC */ -#define SBR_NUM_BITS                            2   /*!< size of bs_num_rel */ -#define SBR_REL_BITS                            2   /*!< size of bs_rel_bord_raw */ -#define SBR_RES_BITS                            1   /*!< size of bs_freq_res_flag */ -#define SBR_DIR_BITS                            1   /*!< size of bs_df_flag */ - - -/* sbr_data */ -#define SI_SBR_INVF_MODE_BITS                   2 - - -#define SI_SBR_START_ENV_BITS_AMP_RES_3_0           6 -#define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0   5 -#define SI_SBR_START_NOISE_BITS_AMP_RES_3_0         5 -#define SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0 5 - -#define SI_SBR_START_ENV_BITS_AMP_RES_1_5           7 -#define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5   6 - - -#define SI_SBR_EXTENDED_DATA_BITS               1 -#define SI_SBR_EXTENSION_SIZE_BITS              4 -#define SI_SBR_EXTENSION_ESC_COUNT_BITS         8 -#define SI_SBR_EXTENSION_ID_BITS                2 - -#define SBR_EXTENDED_DATA_MAX_CNT               (15+255) - -#define EXTENSION_ID_PS_CODING                  2 - -/* Envelope coding constants */ -#define FREQ                      0 -#define TIME                      1 - - -/* huffman tables */ -#define CODE_BOOK_SCF_LAV00         60 -#define CODE_BOOK_SCF_LAV01         31 -#define CODE_BOOK_SCF_LAV10         60 -#define CODE_BOOK_SCF_LAV11         31 -#define CODE_BOOK_SCF_LAV_BALANCE11 12 -#define CODE_BOOK_SCF_LAV_BALANCE10 24 - -typedef enum -{ -  SBR_AMP_RES_1_5=0, -  SBR_AMP_RES_3_0 -} -AMP_RES; - -typedef enum -{ -  XPOS_MDCT, -  XPOS_MDCT_CROSS, -  XPOS_LC, -  XPOS_RESERVED, -  XPOS_SWITCHED /* not a real choice but used here to control behaviour */ -} -XPOS_MODE; - -typedef enum -{ -  INVF_OFF = 0, -  INVF_LOW_LEVEL, -  INVF_MID_LEVEL, -  INVF_HIGH_LEVEL, -  INVF_SWITCHED /* not a real choice but used here to control behaviour */ -} -INVF_MODE; - -typedef enum -{ -  FREQ_RES_LOW = 0, -  FREQ_RES_HIGH -} -FREQ_RES; - - -#endif diff --git a/libSBRenc/src/sbr_encoder.cpp b/libSBRenc/src/sbr_encoder.cpp deleted file mode 100644 index 3e95d6b..0000000 --- a/libSBRenc/src/sbr_encoder.cpp +++ /dev/null @@ -1,2346 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/***************************  Fraunhofer IIS FDK Tools  *********************** - -   Author(s): Andreas Ehret, Tobias Chalupka -   Description: SBR encoder top level processing. - -******************************************************************************/ - -#include "sbr_encoder.h" - -#include "sbr_ram.h" -#include "sbr_rom.h" -#include "sbrenc_freq_sca.h" -#include "env_bit.h" -#include "cmondata.h" -#include "sbr_misc.h" -#include "sbr.h" -#include "qmf.h" - -#include "ps_main.h" - -#define SBRENCODER_LIB_VL0 3 -#define SBRENCODER_LIB_VL1 3 -#define SBRENCODER_LIB_VL2 4 - - - -/***************************************************************************/ -/* - * SBR Delay balancing definitions. - */ - -/* -      input buffer (1ch) - -      |------------ 1537   -------------|-----|---------- 2048 -------------| -           (core2sbr delay     )          ds     (read, core and ds area) -*/ - -#define SFB(dwnsmp)        (32 << (dwnsmp-1))     /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */ -#define STS(fl)            (((fl)==1024)?32:30)   /* SBR Time Slots: 32 for core frame length 1024, 30 for core frame length 960 */ - -#define DELAY_QMF_ANA(dwnsmp) ((320<<((dwnsmp)-1)) - (32<<((dwnsmp)-1))) /* Full bandwidth */ -#define DELAY_HYB_ANA         (10*64)       /* + 0.5 */              /*  */ -#define DELAY_HYB_SYN         (6*64 - 32)                            /*  */ -#define DELAY_QMF_POSTPROC(dwnsmp) (32*(dwnsmp))                     /* QMF postprocessing delay */ -#define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp) )                     /* Decoder QMF overlap */ -#define DELAY_QMF_SYN         (2)                                    /* NO_POLY/2=2.5, rounded down to 2 */ -#define DELAY_QMF_DS          (32)                                   /* QMF synthesis for downsampled time signal */ - -/* Delay in QMF paths */ -#define DELAY_SBR(fl,dwnsmp)     (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp)*STS(fl) - 1) + DELAY_QMF_SYN) -#define DELAY_PS(fl,dwnsmp)      (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + (SFB(dwnsmp)*STS(fl)-1) + DELAY_HYB_SYN + DELAY_QMF_SYN) -#define DELAY_ELDSBR(fl,dwnsmp)  ( ( ((fl)/2)*(dwnsmp) ) - 1 + DELAY_QMF_POSTPROC(dwnsmp) ) - -/* Delay differences for SBR and SBR+PS */ -#define MAX_DS_FILTER_DELAY (5)                                           /* the additional max downsampler filter delay (source fs) */ -#define DELAY_AAC2SBR(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN) - DELAY_SBR((fl),(dwnsmp))) -#define DELAY_ELD2SBR(fl,dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp)) - DELAY_ELDSBR(fl,dwnsmp)) -#define DELAY_AAC2PS(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_HYB_SYN + DELAY_QMF_SYN) - DELAY_PS(fl,dwnsmp)) /* 2048 - 463*2 */ - -/* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */ -#define MAX_SAMPLE_DELAY       (DELAY_AAC2SBR(1024,2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame length of 1024 and dual-rate sbr */ - -/***************************************************************************/ - - - -#define INVALID_TABLE_IDX -1 - -/***************************************************************************/ -/*! - -  \brief  Selects the SBR tuning settings to use dependent on number of -          channels, bitrate, sample rate and core coder - -  \return Index to the appropriate table - -****************************************************************************/ -#define DISTANCE_CEIL_VALUE 5000000 -static INT -getSbrTuningTableIndex(UINT bitrate,    /*! the total bitrate in bits/sec */ -                       UINT numChannels,/*! the number of channels for the core coder */ -                       UINT sampleRate,  /*! the sampling rate of the core coder */ -                       AUDIO_OBJECT_TYPE core, -                       UINT *pBitRateClosest -                       ) -{ -  int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0; -  UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE; -  int isforThisCodec=0; - -  #define isForThisCore(i) \ -    ( ( sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD ) || \ -      ( sbrTuningTable[i].coreCoder == CODEC_AAC   && core != AOT_ER_AAC_ELD ) ) - -  for (i=0; i < sbrTuningTableSize ; i++) { -    if ( isForThisCore(i) ) /* tuning table is for this core codec */ -    { -      if ( numChannels == sbrTuningTable [i].numChannels -        && sampleRate == sbrTuningTable [i].sampleRate ) -      { -        found = 1; -        if ((bitrate >= sbrTuningTable [i].bitrateFrom) && -            (bitrate < sbrTuningTable [i].bitrateTo)) { -              bitRateClosestLower = bitrate; -              bitRateClosestUpper = bitrate; -              //FDKprintf("entry %d\n", i); -          return i ; -        } else { -          if ( sbrTuningTable [i].bitrateFrom > bitrate ) { -            if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) { -              bitRateClosestLower = sbrTuningTable [i].bitrateFrom; -              bitRateClosestLowerIndex = i; -            } -          } -          if ( sbrTuningTable [i].bitrateTo <= bitrate ) { -            if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) { -              bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1; -              bitRateClosestUpperIndex = i; -            } -          } -        } -      } -    } -  } - -  if (pBitRateClosest != NULL) -  { -    /* If there was at least one matching tuning entry found then pick the least distance bit rate */ -    if (found) -    { -      int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE; -      if (bitRateClosestLowerIndex >= 0) { -        distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate; -      } -      if (bitRateClosestUpperIndex >= 0) { -        distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo; -      } -      if ( distanceUpper < distanceLower ) -      { -        *pBitRateClosest = bitRateClosestUpper; -      } else { -        *pBitRateClosest = bitRateClosestLower; -      } -    } else { -      *pBitRateClosest = 0; -    } -  } - -  return INVALID_TABLE_IDX; -} - -/***************************************************************************/ -/*! - -  \brief  Selects the PS tuning settings to use dependent on bitrate -  and core coder - -  \return Index to the appropriate table - -****************************************************************************/ -static INT -getPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest){ - -  INT i, paramSets = sizeof (psTuningTable) / sizeof (psTuningTable [0]); -  int bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1; -  UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE; - -  for (i = 0 ; i < paramSets ; i++)  { -    if ((bitrate >= psTuningTable [i].bitrateFrom) && -        (bitrate < psTuningTable [i].bitrateTo)) { -      return i ; -    } else { -      if ( psTuningTable [i].bitrateFrom > bitrate ) { -        if (psTuningTable [i].bitrateFrom < bitRateClosestLower) { -          bitRateClosestLower = psTuningTable [i].bitrateFrom; -          bitRateClosestLowerIndex = i; -        } -      } -      if ( psTuningTable [i].bitrateTo <= bitrate ) { -        if (psTuningTable [i].bitrateTo > bitRateClosestUpper) { -          bitRateClosestUpper = psTuningTable [i].bitrateTo-1; -          bitRateClosestUpperIndex = i; -        } -      } -    } -  } - -  if (pBitRateClosest != NULL) -  { -    int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE; -    if (bitRateClosestLowerIndex >= 0) { -      distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate; -    } -    if (bitRateClosestUpperIndex >= 0) { -      distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo; -    } -    if ( distanceUpper < distanceLower ) -    { -      *pBitRateClosest = bitRateClosestUpper; -    } else { -      *pBitRateClosest = bitRateClosestLower; -    } -  } - -  return INVALID_TABLE_IDX; -} - -/***************************************************************************/ -/*! - -  \brief  In case of downsampled SBR we may need to lower the stop freq -          of a tuning setting to fit into the lower half of the -          spectrum ( which is sampleRate/4 ) - -  \return the adapted stop frequency index (-1 -> error) - -  \ingroup SbrEncCfg - -****************************************************************************/ -static INT -FDKsbrEnc_GetDownsampledStopFreq ( -        const INT sampleRateCore, -        const INT startFreq, -              INT stopFreq, -        const INT downSampleFactor -        ) -{ -  INT maxStopFreqRaw = sampleRateCore / 2; -  INT startBand, stopBand; -  HANDLE_ERROR_INFO err; - -  while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) { -    stopFreq--; -  } - -  if (FDKsbrEnc_getSbrStopFreqRAW( stopFreq, sampleRateCore) > maxStopFreqRaw) -    return -1; - -  err = FDKsbrEnc_FindStartAndStopBand ( -                sampleRateCore<<(downSampleFactor-1), -                sampleRateCore, -                32<<(downSampleFactor-1), -                startFreq, -                stopFreq, -               &startBand, -               &stopBand -                ); -  if (err) -    return -1; - -  return stopFreq; -} - - -/***************************************************************************/ -/*! - -  \brief  tells us, if for the given coreCoder, bitrate, number of channels -          and input sampling rate an SBR setting is available. If yes, it -          tells us also the core sampling rate we would need to run with - -  \return a flag indicating success: yes (1) or no (0) - -****************************************************************************/ -static UINT -FDKsbrEnc_IsSbrSettingAvail ( -        UINT bitrate,           /*! the total bitrate in bits/sec */ -        UINT vbrMode,           /*! the vbr paramter, 0 means constant bitrate */ -        UINT numOutputChannels, /*! the number of channels for the core coder */ -        UINT sampleRateInput,   /*! the input sample rate [in Hz] */ -        UINT sampleRateCore,    /*! the core's sampling rate */ -        AUDIO_OBJECT_TYPE core -        ) -{ -  INT idx = INVALID_TABLE_IDX; - -  if (sampleRateInput < 16000) -    return 0; - -  if (bitrate==0) { -    /* map vbr quality to bitrate */ -    if (vbrMode < 30) -      bitrate = 24000; -    else if (vbrMode < 40) -      bitrate = 28000; -    else if (vbrMode < 60) -      bitrate = 32000; -    else if (vbrMode < 75) -      bitrate = 40000; -    else -      bitrate = 48000; -    bitrate *= numOutputChannels; -  } - -  idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL); - -  return (idx == INVALID_TABLE_IDX ? 0 : 1); -} - - -/***************************************************************************/ -/*! - -  \brief  Adjusts the SBR settings according to the chosen core coder -          settings which are accessible via config->codecSettings - -  \return A flag indicating success: yes (1) or no (0) - -****************************************************************************/ -static UINT -FDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */ -                   UINT bitRate,             /*! the total bitrate in bits/sec */ -                   UINT numChannels,         /*! the core coder number of channels */ -                   UINT sampleRateCore,      /*! the core coder sampling rate in Hz */ -                   UINT sampleRateSbr,       /*! the sbr coder sampling rate in Hz */ -                   UINT transFac,            /*! the short block to long block ratio */ -                   UINT standardBitrate,     /*! the standard bitrate per channel in bits/sec */ -                   UINT vbrMode,             /*! the vbr paramter, 0 poor quality .. 100 high quality*/ -                   UINT useSpeechConfig,     /*!< adapt tuning parameters for speech ? */ -                   UINT lcsMode,             /*! the low complexity stereo mode */ -                   UINT bParametricStereo,   /*!< use parametric stereo */ -                   AUDIO_OBJECT_TYPE core)   /* Core audio codec object type */ -{ -  INT idx = INVALID_TABLE_IDX; -  /* set the core codec settings */ -  config->codecSettings.bitRate         = bitRate; -  config->codecSettings.nChannels       = numChannels; -  config->codecSettings.sampleFreq      = sampleRateCore; -  config->codecSettings.transFac        = transFac; -  config->codecSettings.standardBitrate = standardBitrate; - -  if (bitRate==0) { -    /* map vbr quality to bitrate */ -    if (vbrMode < 30) -      bitRate = 24000; -    else if (vbrMode < 40) -      bitRate = 28000; -    else if (vbrMode < 60) -      bitRate = 32000; -    else if (vbrMode < 75) -      bitRate = 40000; -    else -      bitRate = 48000; -    bitRate *= numChannels; -    /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */ -    if (numChannels==1) { -      if (sampleRateSbr==44100 || sampleRateSbr==48000) { -        if (vbrMode<40) bitRate = 32000; -      } -    } -  } - -  idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL); - -  if (idx != INVALID_TABLE_IDX) { -    config->startFreq       = sbrTuningTable[idx].startFreq ; -    config->stopFreq        = sbrTuningTable[idx].stopFreq ; -    if (useSpeechConfig) { -      config->startFreq     = sbrTuningTable[idx].startFreqSpeech; -      config->stopFreq      = sbrTuningTable[idx].stopFreqSpeech; -    } - -    /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */ -    if (1 == config->downSampleFactor) { -      INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq( -                               sampleRateCore, -                               config->startFreq, -                               config->stopFreq, -                               config->downSampleFactor -                               ); -      if (dsStopFreq < 0) { -        return 0; -      } - -      config->stopFreq = dsStopFreq; -    } - -    config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ; -    if (core == AOT_ER_AAC_ELD) -      config->init_amp_res_FF = SBR_AMP_RES_1_5; -    config->noiseFloorOffset= sbrTuningTable[idx].noiseFloorOffset; - -    config->ana_max_level   = sbrTuningTable[idx].noiseMaxLevel ; -    config->stereoMode      = sbrTuningTable[idx].stereoMode ; -    config->freqScale       = sbrTuningTable[idx].freqScale ; - -    /* adjust usage of parametric coding dependent on bitrate and speech config flag */ -    if (useSpeechConfig) -      config->parametricCoding  = 0; - -    if (core == AOT_ER_AAC_ELD) { -      if (bitRate < 28000) -        config->init_amp_res_FF = SBR_AMP_RES_3_0; -      config->SendHeaderDataTime = -1; -    } - -    if (numChannels == 1) { -      if (bitRate < 16000) { -        config->parametricCoding  = 0; -      } -    } -    else { -      if (bitRate < 20000) { -        config->parametricCoding  = 0; -      } -    } - -    config->useSpeechConfig = useSpeechConfig; - -    /* PS settings */ -    config->bParametricStereo = bParametricStereo; - -    return 1 ; -  } -  else { -    return 0 ; -  } -} - -/***************************************************************************** - - functionname: FDKsbrEnc_InitializeSbrDefaults - description:  initializes the SBR confifuration - returns:      error status - input:        - core codec type, -               - factor of SBR to core frame length, -               - core frame length - output:       initialized SBR configuration - -*****************************************************************************/ -static UINT -FDKsbrEnc_InitializeSbrDefaults (sbrConfigurationPtr config, -                                 INT                 downSampleFactor, -                                 UINT                codecGranuleLen -                                 ) -{ -    if ( (downSampleFactor < 1 || downSampleFactor > 2) || -         (codecGranuleLen*downSampleFactor > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) ) -       return(0); /* error */ - -    config->SendHeaderDataTime     = 1000; -    config->useWaveCoding          = 0; -    config->crcSbr                 = 0; -    config->dynBwSupported         = 1; -    config->tran_thr               = 13000; -    config->parametricCoding       = 1; - -    config->sbrFrameSize           = codecGranuleLen * downSampleFactor; -    config->downSampleFactor       = downSampleFactor; - -    /* sbr default parameters */ -    config->sbr_data_extra         = 0; -    config->amp_res                = SBR_AMP_RES_3_0 ; -    config->tran_fc                = 0 ; -    config->tran_det_mode          = 1 ; -    config->spread                 = 1 ; -    config->stat                   = 0 ; -    config->e                      = 1 ; -    config->deltaTAcrossFrames     = 1 ; -    config->dF_edge_1stEnv         = FL2FXCONST_DBL(0.3f) ; -    config->dF_edge_incr           = FL2FXCONST_DBL(0.3f) ; - -    config->sbr_invf_mode   = INVF_SWITCHED; -    config->sbr_xpos_mode   = XPOS_LC; -    config->sbr_xpos_ctrl   = SBR_XPOS_CTRL_DEFAULT; -    config->sbr_xpos_level  = 0; -    config->useSaPan        = 0; -    config->dynBwEnabled    = 0; - - -    /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since -       they are included in the tuning table */ -    config->stereoMode             = SBR_SWITCH_LRC; -    config->ana_max_level          = 6; -    config->noiseFloorOffset       = 0; -    config->startFreq              = 5; /*  5.9 respectively  6.0 kHz at fs = 44.1/48 kHz */ -    config->stopFreq               = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */ - - -    /* header_extra_1 */ -    config->freqScale       = SBR_FREQ_SCALE_DEFAULT; -    config->alterScale      = SBR_ALTER_SCALE_DEFAULT; -    config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT; - -    /* header_extra_2 */ -    config->sbr_limiter_bands    = SBR_LIMITER_BANDS_DEFAULT; -    config->sbr_limiter_gains    = SBR_LIMITER_GAINS_DEFAULT; -    config->sbr_interpol_freq    = SBR_INTERPOL_FREQ_DEFAULT; -    config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT; - -    return 1; -} - - -/***************************************************************************** - - functionname: DeleteEnvChannel - description:  frees memory of one SBR channel - returns:      - - input:        handle of channel - output:       released handle - -*****************************************************************************/ -static void -deleteEnvChannel (HANDLE_ENV_CHANNEL hEnvCut) -{ -  if (hEnvCut) { - -    FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr); - -    FDKsbrEnc_deleteExtractSbrEnvelope (&hEnvCut->sbrExtractEnvelope); -  } - -} - - -/***************************************************************************** - - functionname: sbrEncoder_ChannelClose - description:  close the channel coding handle - returns: - input:        phSbrChannel - output: - -*****************************************************************************/ -static void -sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel) -{ -  if (hSbrChannel != NULL) -  { -    deleteEnvChannel (&hSbrChannel->hEnvChannel); -  } -} - -/***************************************************************************** - - functionname: sbrEncoder_ElementClose - description:  close the channel coding handle - returns: - input:        phSbrChannel - output: - -*****************************************************************************/ -static void -sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement) -{ -  HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement; - -  if (hSbrElement!=NULL) { -    if (hSbrElement->sbrConfigData.v_k_master) -      FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master); -    if (hSbrElement->sbrConfigData.freqBandTable[LO]) -      FreeRam_Sbr_freqBandTableLO(&hSbrElement->sbrConfigData.freqBandTable[LO]); -    if (hSbrElement->sbrConfigData.freqBandTable[HI]) -      FreeRam_Sbr_freqBandTableHI(&hSbrElement->sbrConfigData.freqBandTable[HI]); - -    FreeRam_SbrElement(phSbrElement); -  } -  return ; - -} - - -void sbrEncoder_Close (HANDLE_SBR_ENCODER *phSbrEncoder) -{ -  HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder; - -  if (hSbrEncoder != NULL) -  { -    int el, ch; - -    for (el=0; el<(8); el++) -    { -      if (hSbrEncoder->sbrElement[el]!=NULL) { -        sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]); -      } -    } - -    /* Close sbr Channels */ -    for (ch=0; ch<(8); ch++) -    { -      if (hSbrEncoder->pSbrChannel[ch]) { -        sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]); -        FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]); -      } - -      if (hSbrEncoder->QmfAnalysis[ch].FilterStates) -        FreeRam_Sbr_QmfStatesAnalysis((FIXP_QAS**)&hSbrEncoder->QmfAnalysis[ch].FilterStates); - - -    } - -    if (hSbrEncoder->hParametricStereo) -      PSEnc_Destroy(&hSbrEncoder->hParametricStereo); -    if (hSbrEncoder->qmfSynthesisPS.FilterStates) -      FreeRam_PsQmfStatesSynthesis((FIXP_DBL**)&hSbrEncoder->qmfSynthesisPS.FilterStates); - -    /* Release Overlay */ -    FreeRam_SbrDynamic_RAM((FIXP_DBL**)&hSbrEncoder->pSBRdynamic_RAM); - - -    FreeRam_SbrEncoder(phSbrEncoder); -  } - -} - -/***************************************************************************** - - functionname: updateFreqBandTable - description:  updates vk_master - returns:      - - input:        config handle - output:       error info - -*****************************************************************************/ -static INT updateFreqBandTable( -        HANDLE_SBR_CONFIG_DATA  sbrConfigData, -        HANDLE_SBR_HEADER_DATA  sbrHeaderData, -        const INT               downSampleFactor -        ) -{ -  INT k0, k2; - -  if( FDKsbrEnc_FindStartAndStopBand ( -              sbrConfigData->sampleFreq, -              sbrConfigData->sampleFreq >> (downSampleFactor-1), -              sbrConfigData->noQmfBands, -              sbrHeaderData->sbr_start_frequency, -              sbrHeaderData->sbr_stop_frequency, -             &k0, -             &k2 -              ) -    ) -    return(1); - - -  if( FDKsbrEnc_UpdateFreqScale( -              sbrConfigData->v_k_master, -             &sbrConfigData->num_Master, -              k0, -              k2, -              sbrHeaderData->freqScale, -              sbrHeaderData->alterScale -              ) -    ) -    return(1); - - -  sbrHeaderData->sbr_xover_band=0; - - -  if( FDKsbrEnc_UpdateHiRes( -              sbrConfigData->freqBandTable[HI], -              &sbrConfigData->nSfb[HI], -              sbrConfigData->v_k_master, -              sbrConfigData->num_Master, -              &sbrHeaderData->sbr_xover_band -              ) -    ) -    return(1); - - -  FDKsbrEnc_UpdateLoRes( -          sbrConfigData->freqBandTable[LO], -          &sbrConfigData->nSfb[LO], -          sbrConfigData->freqBandTable[HI], -          sbrConfigData->nSfb[HI] -          ); - - -  sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / sbrConfigData->noQmfBands+1)>>1; - -  return (0); -} - - -/***************************************************************************** - - functionname: resetEnvChannel - description:  resets parameters and allocates memory - returns:      error status - input: - output:       hEnv - -*****************************************************************************/ -static INT resetEnvChannel (HANDLE_SBR_CONFIG_DATA  sbrConfigData, -                            HANDLE_SBR_HEADER_DATA  sbrHeaderData, -                            HANDLE_ENV_CHANNEL      hEnv) -{ -  /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function FDKsbrEnc_extractSbrEnvelope !!!*/ -  hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands =  sbrHeaderData->sbr_noise_bands; - - -  if(FDKsbrEnc_ResetTonCorrParamExtr(&hEnv->TonCorr, -                           sbrConfigData->xposCtrlSwitch, -                           sbrConfigData->freqBandTable[HI][0], -                           sbrConfigData->v_k_master, -                           sbrConfigData->num_Master, -                           sbrConfigData->sampleFreq, -                           sbrConfigData->freqBandTable, -                           sbrConfigData->nSfb, -                           sbrConfigData->noQmfBands)) -    return(1); - -  hEnv->sbrCodeNoiseFloor.nSfb[LO] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; -  hEnv->sbrCodeNoiseFloor.nSfb[HI] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; - -  hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO]; -  hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI]; - -  hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; - -  hEnv->sbrCodeEnvelope.upDate = 0; -  hEnv->sbrCodeNoiseFloor.upDate = 0; - -  return (0); -} - -/* ****************************** FDKsbrEnc_SbrGetXOverFreq ******************************/ -/** - * @fn - * @brief       calculates the closest possible crossover frequency - * @return      the crossover frequency SBR accepts - * - */ -static INT -FDKsbrEnc_SbrGetXOverFreq(HANDLE_SBR_ELEMENT  hEnv,        /*!< handle to SBR encoder instance */ -                          INT                 xoverFreq)   /*!< from core coder suggested crossover frequency */ -{ -  INT band; -  INT lastDiff, newDiff; -  INT cutoffSb; - -  UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master; - -  /* Check if there is a matching cutoff frequency in the master table */ -  cutoffSb = (4*xoverFreq * hEnv->sbrConfigData.noQmfBands / hEnv->sbrConfigData.sampleFreq + 1)>>1; -  lastDiff = cutoffSb; -  for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) { - -    newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb); - -    if(newDiff >= lastDiff) { -      band--; -      break; -    } - -    lastDiff = newDiff; -  } - -  return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq/hEnv->sbrConfigData.noQmfBands+1)>>1); -} - -/***************************************************************************** - - functionname: FDKsbrEnc_EnvEncodeFrame - description: performs the sbr envelope calculation for one element - returns: - input: - output: - -*****************************************************************************/ -INT -FDKsbrEnc_EnvEncodeFrame(HANDLE_SBR_ENCODER   hEnvEncoder, -                         int                  iElement, -                         INT_PCM             *samples,                 /*!< time samples, always interleaved */ -                         UINT                 timeInStride,            /*!< time buffer channel interleaving stride */ -                         UINT                *sbrDataBits,             /*!< Size of SBR payload  */ -                         UCHAR               *sbrData,                 /*!< SBR payload  */ -                         int                  clearOutput              /*!< Do not consider any input signal */ -                        ) -{ -  HANDLE_SBR_ELEMENT hSbrElement = hEnvEncoder->sbrElement[iElement]; -  FDK_CRCINFO  crcInfo; -  INT    crcReg; -  INT    ch; -  INT    band; -  INT    cutoffSb; -  INT    newXOver; - -  if (hEnvEncoder == NULL) -    return -1; - -  hSbrElement = hEnvEncoder->sbrElement[iElement]; - -  if (hSbrElement == NULL) -    return -1; - - -  /* header bitstream handling */ -  HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData; - -  INT psHeaderActive = 0; -  sbrBitstreamData->HeaderActive = 0; - -  /* Anticipate PS header because of internal PS bitstream delay in order to be in sync with SBR header. */ -  if ( sbrBitstreamData->CountSendHeaderData==(sbrBitstreamData->NrSendHeaderData-1) ) -  { -      psHeaderActive = 1; -  } - -  /* Signal SBR header to be written into bitstream */ -  if ( sbrBitstreamData->CountSendHeaderData==0  ) -  { -     sbrBitstreamData->HeaderActive = 1; -  } - -  /* Increment header interval counter */ -  if (sbrBitstreamData->NrSendHeaderData == 0) { -    sbrBitstreamData->CountSendHeaderData = 1; -  } -  else { -    if (sbrBitstreamData->CountSendHeaderData >= 0) { -      sbrBitstreamData->CountSendHeaderData++; -      sbrBitstreamData->CountSendHeaderData %= sbrBitstreamData->NrSendHeaderData; -    } -  } - -  if (hSbrElement->CmonData.dynBwEnabled ) { -    INT i; -    for ( i = 4; i > 0; i-- ) -      hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i-1]; - -    hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc; -    if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2]) -      newXOver = hSbrElement->dynXOverFreqDelay[2]; -    else -      newXOver = hSbrElement->dynXOverFreqDelay[1]; - -    /* has the crossover frequency changed? */ -    if ( hSbrElement->sbrConfigData.dynXOverFreq != newXOver ) { - -      /* get corresponding master band */ -      cutoffSb = ((4* newXOver * hSbrElement->sbrConfigData.noQmfBands -                  / hSbrElement->sbrConfigData.sampleFreq)+1)>>1; - -      for ( band = 0; band < hSbrElement->sbrConfigData.num_Master; band++ ) { -        if ( cutoffSb == hSbrElement->sbrConfigData.v_k_master[band] ) -          break; -      } -      FDK_ASSERT( band < hSbrElement->sbrConfigData.num_Master ); - -      hSbrElement->sbrConfigData.dynXOverFreq = newXOver; -      hSbrElement->sbrHeaderData.sbr_xover_band = band; -      hSbrElement->sbrBitstreamData.HeaderActive=1; -      psHeaderActive = 1; /* ps header is one frame delayed */ - -      /* -        update vk_master table -      */ -      if(updateFreqBandTable(&hSbrElement->sbrConfigData, -                             &hSbrElement->sbrHeaderData, -                             hEnvEncoder->downSampleFactor -                             )) -        return(1); - - -      /* reset SBR channels */ -      INT nEnvCh = hSbrElement->sbrConfigData.nChannels; -      for ( ch = 0; ch < nEnvCh; ch++ ) { -        if(resetEnvChannel (&hSbrElement->sbrConfigData, -                            &hSbrElement->sbrHeaderData, -                            &hSbrElement->sbrChannel[ch]->hEnvChannel)) -          return(1); - -      } -    } -  } - -  /* -    allocate space for dummy header and crc -  */ -  crcReg = FDKsbrEnc_InitSbrBitstream(&hSbrElement->CmonData, -                                       hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay], -                                       MAX_PAYLOAD_SIZE*sizeof(UCHAR), -                                      &crcInfo, -                                       hSbrElement->sbrConfigData.sbrSyntaxFlags); - -  /* Temporal Envelope Data */ -  SBR_FRAME_TEMP_DATA _fData; -  SBR_FRAME_TEMP_DATA *fData = &_fData; -  SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS]; - -  /* Init Temporal Envelope Data */ -  { -    int i; - -    FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA)); -    FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA)); -    FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA)); - -    for(i=0; i<MAX_NUM_NOISE_VALUES; i++) -      fData->res[i] = FREQ_RES_HIGH; -  } - - -  if (!clearOutput) -  { -    /* -     * Transform audio data into QMF domain -     */ -    for(ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++) -    { -      HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel; -      HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope; - -      if(hSbrElement->elInfo.fParametricStereo == 0) -      { -        QMF_SCALE_FACTOR tmpScale; -        FIXP_DBL **pQmfReal, **pQmfImag; -        C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2) - - -        /* Obtain pointers to QMF buffers. */ -        pQmfReal = sbrExtrEnv->rBuffer; -        pQmfImag = sbrExtrEnv->iBuffer; - -        qmfAnalysisFiltering( hSbrElement->hQmfAnalysis[ch], -                               pQmfReal, -                               pQmfImag, -                              &tmpScale, -                               samples + hSbrElement->elInfo.ChannelIndex[ch], -                               timeInStride, -                               qmfWorkBuffer ); - -        h_envChan->qmfScale = tmpScale.lb_scale + 7; - - -        C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2) - -      } /* fParametricStereo == 0 */ - - -      /* -        Parametric Stereo processing -      */ -      if (hSbrElement->elInfo.fParametricStereo) -      { -        INT error = noError; - - -        /* Limit Parametric Stereo to one instance */ -        FDK_ASSERT(ch == 0); - - -        if(error == noError){ -          /* parametric stereo processing: -             - input: -               o left and right time domain samples -             - processing: -               o stereo qmf analysis -               o stereo hybrid analysis -               o ps parameter extraction -               o downmix + hybrid synthesis -             - output: -               o downmixed qmf data is written to sbrExtrEnv->rBuffer and sbrExtrEnv->iBuffer -          */ -          SCHAR qmfScale; -          INT_PCM* pSamples[2] = {samples + hSbrElement->elInfo.ChannelIndex[0],samples + hSbrElement->elInfo.ChannelIndex[1]}; -          error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( hEnvEncoder->hParametricStereo, -                                                              pSamples, -                                                              timeInStride, -                                                              hSbrElement->hQmfAnalysis, -                                                              sbrExtrEnv->rBuffer, -                                                              sbrExtrEnv->iBuffer, -                                                              samples + hSbrElement->elInfo.ChannelIndex[ch], -                                                             &hEnvEncoder->qmfSynthesisPS, -                                                             &qmfScale, -                                                              psHeaderActive ); -          if (noError != error) -          { -            error = handBack(error); -          } -          h_envChan->qmfScale = (int)qmfScale; -        } - - -      } /* if (hEnvEncoder->hParametricStereo) */ - -      /* - -         Extract Envelope relevant things from QMF data - -      */ -      FDKsbrEnc_extractSbrEnvelope1( -                                &hSbrElement->sbrConfigData, -                                &hSbrElement->sbrHeaderData, -                                &hSbrElement->sbrBitstreamData, -                                 h_envChan, -                                &hSbrElement->CmonData, -                                &eData[ch], -                                 fData -                                 ); - -    } /* hEnvEncoder->sbrConfigData.nChannels */ - } - -  /* -     Process Envelope relevant things and calculate envelope data and write payload -  */ -  FDKsbrEnc_extractSbrEnvelope2( -                                &hSbrElement->sbrConfigData, -                                &hSbrElement->sbrHeaderData, -                                (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo : NULL, -                                &hSbrElement->sbrBitstreamData, -                                &hSbrElement->sbrChannel[0]->hEnvChannel, -                                &hSbrElement->sbrChannel[1]->hEnvChannel, -                                &hSbrElement->CmonData, -                                 eData, -                                 fData, -                                 clearOutput -                               ); - -  /* -    format payload, calculate crc -  */ -  FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, hSbrElement->sbrConfigData.sbrSyntaxFlags); - -  /* -    save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE -  */ -  hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf); - -  if(hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > (MAX_PAYLOAD_SIZE<<3)) -    hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay]=0; - -  /* While filling the Delay lines, sbrData is NULL */ -  if (sbrData) { -    *sbrDataBits = hSbrElement->payloadDelayLineSize[0]; -    FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], (hSbrElement->payloadDelayLineSize[0]+7)>>3); - - -  } - - -/*******************************/ - -  if (hEnvEncoder->fTimeDomainDownsampling) -  { -    int ch; -    int nChannels = hSbrElement->sbrConfigData.nChannels; - -    for (ch=0; ch < nChannels; ch++) -    { -      INT nOutSamples; - -      FDKaacEnc_Downsample(&hSbrElement->sbrChannel[ch]->downSampler, -                            samples + hSbrElement->elInfo.ChannelIndex[ch] + hEnvEncoder->bufferOffset, -                            hSbrElement->sbrConfigData.frameSize, -                            timeInStride, -                            samples + hSbrElement->elInfo.ChannelIndex[ch], -                           &nOutSamples, -                            hEnvEncoder->nChannels); -    } -  } /* downsample */ - - -  return (0); -} - -/***************************************************************************** - - functionname: createEnvChannel - description:  initializes parameters and allocates memory - returns:      error status - input: - output:       hEnv - -*****************************************************************************/ - -static INT -createEnvChannel (HANDLE_ENV_CHANNEL     hEnv, -                  INT                    channel -                 ,UCHAR*                 dynamic_RAM -                 ) -{ -  FDKmemclear(hEnv,sizeof (struct ENV_CHANNEL)); - -  if ( FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr, -                                         channel) ) -  { -    return(1); -  } - -  if ( FDKsbrEnc_CreateExtractSbrEnvelope (&hEnv->sbrExtractEnvelope, -                               channel -                              ,/*chan*/0 -                              ,dynamic_RAM -                              ) ) -  { -    return(1); -  } - -  return 0; -} - -/***************************************************************************** - - functionname: initEnvChannel - description:  initializes parameters - returns:      error status - input: - output: - -*****************************************************************************/ -static INT -initEnvChannel (  HANDLE_SBR_CONFIG_DATA sbrConfigData, -                  HANDLE_SBR_HEADER_DATA sbrHeaderData, -                  HANDLE_ENV_CHANNEL     hEnv, -                  sbrConfigurationPtr    params, -                  ULONG                  statesInitFlag -                 ,INT                    chanInEl -                 ,UCHAR*                 dynamic_RAM -                 ) -{ -  int frameShift, tran_off=0; -  INT e; -  INT tran_fc; -  INT timeSlots, timeStep, startIndex; -  INT noiseBands[2] = { 3, 3 }; - -  e = 1 << params->e; - -  FDK_ASSERT(params->e >= 0); - -  hEnv->encEnvData.freq_res_fixfix = 1; -  hEnv->fLevelProtect = 0; - -  hEnv->encEnvData.ldGrid = (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0; - -  hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode; - -  if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) { -    /* -       no other type than XPOS_MDCT or XPOS_SPEECH allowed, -       but enable switching -    */ -    sbrConfigData->switchTransposers = TRUE; -    hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT; -  } -  else { -    sbrConfigData->switchTransposers = FALSE; -  } - -  hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl; - - -  /* extended data */ -  if(params->parametricCoding) { -    hEnv->encEnvData.extended_data = 1; -  } -  else { -    hEnv->encEnvData.extended_data = 0; -  } - -  hEnv->encEnvData.extension_size = 0; - -  startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands; - -  switch (params->sbrFrameSize) { -  case 2304: -    timeSlots = 18; -    break; -  case 2048: -  case 1024: -  case 512: -    timeSlots = 16; -    break; -  case 1920: -  case 960: -  case 480: -    timeSlots = 15; -    break; -  case 1152: -    timeSlots = 9; -    break; -  default: -    return (1); /* Illegal frame size */ -  } - -  timeStep = sbrConfigData->noQmfSlots / timeSlots; - -  if ( FDKsbrEnc_InitTonCorrParamExtr(params->sbrFrameSize, -                                     &hEnv->TonCorr, -                                      sbrConfigData, -                                      timeSlots, -                                      params->sbr_xpos_ctrl, -                                      params->ana_max_level, -                                      sbrHeaderData->sbr_noise_bands, -                                      params->noiseFloorOffset, -                                      params->useSpeechConfig) ) -    return(1); - -  hEnv->encEnvData.noOfnoisebands = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; - -  noiseBands[0] = hEnv->encEnvData.noOfnoisebands; -  noiseBands[1] = hEnv->encEnvData.noOfnoisebands; - -  hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode; - -  if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) { -    hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL; -    hEnv->TonCorr.switchInverseFilt = TRUE; -  } -  else { -    hEnv->TonCorr.switchInverseFilt = FALSE; -  } - - -  tran_fc  = params->tran_fc; - -  if (tran_fc == 0) { -    tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,params->codecSettings.sampleFreq)); -  } - -  tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1; - -  if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { -    frameShift = LD_PRETRAN_OFF; -    tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD*timeStep; -  } else -  { -    frameShift = 0; -    switch (timeSlots) { -      /* The factor of 2 is by definition. */ -      case NUMBER_TIME_SLOTS_2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break; -      case NUMBER_TIME_SLOTS_1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break; -      default: return 1; -    } -  } -  if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope, -                               sbrConfigData->noQmfSlots, -                               sbrConfigData->noQmfBands, startIndex, -                               timeSlots, timeStep, tran_off, -                               statesInitFlag -                              ,chanInEl -                              ,dynamic_RAM -                              ,sbrConfigData->sbrSyntaxFlags -                               ) ) -    return(1); - -  if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeEnvelope, -                            sbrConfigData->nSfb, -                            params->deltaTAcrossFrames, -                            params->dF_edge_1stEnv, -                            params->dF_edge_incr)) -    return(1); - -  if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeNoiseFloor, -                            noiseBands, -                            params->deltaTAcrossFrames, -                            0,0)) -    return(1); - -  sbrConfigData->initAmpResFF = params->init_amp_res_FF; - -  if(FDKsbrEnc_InitSbrHuffmanTables (&hEnv->encEnvData, -                           &hEnv->sbrCodeEnvelope, -                           &hEnv->sbrCodeNoiseFloor, -                           sbrHeaderData->sbr_amp_res)) -   return(1); - -  FDKsbrEnc_initFrameInfoGenerator (&hEnv->SbrEnvFrame, -                            params->spread, -                            e, -                            params->stat, -                            timeSlots, -                            hEnv->encEnvData.freq_res_fixfix -                            ,hEnv->encEnvData.ldGrid -                            ); - -  if(FDKsbrEnc_InitSbrTransientDetector (&hEnv->sbrTransientDetector, -                                          sbrConfigData->frameSize, -                                          sbrConfigData->sampleFreq, -                                          params, -                                          tran_fc, -                                          sbrConfigData->noQmfSlots, -                                          sbrConfigData->noQmfBands, -                                          hEnv->sbrExtractEnvelope.YBufferWriteOffset, -                                          hEnv->sbrExtractEnvelope.YBufferSzShift, -                                          frameShift, -                                          tran_off -                                          )) -  return(1); - - -  sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl; - -  hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; -  hEnv->encEnvData.addHarmonicFlag = 0; - -  return (0); -} - -INT sbrEncoder_Open( -        HANDLE_SBR_ENCODER  *phSbrEncoder, -        INT                  nElements, -        INT                  nChannels, -        INT                  supportPS -        ) -{ -  INT i; -  INT errorStatus = 1; -  HANDLE_SBR_ENCODER hSbrEncoder = NULL; - -  if (phSbrEncoder==NULL -     ) -  { -    goto bail; -  } - -  hSbrEncoder = GetRam_SbrEncoder(); -  if (hSbrEncoder==NULL) { -    goto bail; -  } -  FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER)); - -      hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM(); -      hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM; - -  for (i=0; i<nElements; i++) { -    hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i); -    if (hSbrEncoder->sbrElement[i]==NULL) { -        goto bail; -    } -    FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT)); -    hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] =  GetRam_Sbr_freqBandTableLO(i); -    hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] =  GetRam_Sbr_freqBandTableHI(i); -    hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master        =  GetRam_Sbr_v_k_master(i); -    if ( (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO]==NULL) || -         (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI]==NULL) || -         (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master==NULL) ) -    { -        goto bail; -    } -  } - -  for (i=0; i<nChannels; i++) { -    hSbrEncoder->pSbrChannel[i] = GetRam_SbrChannel(i); -    if (hSbrEncoder->pSbrChannel[i]==NULL) { -        goto bail; -    } - -    if ( createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel, -                           i -                          ,hSbrEncoder->dynamicRam -                           ) ) -    { -        goto bail; -    } - -  } - -  for (i=0; i<fixMax(nChannels,(supportPS)?2:0); i++) { -    hSbrEncoder->QmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i); -    if (hSbrEncoder->QmfAnalysis[i].FilterStates==NULL) { -        goto bail; -    } -  } - -  if (supportPS) { -    if (PSEnc_Create(&hSbrEncoder->hParametricStereo)) -    { -      goto bail; -    } - -    hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis(); -    if (hSbrEncoder->qmfSynthesisPS.FilterStates==NULL) { -      goto bail; -    } -  }  /* supportPS */ - -  *phSbrEncoder = hSbrEncoder; - -  errorStatus = 0; -  return errorStatus; - -bail: -  /* Close SBR encoder instance */ -  sbrEncoder_Close(&hSbrEncoder); -  return errorStatus; -} - -static -INT FDKsbrEnc_Reallocate( -                    HANDLE_SBR_ENCODER   hSbrEncoder, -                    SBR_ELEMENT_INFO     elInfo[(8)], -                    const INT            noElements) -{ -  INT totalCh = 0; -  INT totalQmf = 0; -  INT coreEl; -  INT el=-1; - -  hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */ - -  for (coreEl=0; coreEl<noElements; coreEl++) -  { -    /* SBR only handles SCE and CPE's */ -    if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) { -      el++; -    } else { -      if (elInfo[coreEl].elType == ID_LFE) { -          hSbrEncoder->lfeChIdx = elInfo[coreEl].ChannelIndex[0]; -      } -      continue; -    } - -    SBR_ELEMENT_INFO    *pelInfo = &elInfo[coreEl]; -    HANDLE_SBR_ELEMENT  hSbrElement = hSbrEncoder->sbrElement[el]; - -    int ch; -    for ( ch = 0; ch < pelInfo->nChannelsInEl; ch++ ) { -      hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh]; -      totalCh++; -    } -    /* analysis QMF */ -    for ( ch = 0; ch < ((pelInfo->fParametricStereo)?2:pelInfo->nChannelsInEl); ch++ ) { -      hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch]; -      hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++]; -    } - -    /* Copy Element info */ -    hSbrElement->elInfo.elType            = pelInfo->elType; -    hSbrElement->elInfo.instanceTag       = pelInfo->instanceTag; -    hSbrElement->elInfo.nChannelsInEl     = pelInfo->nChannelsInEl; -    hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo; -  } /* coreEl */ - -  return 0; -} - - - -/***************************************************************************** - - functionname: FDKsbrEnc_EnvInit - description:  initializes parameters - returns:      error status - input: - output:       hEnv - -*****************************************************************************/ -static -INT FDKsbrEnc_EnvInit ( -                       HANDLE_SBR_ELEMENT   hSbrElement, -                       sbrConfigurationPtr params, -                       INT      *coreBandWith, -                       AUDIO_OBJECT_TYPE aot, -                       int       nBitstrDelay, -                       int       nElement, -                       const int headerPeriod, -                       ULONG     statesInitFlag, -                       int       fTimeDomainDownsampling -                      ,UCHAR    *dynamic_RAM -                      ) -{ -  UCHAR    *bitstreamBuffer; -  int ch, i; - -  if ((params->codecSettings.nChannels < 1) || (params->codecSettings.nChannels > MAX_NUM_CHANNELS)){ -    return(1); -  } - -  /* initialize the encoder handle  and structs*/ -  bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay]; - -  /* init and set syntax flags */ -  hSbrElement->sbrConfigData.sbrSyntaxFlags = 0; - -  switch (aot) { -  case AOT_DRM_MPEG_PS: -  case AOT_DRM_SBR: -    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_SCALABLE; -    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_DRM_CRC; -    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; -    break; -  case AOT_ER_AAC_ELD: -    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY; -    break; -  default: -    break; -  } -  if (params->crcSbr) { -    hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; -  } - -  hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS>>(2-params->downSampleFactor); -  switch (hSbrElement->sbrConfigData.noQmfBands) -  { -    case 64: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6; -             break; -    case 32: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>5; -             break; -    default: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6; -             return(2); -  } - -  FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER); - -  /* -    now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData, -  */ -  hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels; - -  if(params->codecSettings.nChannels == 2) -     hSbrElement->sbrConfigData.stereoMode = params->stereoMode; -  else -     hSbrElement->sbrConfigData.stereoMode = SBR_MONO; - -  hSbrElement->sbrConfigData.frameSize   = params->sbrFrameSize; - -  hSbrElement->sbrConfigData.sampleFreq = params->downSampleFactor * params->codecSettings.sampleFreq; - -  hSbrElement->sbrBitstreamData.CountSendHeaderData = 0; -  if (params->SendHeaderDataTime > 0 ) { - -    if (headerPeriod==-1) { - -      hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq -                                               / (1000 * hSbrElement->sbrConfigData.frameSize)); -      hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1); -    } -    else { -      /* assure header period at least once per second */ -      hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin(fixMax(headerPeriod,1),(hSbrElement->sbrConfigData.sampleFreq/hSbrElement->sbrConfigData.frameSize)); -    } -  } -  else { -   hSbrElement->sbrBitstreamData.NrSendHeaderData = 0; -  } - -  hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra; -  hSbrElement->sbrBitstreamData.HeaderActive = 0; -  hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq; -  hSbrElement->sbrHeaderData.sbr_stop_frequency  = params->stopFreq; -  hSbrElement->sbrHeaderData.sbr_xover_band = 0; -  hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0; - -  /* data_extra */ -  if (params->sbr_xpos_ctrl!= SBR_XPOS_CTRL_DEFAULT) -     hSbrElement->sbrHeaderData.sbr_data_extra = 1; - -  hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res; - -  /* header_extra_1 */ -  hSbrElement->sbrHeaderData.freqScale  = params->freqScale; -  hSbrElement->sbrHeaderData.alterScale = params->alterScale; -  hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands; -  hSbrElement->sbrHeaderData.header_extra_1 = 0; - -  if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) || -      (params->alterScale != SBR_ALTER_SCALE_DEFAULT) || -      (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT)) -  { -   hSbrElement->sbrHeaderData.header_extra_1 = 1; -  } - -  /* header_extra_2 */ -  hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands; -  hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains; - -  if ((hSbrElement->sbrConfigData.sampleFreq > 48000) && -      (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9)) -  { -    hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE; -  } - -  hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq; -  hSbrElement->sbrHeaderData.sbr_smoothing_length = params->sbr_smoothing_length; -  hSbrElement->sbrHeaderData.header_extra_2 = 0; - -  if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) || -      (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) || -      (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) || -      (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT)) -  { -     hSbrElement->sbrHeaderData.header_extra_2 = 1; -  } - -   /* other switches */ -  hSbrElement->sbrConfigData.useWaveCoding             = params->useWaveCoding; -  hSbrElement->sbrConfigData.useParametricCoding       = params->parametricCoding; - -  /* init freq band table */ -  if(updateFreqBandTable(&hSbrElement->sbrConfigData, -                         &hSbrElement->sbrHeaderData, -                         params->downSampleFactor -                         )) -  { -    return(1); -  } - -  /* now create envelope ext and QMF for each available channel */ -  for ( ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++ ) { - -     if ( initEnvChannel(&hSbrElement->sbrConfigData, -                         &hSbrElement->sbrHeaderData, -                         &hSbrElement->sbrChannel[ch]->hEnvChannel, -                          params, -                          statesInitFlag -                        ,ch -                        ,dynamic_RAM -                         ) ) -     { -       return(1); -     } - - -  } /* nChannels */ - -  /* reset and intialize analysis qmf */ -  for ( ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo)?2:hSbrElement->sbrConfigData.nChannels); ch++ ) -  { -    int err; -    UINT qmfFlags = (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? QMF_FLAG_CLDFB : 0; -    if (statesInitFlag) -      qmfFlags &= ~QMF_FLAG_KEEP_STATES; -    else -      qmfFlags |=  QMF_FLAG_KEEP_STATES; - -    err = qmfInitAnalysisFilterBank( hSbrElement->hQmfAnalysis[ch], -                                     (FIXP_QAS*)hSbrElement->hQmfAnalysis[ch]->FilterStates, -                                     hSbrElement->sbrConfigData.noQmfSlots, -                                     hSbrElement->sbrConfigData.noQmfBands, -                                     hSbrElement->sbrConfigData.noQmfBands, -                                     hSbrElement->sbrConfigData.noQmfBands, -                                     qmfFlags ); -    if (0!=err) { -      return err; -    } -  } - -  /*  */ -  hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq; -  hSbrElement->CmonData.dynBwEnabled = (params->dynBwSupported && params->dynBwEnabled); -  hSbrElement->CmonData.dynXOverFreqEnc = FDKsbrEnc_SbrGetXOverFreq( hSbrElement, hSbrElement->CmonData.xOverFreq); -  for ( i = 0; i < 5; i++ ) -      hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc; -  hSbrElement->CmonData.sbrNumChannels  = hSbrElement->sbrConfigData.nChannels; -  hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq; - -  /* Update Bandwith to be passed to the core encoder */ -  *coreBandWith = hSbrElement->CmonData.xOverFreq; - -  return(0); - } - -INT sbrEncoder_GetInBufferSize(int noChannels) -{ -  INT temp; - -  temp = (2048); -  temp += 1024 + MAX_SAMPLE_DELAY; -  temp *= noChannels; -  temp *= sizeof(INT_PCM); -  return temp; -} - -/* - * Encode Dummy SBR payload frames to fill the delay lines. - */ -static -INT FDKsbrEnc_DelayCompensation ( -                                  HANDLE_SBR_ENCODER hEnvEnc, -                                  INT_PCM *timeBuffer -                                 ) -{ -    int n, el; - -    for (n=hEnvEnc->nBitstrDelay; n>0; n--) -    { -      for (el=0; el<hEnvEnc->noElements; el++) -      { -        if (FDKsbrEnc_EnvEncodeFrame( -                                     hEnvEnc, -                                     el, -                                     timeBuffer + hEnvEnc->downsampledOffset, -                                     hEnvEnc->sbrElement[el]->sbrConfigData.nChannels, -                                     NULL, -                                     NULL, -                                     1 -                                    )) -          return -1; -      } -      sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer); -    } -	  return 0; -} - -UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot) -{ -  UINT newBitRate; -  INT index; - -  FDK_ASSERT(numChannels > 0 && numChannels <= 2); -  if (aot == AOT_PS) { -    if (numChannels == 2) { -      index = getPsTuningTableIndex(bitRate, &newBitRate); -      if (index == INVALID_TABLE_IDX) { -        bitRate = newBitRate; -      } -      /* Set numChannels to 1 because for PS we need a SBR SCE (mono) element. */ -      numChannels = 1; -    } else { -      return 0; -    } -  } -  index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, &newBitRate); -  if (index != INVALID_TABLE_IDX) { -    newBitRate = bitRate; -  } - -  return newBitRate; -} - -UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot) -{ -  UINT isPossible=(AOT_PS==aot)?0:1; -  return isPossible; -} - -INT sbrEncoder_Init( -        HANDLE_SBR_ENCODER   hSbrEncoder, -        SBR_ELEMENT_INFO     elInfo[(8)], -        int                  noElements, -        INT_PCM             *inputBuffer, -        INT                 *coreBandwidth, -        INT                 *inputBufferOffset, -        INT                 *numChannels, -        INT                 *coreSampleRate, -        UINT                *downSampleFactor, -        INT                 *frameLength, -        AUDIO_OBJECT_TYPE    aot, -        int                 *delay, -        int                  transformFactor, -        const int            headerPeriod, -        ULONG                statesInitFlag -        ) -{ -    HANDLE_ERROR_INFO errorInfo = noError; -    sbrConfiguration sbrConfig[(8)]; -    INT error = 0; -    INT lowestBandwidth; -    /* Save input parameters */ -    INT inputSampleRate = *coreSampleRate; -    int coreFrameLength = *frameLength; -    int inputBandWidth = *coreBandwidth; -    int inputChannels = *numChannels; - -    int downsampledOffset = 0; -    int sbrOffset = 0; -    int downsamplerDelay = 0; -    int timeDomainDownsample = 0; -    int nBitstrDelay = 0; -    int highestSbrStartFreq, highestSbrStopFreq; -    int lowDelay = 0; -    int usePs = 0; - -    /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */ -    if (!sbrEncoder_IsSingleRatePossible(aot)) { -      *downSampleFactor = 2; -    } - - - -    if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) { -        usePs = 1; -    } -    if ( (aot==AOT_ER_AAC_ELD) ) { -        lowDelay = 1; -    } -    else if ( (aot==AOT_ER_AAC_LD) ) { -        error = 1; -        goto bail; -    } - -    /* Parametric Stereo */ -    if ( usePs ) { -      if ( *numChannels == 2 && noElements == 1) { -        /* Override Element type in case of Parametric stereo */ -        elInfo[0].elType = ID_SCE; -        elInfo[0].fParametricStereo = 1; -        elInfo[0].nChannelsInEl = 1; -        /* core encoder gets downmixed mono signal */ -        *numChannels  = 1; -      } else { -        error = 1; -        goto bail; -      } -    } /* usePs */ - -    /* set the core's sample rate */ -    switch (*downSampleFactor) { -    case 1: -      *coreSampleRate = inputSampleRate; -      break; -    case 2: -      *coreSampleRate = inputSampleRate>>1; -      break; -    default: -      *coreSampleRate = inputSampleRate>>1; -      return 0; /* return error */ -    } - -    /* check whether SBR setting is available for the current encoder configuration (bitrate, coreSampleRate) */ -    { -      int delayDiff = 0; -      int el, coreEl; - -      /* Check if every element config is feasible */ -      for (coreEl=0; coreEl<noElements; coreEl++) -      { -        /* SBR only handles SCE and CPE's */ -        if (elInfo[coreEl].elType != ID_SCE && elInfo[coreEl].elType != ID_CPE) { -          continue; -        } -        /* check if desired configuration is available */ -        if ( !FDKsbrEnc_IsSbrSettingAvail (elInfo[coreEl].bitRate, 0, elInfo[coreEl].nChannelsInEl, inputSampleRate, *coreSampleRate, aot) ) -        { -            error = 1; -            goto bail; -        } -      } - -      /* Determine Delay balancing and new encoder delay */ -      if (lowDelay) { -        { -        delayDiff = (*delay * *downSampleFactor) + DELAY_ELD2SBR(coreFrameLength,*downSampleFactor); -        *delay = DELAY_ELDSBR(coreFrameLength,*downSampleFactor); -        } -      } -      else if (usePs) { -        delayDiff = (*delay * *downSampleFactor) + DELAY_AAC2PS(coreFrameLength,*downSampleFactor); -        *delay = DELAY_PS(coreFrameLength,*downSampleFactor); -      } -      else { -        delayDiff = DELAY_AAC2SBR(coreFrameLength,*downSampleFactor); -        delayDiff += (*delay * *downSampleFactor); -        *delay = DELAY_SBR(coreFrameLength,*downSampleFactor); -      } - -      if (!usePs) { -          timeDomainDownsample = *downSampleFactor-1;  /* activate time domain downsampler when downSampleFactor is != 1 */ -      } - - -      /* Take care about downsampled data bound to the SBR path */ -      if (!timeDomainDownsample && delayDiff > 0) { -        /* -         * We must tweak the balancing into a situation where the downsampled path -         * is the one to be delayed, because delaying the QMF domain input, also delays -         * the downsampled audio, counteracting to the purpose of delay balancing. -         */ -        while ( delayDiff > 0 ) -        { -          /* Encoder delay increases */ -          { -            *delay += coreFrameLength * *downSampleFactor; -            /* Add one frame delay to SBR path */ -            delayDiff -= coreFrameLength * *downSampleFactor; -          } -          nBitstrDelay += 1; -        } -      } else -      { -        *delay += fixp_abs(delayDiff); -      } - -      if (delayDiff < 0) { -        /* Delay AAC data */ -        delayDiff = -delayDiff; -        /* Multiply downsampled offset by AAC core channels. Divide by 2 because of half samplerate of downsampled data. */ -        FDK_ASSERT(*downSampleFactor>0 && *downSampleFactor<=2); -        downsampledOffset = (delayDiff*(*numChannels))>>(*downSampleFactor-1); -        sbrOffset = 0; -      } else { -        /* Delay SBR input */ -        if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor ) -        { -          /* Do bitstream frame-wise delay balancing if we have more than SBR framelength samples delay difference */ -          delayDiff -= coreFrameLength * *downSampleFactor; -          nBitstrDelay = 1; -        } -        /* Multiply input offset by input channels */ -        sbrOffset = delayDiff*(*numChannels); -        downsampledOffset = 0; -      } -      hSbrEncoder->nBitstrDelay            = nBitstrDelay; -      hSbrEncoder->nChannels               = *numChannels; -      hSbrEncoder->frameSize               = coreFrameLength * *downSampleFactor; -      hSbrEncoder->fTimeDomainDownsampling = timeDomainDownsample; -      hSbrEncoder->downSampleFactor        = *downSampleFactor; -      hSbrEncoder->estimateBitrate         = 0; -      hSbrEncoder->inputDataDelay          = 0; - - -      /* Open SBR elements */ -      el = -1; -      highestSbrStartFreq = highestSbrStopFreq = 0; -      lowestBandwidth = 99999; - -      /* Loop through each core encoder element and get a matching SBR element config */ -      for (coreEl=0; coreEl<noElements; coreEl++) -      { -        /* SBR only handles SCE and CPE's */ -        if (elInfo[coreEl].elType == ID_SCE || elInfo[coreEl].elType == ID_CPE) { -          el++; -        } else { -          continue; -        } - -        /* Set parametric Stereo Flag. */ -        if (usePs) { -          elInfo[coreEl].fParametricStereo = 1; -        } else { -          elInfo[coreEl].fParametricStereo = 0; -        } - -        /* -         * Init sbrConfig structure -         */ -        if ( ! FDKsbrEnc_InitializeSbrDefaults ( &sbrConfig[el], -                                                 *downSampleFactor, -                                                  coreFrameLength -                                                  ) ) -        { -          error = 1; -          goto bail; -        } - -        /* -         * Modify sbrConfig structure according to Element parameters -         */ -        if ( ! FDKsbrEnc_AdjustSbrSettings (&sbrConfig[el], -                                             elInfo[coreEl].bitRate, -                                             elInfo[coreEl].nChannelsInEl, -                                            *coreSampleRate, -                                             inputSampleRate, -                                             transformFactor, -                                             24000, -                                             0, -                                             0,     /* useSpeechConfig */ -                                             0,     /* lcsMode */ -                                             usePs, /* bParametricStereo */ -                                             aot) ) -        { -          error = 1; -          goto bail; -        } - -        /* Find common frequency border for all SBR elements */ -        highestSbrStartFreq = fixMax(highestSbrStartFreq, sbrConfig[el].startFreq); -        highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq); - -      } /* first element loop */ - -      /* Set element count (can be less than core encoder element count) */ -      hSbrEncoder->noElements = el+1; - -      FDKsbrEnc_Reallocate(hSbrEncoder, -                           elInfo, -                           noElements); - -      for (el=0; el<hSbrEncoder->noElements; el++) { - -        int bandwidth = *coreBandwidth; - -        /* Use lowest common bandwidth */ -        sbrConfig[el].startFreq = highestSbrStartFreq; -        sbrConfig[el].stopFreq = highestSbrStopFreq; - -        /* initialize SBR element, and get core bandwidth */ -        error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el], -                                  &sbrConfig[el], -                                  &bandwidth, -                                   aot, -                                   nBitstrDelay, -                                   el, -                                   headerPeriod, -                                   statesInitFlag, -                                   hSbrEncoder->fTimeDomainDownsampling -                                  ,hSbrEncoder->dynamicRam -                                  ); - -        if (error != 0) { -          error = 2; -          goto bail; -        } - -        /* Get lowest core encoder bandwidth to be returned later. */ -        lowestBandwidth = fixMin(lowestBandwidth, bandwidth); - -      } /* second element loop */ - -      /* Initialize a downsampler for each channel in each SBR element */ -      if (hSbrEncoder->fTimeDomainDownsampling) -      { -        for (el=0; el<hSbrEncoder->noElements; el++) -        { -          HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el]; -          INT Wc, ch; - -          /* Calculated required normalized cutoff frequency (Wc = 1.0 -> lowestBandwidth = inputSampleRate/2) */ -          Wc = (2*lowestBandwidth)*1000 / inputSampleRate; - -          for (ch=0; ch<hSbrEl->elInfo.nChannelsInEl; ch++) -          { -            FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, *downSampleFactor); -            FDK_ASSERT (hSbrEl->sbrChannel[ch]->downSampler.delay <=MAX_DS_FILTER_DELAY); -          } - -          downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay; -        } /* third element loop */ - -        /* lfe */ -        FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor); - -        /* Add the resampler additional delay to get the final delay and buffer offset values. */ -        if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))>>(*downSampleFactor-1))) { -          sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ; -          *delay += downsamplerDelay - downsampledOffset; -          downsampledOffset = 0; -        } else { -          downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1); -          sbrOffset = 0; -        } - -        hSbrEncoder->inputDataDelay = downsamplerDelay; -      } - -      /* Assign core encoder Bandwidth */ -      *coreBandwidth = lowestBandwidth; - -      /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */ -      hSbrEncoder->estimateBitrate += 2500 * (*numChannels); - -      /* initialize parametric stereo */ -      if (usePs) -      { -        PSENC_CONFIG psEncConfig; -        FDK_ASSERT(hSbrEncoder->noElements == 1); -        INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL); - -        psEncConfig.frameSize           = coreFrameLength; //sbrConfig.sbrFrameSize; -        psEncConfig.qmfFilterMode       = 0; -        psEncConfig.sbrPsDelay          = 0; - -        /* tuning parameters */ -        if (psTuningTableIdx  != INVALID_TABLE_IDX) { -          psEncConfig.nStereoBands           = psTuningTable[psTuningTableIdx].nStereoBands; -          psEncConfig.maxEnvelopes           = psTuningTable[psTuningTableIdx].nEnvelopes; -          psEncConfig.iidQuantErrorThreshold = (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold; - -          /* calculation is not quite linear, increased number of envelopes causes more bits */ -          /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope configuration */ -          hSbrEncoder->estimateBitrate += ( (((*coreSampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize)); - -        } else { -          error = ERROR(CDI, "Invalid ps tuning table index."); -          goto bail; -        } - -        qmfInitSynthesisFilterBank(&hSbrEncoder->qmfSynthesisPS, -                                    (FIXP_DBL*)hSbrEncoder->qmfSynthesisPS.FilterStates, -                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, -                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1, -                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1, -                                    hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1, -                                    (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES); - -        if(errorInfo == noError){ -          /* update delay */ -          psEncConfig.sbrPsDelay = FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0]->sbrChannel[0]->hEnvChannel.sbrExtractEnvelope); - -          if(noError != (errorInfo = PSEnc_Init( hSbrEncoder->hParametricStereo, -                                                &psEncConfig, -                                                 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, -                                                 hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands -                                                ,hSbrEncoder->dynamicRam -                                                 ))) -          { -            errorInfo = handBack(errorInfo); -          } -        } - -        /* QMF analysis + Hybrid analysis + Hybrid synthesis + QMF synthesis + downsampled input buffer delay */ -        hSbrEncoder->inputDataDelay = (64*10/2) + (6*64) +  (0) + (64*10/2-64+1) + ((*downSampleFactor)*downsampledOffset); -      } - -      hSbrEncoder->downsampledOffset = downsampledOffset; -      { -        hSbrEncoder->downmixSize = coreFrameLength*(*numChannels); -      } - -      hSbrEncoder->bufferOffset = sbrOffset; -      /* Delay Compensation: fill bitstream delay buffer with zero input signal */ -      if ( hSbrEncoder->nBitstrDelay > 0 ) -      { -        error = FDKsbrEnc_DelayCompensation (hSbrEncoder, inputBuffer); -        if (error != 0) -          goto bail; -      } - -      /* Set Output frame length */ -      *frameLength = coreFrameLength * *downSampleFactor; -      /* Input buffer offset */ -      *inputBufferOffset = fixMax(sbrOffset, downsampledOffset); - - -    } - -    return error; - -bail: -    /* Restore input settings */ -    *coreSampleRate = inputSampleRate; -    *frameLength = coreFrameLength; -    *numChannels = inputChannels; -    *coreBandwidth = inputBandWidth; - -    return error; - } - - -INT -sbrEncoder_EncodeFrame(  HANDLE_SBR_ENCODER   hSbrEncoder, -                         INT_PCM             *samples, -                         UINT                 timeInStride, -                         UINT                 sbrDataBits[(8)], -                         UCHAR                sbrData[(8)][MAX_PAYLOAD_SIZE] -                        ) -{ -  INT error; -  int el; - -  for (el=0; el<hSbrEncoder->noElements; el++) -  { -    if (hSbrEncoder->sbrElement[el] != NULL) -    { -      error = FDKsbrEnc_EnvEncodeFrame( -                                        hSbrEncoder, -                                        el, -                                        samples + hSbrEncoder->downsampledOffset, -                                        timeInStride, -                                       &sbrDataBits[el], -                                        sbrData[el], -                                        0 -                                       ); -      if (error) -        return error; -    } -  } - -  if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) ) -  {   /* lfe downsampler */ -      INT nOutSamples; - -      FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler, -                            samples + hSbrEncoder->downsampledOffset + hSbrEncoder->bufferOffset + hSbrEncoder->lfeChIdx, -                            hSbrEncoder->frameSize, -                            timeInStride, -                            samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx, -                           &nOutSamples, -                            hSbrEncoder->nChannels); - - -  } - -  return 0; -} - - -INT sbrEncoder_UpdateBuffers( -                            HANDLE_SBR_ENCODER hSbrEncoder, -                            INT_PCM *timeBuffer -                            ) - { -    if ( hSbrEncoder->downsampledOffset > 0 ) { -      /* Move delayed downsampled data */ -      FDKmemcpy ( timeBuffer, -                  timeBuffer + hSbrEncoder->downmixSize, -                  sizeof(INT_PCM) * (hSbrEncoder->downsampledOffset) ); -    } else { -      /* Move delayed input data */ -      FDKmemcpy ( timeBuffer, -        timeBuffer + hSbrEncoder->nChannels * hSbrEncoder->frameSize, -                  sizeof(INT_PCM) * hSbrEncoder->bufferOffset ); -    } -    if ( hSbrEncoder->nBitstrDelay > 0  ) -    { -      int el; - -      for (el=0; el<hSbrEncoder->noElements; el++) -      { -        FDKmemmove ( hSbrEncoder->sbrElement[el]->payloadDelayLine[0], -                     hSbrEncoder->sbrElement[el]->payloadDelayLine[1], -                     sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay*MAX_PAYLOAD_SIZE) ); - -        FDKmemmove( &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0], -                    &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1], -                    sizeof(UINT) * (hSbrEncoder->nBitstrDelay) ); -      } -    } -    return 0; - } - - -INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder) -{ -  INT estimateBitrate = 0; - -  if(hSbrEncoder) { -    estimateBitrate += hSbrEncoder->estimateBitrate; -  } - -  return estimateBitrate; -} - -INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder) -{ -  INT delay = -1; - -  if(hSbrEncoder) { -    delay = hSbrEncoder->inputDataDelay; -  } -  return delay; -} - - -INT sbrEncoder_GetLibInfo( LIB_INFO *info ) -{ -  int i; - -  if (info == NULL) { -    return -1; -  } -  /* search for next free tab */ -  for (i = 0; i < FDK_MODULE_LAST; i++) { -    if (info[i].module_id == FDK_NONE) break; -  } -  if (i == FDK_MODULE_LAST) { -    return -1; -  } -  info += i; - -  info->module_id = FDK_SBRENC; -  info->version = LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2); -  LIB_VERSION_STRING(info); -  info->build_date = __DATE__; -  info->build_time = __TIME__; -  info->title = "SBR Encoder"; - -  /* Set flags */ -  info->flags = 0 -    | CAPF_SBR_HQ -    | CAPF_SBR_PS_MPEG -    ; -  /* End of flags */ - -  return 0; -} diff --git a/libSBRenc/src/sbr_misc.cpp b/libSBRenc/src/sbr_misc.cpp deleted file mode 100644 index c673b81..0000000 --- a/libSBRenc/src/sbr_misc.cpp +++ /dev/null @@ -1,272 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Sbr miscellaneous helper functions   -*/ -#include "sbr_misc.h" - - -void FDKsbrEnc_Shellsort_fract (FIXP_DBL *in, INT n) -{ -  FIXP_DBL v; -  INT i, j; -  INT inc = 1; - -  do -    inc = 3 * inc + 1; -  while (inc <= n); - -  do { -    inc = inc / 3; -    for (i = inc + 1; i <= n; i++) { -      v = in[i-1]; -      j = i; -      while (in[j-inc-1] > v) { -        in[j-1] = in[j-inc-1]; -        j -= inc; -        if (j <= inc) -          break; -      } -      in[j-1] = v; -    } -  } while (inc > 1); - -} - -/* Sorting routine */ -void FDKsbrEnc_Shellsort_int (INT *in, INT n) -{ - -  INT i, j, v; -  INT inc = 1; - -  do -    inc = 3 * inc + 1; -  while (inc <= n); - -  do { -    inc = inc / 3; -    for (i = inc + 1; i <= n; i++) { -      v = in[i-1]; -      j = i; -      while (in[j-inc-1] > v) { -        in[j-1] = in[j-inc-1]; -        j -= inc; -        if (j <= inc) -          break; -      } -      in[j-1] = v; -    } -  } while (inc > 1); - -} - - - -/******************************************************************************* - Functionname:  FDKsbrEnc_AddVecLeft - ******************************************************************************* - - Description: - - Arguments:   INT* dst, INT* length_dst, INT* src, INT length_src - - Return:      none - -*******************************************************************************/ -void -FDKsbrEnc_AddVecLeft (INT *dst, INT *length_dst, INT *src, INT length_src) -{ -  INT i; - -  for (i = length_src - 1; i >= 0; i--) -    FDKsbrEnc_AddLeft (dst, length_dst, src[i]); -} - - -/******************************************************************************* - Functionname:  FDKsbrEnc_AddLeft - ******************************************************************************* - - Description: - - Arguments:   INT* vector, INT* length_vector, INT value - - Return:      none - -*******************************************************************************/ -void -FDKsbrEnc_AddLeft (INT *vector, INT *length_vector, INT value) -{ -  INT i; - -  for (i = *length_vector; i > 0; i--) -    vector[i] = vector[i - 1]; -  vector[0] = value; -  (*length_vector)++; -} - - -/******************************************************************************* - Functionname:  FDKsbrEnc_AddRight - ******************************************************************************* - - Description: - - Arguments:   INT* vector, INT* length_vector, INT value - - Return:      none - -*******************************************************************************/ -void -FDKsbrEnc_AddRight (INT *vector, INT *length_vector, INT value) -{ -  vector[*length_vector] = value; -  (*length_vector)++; -} - - - -/******************************************************************************* - Functionname:  FDKsbrEnc_AddVecRight - ******************************************************************************* - - Description: - - Arguments:   INT* dst, INT* length_dst, INT* src, INT length_src) - - Return:      none - -*******************************************************************************/ -void -FDKsbrEnc_AddVecRight (INT *dst, INT *length_dst, INT *src, INT length_src) -{ -  INT i; -  for (i = 0; i < length_src; i++) -    FDKsbrEnc_AddRight (dst, length_dst, src[i]); -} - - -/***************************************************************************** - -  functionname: FDKsbrEnc_LSI_divide_scale_fract - -  description:  Calculates division with best precision and scales the result. - -  return:       num*scale/denom - -*****************************************************************************/ -FIXP_DBL FDKsbrEnc_LSI_divide_scale_fract(FIXP_DBL num, FIXP_DBL denom, FIXP_DBL scale) -{ -  FIXP_DBL tmp = FL2FXCONST_DBL(0.0f); -  if (num != FL2FXCONST_DBL(0.0f)) { - -    INT shiftCommon; -    INT shiftNum   = CountLeadingBits(num); -    INT shiftDenom = CountLeadingBits(denom); -    INT shiftScale = CountLeadingBits(scale); - -    num   = num   << shiftNum; -    scale = scale << shiftScale; - -    tmp = fMultDiv2(num,scale); - -    if ( denom > (tmp >> fixMin(shiftNum+shiftScale-1,(DFRACT_BITS-1))) ) { -      denom = denom << shiftDenom; -      tmp = schur_div(tmp,denom,15); -      shiftCommon = fixMin((shiftNum-shiftDenom+shiftScale-1),(DFRACT_BITS-1)); -      if (shiftCommon < 0) -        tmp <<= -shiftCommon; -      else -        tmp >>=  shiftCommon; -    } -    else { -      tmp = /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL; -    } -  } - -  return (tmp); -} - diff --git a/libSBRenc/src/sbr_misc.h b/libSBRenc/src/sbr_misc.h deleted file mode 100644 index f471974..0000000 --- a/libSBRenc/src/sbr_misc.h +++ /dev/null @@ -1,106 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Sbr miscellaneous helper functions prototypes   -  \author -*/ - -#ifndef _SBR_MISC_H -#define _SBR_MISC_H - -#include "sbr_encoder.h" - -/* Sorting routines */ -void FDKsbrEnc_Shellsort_fract (FIXP_DBL *in, INT n); -void FDKsbrEnc_Shellsort_int   (INT *in, INT n); - -void FDKsbrEnc_AddLeft (INT *vector, INT *length_vector, INT value); -void FDKsbrEnc_AddRight (INT *vector, INT *length_vector, INT value); -void FDKsbrEnc_AddVecLeft (INT *dst, INT *length_dst, INT *src, INT length_src); -void FDKsbrEnc_AddVecRight (INT *dst, INT *length_vector_dst, INT *src, INT length_src); - -FIXP_DBL FDKsbrEnc_LSI_divide_scale_fract(FIXP_DBL num, FIXP_DBL denom, FIXP_DBL scale); - -#endif diff --git a/libSBRenc/src/sbr_ram.cpp b/libSBRenc/src/sbr_ram.cpp deleted file mode 100644 index ee6c37f..0000000 --- a/libSBRenc/src/sbr_ram.cpp +++ /dev/null @@ -1,222 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief Memory layout -    - -  This module declares all static and dynamic memory spaces -*/ -#include "sbr_ram.h" - -#include "sbr.h" -#include "genericStds.h" - -C_ALLOC_MEM (Ram_SbrDynamic_RAM, FIXP_DBL, ((SBR_ENC_DYN_RAM_SIZE)/sizeof(FIXP_DBL))) - -/*! -  \name StaticSbrData - -  Static memory areas, must not be overwritten in other sections of the encoder -*/ -/* @{ */ - -/*! static sbr encoder instance for one encoder (2 channels) -  all major static and dynamic memory areas are located -  in module sbr_ram and sbr rom -*/ -C_ALLOC_MEM (Ram_SbrEncoder, SBR_ENCODER, 1) -C_ALLOC_MEM2(Ram_SbrChannel, SBR_CHANNEL, 1, (8)) -C_ALLOC_MEM2(Ram_SbrElement, SBR_ELEMENT, 1, (8)) - -/*! Filter states for QMF-analysis. <br> -  Dimension: #MAXNRSBRCHANNELS * #SBR_QMF_FILTER_LENGTH -*/ -C_AALLOC_MEM2_L (Ram_Sbr_QmfStatesAnalysis, FIXP_QAS, QMF_FILTER_LENGTH, (8), SECT_DATA_L1) - - -/*! Matrix holding the quota values for all estimates, all channels -  Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES -*/ -C_ALLOC_MEM2_L (Ram_Sbr_quotaMatrix, FIXP_DBL, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (8), SECT_DATA_L1) - -/*! Matrix holding the sign values for all estimates, all channels -  Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES -*/ -C_ALLOC_MEM2 (Ram_Sbr_signMatrix, INT, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (8)) - -/*! Frequency band table (low res) <br> -  Dimension #MAX_FREQ_COEFFS/2+1 -*/ -C_ALLOC_MEM2 (Ram_Sbr_freqBandTableLO, UCHAR, (MAX_FREQ_COEFFS/2+1), (8)) - -/*! Frequency band table (high res) <br> -  Dimension #MAX_FREQ_COEFFS +1 -*/ -C_ALLOC_MEM2 (Ram_Sbr_freqBandTableHI, UCHAR, (MAX_FREQ_COEFFS+1), (8)) - -/*! vk matser table <br> -  Dimension #MAX_FREQ_COEFFS +1 -*/ -C_ALLOC_MEM2 (Ram_Sbr_v_k_master, UCHAR, (MAX_FREQ_COEFFS+1), (8)) - - -/* -  Missing harmonics detection -*/ - -/*! sbr_detectionVectors <br> -  Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] -*/ -C_ALLOC_MEM2 (Ram_Sbr_detectionVectors, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) - -/*! sbr_prevCompVec[ <br> -  Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] -*/ -C_ALLOC_MEM2 (Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (8)) -/*! sbr_guideScfb[ <br> -  Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] -*/ -C_ALLOC_MEM2 (Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (8)) - -/*! sbr_guideVectorDetected <br> -  Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] -*/ -C_ALLOC_MEM2 (Ram_Sbr_guideVectorDetected, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) -C_ALLOC_MEM2 (Ram_Sbr_guideVectorDiff, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) -C_ALLOC_MEM2 (Ram_Sbr_guideVectorOrig, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) - -/* -  Static Parametric Stereo memory -*/ -C_AALLOC_MEM_L(Ram_PsQmfStatesSynthesis, FIXP_DBL, QMF_FILTER_LENGTH/2, SECT_DATA_L1) - -C_ALLOC_MEM_L (Ram_PsEncode,    PS_ENCODE, 1, SECT_DATA_L1) -C_ALLOC_MEM   (Ram_ParamStereo, PARAMETRIC_STEREO, 1) - - - -/* @} */ - - -/*! -  \name DynamicSbrData - -  Dynamic memory areas, might be reused in other algorithm sections, -  e.g. the core encoder. -*/ -/* @{ */ - -  /*! Energy buffer for envelope extraction <br> -    Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_SLOTS *  #SBR_QMF_CHANNELS -  */ -  C_ALLOC_MEM2 (Ram_Sbr_envYBuffer, FIXP_DBL, (QMF_MAX_TIME_SLOTS/2 * QMF_CHANNELS), (8)) - -  FIXP_DBL* GetRam_Sbr_envYBuffer (int n, UCHAR* dynamic_RAM) { -    FDK_ASSERT(dynamic_RAM!=0); -    return ((FIXP_DBL*) (dynamic_RAM + OFFSET_NRG + (n*Y_2_BUF_BYTE) )); -  } - -  /* -   * QMF data -   */ -  /* The SBR encoder uses a single channel overlapping buffer set (always n=0), but PS does not. */ -  FIXP_DBL* GetRam_Sbr_envRBuffer (int n, UCHAR* dynamic_RAM) { -    FDK_ASSERT(dynamic_RAM!=0); -    return ((FIXP_DBL*) (dynamic_RAM + OFFSET_QMF + (n*(ENV_R_BUFF_BYTE+ENV_I_BUFF_BYTE)) )); -  } -  FIXP_DBL* GetRam_Sbr_envIBuffer (int n, UCHAR* dynamic_RAM) { -    FDK_ASSERT(dynamic_RAM!=0); -    return ((FIXP_DBL*) (dynamic_RAM + OFFSET_QMF + (ENV_R_BUFF_BYTE) + (n*(ENV_R_BUFF_BYTE+ENV_I_BUFF_BYTE)))); -  } - - - - -/* @} */ - - - - - diff --git a/libSBRenc/src/sbr_ram.h b/libSBRenc/src/sbr_ram.h deleted file mode 100644 index 7e3d0c8..0000000 --- a/libSBRenc/src/sbr_ram.h +++ /dev/null @@ -1,187 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -\file -\brief Memory layout -  -*/ -#ifndef __SBR_RAM_H -#define __SBR_RAM_H - -#include "sbr_def.h" -#include "env_est.h" -#include "sbr_encoder.h" -#include "sbr.h" - - - -#include "ps_main.h" -#include "ps_encode.h" - - -#define ENV_TRANSIENTS_BYTE  ( (sizeof(FIXP_DBL)*(MAX_NUM_CHANNELS*3*QMF_MAX_TIME_SLOTS)) ) - -  #define ENV_R_BUFF_BYTE      ( (sizeof(FIXP_DBL)*((QMF_MAX_TIME_SLOTS) * MAX_HYBRID_BANDS)) ) -  #define ENV_I_BUFF_BYTE      ( (sizeof(FIXP_DBL)*((QMF_MAX_TIME_SLOTS) * MAX_HYBRID_BANDS)) ) -  #define Y_BUF_CH_BYTE        ( (2*sizeof(FIXP_DBL)*((QMF_MAX_TIME_SLOTS) * MAX_HYBRID_BANDS)) ) - - -#define ENV_R_BUF_PS_BYTE    ( (sizeof(FIXP_DBL)*QMF_MAX_TIME_SLOTS * QMF_CHANNELS / 2) ) -#define ENV_I_BUF_PS_BYTE    ( (sizeof(FIXP_DBL)*QMF_MAX_TIME_SLOTS * QMF_CHANNELS / 2) ) - -#define TON_BUF_CH_BYTE      ( (sizeof(FIXP_DBL)*(MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS)) ) - -#define Y_2_BUF_BYTE         ( Y_BUF_CH_BYTE>>1 ) - - -/* Workbuffer RAM - Allocation */ -/* - ++++++++++++++++++++++++++++++++++++++++++++++++++++ - |        OFFSET_QMF       |        OFFSET_NRG      | - ++++++++++++++++++++++++++++++++++++++++++++++++++++ -  ------------------------- ------------------------- - |                         |         0.5 *          | - |     sbr_envRBuffer      | sbr_envYBuffer_size    | - |     sbr_envIBuffer      |                        | -  ------------------------- ------------------------- - -*/ -  #define BUF_NRG_SIZE   ( (MAX_NUM_CHANNELS * Y_2_BUF_BYTE) ) -  #define BUF_QMF_SIZE  (ENV_R_BUFF_BYTE + ENV_I_BUFF_BYTE) - -  /* Size of the shareable memory region than can be reused */ -  #define SBR_ENC_DYN_RAM_SIZE  ( BUF_QMF_SIZE + BUF_NRG_SIZE ) - -  #define OFFSET_QMF         ( 0 ) -  #define OFFSET_NRG         ( OFFSET_QMF + BUF_QMF_SIZE ) - - -/* - ***************************************************************************************************** - */ - -  H_ALLOC_MEM(Ram_SbrDynamic_RAM, FIXP_DBL) - -  H_ALLOC_MEM(Ram_SbrEncoder, SBR_ENCODER) -  H_ALLOC_MEM(Ram_SbrChannel, SBR_CHANNEL) -  H_ALLOC_MEM(Ram_SbrElement, SBR_ELEMENT) - -  H_ALLOC_MEM(Ram_Sbr_quotaMatrix, FIXP_DBL) -  H_ALLOC_MEM(Ram_Sbr_signMatrix, INT) - -  H_ALLOC_MEM(Ram_Sbr_QmfStatesAnalysis, FIXP_QAS) - -  H_ALLOC_MEM(Ram_Sbr_freqBandTableLO, UCHAR) -  H_ALLOC_MEM(Ram_Sbr_freqBandTableHI, UCHAR) -  H_ALLOC_MEM(Ram_Sbr_v_k_master, UCHAR) - -  H_ALLOC_MEM(Ram_Sbr_detectionVectors, UCHAR) -  H_ALLOC_MEM(Ram_Sbr_prevEnvelopeCompensation, UCHAR) -  H_ALLOC_MEM(Ram_Sbr_guideScfb, UCHAR) -  H_ALLOC_MEM(Ram_Sbr_guideVectorDetected, UCHAR) - -  /* Dynamic Memory Allocation */ - -  H_ALLOC_MEM(Ram_Sbr_envYBuffer, FIXP_DBL) -  FIXP_DBL* GetRam_Sbr_envYBuffer (int n, UCHAR* dynamic_RAM); -  FIXP_DBL* GetRam_Sbr_envRBuffer (int n, UCHAR* dynamic_RAM); -  FIXP_DBL* GetRam_Sbr_envIBuffer (int n, UCHAR* dynamic_RAM); - -  H_ALLOC_MEM(Ram_Sbr_guideVectorDiff, FIXP_DBL) -  H_ALLOC_MEM(Ram_Sbr_guideVectorOrig, FIXP_DBL) - - -  H_ALLOC_MEM(Ram_PsQmfStatesSynthesis, FIXP_DBL) - -  H_ALLOC_MEM(Ram_PsEncode, PS_ENCODE) - -  FIXP_DBL* FDKsbrEnc_SliceRam_PsRqmf (FIXP_DBL* rQmfData, UCHAR* dynamic_RAM, int n, int i, int qmfSlots); -  FIXP_DBL* FDKsbrEnc_SliceRam_PsIqmf (FIXP_DBL* iQmfData, UCHAR* dynamic_RAM, int n, int i, int qmfSlots); - -  H_ALLOC_MEM(Ram_ParamStereo, PARAMETRIC_STEREO) - - - -#endif - diff --git a/libSBRenc/src/sbr_rom.cpp b/libSBRenc/src/sbr_rom.cpp deleted file mode 100644 index a2b6527..0000000 --- a/libSBRenc/src/sbr_rom.cpp +++ /dev/null @@ -1,792 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Definition of constant tables -    - -  This module contains most of the constant data that can be stored in ROM. -*/ - -#include "sbr_rom.h" -#include "genericStds.h" - -//@{ -/******************************************************************************* - -   Table Overview: - - o envelope level,   1.5 dB: -    1a)  v_Huff_envelopeLevelC10T[121] -    1b)  v_Huff_envelopeLevelL10T[121] -    2a)  v_Huff_envelopeLevelC10F[121] -    2b)  v_Huff_envelopeLevelL10F[121] - - o envelope balance, 1.5 dB: -    3a)  bookSbrEnvBalanceC10T[49] -    3b)  bookSbrEnvBalanceL10T[49] -    4a)  bookSbrEnvBalanceC10F[49] -    4b)  bookSbrEnvBalanceL10F[49] - - o envelope level,   3.0 dB: -    5a)  v_Huff_envelopeLevelC11T[63] -    5b)  v_Huff_envelopeLevelL11T[63] -    6a)  v_Huff_envelopeLevelC11F[63] -    6b)  v_Huff_envelopeLevelC11F[63] - - o envelope balance, 3.0 dB: -    7a)  bookSbrEnvBalanceC11T[25] -    7b)  bookSbrEnvBalanceL11T[25] -    8a)  bookSbrEnvBalanceC11F[25] -    8b)  bookSbrEnvBalanceL11F[25] - - o noise level,      3.0 dB: -    9a)  v_Huff_NoiseLevelC11T[63] -    9b)  v_Huff_NoiseLevelL11T[63] -    - ) (v_Huff_envelopeLevelC11F[63] is used for freq dir) -    - ) (v_Huff_envelopeLevelL11F[63] is used for freq dir) - - o noise balance,    3.0 dB: -   10a)  bookSbrNoiseBalanceC11T[25] -   10b)  bookSbrNoiseBalanceL11T[25] -    - ) (bookSbrEnvBalanceC11F[25] is used for freq dir) -    - ) (bookSbrEnvBalanceL11F[25] is used for freq dir) - - -  (1.5 dB is never used for noise) - -********************************************************************************/ - - -/*******************************************************************************/ -/* table       : envelope level, 1.5 dB                                        */ -/* theor range : [-58,58], CODE_BOOK_SCF_LAV   = 58                            */ -/* implem range: [-60,60], CODE_BOOK_SCF_LAV10 = 60                            */ -/* raw stats   : envelopeLevel_00 (yes, wrong suffix in name)  KK 01-03-09     */ -/*******************************************************************************/ - -/* direction: time -   contents : codewords -   raw table: HuffCode3C2FIX.m/envelopeLevel_00T_cF.mat/v_nChex_cF -   built by : FH 01-07-05 */ - -const INT v_Huff_envelopeLevelC10T[121] = -{ -  0x0003FFD6, 0x0003FFD7, 0x0003FFD8, 0x0003FFD9, 0x0003FFDA, 0x0003FFDB, 0x0007FFB8, 0x0007FFB9, -  0x0007FFBA, 0x0007FFBB, 0x0007FFBC, 0x0007FFBD, 0x0007FFBE, 0x0007FFBF, 0x0007FFC0, 0x0007FFC1, -  0x0007FFC2, 0x0007FFC3, 0x0007FFC4, 0x0007FFC5, 0x0007FFC6, 0x0007FFC7, 0x0007FFC8, 0x0007FFC9, -  0x0007FFCA, 0x0007FFCB, 0x0007FFCC, 0x0007FFCD, 0x0007FFCE, 0x0007FFCF, 0x0007FFD0, 0x0007FFD1, -  0x0007FFD2, 0x0007FFD3, 0x0001FFE6, 0x0003FFD4, 0x0000FFF0, 0x0001FFE9, 0x0003FFD5, 0x0001FFE7, -  0x0000FFF1, 0x0000FFEC, 0x0000FFED, 0x0000FFEE, 0x00007FF4, 0x00003FF9, 0x00003FF7, 0x00001FFA, -  0x00001FF9, 0x00000FFB, 0x000007FC, 0x000003FC, 0x000001FD, 0x000000FD, 0x0000007D, 0x0000003D, -  0x0000001D, 0x0000000D, 0x00000005, 0x00000001, 0x00000000, 0x00000004, 0x0000000C, 0x0000001C, -  0x0000003C, 0x0000007C, 0x000000FC, 0x000001FC, 0x000003FD, 0x00000FFA, 0x00001FF8, 0x00003FF6, -  0x00003FF8, 0x00007FF5, 0x0000FFEF, 0x0001FFE8, 0x0000FFF2, 0x0007FFD4, 0x0007FFD5, 0x0007FFD6, -  0x0007FFD7, 0x0007FFD8, 0x0007FFD9, 0x0007FFDA, 0x0007FFDB, 0x0007FFDC, 0x0007FFDD, 0x0007FFDE, -  0x0007FFDF, 0x0007FFE0, 0x0007FFE1, 0x0007FFE2, 0x0007FFE3, 0x0007FFE4, 0x0007FFE5, 0x0007FFE6, -  0x0007FFE7, 0x0007FFE8, 0x0007FFE9, 0x0007FFEA, 0x0007FFEB, 0x0007FFEC, 0x0007FFED, 0x0007FFEE, -  0x0007FFEF, 0x0007FFF0, 0x0007FFF1, 0x0007FFF2, 0x0007FFF3, 0x0007FFF4, 0x0007FFF5, 0x0007FFF6, -  0x0007FFF7, 0x0007FFF8, 0x0007FFF9, 0x0007FFFA, 0x0007FFFB, 0x0007FFFC, 0x0007FFFD, 0x0007FFFE, -  0x0007FFFF -}; - - -/* direction: time -   contents : codeword lengths -   raw table: HuffCode3C2FIX.m/envelopeLevel_00T_cF.mat/v_nLhex_cF -   built by : FH 01-07-05 */ - -const UCHAR v_Huff_envelopeLevelL10T[121] = -{ -  0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, -  0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, -  0x13, 0x13, 0x11, 0x12, 0x10, 0x11, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x0F, 0x0E, 0x0E, 0x0D, -  0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x03, 0x04, 0x05, -  0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0D, 0x0E, 0x0E, 0x0F, 0x10, 0x11, 0x10, 0x13, 0x13, 0x13, -  0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, -  0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, -  0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13 -}; - - -/* direction: freq -   contents : codewords -   raw table: HuffCode3C2FIX.m/envelopeLevel_00F_cF.mat/v_nChex_cF -   built by : FH 01-07-05 */ - -const INT v_Huff_envelopeLevelC10F[121] = -{ -  0x0007FFE7, 0x0007FFE8, 0x000FFFD2, 0x000FFFD3, 0x000FFFD4, 0x000FFFD5, 0x000FFFD6, 0x000FFFD7, -  0x000FFFD8, 0x0007FFDA, 0x000FFFD9, 0x000FFFDA, 0x000FFFDB, 0x000FFFDC, 0x0007FFDB, 0x000FFFDD, -  0x0007FFDC, 0x0007FFDD, 0x000FFFDE, 0x0003FFE4, 0x000FFFDF, 0x000FFFE0, 0x000FFFE1, 0x0007FFDE, -  0x000FFFE2, 0x000FFFE3, 0x000FFFE4, 0x0007FFDF, 0x000FFFE5, 0x0007FFE0, 0x0003FFE8, 0x0007FFE1, -  0x0003FFE0, 0x0003FFE9, 0x0001FFEF, 0x0003FFE5, 0x0001FFEC, 0x0001FFED, 0x0001FFEE, 0x0000FFF4, -  0x0000FFF3, 0x0000FFF0, 0x00007FF7, 0x00007FF6, 0x00003FFA, 0x00001FFA, 0x00001FF9, 0x00000FFA, -  0x00000FF8, 0x000007F9, 0x000003FB, 0x000001FC, 0x000001FA, 0x000000FB, 0x0000007C, 0x0000003C, -  0x0000001C, 0x0000000C, 0x00000005, 0x00000001, 0x00000000, 0x00000004, 0x0000000D, 0x0000001D, -  0x0000003D, 0x000000FA, 0x000000FC, 0x000001FB, 0x000003FA, 0x000007F8, 0x000007FA, 0x000007FB, -  0x00000FF9, 0x00000FFB, 0x00001FF8, 0x00001FFB, 0x00003FF8, 0x00003FF9, 0x0000FFF1, 0x0000FFF2, -  0x0001FFEA, 0x0001FFEB, 0x0003FFE1, 0x0003FFE2, 0x0003FFEA, 0x0003FFE3, 0x0003FFE6, 0x0003FFE7, -  0x0003FFEB, 0x000FFFE6, 0x0007FFE2, 0x000FFFE7, 0x000FFFE8, 0x000FFFE9, 0x000FFFEA, 0x000FFFEB, -  0x000FFFEC, 0x0007FFE3, 0x000FFFED, 0x000FFFEE, 0x000FFFEF, 0x000FFFF0, 0x0007FFE4, 0x000FFFF1, -  0x0003FFEC, 0x000FFFF2, 0x000FFFF3, 0x0007FFE5, 0x0007FFE6, 0x000FFFF4, 0x000FFFF5, 0x000FFFF6, -  0x000FFFF7, 0x000FFFF8, 0x000FFFF9, 0x000FFFFA, 0x000FFFFB, 0x000FFFFC, 0x000FFFFD, 0x000FFFFE, -  0x000FFFFF -}; - - -/* direction: freq -   contents : codeword lengths -   raw table: HuffCode3C2FIX.m/envelopeLevel_00F_cF.mat/v_nLhex_cF -   built by : FH 01-07-05 */ - -const UCHAR v_Huff_envelopeLevelL10F[121] = -{ -  0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x14, 0x14, 0x14, 0x14, 0x13, 0x14, -  0x13, 0x13, 0x14, 0x12, 0x14, 0x14, 0x14, 0x13, 0x14, 0x14, 0x14, 0x13, 0x14, 0x13, 0x12, 0x13, -  0x12, 0x12, 0x11, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x0F, 0x0F, 0x0E, 0x0D, 0x0D, 0x0C, -  0x0C, 0x0B, 0x0A, 0x09, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x03, 0x04, 0x05, -  0x06, 0x08, 0x08, 0x09, 0x0A, 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0D, 0x0D, 0x0E, 0x0E, 0x10, 0x10, -  0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x14, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, -  0x14, 0x13, 0x14, 0x14, 0x14, 0x14, 0x13, 0x14, 0x12, 0x14, 0x14, 0x13, 0x13, 0x14, 0x14, 0x14, -  0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 -}; - - -/*******************************************************************************/ -/* table       : envelope balance, 1.5 dB                                      */ -/* theor range : [-48,48], CODE_BOOK_SCF_LAV = 48                              */ -/* implem range: same but mapped to [-24,24], CODE_BOOK_SCF_LAV_BALANCE10 = 24 */ -/* raw stats   : envelopePan_00 (yes, wrong suffix in name)  KK 01-03-09       */ -/*******************************************************************************/ - -/* direction: time -   contents : codewords -   raw table: HuffCode3C.m/envelopePan_00T.mat/v_nBhex -   built by : FH 01-05-15 */ - -const INT bookSbrEnvBalanceC10T[49] = -{ -  0x0000FFE4, 0x0000FFE5, 0x0000FFE6, 0x0000FFE7, 0x0000FFE8, 0x0000FFE9, 0x0000FFEA, 0x0000FFEB, -  0x0000FFEC, 0x0000FFED, 0x0000FFEE, 0x0000FFEF, 0x0000FFF0, 0x0000FFF1, 0x0000FFF2, 0x0000FFF3, -  0x0000FFF4, 0x0000FFE2, 0x00000FFC, 0x000007FC, 0x000001FE, 0x0000007E, 0x0000001E, 0x00000006, -  0x00000000, 0x00000002, 0x0000000E, 0x0000003E, 0x000000FE, 0x000007FD, 0x00000FFD, 0x00007FF0, -  0x0000FFE3, 0x0000FFF5, 0x0000FFF6, 0x0000FFF7, 0x0000FFF8, 0x0000FFF9, 0x0000FFFA, 0x0001FFF6, -  0x0001FFF7, 0x0001FFF8, 0x0001FFF9, 0x0001FFFA, 0x0001FFFB, 0x0001FFFC, 0x0001FFFD, 0x0001FFFE, -  0x0001FFFF -}; - - -/* direction: time -   contents : codeword lengths -   raw table: HuffCode3C.m/envelopePan_00T.mat/v_nLhex -   built by : FH 01-05-15 */ - -const UCHAR bookSbrEnvBalanceL10T[49] = -{ -  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, -  0x10, 0x10, 0x0C, 0x0B, 0x09, 0x07, 0x05, 0x03, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0C, 0x0F, -  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, -  0x11 -}; - - -/* direction: freq -   contents : codewords -   raw table: HuffCode3C.m/envelopePan_00F.mat/v_nBhex -   built by : FH 01-05-15 */ - -const INT bookSbrEnvBalanceC10F[49] = -{ -  0x0003FFE2, 0x0003FFE3, 0x0003FFE4, 0x0003FFE5, 0x0003FFE6, 0x0003FFE7, 0x0003FFE8, 0x0003FFE9, -  0x0003FFEA, 0x0003FFEB, 0x0003FFEC, 0x0003FFED, 0x0003FFEE, 0x0003FFEF, 0x0003FFF0, 0x0000FFF7, -  0x0001FFF0, 0x00003FFC, 0x000007FE, 0x000007FC, 0x000000FE, 0x0000007E, 0x0000000E, 0x00000002, -  0x00000000, 0x00000006, 0x0000001E, 0x0000003E, 0x000001FE, 0x000007FD, 0x00000FFE, 0x00007FFA, -  0x0000FFF6, 0x0003FFF1, 0x0003FFF2, 0x0003FFF3, 0x0003FFF4, 0x0003FFF5, 0x0003FFF6, 0x0003FFF7, -  0x0003FFF8, 0x0003FFF9, 0x0003FFFA, 0x0003FFFB, 0x0003FFFC, 0x0003FFFD, 0x0003FFFE, 0x0007FFFE, -  0x0007FFFF -}; - - -/* direction: freq -   contents : codeword lengths -   raw table: HuffCode3C.m/envelopePan_00F.mat/v_nLhex -   built by : FH 01-05-15 */ - -const UCHAR bookSbrEnvBalanceL10F[49] = -{ -  0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, -  0x11, 0x0E, 0x0B, 0x0B, 0x08, 0x07, 0x04, 0x02, 0x01, 0x03, 0x05, 0x06, 0x09, 0x0B, 0x0C, 0x0F, -  0x10, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, -  0x13 -}; - - -/*******************************************************************************/ -/* table       : envelope level, 3.0 dB                                        */ -/* theor range : [-29,29], CODE_BOOK_SCF_LAV   = 29                            */ -/* implem range: [-31,31], CODE_BOOK_SCF_LAV11 = 31                            */ -/* raw stats   : envelopeLevel_11  KK 00-02-03                                 */ -/*******************************************************************************/ - -/* direction: time -   contents : codewords -   raw table: HuffCode2.m -   built by : FH 00-02-04 */ - -const INT v_Huff_envelopeLevelC11T[63] = { -  0x0003FFED, 0x0003FFEE, 0x0007FFDE, 0x0007FFDF, 0x0007FFE0, 0x0007FFE1, 0x0007FFE2, 0x0007FFE3, -  0x0007FFE4, 0x0007FFE5, 0x0007FFE6, 0x0007FFE7, 0x0007FFE8, 0x0007FFE9, 0x0007FFEA, 0x0007FFEB, -  0x0007FFEC, 0x0001FFF4, 0x0000FFF7, 0x0000FFF9, 0x0000FFF8, 0x00003FFB, 0x00003FFA, 0x00003FF8, -  0x00001FFA, 0x00000FFC, 0x000007FC, 0x000000FE, 0x0000003E, 0x0000000E, 0x00000002, 0x00000000, -  0x00000006, 0x0000001E, 0x0000007E, 0x000001FE, 0x000007FD, 0x00001FFB, 0x00003FF9, 0x00003FFC, -  0x00007FFA, 0x0000FFF6, 0x0001FFF5, 0x0003FFEC, 0x0007FFED, 0x0007FFEE, 0x0007FFEF, 0x0007FFF0, -  0x0007FFF1, 0x0007FFF2, 0x0007FFF3, 0x0007FFF4, 0x0007FFF5, 0x0007FFF6, 0x0007FFF7, 0x0007FFF8, -  0x0007FFF9, 0x0007FFFA, 0x0007FFFB, 0x0007FFFC, 0x0007FFFD, 0x0007FFFE, 0x0007FFFF -}; - - -/* direction: time -   contents : codeword lengths -   raw table: HuffCode2.m -   built by : FH 00-02-04 */ - -const UCHAR v_Huff_envelopeLevelL11T[63] = { -  0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, -  0x13, 0x11, 0x10, 0x10, 0x10, 0x0E, 0x0E, 0x0E, 0x0D, 0x0C, 0x0B, 0x08, 0x06, 0x04, 0x02, 0x01, -  0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0E, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x13, 0x13, 0x13, -  0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13 -}; - - -/* direction: freq -   contents : codewords -   raw table: HuffCode2.m -   built by : FH 00-02-04 */ - -const INT v_Huff_envelopeLevelC11F[63] = { -  0x000FFFF0, 0x000FFFF1, 0x000FFFF2, 0x000FFFF3, 0x000FFFF4, 0x000FFFF5, 0x000FFFF6, 0x0003FFF3, -  0x0007FFF5, 0x0007FFEE, 0x0007FFEF, 0x0007FFF6, 0x0003FFF4, 0x0003FFF2, 0x000FFFF7, 0x0007FFF0, -  0x0001FFF5, 0x0003FFF0, 0x0001FFF4, 0x0000FFF7, 0x0000FFF6, 0x00007FF8, 0x00003FFB, 0x00000FFD, -  0x000007FD, 0x000003FD, 0x000001FD, 0x000000FD, 0x0000003E, 0x0000000E, 0x00000002, 0x00000000, -  0x00000006, 0x0000001E, 0x000000FC, 0x000001FC, 0x000003FC, 0x000007FC, 0x00000FFC, 0x00001FFC, -  0x00003FFA, 0x00007FF9, 0x00007FFA, 0x0000FFF8, 0x0000FFF9, 0x0001FFF6, 0x0001FFF7, 0x0003FFF5, -  0x0003FFF6, 0x0003FFF1, 0x000FFFF8, 0x0007FFF1, 0x0007FFF2, 0x0007FFF3, 0x000FFFF9, 0x0007FFF7, -  0x0007FFF4, 0x000FFFFA, 0x000FFFFB, 0x000FFFFC, 0x000FFFFD, 0x000FFFFE, 0x000FFFFF -}; - - -/* direction: freq -   contents : codeword lengths -   raw table: HuffCode2.m -   built by : FH 00-02-04 */ - -const UCHAR v_Huff_envelopeLevelL11F[63] = { -  0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x12, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x14, 0x13, -  0x11, 0x12, 0x11, 0x10, 0x10, 0x0F, 0x0E, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01, -  0x03, 0x05, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x0F, 0x10, 0x10, 0x11, 0x11, 0x12, -  0x12, 0x12, 0x14, 0x13, 0x13, 0x13, 0x14, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 -}; - - - -/*******************************************************************************/ -/* table       : envelope balance, 3.0 dB                                      */ -/* theor range : [-24,24], CODE_BOOK_SCF_LAV = 24                              */ -/* implem range: same but mapped to [-12,12], CODE_BOOK_SCF_LAV_BALANCE11 = 12 */ -/* raw stats   : envelopeBalance_11  KK 00-02-03                               */ -/*******************************************************************************/ - -/* direction: time -   contents : codewords -   raw table: HuffCode3C.m/envelopeBalance_11T.mat/v_nBhex -   built by : FH 01-05-15 */ - -const INT bookSbrEnvBalanceC11T[25] = -{ -  0x00001FF2, 0x00001FF3, 0x00001FF4, 0x00001FF5, 0x00001FF6, 0x00001FF7, 0x00001FF8, 0x00000FF8, -  0x000000FE, 0x0000007E, 0x0000000E, 0x00000006, 0x00000000, 0x00000002, 0x0000001E, 0x0000003E, -  0x000001FE, 0x00001FF9, 0x00001FFA, 0x00001FFB, 0x00001FFC, 0x00001FFD, 0x00001FFE, 0x00003FFE, -  0x00003FFF -}; - - -/* direction: time -   contents : codeword lengths -   raw table: HuffCode3C.m/envelopeBalance_11T.mat/v_nLhex -   built by : FH 01-05-15 */ - -const UCHAR bookSbrEnvBalanceL11T[25] = -{ -  0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x08, 0x07, 0x04, 0x03, 0x01, 0x02, 0x05, 0x06, -  0x09, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E -}; - - -/* direction: freq -   contents : codewords -   raw table: HuffCode3C.m/envelopeBalance_11F.mat/v_nBhex -   built by : FH 01-05-15 */ - -const INT bookSbrEnvBalanceC11F[25] = -{ -  0x00001FF7, 0x00001FF8, 0x00001FF9, 0x00001FFA, 0x00001FFB, 0x00003FF8, 0x00003FF9, 0x000007FC, -  0x000000FE, 0x0000007E, 0x0000000E, 0x00000002, 0x00000000, 0x00000006, 0x0000001E, 0x0000003E, -  0x000001FE, 0x00000FFA, 0x00001FF6, 0x00003FFA, 0x00003FFB, 0x00003FFC, 0x00003FFD, 0x00003FFE, -  0x00003FFF -}; - - -/* direction: freq -   contents : codeword lengths -   raw table: HuffCode3C.m/envelopeBalance_11F.mat/v_nLhex -   built by : FH 01-05-15 */ - -const UCHAR bookSbrEnvBalanceL11F[25] = -{ -  0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x0B, 0x08, 0x07, 0x04, 0x02, 0x01, 0x03, 0x05, 0x06, -  0x09, 0x0C, 0x0D, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E -}; - - -/*******************************************************************************/ -/* table       : noise level, 3.0 dB                                           */ -/* theor range : [-29,29], CODE_BOOK_SCF_LAV   = 29                            */ -/* implem range: [-31,31], CODE_BOOK_SCF_LAV11 = 31                            */ -/* raw stats   : noiseLevel_11  KK 00-02-03                                    */ -/*******************************************************************************/ - -/* direction: time -   contents : codewords -   raw table: HuffCode2.m -   built by : FH 00-02-04 */ - -const INT v_Huff_NoiseLevelC11T[63] = { -  0x00001FCE, 0x00001FCF, 0x00001FD0, 0x00001FD1, 0x00001FD2, 0x00001FD3, 0x00001FD4, 0x00001FD5, -  0x00001FD6, 0x00001FD7, 0x00001FD8, 0x00001FD9, 0x00001FDA, 0x00001FDB, 0x00001FDC, 0x00001FDD, -  0x00001FDE, 0x00001FDF, 0x00001FE0, 0x00001FE1, 0x00001FE2, 0x00001FE3, 0x00001FE4, 0x00001FE5, -  0x00001FE6, 0x00001FE7, 0x000007F2, 0x000000FD, 0x0000003E, 0x0000000E, 0x00000006, 0x00000000, -  0x00000002, 0x0000001E, 0x000000FC, 0x000003F8, 0x00001FCC, 0x00001FE8, 0x00001FE9, 0x00001FEA, -  0x00001FEB, 0x00001FEC, 0x00001FCD, 0x00001FED, 0x00001FEE, 0x00001FEF, 0x00001FF0, 0x00001FF1, -  0x00001FF2, 0x00001FF3, 0x00001FF4, 0x00001FF5, 0x00001FF6, 0x00001FF7, 0x00001FF8, 0x00001FF9, -  0x00001FFA, 0x00001FFB, 0x00001FFC, 0x00001FFD, 0x00001FFE, 0x00003FFE, 0x00003FFF -}; - - -/* direction: time -   contents : codeword lengths -   raw table: HuffCode2.m -   built by : FH 00-02-04 */ - -const UCHAR v_Huff_NoiseLevelL11T[63] = { -  0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, -  0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, -  0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, -  0x0000000D, 0x0000000D, 0x0000000B, 0x00000008, 0x00000006, 0x00000004, 0x00000003, 0x00000001, -  0x00000002, 0x00000005, 0x00000008, 0x0000000A, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, -  0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, -  0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, -  0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000D, 0x0000000E, 0x0000000E -}; - - -/*******************************************************************************/ -/* table       : noise balance, 3.0 dB                                         */ -/* theor range : [-24,24], CODE_BOOK_SCF_LAV = 24                              */ -/* implem range: same but mapped to [-12,12], CODE_BOOK_SCF_LAV_BALANCE11 = 12 */ -/* raw stats   : noiseBalance_11  KK 00-02-03                                  */ -/*******************************************************************************/ - -/* direction: time -   contents : codewords -   raw table: HuffCode3C.m/noiseBalance_11.mat/v_nBhex -   built by : FH 01-05-15 */ - -const INT bookSbrNoiseBalanceC11T[25] = -{ -  0x000000EC, 0x000000ED, 0x000000EE, 0x000000EF, 0x000000F0, 0x000000F1, 0x000000F2, 0x000000F3, -  0x000000F4, 0x000000F5, 0x0000001C, 0x00000002, 0x00000000, 0x00000006, 0x0000003A, 0x000000F6, -  0x000000F7, 0x000000F8, 0x000000F9, 0x000000FA, 0x000000FB, 0x000000FC, 0x000000FD, 0x000000FE, -  0x000000FF -}; - - -/* direction: time -   contents : codeword lengths -   raw table: HuffCode3C.m/noiseBalance_11.mat/v_nLhex -   built by : FH 01-05-15 */ - -const UCHAR bookSbrNoiseBalanceL11T[25] = -{ -  0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x05, 0x02, 0x01, 0x03, 0x06, 0x08, -  0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 -}; - -/* -   tuningTable -*/ -const sbrTuningTable_t sbrTuningTable[] = -{ -  /* Some of the low bitrates are commented out here, this is because the -     encoder could lose frames at those bitrates and throw an error because -     it has insufficient bits to encode for some test items. -  */ - -  /*** HE-AAC section ***/ -  /*                        sf,sfsp,sf,sfsp,nnb,nfo,saml,SM,FS*/ - -  /*** mono ***/ - -  /* 8/16 kHz dual rate */ -  { CODEC_AAC,   8000, 10000,   8000, 1,  7, 6, 11,10, 1, 0, 6, SBR_MONO, 3 }, -  { CODEC_AAC,  10000, 12000,   8000, 1, 11, 7, 13,12, 1, 0, 6, SBR_MONO, 3 }, -  { CODEC_AAC,  12000, 16001,   8000, 1, 14,10, 13,13, 1, 0, 6, SBR_MONO, 3 }, -  { CODEC_AAC,  16000, 24000,   8000, 1, 14,10, 14,14, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ -  { CODEC_AAC,  24000, 32000,   8000, 1, 14,10, 14,14, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ -  { CODEC_AAC,  32000, 48001,   8000, 1, 14,11, 15,15, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ /* bitrates higher than 48000 not supported by AAC core */ - -  /* 11/22 kHz dual rate */ -  { CODEC_AAC,   8000, 10000,  11025, 1,  5, 4,  6, 6, 1, 0, 6, SBR_MONO, 3 }, -  { CODEC_AAC,  10000, 12000,  11025, 1,  8, 5, 12, 9, 1, 0, 6, SBR_MONO, 3 }, -  { CODEC_AAC,  12000, 16000,  11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3 }, -  { CODEC_AAC,  16000, 20000,  11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3 }, /* at such "high" bitrates it's better to upsample the input */ -  { CODEC_AAC,  20000, 24001,  11025, 1, 13, 9, 13, 8, 1, 0, 6, SBR_MONO, 3 }, /* signal by a factor of 2 before sending it into the encoder */ -  { CODEC_AAC,  24000, 32000,  11025, 1, 14,10, 14, 9, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ -  { CODEC_AAC,  32000, 48000,  11025, 1, 15,11, 15,10, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ -  { CODEC_AAC,  48000, 64001,  11025, 1, 15,11, 15,10, 2, 0, 3, SBR_MONO, 1 }, /* placebo */ - -  /* 12/24 kHz dual rate */ -  { CODEC_AAC,   8000, 10000,  12000, 1,  4, 3,  6, 6, 1, 0, 6, SBR_MONO, 3 }, /* nominal:  8 kbit/s */ -  { CODEC_AAC,  10000, 12000,  12000, 1,  7, 4, 11, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 10 kbit/s */ -  { CODEC_AAC,  12000, 16000,  12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */ -  { CODEC_AAC,  16000, 20000,  12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */ /* at such "high" bitrates it's better to upsample the input */ -  { CODEC_AAC,  20000, 24001,  12000, 1, 12, 8, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 20 kbit/s */ /* signal by a factor of 2 before sending it into the encoder */ -  { CODEC_AAC,  24000, 32000,  12000, 1, 13, 9, 13, 9, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ -  { CODEC_AAC,  32000, 48000,  12000, 1, 14,10, 14,10, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ -  { CODEC_AAC,  48000, 64001,  12000, 1, 14,11, 15,11, 2, 0, 3, SBR_MONO, 1 }, /* placebo */ - -  /* 16/32 kHz dual rate */ -  { CODEC_AAC,   8000, 10000,  16000, 1,  1, 1, 0, 0,  1, 0, 6, SBR_MONO, 3 }, /* nominal:  8 kbit/s */ -  { CODEC_AAC,  10000, 12000,  16000, 1,  2, 1, 6, 0,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 10 kbit/s */ -  { CODEC_AAC,  12000, 16000,  16000, 1,  4, 2, 6, 0,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */ -  { CODEC_AAC,  16000, 18000,  16000, 1,  4, 2, 8, 3,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */ -  { CODEC_AAC,  18000, 22000,  16000, 1,  6, 5,11, 7,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */ -  { CODEC_AAC,  22000, 28000,  16000, 1, 10, 9,12, 8,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  16000, 1, 12,12,13,13,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  16000, 1, 14,14,13,13,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 64001,  16000, 1, 14,14,13,13,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ - -  /* 22.05/44.1 kHz dual rate */ -  /* { CODEC_AAC,   8000, 11369,  22050, 1,  1, 1, 1, 1,  1, 0, 6, SBR_MONO, 3 }, */ /* nominal:  8 kbit/s */   /* encoder can not work stable at this extremely low bitrate */ -  { CODEC_AAC,  11369, 16000,  22050, 1,  3, 1, 4, 4,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */ -  { CODEC_AAC,  16000, 18000,  22050, 1,  3, 1, 5, 4,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */ -  { CODEC_AAC,  18000, 22000,  22050, 1,  4, 4, 8, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */ -  { CODEC_AAC,  22000, 28000,  22050, 1,  7, 6, 8, 6,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  22050, 1, 10,10, 9, 9,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  22050, 1, 11,11,10,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 64001,  22050, 1, 13,13,12,12,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ - -  /* 24/48 kHz dual rate */ -  /* { CODEC_AAC,   8000, 12000,  24000, 1,  1, 1, 1, 1,  1, 0, 6, SBR_MONO, 3 }, */ /* nominal:  8 kbit/s */   /* encoder can not work stable at this extremely low bitrate */ -  { CODEC_AAC,  12000, 16000,  24000, 1,  3, 1, 4, 4,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */ -  { CODEC_AAC,  16000, 18000,  24000, 1,  3, 1, 5, 4,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */ -  { CODEC_AAC,  18000, 22000,  24000, 1,  4, 3, 8, 5,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */ -  { CODEC_AAC,  22000, 28000,  24000, 1,  7, 6, 8, 6,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  24000, 1, 10,10, 9, 9,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  24000, 1, 11,11,10,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 64001,  24000, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ - -  /* 32/64 kHz dual rate */  /* placebo settings */ -  { CODEC_AAC,   24000, 36000, 32000, 1,  4, 4, 4, 4,  2, 0, 3, SBR_MONO, 3 }, /* lowest range  */ -  { CODEC_AAC,   36000, 60000, 32000, 1,  7, 7, 6, 6,  2, 0, 3, SBR_MONO, 2 }, /* lowest range */ -  { CODEC_AAC,   60000, 72000, 32000, 1,  9, 9, 8, 8,  2, 0, 3, SBR_MONO, 1 }, /* low range */ -  { CODEC_AAC,   72000,100000, 32000, 1, 11,11,10,10,  2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */ -  { CODEC_AAC,  100000,160001, 32000, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */ - -  /* 44.1/88.2 kHz dual rate */  /* placebo settings */ -  { CODEC_AAC,   24000, 36000, 44100, 1,  4, 4, 4, 4,  2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   36000, 60000, 44100, 1,  7, 7, 6, 6,  2, 0, 3, SBR_MONO, 2 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   60000, 72000, 44100, 1,  9, 9, 8, 8,  2, 0, 3, SBR_MONO, 1 }, /* low range */ -  { CODEC_AAC,   72000,100000, 44100, 1, 11,11,10,10,  2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */ -  { CODEC_AAC,  100000,160001, 44100, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */ - -  /* 48/96 kHz dual rate */  /* not yet finally tuned */ -  { CODEC_AAC,   32000, 36000, 48000, 1,  4, 4, 9, 9,  2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   36000, 60000, 48000, 1,  7, 7,10,10,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */ -  { CODEC_AAC,   60000, 72000, 48000, 1,  9, 9,10,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */ -  { CODEC_AAC,   72000,100000, 48000, 1, 11,11,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */ -  { CODEC_AAC,  100000,160001, 48000, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */ - -  /*** stereo ***/ -  /* 08/16 kHz dual rate */ -  { CODEC_AAC,  16000, 24000,   8000, 2,  6, 6,  9, 7, 1, 0,-3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */ -  { CODEC_AAC,  24000, 28000,   8000, 2,  9, 9, 11, 9, 1, 0,-3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,   8000, 2, 11, 9, 11, 9, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,   8000, 2, 13,11, 13,11, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 52000,   8000, 2, 14,12, 13,12, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AAC,  52000, 60000,   8000, 2, 14,14, 13,13, 3, 0,-3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AAC,  60000, 76000,   8000, 2, 14,14, 13,13, 3, 0,-3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AAC,  76000,128001,   8000, 2, 14,14, 13,13, 3, 0,-3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 11/22 kHz dual rate */ -  { CODEC_AAC,  16000, 24000,  11025, 2,  7, 5, 9, 7,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */ -  { CODEC_AAC,  24000, 28000,  11025, 2, 10, 8,10, 8,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  11025, 2, 12, 8,12, 8,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  11025, 2, 13, 9,13, 9,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 52000,  11025, 2, 14,11,13,11,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AAC,  52000, 60000,  11025, 2, 15,15,13,13,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AAC,  60000, 76000,  11025, 2, 15,15,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AAC,  76000,128001,  11025, 2, 15,15,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 12/24 kHz dual rate */ -  { CODEC_AAC,  16000, 24000,  12000, 2,  6, 4, 9, 7,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */ -  { CODEC_AAC,  24000, 28000,  12000, 2,  9, 7,10, 8,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  12000, 2, 11, 7,12, 8,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  12000, 2, 12, 9,12, 9,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 52000,  12000, 2, 13,12,13,12,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AAC,  52000, 60000,  12000, 2, 14,14,13,13,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AAC,  60000, 76000,  12000, 2, 14,14,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AAC,  76000,128001,  12000, 2, 14,14,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 16/32 kHz dual rate */ -  { CODEC_AAC,  16000, 24000,  16000, 2,  4, 2, 1, 0,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ -  { CODEC_AAC,  24000, 28000,  16000, 2,  8, 7,10, 8,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  16000, 2, 10, 9,12,11,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  16000, 2, 13,13,13,13,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 52000,  16000, 2, 14,14,13,13,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AAC,  52000, 60000,  16000, 2, 14,14,13,13,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AAC,  60000, 76000,  16000, 2, 14,14,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AAC,  76000,128001,  16000, 2, 14,14,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 22.05/44.1 kHz dual rate */ -  { CODEC_AAC,  16000, 24000,  22050, 2,  2, 1, 1, 0,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ -  { CODEC_AAC,  24000, 28000,  22050, 2,  5, 4, 6, 5,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 32000,  22050, 2,  5, 4, 8, 7,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 28 kbit/s */ -  { CODEC_AAC,  32000, 36000,  22050, 2,  7, 6, 8, 7,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  22050, 2, 10,10, 9, 9,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 52000,  22050, 2, 12,12, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AAC,  52000, 60000,  22050, 2, 13,13,10,10,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AAC,  60000, 76000,  22050, 2, 14,14,12,12,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AAC,  76000,128001,  22050, 2, 14,14,12,12,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 24/48 kHz dual rate */ -  { CODEC_AAC,  16000, 24000,  24000, 2,  2, 1, 1, 0,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ -  { CODEC_AAC,  24000, 28000,  24000, 2,  5, 5, 6, 6,  1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */ -  { CODEC_AAC,  28000, 36000,  24000, 2,  7, 6, 8, 7,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AAC,  36000, 44000,  24000, 2, 10,10, 9, 9,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AAC,  44000, 52000,  24000, 2, 12,12, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AAC,  52000, 60000,  24000, 2, 13,13,10,10,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AAC,  60000, 76000,  24000, 2, 14,14,12,12,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AAC,  76000,128001,  24000, 2, 14,14,12,12,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 32/64 kHz dual rate */  /* placebo settings */ -  { CODEC_AAC,   32000, 60000, 32000, 2,  4, 4, 4, 4,  2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   60000, 80000, 32000, 2,  7, 7, 6, 6,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   80000,112000, 32000, 2,  9, 9, 8, 8,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */ -  { CODEC_AAC,  112000,144000, 32000, 2, 11,11,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */ -  { CODEC_AAC,  144000,256001, 32000, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */ - -  /* 44.1/88.2 kHz dual rate */  /* placebo settings */ -  { CODEC_AAC,   32000, 60000, 44100, 2,  4, 4, 4, 4,  2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   60000, 80000, 44100, 2,  7, 7, 6, 6,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   80000,112000, 44100, 2,  9, 9, 8, 8,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */ -  { CODEC_AAC,  112000,144000, 44100, 2, 11,11,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */ -  { CODEC_AAC,  144000,256001, 44100, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */ - -  /* 48/96 kHz dual rate */  /* not yet finally tuned */ -  { CODEC_AAC,   36000, 60000, 48000, 2,  4, 4, 9, 9,  2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */ -  { CODEC_AAC,   60000, 80000, 48000, 2,  7, 7, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */ -  { CODEC_AAC,   80000,112000, 48000, 2,  9, 9,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */ -  { CODEC_AAC,  112000,144000, 48000, 2, 11,11,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */ -  { CODEC_AAC,  144000,256001, 48000, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 192 */ - - -  /** AAC LOW DELAY SECTION **/ - -  /*** mono ***/ -  /* 16/32 kHz dual rate not yet tuned ->alb copied from non LD tables*/ -  { CODEC_AACLD,  16000, 18000,  16000, 1,  4, 5, 9, 7,  1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s wrr: tuned */ -  { CODEC_AACLD,  18000, 22000,  16000, 1,  7, 7,12,12,  1, 6, 9, SBR_MONO, 3 }, /* nominal: 20 kbit/s wrr: tuned */ -  { CODEC_AACLD,  22000, 28000,  16000, 1,  6, 6, 9, 9,  2, 3, 6, SBR_MONO, 3 }, /* nominal: 24 kbit/s wrr: tuned */ -  { CODEC_AACLD,  28000, 36000,  16000, 1,  8, 8,12, 7,  2, 9,12, SBR_MONO, 3 }, /* jgr: special */ /* wrr: tuned */ -  { CODEC_AACLD,  36000, 44000,  16000, 1, 10,14,12,13,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ -  { CODEC_AACLD,  44000, 64001,  16000, 1, 11,14,13,13,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ - -  /* 22.05/44.1 kHz dual rate */ -  { CODEC_AACLD,  18000, 22000,  22050, 1,  4, 4, 5, 5,  2, 0, 6, SBR_MONO, 3 }, /* nominal: 20 kbit/s */ -  { CODEC_AACLD,  22000, 28000,  22050, 1,  5, 5, 6, 6,  2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ -  { CODEC_AACLD,  28000, 36000,  22050, 1,  7, 8, 8, 8,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AACLD,  36000, 44000,  22050, 1,  9, 9, 9, 9,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ -  { CODEC_AACLD,  44000, 52000,  22050, 1, 12,11,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ -  { CODEC_AACLD,  52000, 64001,  22050, 1, 13,11,11,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 56 kbit/s */ - -  /* 24/48 kHz dual rate */ -  { CODEC_AACLD,  20000, 22000,  24000, 1,  4, 1, 8, 4,  2, 3, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */ -  { CODEC_AACLD,  22000, 28000,  24000, 1,  3, 8, 8, 7,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ -  { CODEC_AACLD,  28000, 36000,  24000, 1,  4, 8, 8, 7,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AACLD,  36000, 56000,  24000, 1,  8, 9, 9, 9,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ -  { CODEC_AACLD,  56000, 64001,  24000, 1, 13,11,11,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 kbit/s */ - -  /* 32/64 kHz dual rate */  /* placebo settings */  /*jgr: new, copy from CODEC_AAC */ -  { CODEC_AACLD,  24000, 36000,  32000, 1,  4, 4, 4, 4,  2, 0, 3, SBR_MONO, 3 }, /* lowest range  */ -  { CODEC_AACLD,  36000, 60000,  32000, 1,  7, 7, 6, 6,  2, 0, 3, SBR_MONO, 2 }, /* lowest range */ -  { CODEC_AACLD,  60000, 72000,  32000, 1,  9, 9, 8, 8,  2, 0, 3, SBR_MONO, 1 }, /* low range */ -  { CODEC_AACLD,  72000,100000,  32000, 1, 11,11,10,10,  2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */ -  { CODEC_AACLD, 100000,160001,  32000, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */ - -  /* 44/88 kHz dual rate */  /* not yet finally tuned */ -  { CODEC_AACLD,  36000, 60000,  44100, 1,  8, 7, 6, 9,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */ -  { CODEC_AACLD,  60000, 72000,  44100, 1,  9, 9,10,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */ -  { CODEC_AACLD,  72000,100000,  44100, 1, 11,11,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */ -  { CODEC_AACLD, 100000,160001,  44100, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */ - -  /* 48/96 kHz dual rate */  /* 32 and 40kbps line tuned for dual-rate SBR */ -  { CODEC_AACLD,  36000, 60000,  48000, 1,  8, 7, 6, 9,  2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */ -  { CODEC_AACLD,  60000, 72000,  48000, 1,  9, 9,10,10,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */ -  { CODEC_AACLD,  72000,100000,  48000, 1, 11,11,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */ -  { CODEC_AACLD, 100000,160001,  48000, 1, 13,13,11,11,  2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */ - -  /*** stereo ***/ -  /* 16/32 kHz dual rate not yet tuned ->alb copied from non LD tables*/ -  { CODEC_AACLD,  32000, 36000,  16000, 2, 10, 9,12,11,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AACLD,  36000, 44000,  16000, 2, 13,13,13,13,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AACLD,  44000, 52000,  16000, 2, 10, 9,11, 9,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* tune12 nominal: 48 kbit/s */ -  { CODEC_AACLD,  52000, 60000,  16000, 2, 14,14,13,13,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AACLD,  60000, 76000,  16000, 2, 14,14,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AACLD,  76000,128001,  16000, 2, 14,14,13,13,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 22.05/44.1 kHz dual rate */ -  { CODEC_AACLD,  32000, 36000,  22050, 2,  5, 4, 7, 6,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AACLD,  36000, 44000,  22050, 2,  5, 8, 8, 8,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AACLD,  44000, 52000,  22050, 2,  7,10, 8, 8,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AACLD,  52000, 60000,  22050, 2,  9,11, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AACLD,  60000, 76000,  22050, 2, 10,12,10,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AACLD,  76000, 82000,  22050, 2, 12,12,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ -  { CODEC_AACLD,  82000,128001,  22050, 2, 13,12,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ - -  /* 24/48 kHz dual rate */ -  { CODEC_AACLD,  32000, 36000,  24000, 2,  5, 4, 7, 6,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ -  { CODEC_AACLD,  36000, 44000,  24000, 2,  4, 8, 8, 8,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ -  { CODEC_AACLD,  44000, 52000,  24000, 2,  6,10, 8, 8,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ -  { CODEC_AACLD,  52000, 60000,  24000, 2,  9,11, 9, 9,  3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ -  { CODEC_AACLD,  60000, 76000,  24000, 2, 11,12,10,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ -  { CODEC_AACLD,  76000, 88000,  24000, 2, 12,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ -  { CODEC_AACLD,  88000,128001,  24000, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 92 kbit/s */ - -  /* 32/64 kHz dual rate */  /* placebo settings */ /*jgr: new, copy from CODEC_AAC */ -  { CODEC_AACLD,  60000, 80000,  32000, 2,  7, 7, 6, 6,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */ -  { CODEC_AACLD,  80000,112000,  32000, 2,  9, 9, 8, 8,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */ -  { CODEC_AACLD, 112000,144000,  32000, 2, 11,11,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */ -  { CODEC_AACLD, 144000,256001,  32000, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */ - -  /* 44.1/88.2 kHz dual rate */  /* placebo settings */ /*wrr: new, copy from CODEC_AAC */ -  { CODEC_AACLD,  60000, 80000,  44100, 2,  7, 7, 6, 6,  3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */ -  { CODEC_AACLD,  80000,112000,  44100, 2, 10,10, 8, 8,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 11-08-29 */ -  { CODEC_AACLD, 112000,144000,  44100, 2, 12,12,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 11-08-29 */ -  { CODEC_AACLD, 144000,256001,  44100, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */ - -  /* 48/96 kHz dual rate */  /* not yet finally tuned */ /*wrr: new, copy from CODEC_AAC */ -  { CODEC_AACLD,  60000, 80000,  48000, 2,  7, 7,10,10,  2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */ -  { CODEC_AACLD,  80000,112000,  48000, 2,  9, 9,10,10,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */ -  { CODEC_AACLD, 112000,144000,  48000, 2, 11,11,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */ -  { CODEC_AACLD, 144000,176000,  48000, 2, 12,12,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 09-10-19 */ -  { CODEC_AACLD, 176000,256001,  48000, 2, 13,13,11,11,  3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 09-10-19 */ - -}; - -const int sbrTuningTableSize = sizeof(sbrTuningTable)/sizeof(sbrTuningTable[0]); - -const psTuningTable_t psTuningTable[4] = -{ -  {  8000,  22000, PSENC_STEREO_BANDS_10, PSENC_NENV_1, FL2FXCONST_DBL(3.0f/4.0f) }, -  { 22000,  28000, PSENC_STEREO_BANDS_20, PSENC_NENV_1, FL2FXCONST_DBL(2.0f/4.0f) }, -  { 28000,  36000, PSENC_STEREO_BANDS_20, PSENC_NENV_2, FL2FXCONST_DBL(1.5f/4.0f) }, -  { 36000, 160001, PSENC_STEREO_BANDS_20, PSENC_NENV_4, FL2FXCONST_DBL(1.1f/4.0f) }, -}; - - -//@} - - - diff --git a/libSBRenc/src/sbr_rom.h b/libSBRenc/src/sbr_rom.h deleted file mode 100644 index afa924e..0000000 --- a/libSBRenc/src/sbr_rom.h +++ /dev/null @@ -1,127 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -\file -\brief Declaration of constant tables -  -*/ -#ifndef __SBR_ROM_H -#define __SBR_ROM_H - -#include "sbr_def.h" -#include "sbr_encoder.h" - -#include "ps_main.h" - -/* -  huffman tables -*/ -extern const INT           v_Huff_envelopeLevelC10T[121]; -extern const UCHAR         v_Huff_envelopeLevelL10T[121]; -extern const INT           v_Huff_envelopeLevelC10F[121]; -extern const UCHAR         v_Huff_envelopeLevelL10F[121]; -extern const INT           bookSbrEnvBalanceC10T[49]; -extern const UCHAR         bookSbrEnvBalanceL10T[49]; -extern const INT           bookSbrEnvBalanceC10F[49]; -extern const UCHAR         bookSbrEnvBalanceL10F[49]; -extern const INT           v_Huff_envelopeLevelC11T[63]; -extern const UCHAR         v_Huff_envelopeLevelL11T[63]; -extern const INT           v_Huff_envelopeLevelC11F[63]; -extern const UCHAR         v_Huff_envelopeLevelL11F[63]; -extern const INT           bookSbrEnvBalanceC11T[25]; -extern const UCHAR         bookSbrEnvBalanceL11T[25]; -extern const INT           bookSbrEnvBalanceC11F[25]; -extern const UCHAR         bookSbrEnvBalanceL11F[25]; -extern const INT           v_Huff_NoiseLevelC11T[63]; -extern const UCHAR         v_Huff_NoiseLevelL11T[63]; -extern const INT           bookSbrNoiseBalanceC11T[25]; -extern const UCHAR         bookSbrNoiseBalanceL11T[25]; - -extern const sbrTuningTable_t sbrTuningTable[]; -extern const int sbrTuningTableSize; - -extern const psTuningTable_t psTuningTable[4]; - - -#endif diff --git a/libSBRenc/src/sbrenc_freq_sca.cpp b/libSBRenc/src/sbrenc_freq_sca.cpp deleted file mode 100644 index 30bc5ca..0000000 --- a/libSBRenc/src/sbrenc_freq_sca.cpp +++ /dev/null @@ -1,691 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  frequency scale   -  \author Tobias Chalupka -*/ - -#include "sbrenc_freq_sca.h" -#include "sbr_misc.h" - -#include "genericStds.h" - -/*  StartFreq */ -static INT getStartFreq(INT fsCore, const INT start_freq); - -/* StopFreq */ -static INT getStopFreq(INT fsCore, const INT stop_freq); - -static INT  numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor); -static void CalcBands(INT * diff, INT start , INT stop , INT num_bands); -static INT  modifyBands(INT max_band, INT * diff, INT length); -static void cumSum(INT start_value, INT* diff, INT length, UCHAR  *start_adress); - - - -/******************************************************************************* - Functionname:  FDKsbrEnc_getSbrStartFreqRAW - ******************************************************************************* - Description: - - Arguments: - - Return: - *******************************************************************************/ - -INT -FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore) -{ -  INT result; - -  if ( startFreq < 0 || startFreq > 15) { -    return -1; -  } -  /* Update startFreq struct */ -  result = getStartFreq(fsCore, startFreq); - -  result = (result*(fsCore>>5)+1)>>1; /* (result*fsSBR/QMFbands+1)>>1; */ - -  return (result); - -} /* End FDKsbrEnc_getSbrStartFreqRAW */ - - -/******************************************************************************* - Functionname:  getSbrStopFreq - ******************************************************************************* - Description: - - Arguments: - - Return: - *******************************************************************************/ -INT FDKsbrEnc_getSbrStopFreqRAW  (INT stopFreq, INT fsCore) -{ -  INT result; - -  if ( stopFreq < 0 || stopFreq > 13) -    return -1; - -  /* Uppdate stopFreq struct */ -  result = getStopFreq(fsCore, stopFreq); -  result = (result*(fsCore>>5)+1)>>1; /* (result*fsSBR/QMFbands+1)>>1; */ - -  return (result); -} /* End getSbrStopFreq */ - - -/******************************************************************************* - Functionname:  getStartFreq - ******************************************************************************* - Description: - - Arguments:  fsCore - core sampling rate - - - Return: - *******************************************************************************/ -static INT -getStartFreq(INT fsCore, const INT start_freq) -{ -  INT k0_min; - -  switch(fsCore){ -  case  8000: k0_min = 24; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 11025: k0_min = 17; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 12000: k0_min = 16; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 16000: k0_min = 16; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 22050: k0_min = 12; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 24000: k0_min = 11; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 32000: k0_min = 10; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 44100: k0_min = 7;  /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 48000: k0_min = 7;  /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  case 96000: k0_min = 3;  /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ -    break; -  default: -    k0_min=11; /* illegal fs */ -  } - - -  switch (fsCore) { - -  case  8000: -    { -      INT v_offset[]= {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; -      return (k0_min + v_offset[start_freq]); -    } -  case 11025: -    { -      INT v_offset[]= {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13}; -      return (k0_min + v_offset[start_freq]); -    } -  case 12000: -    { -      INT v_offset[]= {-5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; -      return (k0_min + v_offset[start_freq]); -    } -  case 16000: -    { -      INT v_offset[]= {-6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; -      return (k0_min + v_offset[start_freq]); -    } -  case 22050: -  case 24000: -  case 32000: -    { -      INT v_offset[]= {-4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20}; -      return (k0_min + v_offset[start_freq]); -    } -  case 44100: -  case 48000: -  case 96000: -    { -      INT v_offset[]= {-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24}; -      return (k0_min + v_offset[start_freq]); -    } -  default: -    { -      INT v_offset[]= {0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33}; -      return (k0_min + v_offset[start_freq]); -    } -  } -} /* End getStartFreq */ - - -/******************************************************************************* - Functionname:  getStopFreq - ******************************************************************************* - Description: - - Arguments: - - Return: - *******************************************************************************/ - static INT -getStopFreq(INT fsCore, const INT stop_freq) -{ -  INT result,i; -  INT k1_min; -  INT v_dstop[13]; - -  INT *v_stop_freq = NULL; -  INT v_stop_freq_16[14] = {48,49,50,51,52,54,55,56,57,59,60,61,63,64}; -  INT v_stop_freq_22[14] = {35,37,38,40,42,44,46,48,51,53,56,58,61,64}; -  INT v_stop_freq_24[14] = {32,34,36,38,40,42,44,46,49,52,55,58,61,64}; -  INT v_stop_freq_32[14] = {32,34,36,38,40,42,44,46,49,52,55,58,61,64}; -  INT v_stop_freq_44[14] = {23,25,27,29,32,34,37,40,43,47,51,55,59,64}; -  INT v_stop_freq_48[14] = {21,23,25,27,30,32,35,38,42,45,49,54,59,64}; -  INT v_stop_freq_64[14] = {20,22,24,26,29,31,34,37,41,45,49,54,59,64}; -  INT v_stop_freq_88[14] = {15,17,19,21,23,26,29,33,37,41,46,51,57,64}; -  INT v_stop_freq_96[14] = {13,15,17,19,21,24,27,31,35,39,44,50,57,64}; -  INT v_stop_freq_192[14] = {7, 8,10,12,14,16,19,23,27,32,38,46,54,64}; - -  switch(fsCore){ -  case  8000: k1_min = 48; -              v_stop_freq =v_stop_freq_16; -    break; -  case 11025: k1_min = 35; -              v_stop_freq =v_stop_freq_22; -    break; -  case 12000: k1_min = 32; -              v_stop_freq =v_stop_freq_24; -    break; -  case 16000: k1_min = 32; -              v_stop_freq =v_stop_freq_32; -    break; -  case 22050: k1_min = 23; -              v_stop_freq =v_stop_freq_44; -    break; -  case 24000: k1_min = 21; -              v_stop_freq =v_stop_freq_48; -    break; -  case 32000: k1_min = 20; -              v_stop_freq =v_stop_freq_64; -    break; -  case 44100: k1_min = 15; -              v_stop_freq =v_stop_freq_88; -    break; -  case 48000: k1_min = 13; -              v_stop_freq =v_stop_freq_96; -    break; -  case 96000: k1_min =  7; -              v_stop_freq =v_stop_freq_192; -    break; -  default: -    k1_min = 21; /* illegal fs  */ -  } - -  /* if no valid core samplingrate is used this loop produces -     a segfault, because v_stop_freq is not initialized */ -  /* Ensure increasing bandwidth */ -  for(i = 0; i <= 12; i++) { -    v_dstop[i] = v_stop_freq[i+1] - v_stop_freq[i]; -  } - -  FDKsbrEnc_Shellsort_int(v_dstop, 13); /* Sort bandwidth changes */ - -  result = k1_min; -  for(i = 0; i < stop_freq; i++) { -    result = result + v_dstop[i]; -  } - -  return(result); - -}/* End getStopFreq */ - - -/******************************************************************************* - Functionname:  FDKsbrEnc_FindStartAndStopBand - ******************************************************************************* - Description: - - Arguments:     srSbr            SBR sampling freqency -                srCore           AAC core sampling freqency -                noChannels       Number of QMF channels -                startFreq        SBR start frequency in QMF bands -                stopFreq         SBR start frequency in QMF bands - -               *k0               Output parameter -               *k2               Output parameter - - Return:       Error code (0 is OK) - *******************************************************************************/ -INT -FDKsbrEnc_FindStartAndStopBand( -        const INT srSbr, -        const INT srCore, -        const INT noChannels, -        const INT startFreq, -        const INT stopFreq, -        INT *k0, -        INT *k2 -        ) -{ - -  /* Update startFreq struct */ -  *k0 = getStartFreq(srCore, startFreq); - -  /* Test if start freq is outside corecoder range */ -  if( srSbr*noChannels < *k0 * srCore ) { -    return (1); /* raise the cross-over frequency and/or lower the number -                   of target bands per octave (or lower the sampling frequency) */ -  } - -  /*Update stopFreq struct */ -  if ( stopFreq < 14 ) { -    *k2 = getStopFreq(srCore, stopFreq); -  } else if( stopFreq == 14 ) { -    *k2 = 2 * *k0; -  } else { -    *k2 = 3 * *k0; -  } - -  /* limit to Nyqvist */ -  if (*k2 > noChannels) { -    *k2 = noChannels; -  } - - - -  /* Test for invalid  k0 k2 combinations */ -  if ( (srCore == 22050) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS44100 ) ) -    return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs=44.1kHz */ - -  if ( (srCore >= 24000) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS48000 ) ) -    return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs>=48kHz */ - -  if ((*k2 - *k0) > MAX_FREQ_COEFFS) -    return (1);/*Number of bands exceeds valid range of MAX_FREQ_COEFFS */ - -  if ((*k2 - *k0) < 0) -    return (1);/* Number of bands is negative */ - - -  return(0); -} - -/******************************************************************************* - Functionname:  FDKsbrEnc_UpdateFreqScale - ******************************************************************************* - Description: - - Arguments: - - Return: - *******************************************************************************/ -INT -FDKsbrEnc_UpdateFreqScale( -        UCHAR     *v_k_master, -        INT       *h_num_bands, -        const INT  k0, -        const INT  k2, -        const INT  freqScale, -        const INT  alterScale -        ) - -{ - -  INT     b_p_o = 0;        /* bands_per_octave */ -  FIXP_DBL warp = FL2FXCONST_DBL(0.0f); -  INT     dk = 0; - -  /* Internal variables */ -  INT     k1 = 0, i; -  INT     num_bands0; -  INT     num_bands1; -  INT     diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; -  INT     *diff0 = diff_tot; -  INT     *diff1 = diff_tot+MAX_OCTAVE; -  INT     k2_achived; -  INT     k2_diff; -  INT     incr = 0; - -  /* Init */ -  if (freqScale==1)  b_p_o = 12; -  if (freqScale==2)  b_p_o = 10; -  if (freqScale==3)  b_p_o = 8; - - -  if(freqScale > 0) /*Bark*/ -    { -      if(alterScale==0) -        warp = FL2FXCONST_DBL(0.5f);        /* 1.0/(1.0*2.0) */ -      else -        warp = FL2FXCONST_DBL(1.0f/2.6f);   /* 1.0/(1.3*2.0); */ - - -      if(4*k2 >= 9*k0)  /*two or more regions (how many times the basis band is copied)*/ -        { -          k1=2*k0; - -          num_bands0=numberOfBands(b_p_o, k0, k1, FL2FXCONST_DBL(0.5f)); -          num_bands1=numberOfBands(b_p_o, k1, k2, warp); - -          CalcBands(diff0, k0, k1, num_bands0);/*CalcBands1 => diff0 */ -          FDKsbrEnc_Shellsort_int( diff0, num_bands0);/*SortBands sort diff0 */ - -          if (diff0[0] == 0) /* too wide FB bands for target tuning */ -          { -            return (1);/* raise the cross-over frequency and/or lower the number -                          of target bands per octave (or lower the sampling frequency */ -          } - -          cumSum(k0, diff0, num_bands0, v_k_master); /* cumsum */ - -          CalcBands(diff1, k1, k2, num_bands1);     /* CalcBands2 => diff1 */ -          FDKsbrEnc_Shellsort_int( diff1, num_bands1);            /* SortBands sort diff1 */ -          if(diff0[num_bands0-1] > diff1[0])        /* max(1) > min(2) */ -            { -              if(modifyBands(diff0[num_bands0-1],diff1, num_bands1)) -                return(1); -            } - -          /* Add 2'nd region */ -          cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]); -          *h_num_bands=num_bands0+num_bands1;     /* Output nr of bands */ - -        } -      else /* one region */ -        { -          k1=k2; - -          num_bands0=numberOfBands(b_p_o, k0, k1, FL2FXCONST_DBL(0.5f)); -          CalcBands(diff0, k0, k1, num_bands0);/* CalcBands1 => diff0 */ -          FDKsbrEnc_Shellsort_int( diff0, num_bands0);       /* SortBands sort diff0 */ - -          if (diff0[0] == 0) /* too wide FB bands for target tuning */ -          { -            return (1); /* raise the cross-over frequency and/or lower the number -                           of target bands per octave (or lower the sampling frequency */ -          } - -          cumSum(k0, diff0, num_bands0, v_k_master);/* cumsum */ -          *h_num_bands=num_bands0;        /* Output nr of bands */ - -        } -    } -  else /* Linear mode */ -    { -      if (alterScale==0) { -        dk = 1; -        num_bands0 = 2 * ((k2 - k0)/2);         /* FLOOR to get to few number of bands*/ -      } else { -        dk = 2; -        num_bands0 = 2 * (((k2 - k0)/dk +1)/2); /* ROUND to get closest fit */ -      } - -      k2_achived = k0 + num_bands0*dk; -      k2_diff = k2 - k2_achived; - -      for(i=0;i<num_bands0;i++) -        diff_tot[i] = dk; - -      /* If linear scale wasn't achived */ -      /* and we got wide SBR are */ -      if (k2_diff < 0) { -          incr = 1; -          i = 0; -      } - -      /* If linear scale wasn't achived */ -      /* and we got small SBR are */ -      if (k2_diff > 0) { -          incr = -1; -          i = num_bands0-1; -      } - -      /* Adjust diff vector to get sepc. SBR range */ -      while (k2_diff != 0) { -        diff_tot[i] = diff_tot[i] - incr; -        i = i + incr; -        k2_diff = k2_diff + incr; -      } - -      cumSum(k0, diff_tot, num_bands0, v_k_master);/* cumsum */ -      *h_num_bands=num_bands0;        /* Output nr of bands */ - -    } - -  if (*h_num_bands < 1) -    return(1); /*To small sbr area */ - -  return (0); -}/* End FDKsbrEnc_UpdateFreqScale */ - -static INT -numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor) -{ -  INT result=0; -  /* result = 2* (INT) ( (double)b_p_o * (double)(FDKlog((double)stop/(double)start)/FDKlog((double)2)) * (double)FX_DBL2FL(warp_factor) + 0.5); */ -  result = ( ( b_p_o * fMult( (CalcLdInt(stop) - CalcLdInt(start)),  warp_factor) + (FL2FX_DBL(0.5f)>>LD_DATA_SHIFT) -               ) >> ((DFRACT_BITS-1)-LD_DATA_SHIFT) ) << 1; /* do not optimize anymore (rounding!!) */ - -  return(result); -} - - -static void -CalcBands(INT * diff, INT start , INT stop , INT num_bands) -{ -    INT i, qb, qe, qtmp; -    INT previous; -    INT current; -    FIXP_DBL base, exp, tmp; - -    previous=start; -    for(i=1; i<= num_bands; i++) -    { -        base = fDivNorm((FIXP_DBL)stop, (FIXP_DBL)start, &qb); -        exp = fDivNorm((FIXP_DBL)i, (FIXP_DBL)num_bands, &qe); -        tmp = fPow(base, qb, exp, qe, &qtmp); -        tmp = fMult(tmp, (FIXP_DBL)(start<<24)); -        current   = (INT)scaleValue(tmp, qtmp-23); -        current   = (current+1) >> 1; /* rounding*/ -        diff[i-1] = current-previous; -        previous  = current; -    } - -}/* End CalcBands */ - - -static void -cumSum(INT start_value, INT* diff, INT length,  UCHAR *start_adress) -{ -  INT i; -  start_adress[0]=start_value; -  for(i=1;i<=length;i++) -    start_adress[i]=start_adress[i-1]+diff[i-1]; -} /* End cumSum */ - - -static INT -modifyBands(INT max_band_previous, INT * diff, INT length) -{ -  INT change=max_band_previous-diff[0]; - -  /* Limit the change so that the last band cannot get narrower than the first one */ -  if ( change > (diff[length-1] - diff[0]) / 2 ) -    change = (diff[length-1] - diff[0]) / 2; - -  diff[0] += change; -  diff[length-1] -= change; -  FDKsbrEnc_Shellsort_int(diff, length); - -  return(0); -}/* End modifyBands */ - - -/******************************************************************************* - Functionname:  FDKsbrEnc_UpdateHiRes - ******************************************************************************* - Description: - - - Arguments: - - Return: - *******************************************************************************/ -INT -FDKsbrEnc_UpdateHiRes( -        UCHAR   *h_hires, -        INT     *num_hires, -        UCHAR   *v_k_master, -        INT      num_master, -        INT     *xover_band -        ) -{ -  INT i; -  INT max1,max2; - -  if( (v_k_master[*xover_band] > 32 ) || /* v_k_master[*xover_band] > noQMFChannels(dualRate)/divider */ -      ( *xover_band > num_master ) )  { -      /* xover_band error, too big for this startFreq. Will be clipped */ - -    /* Calculate maximum value for xover_band */ -    max1=0; -    max2=num_master; -    while( (v_k_master[max1+1] < 32 ) && /* noQMFChannels(dualRate)/divider */ -           ( (max1+1) < max2) ) -      { -        max1++; -      } - -    *xover_band=max1; -  } - -  *num_hires = num_master - *xover_band; -  for(i = *xover_band; i <= num_master; i++) -    { -      h_hires[i - *xover_band] = v_k_master[i]; -    } - -  return (0); -}/* End FDKsbrEnc_UpdateHiRes */ - - -/******************************************************************************* - Functionname:  FDKsbrEnc_UpdateLoRes - ******************************************************************************* - Description: - - Arguments: - - Return: - *******************************************************************************/ -void -FDKsbrEnc_UpdateLoRes(UCHAR * h_lores, INT *num_lores, UCHAR * h_hires, INT num_hires) -{ -  INT i; - -  if(num_hires%2 == 0) /* if even number of hires bands */ -    { -      *num_lores=num_hires/2; -      /* Use every second lores=hires[0,2,4...] */ -      for(i=0;i<=*num_lores;i++) -        h_lores[i]=h_hires[i*2]; - -    } -  else            /* odd number of hires which means xover is odd */ -    { -      *num_lores=(num_hires+1)/2; - -      /* Use lores=hires[0,1,3,5 ...] */ -      h_lores[0]=h_hires[0]; -      for(i=1;i<=*num_lores;i++) -        { -          h_lores[i]=h_hires[i*2-1]; -        } -    } - -}/* End FDKsbrEnc_UpdateLoRes */ diff --git a/libSBRenc/src/sbrenc_freq_sca.h b/libSBRenc/src/sbrenc_freq_sca.h deleted file mode 100644 index 6f2bb84..0000000 --- a/libSBRenc/src/sbrenc_freq_sca.h +++ /dev/null @@ -1,137 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  frequency scale prototypes   -*/ -#ifndef __FREQ_SCA2_H -#define __FREQ_SCA2_H - -#include "sbr_encoder.h" -#include "sbr_def.h" - -#define MAX_OCTAVE        29 -#define MAX_SECOND_REGION 50 - - -INT -FDKsbrEnc_UpdateFreqScale( -        UCHAR *v_k_master, -        INT   *h_num_bands, -        const  INT k0, -        const  INT k2, -        const  INT freq_scale, -        const  INT alter_scale -        ); - -INT -FDKsbrEnc_UpdateHiRes( -        UCHAR *h_hires, -        INT   *num_hires, -        UCHAR *v_k_master, -        INT    num_master, -        INT   *xover_band -        ); - -void  FDKsbrEnc_UpdateLoRes( -        UCHAR *v_lores, -        INT   *num_lores, -        UCHAR *v_hires, -        INT    num_hires -        ); - -INT -FDKsbrEnc_FindStartAndStopBand( -        const INT srSbr, -        const INT srCore, -        const INT noChannels, -        const INT startFreq, -        const INT stop_freq, -        INT *k0, -        INT *k2 -        ); - -INT FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore); -INT FDKsbrEnc_getSbrStopFreqRAW  (INT stopFreq, INT fsCore); -#endif diff --git a/libSBRenc/src/ton_corr.cpp b/libSBRenc/src/ton_corr.cpp deleted file mode 100644 index 224da11..0000000 --- a/libSBRenc/src/ton_corr.cpp +++ /dev/null @@ -1,881 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "ton_corr.h" - -#include "sbr_ram.h" -#include "sbr_misc.h" -#include "genericStds.h" -#include "autocorr2nd.h" - - - -/*************************************************************************** - -  Send autoCorrSecondOrder to mlfile - -****************************************************************************/ - -/**************************************************************************/ -/*! -  \brief Calculates the tonal to noise ration for different frequency bands -   and time segments. - -   The ratio between the predicted energy (tonal energy A) and the total -   energy (A + B) is calculated. This is converted to the ratio between -   the predicted energy (tonal energy A) and the non-predictable energy -   (noise energy B). Hence the quota-matrix contains A/B = q/(1-q). - -   The samples in nrgVector are scaled by 1.0/16.0 -		The samples in pNrgVectorFreq	are scaled by 1.0/2.0 -   The samples in quotaMatrix are scaled by RELAXATION - -  \return none. - -*/ -/**************************************************************************/ - -void -FDKsbrEnc_CalculateTonalityQuotas( HANDLE_SBR_TON_CORR_EST hTonCorr,      /*!< Handle to SBR_TON_CORR struct. */ -                                   FIXP_DBL **RESTRICT sourceBufferReal,  /*!< The real part of the QMF-matrix.  */ -                                   FIXP_DBL **RESTRICT sourceBufferImag,  /*!< The imaginary part of the QMF-matrix. */ -                                   INT usb,                               /*!< upper side band, highest + 1 QMF band in the SBR range. */ -                                   INT qmfScale                       /*!< sclefactor of QMF subsamples */ -                                 ) -{ -  INT     i, k, r, r2, timeIndex, autoCorrScaling; - -  INT     startIndexMatrix  = hTonCorr->startIndexMatrix; -  INT     totNoEst          = hTonCorr->numberOfEstimates; -  INT     noEstPerFrame     = hTonCorr->numberOfEstimatesPerFrame; -  INT     move              = hTonCorr->move; -  INT     noQmfChannels     = hTonCorr->noQmfChannels;     /* Numer of Bands */ -  INT     buffLen           = hTonCorr->bufferLength;      /* Numer of Slots */ -  INT     stepSize          = hTonCorr->stepSize; -  INT    *pBlockLength      = hTonCorr->lpcLength; -  INT**   RESTRICT signMatrix        = hTonCorr->signMatrix; -  FIXP_DBL* RESTRICT  nrgVector      = hTonCorr->nrgVector; -  FIXP_DBL** RESTRICT quotaMatrix    = hTonCorr->quotaMatrix; -  FIXP_DBL*  RESTRICT pNrgVectorFreq = hTonCorr->nrgVectorFreq; - -#define BAND_V_SIZE QMF_MAX_TIME_SLOTS -#define NUM_V_COMBINE 8 /* Must be a divisor of 64 and fulfill the ASSERTs below */ - -  FIXP_DBL *realBuf; -  FIXP_DBL *imagBuf; - -  FIXP_DBL  alphar[2],alphai[2],fac; - -  C_ALLOC_SCRATCH_START(ac, ACORR_COEFS, 1); -  C_ALLOC_SCRATCH_START(realBufRef, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE); - -  realBuf = realBufRef; -  imagBuf = realBuf + BAND_V_SIZE*NUM_V_COMBINE; - - -  FDK_ASSERT(buffLen <= BAND_V_SIZE); -  FDK_ASSERT(sizeof(FIXP_DBL)*NUM_V_COMBINE*BAND_V_SIZE*2 < (1024*sizeof(FIXP_DBL)-sizeof(ACORR_COEFS)) ); - -  /* -   * Buffering of the quotaMatrix and the quotaMatrixTransp. -   *********************************************************/ -  for(i =  0 ; i < move; i++){ -    FDKmemcpy(quotaMatrix[i],quotaMatrix[i + noEstPerFrame],noQmfChannels * sizeof(FIXP_DBL)); -    FDKmemcpy(signMatrix[i],signMatrix[i + noEstPerFrame],noQmfChannels * sizeof(INT)); -  } - -  FDKmemmove(nrgVector,nrgVector+noEstPerFrame,move*sizeof(FIXP_DBL)); -  FDKmemclear(nrgVector+startIndexMatrix,(totNoEst-startIndexMatrix)*sizeof(FIXP_DBL)); -  FDKmemclear(pNrgVectorFreq,noQmfChannels * sizeof(FIXP_DBL)); - -  /* -   * Calculate the quotas for the current time steps. -   **************************************************/ - -  for (r = 0; r < usb; r++) -  { -    int blockLength; - -    k = hTonCorr->nextSample; /* startSample */ -    timeIndex = startIndexMatrix; -    /* Copy as many as possible Band accross all Slots at once */ -    if (realBuf != realBufRef) { -      realBuf -= BAND_V_SIZE; -      imagBuf -= BAND_V_SIZE; -    } else { -      realBuf += BAND_V_SIZE*(NUM_V_COMBINE-1); -      imagBuf += BAND_V_SIZE*(NUM_V_COMBINE-1); -      for (i = 0; i < buffLen; i++) { -        int v; -        FIXP_DBL *ptr; -        ptr = realBuf+i; -        for (v=0; v<NUM_V_COMBINE; v++) -        { -          ptr[0] = sourceBufferReal[i][r+v]; -          ptr[0+BAND_V_SIZE*NUM_V_COMBINE] = sourceBufferImag[i][r+v]; -          ptr -= BAND_V_SIZE; -        } -      } -    } - -    blockLength = pBlockLength[0]; - -    while(k <= buffLen - blockLength) -    { -      autoCorrScaling = fixMin(getScalefactor(&realBuf[k-LPC_ORDER], LPC_ORDER+blockLength), getScalefactor(&imagBuf[k-LPC_ORDER], LPC_ORDER+blockLength)); -      autoCorrScaling = fixMax(0, autoCorrScaling-1); - -      scaleValues(&realBuf[k-LPC_ORDER], LPC_ORDER+blockLength, autoCorrScaling); -      scaleValues(&imagBuf[k-LPC_ORDER], LPC_ORDER+blockLength, autoCorrScaling); - -      autoCorrScaling <<= 1; /* consider qmf buffer scaling twice */ -      autoCorrScaling += autoCorr2nd_cplx ( ac, realBuf+k, imagBuf+k, blockLength ); - - -      if(ac->det == FL2FXCONST_DBL(0.0f)){ -        alphar[1] = alphai[1] = FL2FXCONST_DBL(0.0f); - -        alphar[0] = (ac->r01r)>>2; -        alphai[0] = (ac->r01i)>>2; - -        fac = fMultDiv2(ac->r00r, ac->r11r)>>1; -      } -      else{ -        alphar[1] = (fMultDiv2(ac->r01r, ac->r12r)>>1) - (fMultDiv2(ac->r01i, ac->r12i)>>1) - (fMultDiv2(ac->r02r, ac->r11r)>>1); -        alphai[1] = (fMultDiv2(ac->r01i, ac->r12r)>>1) + (fMultDiv2(ac->r01r, ac->r12i)>>1) - (fMultDiv2(ac->r02i, ac->r11r)>>1); - -        alphar[0] = (fMultDiv2(ac->r01r, ac->det)>>(ac->det_scale+1)) + fMult(alphar[1], ac->r12r) + fMult(alphai[1], ac->r12i); -        alphai[0] = (fMultDiv2(ac->r01i, ac->det)>>(ac->det_scale+1)) + fMult(alphai[1], ac->r12r) - fMult(alphar[1], ac->r12i); - -        fac = fMultDiv2(ac->r00r, fMult(ac->det, ac->r11r))>>(ac->det_scale+1); -      } - -      if(fac == FL2FXCONST_DBL(0.0f)){ -        quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f); -        signMatrix[timeIndex][r] = 0; -      } -      else { -        /* quotaMatrix is scaled with the factor RELAXATION -           parse RELAXATION in fractional part and shift factor: 1/(1/0.524288 * 2^RELAXATION_SHIFT) */ -        FIXP_DBL tmp,num,denom; -        INT numShift,denomShift,commonShift; -        INT sign; - -        num = fMultDiv2(alphar[0], ac->r01r) + fMultDiv2(alphai[0], ac->r01i) - fMultDiv2(alphar[1], fMult(ac->r02r, ac->r11r)) - fMultDiv2(alphai[1], fMult(ac->r02i, ac->r11r)); -        num = fixp_abs(num); - -        denom = (fac>>1) + (fMultDiv2(fac,RELAXATION_FRACT)>>RELAXATION_SHIFT) - num; -        denom = fixp_abs(denom); - -        num = fMult(num,RELAXATION_FRACT); - -        numShift = CountLeadingBits(num) - 2; -        num = scaleValue(num, numShift); - -        denomShift = CountLeadingBits(denom); -        denom = (FIXP_DBL)denom << denomShift; - -        if ((num > FL2FXCONST_DBL(0.0f)) && (denom != FL2FXCONST_DBL(0.0f))) { -          commonShift = fixMin(numShift - denomShift + RELAXATION_SHIFT, DFRACT_BITS-1); -          if (commonShift < 0) { -            commonShift = -commonShift; -            tmp = schur_div(num,denom,16); -            commonShift = fixMin(commonShift,CountLeadingBits(tmp)); -            quotaMatrix[timeIndex][r] = tmp << commonShift; -          } -          else { -            quotaMatrix[timeIndex][r] = schur_div(num,denom,16) >> commonShift; -          } -        } -        else { -          quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f); -        } - -        if (ac->r11r != FL2FXCONST_DBL(0.0f)) { -          if (  ( (ac->r01r >= FL2FXCONST_DBL(0.0f) ) && ( ac->r11r >= FL2FXCONST_DBL(0.0f) ) ) -              ||( (ac->r01r <  FL2FXCONST_DBL(0.0f) ) && ( ac->r11r <  FL2FXCONST_DBL(0.0f) ) )  ) { -            sign = 1; -          } -          else { -            sign = -1; -          } -        } -        else { -          sign = 1; -        } - -        if(sign < 0) { -          r2 = r;       /* (INT) pow(-1, band); */ -        } -        else { -          r2 = r + 1;   /* (INT) pow(-1, band+1); */ -        } -        signMatrix[timeIndex][r] = 1 - 2*(r2 & 0x1); -      } - -      nrgVector[timeIndex] += ((ac->r00r) >> fixMin(DFRACT_BITS-1,(2*qmfScale+autoCorrScaling + SCALE_NRGVEC))); -      /* pNrgVectorFreq[r] finally has to be divided by noEstPerFrame, replaced division by shifting with one */ -      pNrgVectorFreq[r] = pNrgVectorFreq[r] + ((ac->r00r) >> fixMin(DFRACT_BITS-1,(2*qmfScale+autoCorrScaling + SCALE_NRGVEC))); - -      blockLength = pBlockLength[1]; -      k += stepSize; -      timeIndex++; -    } -  } - - -  C_ALLOC_SCRATCH_END(realBuf, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE); -  C_ALLOC_SCRATCH_END(ac, ACORR_COEFS, 1); -} - -/**************************************************************************/ -/*! -  \brief Extracts the parameters required in the decoder to obtain the -  correct tonal to noise ratio after SBR. - -  Estimates the tonal to noise ratio of the original signal (using LPC). -  Predicts the tonal to noise ration of the SBR signal (in the decoder) by -  patching the tonal to noise ratio values similar to the patching of the -  lowband in the decoder. Given the tonal to noise ratio of the original -  and the SBR signal, it estimates the required amount of inverse filtering, -  additional noise as well as any additional sines. - -  \return none. - -*/ -/**************************************************************************/ -void -FDKsbrEnc_TonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr,/*!< Handle to SBR_TON_CORR struct. */ -                           INVF_MODE* infVec,               /*!< Vector where the inverse filtering levels will be stored. */ -                           FIXP_DBL * noiseLevels,          /*!< Vector where the noise levels will be stored. */ -                           INT* missingHarmonicFlag,        /*!< Flag set to one or zero, dependent on if any strong sines are missing.*/ -                           UCHAR * missingHarmonicsIndex,   /*!< Vector indicating where sines are missing. */ -                           UCHAR * envelopeCompensation,    /*!< Vector to store compensation values for the energies in. */ -                           const SBR_FRAME_INFO *frameInfo, /*!< Frame info struct, contains the time and frequency grid of the current frame.*/ -                           UCHAR* transientInfo,            /*!< Transient info.*/ -                           UCHAR* freqBandTable,            /*!< Frequency band tables for high-res.*/ -                           INT nSfb,                        /*!< Number of scalefactor bands for high-res. */ -                           XPOS_MODE xposType,              /*!< Type of transposer used in the decoder.*/ -                           UINT sbrSyntaxFlags -                           ) -{ -  INT band; -  INT transientFlag = transientInfo[1] ;    /*!< Flag indicating if a transient is present in the current frame. */ -  INT transientPos  = transientInfo[0];     /*!< Position of the transient.*/ -  INT transientFrame, transientFrameInvfEst; -  INVF_MODE* infVecPtr; - - -  /* Determine if this is a frame where a transient starts... - -  The detection of noise-floor, missing harmonics and invf_est, is not in sync for the -  non-buf-opt decoder such as AAC. Hence we need to keep track on the transient in the -  present frame as well as in the next. -  */ -  transientFrame = 0; -  if(hTonCorr->transientNextFrame){       /* The transient was detected in the previous frame, but is actually */ -    transientFrame = 1; -    hTonCorr->transientNextFrame = 0; - -    if(transientFlag){ -      if(transientPos + hTonCorr->transientPosOffset >= frameInfo->borders[frameInfo->nEnvelopes]){ -        hTonCorr->transientNextFrame = 1; -      } -    } -  } -  else{ -    if(transientFlag){ -      if(transientPos + hTonCorr->transientPosOffset < frameInfo->borders[frameInfo->nEnvelopes]){ -        transientFrame = 1; -        hTonCorr->transientNextFrame = 0; -      } -      else{ -        hTonCorr->transientNextFrame = 1; -      } -    } -  } -  transientFrameInvfEst = transientFrame; - - -  /* -    Estimate the required invese filtereing level. -  */ -  if (hTonCorr->switchInverseFilt) -    FDKsbrEnc_qmfInverseFilteringDetector(&hTonCorr->sbrInvFilt, -                                          hTonCorr->quotaMatrix, -                                          hTonCorr->nrgVector, -                                          hTonCorr->indexVector, -                                          hTonCorr->frameStartIndexInvfEst, -                                          hTonCorr->numberOfEstimatesPerFrame + hTonCorr->frameStartIndexInvfEst, -                                          transientFrameInvfEst, -                                          infVec); - -  /* -      Detect what tones will be missing. -   */ -  if (xposType == XPOS_LC ){ -    FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(&hTonCorr->sbrMissingHarmonicsDetector, -                                             hTonCorr->quotaMatrix, -                                             hTonCorr->signMatrix, -                                             hTonCorr->indexVector, -                                             frameInfo, -                                             transientInfo, -                                             missingHarmonicFlag, -                                             missingHarmonicsIndex, -                                             freqBandTable, -                                             nSfb, -                                             envelopeCompensation, -                                             hTonCorr->nrgVectorFreq); -  } -  else{ -    *missingHarmonicFlag = 0; -    FDKmemclear(missingHarmonicsIndex,nSfb*sizeof(UCHAR)); -  } - - - -  /* -    Noise floor estimation -  */ - -  infVecPtr = hTonCorr->sbrInvFilt.prevInvfMode; - -  FDKsbrEnc_sbrNoiseFloorEstimateQmf(&hTonCorr->sbrNoiseFloorEstimate, -                                     frameInfo, -                                     noiseLevels, -                                     hTonCorr->quotaMatrix, -                                     hTonCorr->indexVector, -                                     *missingHarmonicFlag, -                                     hTonCorr->frameStartIndex, -                                     hTonCorr->numberOfEstimatesPerFrame, -                                     transientFrame, -                                     infVecPtr, -                                     sbrSyntaxFlags); - - -  /* Store the invfVec data for the next frame...*/ -  for(band = 0 ; band < hTonCorr->sbrInvFilt.noDetectorBands; band++){ -    hTonCorr->sbrInvFilt.prevInvfMode[band] = infVec[band]; -  } -} - -/**************************************************************************/ -/*! -  \brief     Searches for the closest match in the frequency master table. - - - -  \return   closest entry. - -*/ -/**************************************************************************/ -static INT -findClosestEntry(INT goalSb, -                 UCHAR *v_k_master, -                 INT numMaster, -                 INT direction) -{ -  INT index; - -  if( goalSb <= v_k_master[0] ) -    return v_k_master[0]; - -  if( goalSb >= v_k_master[numMaster] ) -    return v_k_master[numMaster]; - -  if(direction) { -    index = 0; -    while( v_k_master[index] < goalSb ) { -      index++; -    } -  } else { -    index = numMaster; -    while( v_k_master[index] > goalSb ) { -      index--; -    } -  } - -  return v_k_master[index]; -} - - -/**************************************************************************/ -/*! -  \brief     resets the patch - - - -  \return   errorCode, noError if successful. - -*/ -/**************************************************************************/ -static INT -resetPatch(HANDLE_SBR_TON_CORR_EST hTonCorr,  /*!< Handle to SBR_TON_CORR struct. */ -           INT xposctrl,                      /*!< Different patch modes. */ -           INT highBandStartSb,               /*!< Start band of the SBR range. */ -           UCHAR *v_k_master,                   /*!< Master frequency table from which all other table are derived.*/ -           INT numMaster,                     /*!< Number of elements in the master table. */ -           INT fs,                            /*!< Sampling frequency. */ -           INT noChannels)                    /*!< Number of QMF-channels. */ -{ -  INT patch,k,i; -  INT targetStopBand; - -  PATCH_PARAM  *patchParam = hTonCorr->patchParam; - -  INT sbGuard = hTonCorr->guard; -  INT sourceStartBand; -  INT patchDistance; -  INT numBandsInPatch; - -  INT lsb = v_k_master[0];                           /* Lowest subband related to the synthesis filterbank */ -  INT usb = v_k_master[numMaster];                   /* Stop subband related to the synthesis filterbank */ -  INT xoverOffset = highBandStartSb - v_k_master[0]; /* Calculate distance in subbands between k0 and kx */ - -  INT goalSb; - - -  /* -   * Initialize the patching parameter -   */ - -  if (xposctrl == 1) { -    lsb += xoverOffset; -    xoverOffset = 0; -  } - -  goalSb = (INT)( (2 * noChannels * 16000 + (fs>>1)) / fs ); /* 16 kHz band */ -  goalSb = findClosestEntry(goalSb, v_k_master, numMaster, 1); /* Adapt region to master-table */ - -  /* First patch */ -  sourceStartBand = hTonCorr->shiftStartSb + xoverOffset; -  targetStopBand = lsb + xoverOffset; - -  /* even (odd) numbered channel must be patched to even (odd) numbered channel */ -  patch = 0; -  while(targetStopBand < usb) { - -    /* To many patches */ -    if (patch >= MAX_NUM_PATCHES) -      return(1); /*Number of patches to high */ - -    patchParam[patch].guardStartBand = targetStopBand; -    targetStopBand += sbGuard; -    patchParam[patch].targetStartBand = targetStopBand; - -    numBandsInPatch = goalSb - targetStopBand;                   /* get the desired range of the patch */ - -    if ( numBandsInPatch >= lsb - sourceStartBand ) { -      /* desired number bands are not available -> patch whole source range */ -      patchDistance   = targetStopBand - sourceStartBand;        /* get the targetOffset */ -      patchDistance   = patchDistance & ~1;                      /* rounding off odd numbers and make all even */ -      numBandsInPatch = lsb - (targetStopBand - patchDistance); -      numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch, v_k_master, numMaster, 0) - -                        targetStopBand;  /* Adapt region to master-table */ -    } - -    /* desired number bands are available -> get the minimal even patching distance */ -    patchDistance   = numBandsInPatch + targetStopBand - lsb;  /* get minimal distance */ -    patchDistance   = (patchDistance + 1) & ~1;                /* rounding up odd numbers and make all even */ - -    if (numBandsInPatch <= 0) { -      patch--; -    } else { -      patchParam[patch].sourceStartBand = targetStopBand - patchDistance; -      patchParam[patch].targetBandOffs  = patchDistance; -      patchParam[patch].numBandsInPatch = numBandsInPatch; -      patchParam[patch].sourceStopBand  = patchParam[patch].sourceStartBand + numBandsInPatch; - -      targetStopBand += patchParam[patch].numBandsInPatch; -    } - -    /* All patches but first */ -    sourceStartBand = hTonCorr->shiftStartSb; - -    /* Check if we are close to goalSb */ -    if( fixp_abs(targetStopBand - goalSb) < 3) { -      goalSb = usb; -    } - -    patch++; - -  } - -  patch--; - -  /* if highest patch contains less than three subband: skip it */ -  if ( patchParam[patch].numBandsInPatch < 3 && patch > 0 ) { -    patch--; -    targetStopBand = patchParam[patch].targetStartBand + patchParam[patch].numBandsInPatch; -  } - -  hTonCorr->noOfPatches = patch + 1; - - -  /* Assign the index-vector, so we know where to look for the high-band. -     -1 represents a guard-band. */ -  for(k = 0; k < hTonCorr->patchParam[0].guardStartBand; k++) -    hTonCorr->indexVector[k] = k; - -  for(i = 0; i < hTonCorr->noOfPatches; i++) -  { -    INT sourceStart    = hTonCorr->patchParam[i].sourceStartBand; -    INT targetStart    = hTonCorr->patchParam[i].targetStartBand; -    INT numberOfBands  = hTonCorr->patchParam[i].numBandsInPatch; -    INT startGuardBand = hTonCorr->patchParam[i].guardStartBand; - -    for(k = 0; k < (targetStart- startGuardBand); k++) -      hTonCorr->indexVector[startGuardBand+k] = -1; - -    for(k = 0; k < numberOfBands; k++) -      hTonCorr->indexVector[targetStart+k] = sourceStart+k; -  } - -  return (0); -} - -/**************************************************************************/ -/*! -  \brief     Creates an instance of the tonality correction parameter module. - -  The module includes modules for inverse filtering level estimation, -  missing harmonics detection and noise floor level estimation. - -  \return   errorCode, noError if successful. -*/ -/**************************************************************************/ -INT -FDKsbrEnc_CreateTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ -                                 INT                     chan)     /*!< Channel index, needed for mem allocation */ -{ -  INT i; -  FIXP_DBL* quotaMatrix = GetRam_Sbr_quotaMatrix(chan); -  INT*      signMatrix  = GetRam_Sbr_signMatrix(chan); - -  FDKmemclear(hTonCorr, sizeof(SBR_TON_CORR_EST)); - -  for (i=0; i<MAX_NO_OF_ESTIMATES; i++) { -    hTonCorr->quotaMatrix[i] = quotaMatrix + (i*QMF_CHANNELS); -    hTonCorr->signMatrix[i]  = signMatrix  + (i*QMF_CHANNELS); -  } - -  FDKsbrEnc_CreateSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector, chan); - -  return 0; -} - - - -/**************************************************************************/ -/*! -  \brief     Initialize an instance of the tonality correction parameter module. - -  The module includes modules for inverse filtering level estimation, -  missing harmonics detection and noise floor level estimation. - -  \return   errorCode, noError if successful. -*/ -/**************************************************************************/ -INT -FDKsbrEnc_InitTonCorrParamExtr (INT frameSize,                     /*!< Current SBR frame size. */ -                                HANDLE_SBR_TON_CORR_EST hTonCorr,  /*!< Pointer to handle to SBR_TON_CORR struct. */ -                                HANDLE_SBR_CONFIG_DATA sbrCfg,     /*!< Pointer to SBR configuration parameters. */ -                                INT timeSlots,                     /*!< Number of time-slots per frame */ -                                INT xposCtrl,                      /*!< Different patch modes. */ -                                INT ana_max_level,                 /*!< Maximum level of the adaptive noise. */ -                                INT noiseBands,                    /*!< Number of noise bands per octave. */ -                                INT noiseFloorOffset,              /*!< Noise floor offset. */ -                                UINT useSpeechConfig)              /*!< Speech or music tuning. */ -{ -  INT nCols = sbrCfg->noQmfSlots; -  INT fs    = sbrCfg->sampleFreq; -  INT noQmfChannels = sbrCfg->noQmfBands; - -  INT highBandStartSb = sbrCfg->freqBandTable[LOW_RES][0]; -  UCHAR *v_k_master   = sbrCfg->v_k_master; -  INT numMaster       = sbrCfg->num_Master; - -  UCHAR **freqBandTable   = sbrCfg->freqBandTable; -  INT    *nSfb            = sbrCfg->nSfb; - -  INT i; - -  /* -  Reset the patching and allocate memory for the quota matrix. -  Assing parameters for the LPC analysis. -  */ -  if (sbrCfg->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { -    switch (timeSlots) { -    case NUMBER_TIME_SLOTS_1920: -      hTonCorr->lpcLength[0]              = 8 - LPC_ORDER; -      hTonCorr->lpcLength[1]              = 7 - LPC_ORDER; -      hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LD; -      hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 7; -      hTonCorr->frameStartIndexInvfEst    = 0; -      hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_512LD; -      break; -    case NUMBER_TIME_SLOTS_2048: -      hTonCorr->lpcLength[0]              = 8 - LPC_ORDER; -      hTonCorr->lpcLength[1]              = 8 - LPC_ORDER; -      hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LD; -      hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 8; -      hTonCorr->frameStartIndexInvfEst    = 0; -      hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_512LD; -      break; -    } -  } else -  switch (timeSlots) { -  case NUMBER_TIME_SLOTS_2048: -    hTonCorr->lpcLength[0]              = 16 - LPC_ORDER; /* blockLength[0] */ -    hTonCorr->lpcLength[1]              = 16 - LPC_ORDER; /* blockLength[0] */ -    hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LC; -    hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 16; -    hTonCorr->frameStartIndexInvfEst    = 0; -    hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_2048; -    break; -  case NUMBER_TIME_SLOTS_1920: -    hTonCorr->lpcLength[0]              = 15 - LPC_ORDER; /* blockLength[0] */ -    hTonCorr->lpcLength[1]              = 15 - LPC_ORDER; /* blockLength[0] */ -    hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LC; -    hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 15; -    hTonCorr->frameStartIndexInvfEst    = 0; -    hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_1920; -    break; -  default: -    return -1; -  } - -  hTonCorr->bufferLength              = nCols; -  hTonCorr->stepSize                  = hTonCorr->lpcLength[0] + LPC_ORDER; /* stepSize[0] implicitly 0. */ - -  hTonCorr->nextSample                = LPC_ORDER; /* firstSample */ -  hTonCorr->move                      = hTonCorr->numberOfEstimates - hTonCorr->numberOfEstimatesPerFrame;    /* Number of estimates to move when buffering.*/ -  hTonCorr->startIndexMatrix          = hTonCorr->numberOfEstimates - hTonCorr->numberOfEstimatesPerFrame;    /* Where to store the latest estimations in the tonality Matrix.*/ -  hTonCorr->frameStartIndex           = 0;                      /* Where in the tonality matrix the current frame (to be sent to the decoder) starts. */ -  hTonCorr->prevTransientFlag = 0; -  hTonCorr->transientNextFrame = 0; - -  hTonCorr->noQmfChannels = noQmfChannels; - -  for (i=0; i<hTonCorr->numberOfEstimates; i++) { -    FDKmemclear (hTonCorr->quotaMatrix[i] , sizeof(FIXP_DBL)*noQmfChannels); -    FDKmemclear (hTonCorr->signMatrix[i] , sizeof(INT)*noQmfChannels); -  } - -   /* Reset the patch.*/ -  hTonCorr->guard = 0; -  hTonCorr->shiftStartSb = 1; - -  if(resetPatch(hTonCorr, -                xposCtrl, -                highBandStartSb, -                v_k_master, -                numMaster, -                fs, -                noQmfChannels)) -    return(1); - -  if(FDKsbrEnc_InitSbrNoiseFloorEstimate (&hTonCorr->sbrNoiseFloorEstimate, -                                   ana_max_level, -                                   freqBandTable[LO], -                                   nSfb[LO], -                                   noiseBands, -                                   noiseFloorOffset, -                                   timeSlots, -                                   useSpeechConfig)) -    return(1); - - -  if(FDKsbrEnc_initInvFiltDetector(&hTonCorr->sbrInvFilt, -                            hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf, -                            hTonCorr->sbrNoiseFloorEstimate.noNoiseBands, -                            useSpeechConfig)) -    return(1); - - - -  if(FDKsbrEnc_InitSbrMissingHarmonicsDetector( -                                        &hTonCorr->sbrMissingHarmonicsDetector, -                                        fs, -                                        frameSize, -                                        nSfb[HI], -                                        noQmfChannels, -                                        hTonCorr->numberOfEstimates, -                                        hTonCorr->move, -                                        hTonCorr->numberOfEstimatesPerFrame, -                                        sbrCfg->sbrSyntaxFlags)) -    return(1); - - - -  return (0); -} - - - -/**************************************************************************/ -/*! -  \brief     resets tonality correction parameter module. - - - -  \return   errorCode, noError if successful. - -*/ -/**************************************************************************/ -INT -FDKsbrEnc_ResetTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ -                      INT xposctrl,                     /*!< Different patch modes. */ -                      INT highBandStartSb,              /*!< Start band of the SBR range. */ -                      UCHAR *v_k_master,        /*!< Master frequency table from which all other table are derived.*/ -                      INT numMaster,                    /*!< Number of elements in the master table. */ -                      INT fs,                           /*!< Sampling frequency (of the SBR part). */ -                      UCHAR ** freqBandTable,   /*!< Frequency band table for low-res and high-res. */ -                      INT* nSfb,                        /*!< Number of frequency bands (hig-res and low-res). */ -                      INT noQmfChannels                 /*!< Number of QMF channels. */ -                      ) -{ - -  /* Reset the patch.*/ -  hTonCorr->guard = 0; -  hTonCorr->shiftStartSb = 1; - -  if(resetPatch(hTonCorr, -                xposctrl, -                highBandStartSb, -                v_k_master, -                numMaster, -                fs, -                noQmfChannels)) -    return(1); - - - -  /* Reset the noise floor estimate.*/ -  if(FDKsbrEnc_resetSbrNoiseFloorEstimate (&hTonCorr->sbrNoiseFloorEstimate, -                                 freqBandTable[LO], -                                 nSfb[LO])) -    return(1); - -  /* -  Reset the inveerse filtereing detector. -  */ -  if(FDKsbrEnc_resetInvFiltDetector(&hTonCorr->sbrInvFilt, -                           hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf, -                           hTonCorr->sbrNoiseFloorEstimate.noNoiseBands)) -    return(1); -/* Reset the missing harmonics detector. */ -  if(FDKsbrEnc_ResetSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector, -                                       nSfb[HI])) -    return(1); - -  return (0); -} - - - - - -/**************************************************************************/ -/*! -  \brief  Deletes the tonality correction paramtere module. - - - -  \return   none - -*/ -/**************************************************************************/ -void -FDKsbrEnc_DeleteTonCorrParamExtr (HANDLE_SBR_TON_CORR_EST hTonCorr) /*!< Handle to SBR_TON_CORR struct. */ -{ - -  if (hTonCorr) { - -   FreeRam_Sbr_quotaMatrix(hTonCorr->quotaMatrix); - -   FreeRam_Sbr_signMatrix(hTonCorr->signMatrix); - -   FDKsbrEnc_DeleteSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector); -  } -} diff --git a/libSBRenc/src/ton_corr.h b/libSBRenc/src/ton_corr.h deleted file mode 100644 index 8c8425c..0000000 --- a/libSBRenc/src/ton_corr.h +++ /dev/null @@ -1,212 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  General tonality correction detector module. -*/ -#ifndef _TON_CORR_EST_H -#define _TON_CORR_EST_H - -#include "sbr_encoder.h" -#include "mh_det.h" -#include "nf_est.h" -#include "invf_est.h" - - -#define MAX_NUM_PATCHES 6 -#define SCALE_NRGVEC 4 - -/** parameter set for one single patch */ -typedef struct { -  INT    sourceStartBand;         /*!< first band in lowbands where to take the samples from */ -  INT    sourceStopBand;          /*!< first band in lowbands which is not included in the patch anymore */ -  INT    guardStartBand;          /*!< first band in highbands to be filled with zeros in order to -                                         reduce interferences between patches */ -  INT    targetStartBand;         /*!< first band in highbands to be filled with whitened lowband signal */ -  INT    targetBandOffs;          /*!< difference between 'startTargetBand' and 'startSourceBand' */ -  INT    numBandsInPatch;         /*!< number of consecutive bands in this one patch */ -} PATCH_PARAM; - - - - -typedef struct -{ -  INT switchInverseFilt;          /*!< Flag to enable dynamic adaption of invf. detection */ -  INT noQmfChannels; -  INT bufferLength;               /*!< Length of the r and i buffers. */ -  INT stepSize;                   /*!< Stride for the lpc estimate. */ -  INT numberOfEstimates;          /*!< The total number of estiamtes, available in the quotaMatrix.*/ -  INT numberOfEstimatesPerFrame;  /*!< The number of estimates per frame available in the quotaMatrix.*/ -  INT lpcLength[2];               /*!< Segment length used for second order LPC analysis.*/ -  INT nextSample;                 /*!< Where to start the LPC analysis of the current frame.*/ -  INT move;                       /*!< How many estimates to move in the quotaMatrix, when buffering. */ -  INT frameStartIndex;            /*!< The start index for the current frame in the r and i buffers. */ -  INT startIndexMatrix;           /*!< The start index for the current frame in the quotaMatrix. */ -  INT frameStartIndexInvfEst;     /*!< The start index of the inverse filtering, not the same as the others, -                                       dependent on what decoder is used (buffer opt, or no buffer opt). */ -  INT prevTransientFlag;          /*!< The transisent flag (from the transient detector) for the previous frame. */ -  INT transientNextFrame;         /*!< Flag to indicate that the transient will show up in the next frame. */ -  INT transientPosOffset;         /*!< An offset value to match the transient pos as calculated by the transient detector -                                       with the actual position in the frame.*/ - -  INT *signMatrix[MAX_NO_OF_ESTIMATES];      /*!< Matrix holding the sign of each channe, i.e. indicating in what -                                                  part of a QMF channel a possible sine is. */ - -  FIXP_DBL *quotaMatrix[MAX_NO_OF_ESTIMATES];/*!< Matrix holding the quota values for all estimates, all channels. */ - -  FIXP_DBL nrgVector[MAX_NO_OF_ESTIMATES];   /*!< Vector holding the averaged energies for every QMF band. */ -  FIXP_DBL nrgVectorFreq[QMF_CHANNELS];      /*!< Vector holding the averaged energies for every QMF channel */ - -  SCHAR indexVector[QMF_CHANNELS];           /*!< Index vector poINTing to the correct lowband channel, -                                                  when indexing a highband channel, -1 represents a guard band */ -  PATCH_PARAM  patchParam[MAX_NUM_PATCHES];  /*!< new parameter set for patching */ -  INT    guard;                              /*!< number of guardbands between every patch */ -  INT    shiftStartSb;                       /*!< lowest subband of source range to be included in the patches */ -  INT    noOfPatches;                        /*!< number of patches */ - -  SBR_MISSING_HARMONICS_DETECTOR sbrMissingHarmonicsDetector;  /*!< SBR_MISSING_HARMONICS_DETECTOR struct. */ -  SBR_NOISE_FLOOR_ESTIMATE sbrNoiseFloorEstimate;              /*!< SBR_NOISE_FLOOR_ESTIMATE struct. */ -  SBR_INV_FILT_EST sbrInvFilt;                                 /*!< SBR_INV_FILT_EST struct. */ -} -SBR_TON_CORR_EST; - -typedef SBR_TON_CORR_EST *HANDLE_SBR_TON_CORR_EST; - -void -FDKsbrEnc_TonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr,   /*!< Handle to SBR_TON_CORR struct. */ -                 INVF_MODE* infVec,                  /*!< Vector where the inverse filtering levels will be stored. */ -                 FIXP_DBL * noiseLevels,             /*!< Vector where the noise levels will be stored. */ -                 INT* missingHarmonicFlag,           /*!< Flag set to one or zero, dependent on if any strong sines are missing.*/ -                 UCHAR* missingHarmonicsIndex,       /*!< Vector indicating where sines are missing. */ -                 UCHAR* envelopeCompensation,        /*!< Vector to store compensation values for the energies in. */ -                 const SBR_FRAME_INFO *frameInfo,    /*!< Frame info struct, contains the time and frequency grid of the current frame.*/ -                 UCHAR* transientInfo,               /*!< Transient info.*/ -                 UCHAR * freqBandTable,              /*!< Frequency band tables for high-res.*/ -                 INT nSfb,                           /*!< Number of scalefactor bands for high-res. */ -                 XPOS_MODE xposType,                 /*!< Type of transposer used in the decoder.*/ -                 UINT sbrSyntaxFlags -                 ); - -INT -FDKsbrEnc_CreateTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ -                                 INT                     chan);    /*!< Channel index, needed for mem allocation */ - -INT -FDKsbrEnc_InitTonCorrParamExtr(INT frameSize,                      /*!< Current SBR frame size. */ -                               HANDLE_SBR_TON_CORR_EST hTonCorr,   /*!< Pointer to handle to SBR_TON_CORR struct. */ -                               HANDLE_SBR_CONFIG_DATA sbrCfg,      /*!< Pointer to SBR configuration parameters. */ -                               INT timeSlots,                      /*!< Number of time-slots per frame */ -                               INT xposCtrl,                       /*!< Different patch modes. */ -                               INT ana_max_level,                  /*!< Maximum level of the adaptive noise. */ -                               INT noiseBands,                     /*!< Number of noise bands per octave. */ -                               INT noiseFloorOffset,               /*!< Noise floor offset. */ -                               UINT useSpeechConfig                /*!< Speech or music tuning. */ -                              ); - -void -FDKsbrEnc_DeleteTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr); /*!< Handle to SBR_TON_CORR struct. */ - - -void -FDKsbrEnc_CalculateTonalityQuotas(HANDLE_SBR_TON_CORR_EST hTonCorr, -                        FIXP_DBL **sourceBufferReal, -                        FIXP_DBL **sourceBufferImag, -                        INT usb, -                        INT qmfScale                    /*!< sclefactor of QMF subsamples */ -                       ); - -INT -FDKsbrEnc_ResetTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ -                      INT xposctrl,                     /*!< Different patch modes. */ -                      INT highBandStartSb,              /*!< Start band of the SBR range. */ -                      UCHAR *v_k_master,        /*!< Master frequency table from which all other table are derived.*/ -                      INT numMaster,                    /*!< Number of elements in the master table. */ -                      INT fs,                           /*!< Sampling frequency (of the SBR part). */ -                      UCHAR** freqBandTable,    /*!< Frequency band table for low-res and high-res. */ -                      INT* nSfb,                        /*!< Number of frequency bands (hig-res and low-res). */ -                      INT noQmfChannels                 /*!< Number of QMF channels. */ -                      ); -#endif - diff --git a/libSBRenc/src/tran_det.cpp b/libSBRenc/src/tran_det.cpp deleted file mode 100644 index 1e0a59f..0000000 --- a/libSBRenc/src/tran_det.cpp +++ /dev/null @@ -1,701 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -#include "tran_det.h" - -#include "fram_gen.h" -#include "sbr_ram.h" -#include "sbr_misc.h" - -#include "genericStds.h" - -#define NORM_QMF_ENERGY 5.684341886080801486968994140625e-14 /* 2^-44 */ - -/* static FIXP_DBL ABS_THRES = fixMax( FL2FXCONST_DBL(1.28e5 *  NORM_QMF_ENERGY), (FIXP_DBL)1)  Minimum threshold for detecting changes */ -#define ABS_THRES ((FIXP_DBL)16) - -/******************************************************************************* - Functionname:  spectralChange - ******************************************************************************* - \brief   Calculates a measure for the spectral change within the frame - - The function says how good it would be to split the frame at the given border - position into 2 envelopes. - - The return value delta_sum is scaled with the factor 1/64 - - \return  calculated value -*******************************************************************************/ -static FIXP_DBL spectralChange(FIXP_DBL Energies[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS], -                               INT *scaleEnergies, -                               FIXP_DBL EnergyTotal, -                               INT nSfb, -                               INT start, -                               INT border, -                               INT stop) -{ -  INT i,j; -  INT len1,len2; -  FIXP_DBL delta,tmp0,tmp1,tmp2; -  FIXP_DBL accu1,accu2,delta_sum,result; - -  FDK_ASSERT(scaleEnergies[0] >= 0); - -  /* equal for aac (would be not equal for mp3) */ -  len1 = border-start; -  len2 = stop-border; - -  /* prefer borders near the middle of the frame */ -  FIXP_DBL   pos_weight; -  pos_weight = FL2FXCONST_DBL(0.5f) - (len1*GetInvInt(len1+len2)); -  pos_weight = /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL - (fMult(pos_weight, pos_weight)<<2); - -  delta_sum = FL2FXCONST_DBL(0.0f); - -  /* Sum up energies of all QMF-timeslots for both halfs */ -  for (j=0; j<nSfb; j++) { -    #define NRG_SCALE  3 -    /* init with some energy to prevent division by zero -       and to prevent splitting for very low levels */ -    accu1 = ((FL2FXCONST_DBL((1.0e6*NORM_QMF_ENERGY*8.0/32))) << fixMin(scaleEnergies[0],25))>>NRG_SCALE;  /* complex init for compare with original version */ -    accu2 = ((FL2FXCONST_DBL((1.0e6*NORM_QMF_ENERGY*8.0/32))) << fixMin(scaleEnergies[0],25))>>NRG_SCALE;  /* can be simplified in dsp implementation */ - -    /* Sum up energies in first half */ -    for (i=start; i<border; i++) { -      accu1 += (Energies[i][j]>>NRG_SCALE); -    } - -    /* Sum up energies in second half */ -    for (i=border; i<stop; i++) { -      accu2 += (Energies[i][j]>>NRG_SCALE); -    } - -    /* Energy change in current band */ -    tmp0 = CalcLdData(accu2); -    tmp1 = CalcLdData(accu1); -    tmp2 = (tmp0 - tmp1 + CalcLdData(len1)-CalcLdData(len2)); -    delta = fixp_abs(fMult(tmp2, FL2FXCONST_DBL(0.6931471806f))); - -    /* Weighting with amplitude ratio of this band */ -    result = (EnergyTotal == FL2FXCONST_DBL(0.0f)) -            ? FL2FXCONST_DBL(0.f) -            : FDKsbrEnc_LSI_divide_scale_fract( (accu1+accu2), -                                      (EnergyTotal>>NRG_SCALE)+(FIXP_DBL)1, -                                      (FIXP_DBL)MAXVAL_DBL >> fixMin(scaleEnergies[0],(DFRACT_BITS-1)) ); - -    delta_sum += (FIXP_DBL)(fMult(sqrtFixp(result), delta)); -  } - -  return fMult(delta_sum, pos_weight); -} - - -/******************************************************************************* - Functionname:  addLowbandEnergies - ******************************************************************************* - \brief   Calculates total lowband energy - - The return value nrgTotal is scaled by the factor (1/32.0) - - \return  total energy in the lowband -*******************************************************************************/ -static FIXP_DBL addLowbandEnergies(FIXP_DBL **Energies, -                                   int       *scaleEnergies, -                                   int        YBufferWriteOffset, -                                   int        nrgSzShift, -                                   int        tran_off, -                                   UCHAR     *freqBandTable, -                                   int        slots) -{ -  FIXP_DBL nrgTotal; -  FIXP_DBL accu1 = FL2FXCONST_DBL(0.0f); -  FIXP_DBL accu2 = FL2FXCONST_DBL(0.0f); -  int tran_offdiv2 = tran_off>>nrgSzShift; -  int ts,k; - -  /* Sum up lowband energy from one frame at offset tran_off */ -  for (ts=tran_offdiv2; ts<YBufferWriteOffset; ts++) { -    for (k = 0; k < freqBandTable[0]; k++) { -      accu1 += Energies[ts][k] >> 6; -    } -  } -  for (; ts<tran_offdiv2+(slots>>nrgSzShift); ts++) { -    for (k = 0; k < freqBandTable[0]; k++) { -      accu2 += Energies[ts][k] >> 6; -    } -  } - -  nrgTotal = ( (accu1 >> fixMin(scaleEnergies[0],(DFRACT_BITS-1))) -           +   (accu2 >> fixMin(scaleEnergies[1],(DFRACT_BITS-1))) ) << (2); - -  return(nrgTotal); -} - - -/******************************************************************************* - Functionname:  addHighbandEnergies - ******************************************************************************* - \brief   Add highband energies - - Highband energies are mapped to an array with smaller dimension: - Its time resolution is only 1 SBR-timeslot and its frequency resolution - is 1 SBR-band. Therefore the data to be fed into the spectralChange - function is reduced. - - The values EnergiesM are scaled by the factor (1/32.0) and scaleEnergies[0] - The return value nrgTotal is scaled by the factor (1/32.0) - - \return  total energy in the highband -*******************************************************************************/ - -static FIXP_DBL addHighbandEnergies(FIXP_DBL **RESTRICT Energies, /*!< input */ -                                    INT       *scaleEnergies, -                                    FIXP_DBL   EnergiesM[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS], /*!< Combined output */ -                                    UCHAR     *RESTRICT freqBandTable, -                                    INT        nSfb, -                                    INT        sbrSlots, -                                    INT        timeStep) -{ -  INT i,j,k,slotIn,slotOut,scale; -  INT li,ui; -  FIXP_DBL nrgTotal; -  FIXP_DBL accu = FL2FXCONST_DBL(0.0f); - -  /* Combine QMF-timeslots to SBR-timeslots, -     combine QMF-bands to SBR-bands, -     combine Left and Right channel */ -  for (slotOut=0; slotOut<sbrSlots; slotOut++) { -    slotIn = 2*slotOut; - -    for (j=0; j<nSfb; j++) { -      accu = FL2FXCONST_DBL(0.0f); - -      li = freqBandTable[j]; -      ui = freqBandTable[j + 1]; - -      for (k=li; k<ui; k++) { -        for (i=0; i<timeStep; i++) { -         accu += (Energies[(slotIn+i)>>1][k] >> 5); -        } -      } -      EnergiesM[slotOut][j] = accu; -    } -  } - -  scale = fixMin(8,scaleEnergies[0]);      /* scale energies down before add up */ - -  if ((scaleEnergies[0]-1) > (DFRACT_BITS-1) ) -    nrgTotal = FL2FXCONST_DBL(0.0f); -  else { -    /* Now add all energies */ -    accu = FL2FXCONST_DBL(0.0f); -    for (slotOut=0; slotOut<sbrSlots; slotOut++) { -      for (j=0; j<nSfb; j++) { -        accu += (EnergiesM[slotOut][j] >> scale); -      } -    } -    nrgTotal = accu >> (scaleEnergies[0]-scale); -  } - -  return(nrgTotal); -} - - -/******************************************************************************* - Functionname:  FDKsbrEnc_frameSplitter - ******************************************************************************* - \brief   Decides if a FIXFIX-frame shall be splitted into 2 envelopes - - If no transient has been detected before, the frame can still be splitted - into 2 envelopes. -*******************************************************************************/ -void -FDKsbrEnc_frameSplitter(FIXP_DBL **Energies, -                        INT *scaleEnergies, -                        HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, -                        UCHAR *freqBandTable, -                        UCHAR *tran_vector, -                        int YBufferWriteOffset, -                        int YBufferSzShift, -                        int nSfb, -                        int timeStep, -                        int no_cols) -{ -  if (tran_vector[1]==0) /* no transient was detected */ -  { -    FIXP_DBL delta; -    FIXP_DBL EnergiesM[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS]; -    FIXP_DBL EnergyTotal,newLowbandEnergy,newHighbandEnergy; -    INT border; -    INT sbrSlots = fMultI(GetInvInt(timeStep),no_cols); - -    FDK_ASSERT( sbrSlots * timeStep == no_cols ); - -    /* -      Get Lowband-energy over a range of 2 frames (Look half a frame back and ahead). -    */ -    newLowbandEnergy = addLowbandEnergies(Energies, -                                          scaleEnergies, -                                          YBufferWriteOffset, -                                          YBufferSzShift, -                                          h_sbrTransientDetector->tran_off, -                                          freqBandTable, -                                          no_cols); - -    newHighbandEnergy = addHighbandEnergies(Energies, -                                            scaleEnergies, -                                            EnergiesM, -                                            freqBandTable, -                                            nSfb, -                                            sbrSlots, -                                            timeStep); - -    if ( h_sbrTransientDetector->frameShift != 0 ) { -      if (tran_vector[1]==0) -        tran_vector[0] = 0; -    } else -    { -      /* prevLowBandEnergy: Corresponds to 1 frame, starting with half a frame look-behind -         newLowbandEnergy:  Corresponds to 1 frame, starting in the middle of the current frame */ -      EnergyTotal = (newLowbandEnergy + h_sbrTransientDetector->prevLowBandEnergy) >> 1; -      EnergyTotal += newHighbandEnergy; -      /* The below border should specify the same position as the middle border -         of a FIXFIX-frame with 2 envelopes. */ -      border = (sbrSlots+1) >> 1; - -      delta = spectralChange(EnergiesM, -                             scaleEnergies, -                             EnergyTotal, -                             nSfb, -                             0, -                             border, -                             sbrSlots); - -      if (delta > (h_sbrTransientDetector->split_thr >> LD_DATA_SHIFT)) /* delta scaled by 1/64 */ -        tran_vector[0] = 1; /* Set flag for splitting */ -      else -        tran_vector[0] = 0; -    } - -    /* Update prevLowBandEnergy */ -    h_sbrTransientDetector->prevLowBandEnergy = newLowbandEnergy; -    h_sbrTransientDetector->prevHighBandEnergy = newHighbandEnergy; -  } -} - -/* - * Calculate transient energy threshold for each QMF band - */ -static void -calculateThresholds(FIXP_DBL **RESTRICT Energies, -                    INT       *RESTRICT scaleEnergies, -                    FIXP_DBL  *RESTRICT thresholds, -                    int        YBufferWriteOffset, -                    int        YBufferSzShift, -                    int        noCols, -                    int        noRows, -                    int        tran_off) -{ -  FIXP_DBL mean_val,std_val,temp; -  FIXP_DBL i_noCols; -  FIXP_DBL i_noCols1; -  FIXP_DBL accu,accu0,accu1; -  int scaleFactor0,scaleFactor1,commonScale; -  int i,j; - -  i_noCols  = GetInvInt(noCols + tran_off ) << YBufferSzShift; -  i_noCols1 = GetInvInt(noCols + tran_off - 1) << YBufferSzShift; - -  /* calc minimum scale of energies of previous and current frame */ -  commonScale = fixMin(scaleEnergies[0],scaleEnergies[1]); - -  /* calc scalefactors to adapt energies to common scale */ -  scaleFactor0 = fixMin((scaleEnergies[0]-commonScale), (DFRACT_BITS-1)); -  scaleFactor1 = fixMin((scaleEnergies[1]-commonScale), (DFRACT_BITS-1)); - -  FDK_ASSERT((scaleFactor0 >= 0) && (scaleFactor1 >= 0)); - -  /* calculate standard deviation in every subband */ -  for (i=0; i<noRows; i++) -  { -    int startEnergy = (tran_off>>YBufferSzShift); -    int endEnergy = ((noCols>>YBufferSzShift)+tran_off); -    int shift; - -    /* calculate mean value over decimated energy values (downsampled by 2). */ -    accu0 = accu1 = FL2FXCONST_DBL(0.0f); - -    for (j=startEnergy; j<YBufferWriteOffset; j++) -      accu0 += fMult(Energies[j][i], i_noCols); -    for (; j<endEnergy; j++) -      accu1 += fMult(Energies[j][i], i_noCols); - -    mean_val = (accu0 >> scaleFactor0) + (accu1 >> scaleFactor1);  /* average */ -    shift    = fixMax(0,CountLeadingBits(mean_val)-6);             /* -6 to keep room for accumulating upto N = 24 values */ - -    /* calculate standard deviation */ -    accu = FL2FXCONST_DBL(0.0f); - -    /* summe { ((mean_val-nrg)^2) * i_noCols1 } */ -    for (j=startEnergy; j<YBufferWriteOffset; j++) { -      temp = ((FIXP_DBL)mean_val - ((FIXP_DBL)Energies[j][i] >> scaleFactor0))<<shift; -      temp = fPow2(temp); -      temp = fMult(temp, i_noCols1); -      accu += temp; -    } -    for (; j<endEnergy; j++) { -      temp = ((FIXP_DBL)mean_val - ((FIXP_DBL)Energies[j][i] >> scaleFactor1))<<shift; -      temp = fPow2(temp); -      temp = fMult(temp, i_noCols1); -      accu += temp; -    } - -    std_val = sqrtFixp(accu)>>shift;     /* standard deviation */ - -    /* -    Take new threshold as average of calculated standard deviation ratio -    and old threshold if greater than absolute threshold -    */ -    temp = ( commonScale<=(DFRACT_BITS-1) ) -            ? fMult(FL2FXCONST_DBL(0.66f), thresholds[i]) + (fMult(FL2FXCONST_DBL(0.34f), std_val) >> commonScale) -            : (FIXP_DBL) 0; - -    thresholds[i] = fixMax(ABS_THRES,temp); - -    FDK_ASSERT(commonScale >= 0); -  } -} - -/* - * Calculate transient levels for each QMF time slot. - */ -static void -extractTransientCandidates(FIXP_DBL  **RESTRICT Energies, -                           INT        *RESTRICT scaleEnergies, -                           FIXP_DBL   *RESTRICT thresholds, -                           FIXP_DBL   *RESTRICT transients, -                           int         YBufferWriteOffset, -                           int         YBufferSzShift, -                           int         noCols, -                           int         start_band, -                           int         stop_band, -                           int         tran_off, -                           int         addPrevSamples) -{ -  FIXP_DBL i_thres; -  C_ALLOC_SCRATCH_START(EnergiesTemp, FIXP_DBL, 2*QMF_MAX_TIME_SLOTS); -  FIXP_DBL *RESTRICT pEnergiesTemp = EnergiesTemp; -  int tmpScaleEnergies0, tmpScaleEnergies1; -  int endCond; -  int startEnerg,endEnerg; -  int i,j,jIndex,jpBM; - -  tmpScaleEnergies0 = scaleEnergies[0]; -  tmpScaleEnergies1 = scaleEnergies[1]; - -  /* Scale value for first energies, upto YBufferWriteOffset */ -  tmpScaleEnergies0 = fixMin(tmpScaleEnergies0, MAX_SHIFT_DBL); -  /* Scale value for first energies, from YBufferWriteOffset upwards */ -  tmpScaleEnergies1 = fixMin(tmpScaleEnergies1, MAX_SHIFT_DBL); - -  FDK_ASSERT((tmpScaleEnergies0 >= 0) && (tmpScaleEnergies1 >= 0)); - -  /* Keep addPrevSamples extra previous transient candidates. */ -  FDKmemmove(transients, transients + noCols - addPrevSamples, (tran_off+addPrevSamples) * sizeof (FIXP_DBL)); -  FDKmemclear(transients + tran_off + addPrevSamples, noCols * sizeof (FIXP_DBL)); - -  endCond = noCols; /* Amount of new transient values to be calculated. */ -  startEnerg = (tran_off-3)>>YBufferSzShift; /* >>YBufferSzShift because of amount of energy values. -3 because of neighbors being watched. */ -  endEnerg = ((noCols+ (YBufferWriteOffset<<YBufferSzShift))-1)>>YBufferSzShift; /* YBufferSzShift shifts because of half energy values. */ - -  /* Compute differential values with two different weightings in every subband */ -  for (i=start_band; i<stop_band; i++) -  { -    FIXP_DBL thres = thresholds[i]; - -    if((LONG)thresholds[i]>=256) -      i_thres = (LONG)( (LONG)MAXVAL_DBL / ((((LONG)thresholds[i]))+1) )<<(32-24); -    else -      i_thres = (LONG)MAXVAL_DBL; - -    /* Copy one timeslot and de-scale and de-squish */ -    if (YBufferSzShift == 1) { -      for(j=startEnerg; j<YBufferWriteOffset; j++) { -        FIXP_DBL tmp = Energies[j][i]; -        EnergiesTemp[(j<<1)+1] = EnergiesTemp[j<<1] = tmp>>tmpScaleEnergies0; -      } -      for(; j<=endEnerg; j++) { -        FIXP_DBL tmp = Energies[j][i]; -        EnergiesTemp[(j<<1)+1] = EnergiesTemp[j<<1] = tmp>>tmpScaleEnergies1; -      } -    } else { -      for(j=startEnerg; j<YBufferWriteOffset; j++) { -        FIXP_DBL tmp = Energies[j][i]; -        EnergiesTemp[j] = tmp>>tmpScaleEnergies0; -      } -      for(; j<=endEnerg; j++) { -        FIXP_DBL tmp = Energies[j][i]; -        EnergiesTemp[j] = tmp>>tmpScaleEnergies1; -      } -    } - -    /* Detect peaks in energy values. */ - -    jIndex = tran_off; -    jpBM = jIndex+addPrevSamples; - -    for (j=endCond; j--; jIndex++, jpBM++) -    { - -      FIXP_DBL delta, tran; -      int d; - -      delta = (FIXP_DBL)0; -      tran  = (FIXP_DBL)0; - -      for (d=1; d<4; d++) { -        delta += pEnergiesTemp[jIndex+d]; /* R */ -        delta -= pEnergiesTemp[jIndex-d]; /* L */ -        delta -= thres; - -        if ( delta > (FIXP_DBL)0 ) { -          tran += fMult(i_thres, delta); -        } -      } -      transients[jpBM] += tran; -    } -  } -  C_ALLOC_SCRATCH_END(EnergiesTemp, FIXP_DBL, 2*QMF_MAX_TIME_SLOTS); -} - -void -FDKsbrEnc_transientDetect(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTran, -                          FIXP_DBL **Energies, -                          INT *scaleEnergies, -                          UCHAR *transient_info, -                          int YBufferWriteOffset, -                          int YBufferSzShift, -                          int timeStep, -                          int frameMiddleBorder) -{ -  int no_cols = h_sbrTran->no_cols; -  int qmfStartSample; -  int addPrevSamples; -  int timeStepShift=0; -  int i, cond; - -  /* Where to start looking for transients in the transient candidate buffer */ -  qmfStartSample = timeStep * frameMiddleBorder; -  /* We need to look one value backwards in the transients, so we might need one more previous value. */ -  addPrevSamples = (qmfStartSample > 0) ? 0: 1; - -  switch (timeStep) { -    case 1: timeStepShift = 0; break; -    case 2: timeStepShift = 1; break; -    case 4: timeStepShift = 2; break; -  } - -  calculateThresholds(Energies, -                      scaleEnergies, -                      h_sbrTran->thresholds, -                      YBufferWriteOffset, -                      YBufferSzShift, -                      h_sbrTran->no_cols, -                      h_sbrTran->no_rows, -                      h_sbrTran->tran_off); - -  extractTransientCandidates(Energies, -                             scaleEnergies, -                             h_sbrTran->thresholds, -                             h_sbrTran->transients, -                             YBufferWriteOffset, -                             YBufferSzShift, -                             h_sbrTran->no_cols, -                             0, -                             h_sbrTran->no_rows, -                             h_sbrTran->tran_off, -                             addPrevSamples ); - -  transient_info[0] = 0; -  transient_info[1] = 0; -  transient_info[2] = 0; - -  /* Offset by the amount of additional previous transient candidates being kept. */ -  qmfStartSample += addPrevSamples; - -  /* Check for transients in second granule (pick the last value of subsequent values)  */ -  for (i=qmfStartSample; i<qmfStartSample + no_cols; i++) { -    cond =    (h_sbrTran->transients[i] < fMult(FL2FXCONST_DBL(0.9f), h_sbrTran->transients[i - 1]) ) -           && (h_sbrTran->transients[i - 1] > h_sbrTran->tran_thr); - -    if (cond) { -      transient_info[0] = (i - qmfStartSample)>>timeStepShift; -      transient_info[1] = 1; -      break; -    } -  } - -  if ( h_sbrTran->frameShift != 0) { -      /* transient prediction for LDSBR */ -      /* Check for transients in first <frameShift> qmf-slots of second frame */ -      for (i=qmfStartSample+no_cols; i<qmfStartSample + no_cols+h_sbrTran->frameShift; i++) { - -        cond =    (h_sbrTran->transients[i] < fMult(FL2FXCONST_DBL(0.9f), h_sbrTran->transients[i - 1]) ) -               && (h_sbrTran->transients[i - 1] > h_sbrTran->tran_thr); - -        if (cond) { -          int pos = (int) ( (i - qmfStartSample-no_cols) >> timeStepShift ); -          if ((pos < 3) && (transient_info[1]==0)) { -            transient_info[2] = 1; -          } -          break; -        } -      } -  } -} - -int -FDKsbrEnc_InitSbrTransientDetector(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, -                                   INT   frameSize, -                                   INT   sampleFreq, -                                   sbrConfigurationPtr params, -                                   int   tran_fc, -                                   int   no_cols, -                                   int   no_rows, -                                   int   YBufferWriteOffset, -                                   int   YBufferSzShift, -                                   int   frameShift, -                                   int   tran_off) -{ -    INT totalBitrate = params->codecSettings.standardBitrate * params->codecSettings.nChannels; -    INT codecBitrate = params->codecSettings.bitRate; -    FIXP_DBL bitrateFactor_fix, framedur_fix; -    INT scale_0, scale_1; - -    FDKmemclear(h_sbrTransientDetector,sizeof(SBR_TRANSIENT_DETECTOR)); - -    h_sbrTransientDetector->frameShift = frameShift; -    h_sbrTransientDetector->tran_off = tran_off; - -    if(codecBitrate) { -      bitrateFactor_fix = fDivNorm((FIXP_DBL)totalBitrate, (FIXP_DBL)(codecBitrate<<2),&scale_0); -    } -    else { -      bitrateFactor_fix = FL2FXCONST_DBL(1.0/4.0); -      scale_0 = 0; -    } - -    framedur_fix = fDivNorm(frameSize, sampleFreq); - -    /* The longer the frames, the more often should the FIXFIX- -    case transmit 2 envelopes instead of 1. -    Frame durations below 10 ms produce the highest threshold -    so that practically always only 1 env is transmitted. */ -    FIXP_DBL tmp = framedur_fix - FL2FXCONST_DBL(0.010); - -    tmp = fixMax(tmp, FL2FXCONST_DBL(0.0001)); -    tmp = fDivNorm(FL2FXCONST_DBL(0.000075), fPow2(tmp), &scale_1); - -    scale_1 = -(scale_1 + scale_0 + 2); - -    FDK_ASSERT(no_cols <= QMF_MAX_TIME_SLOTS); -    FDK_ASSERT(no_rows <= QMF_CHANNELS); - -    h_sbrTransientDetector->no_cols = no_cols; -    h_sbrTransientDetector->tran_thr = (FIXP_DBL)((params->tran_thr << (32-24-1)) / no_rows); -    h_sbrTransientDetector->tran_fc = tran_fc; - -    if (scale_1>=0) { -      h_sbrTransientDetector->split_thr = fMult(tmp, bitrateFactor_fix) >> scale_1; -    } -    else { -      h_sbrTransientDetector->split_thr = fMult(tmp, bitrateFactor_fix) << (-scale_1); -    } - -    h_sbrTransientDetector->no_rows = no_rows; -    h_sbrTransientDetector->mode = params->tran_det_mode; -    h_sbrTransientDetector->prevLowBandEnergy = FL2FXCONST_DBL(0.0f); - -    return (0); -} - diff --git a/libSBRenc/src/tran_det.h b/libSBRenc/src/tran_det.h deleted file mode 100644 index 95b5d2e..0000000 --- a/libSBRenc/src/tran_det.h +++ /dev/null @@ -1,150 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright  1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*! -  \file -  \brief  Transient detector prototypes   -*/ -#ifndef __TRAN_DET_H -#define __TRAN_DET_H - -#include "sbr_encoder.h" -#include "sbr_def.h" - -typedef struct -{ -  FIXP_DBL  transients[QMF_MAX_TIME_SLOTS+(QMF_MAX_TIME_SLOTS/2)]; -  FIXP_DBL  thresholds[QMF_CHANNELS]; -  FIXP_DBL  tran_thr;              /* Master threshold for transient signals */ -  FIXP_DBL  split_thr;             /* Threshold for splitting FIXFIX-frames into 2 env */ -  FIXP_DBL  prevLowBandEnergy;     /* Energy of low band */ -  FIXP_DBL  prevHighBandEnergy;    /* Energy of high band */ -  INT    tran_fc;                  /* Number of lowband subbands to discard  */ -  INT    no_cols; -  INT    no_rows; -  INT    mode; - -  int    frameShift; -  int    tran_off;                 /* Offset for reading energy values. */ -} -SBR_TRANSIENT_DETECTOR; - - -typedef SBR_TRANSIENT_DETECTOR *HANDLE_SBR_TRANSIENT_DETECTOR; - -void -FDKsbrEnc_transientDetect(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, -                          FIXP_DBL **Energies, -                          INT *scaleEnergies, -                          UCHAR *tran_vector, -                          int YBufferWriteOffset, -                          int YBufferSzShift, -                          int timeStep, -                          int frameMiddleBorder); - -int -FDKsbrEnc_InitSbrTransientDetector (HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, -                            INT   frameSize, -                            INT   sampleFreq, -                            sbrConfigurationPtr params, -                            int   tran_fc, -                            int   no_cols, -                            int   no_rows, -                            int   YBufferWriteOffset, -                            int   YBufferSzShift, -                            int   frameShift, -                            int   tran_off); - -void -FDKsbrEnc_frameSplitter(FIXP_DBL **Energies, -                        INT *scaleEnergies, -                        HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, -                        UCHAR *freqBandTable, -                        UCHAR *tran_vector, -                        int YBufferWriteOffset, -                        int YBufferSzShift, -                        int nSfb, -                        int timeStep, -                        int no_cols); - -#endif  | 
